kronk 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gemtest +0 -0
- data/History.rdoc +22 -0
- data/Manifest.txt +15 -6
- data/README.rdoc +5 -6
- data/Rakefile +5 -5
- data/lib/kronk.rb +164 -194
- data/lib/kronk/cmd.rb +188 -74
- data/lib/kronk/constants.rb +90 -0
- data/lib/kronk/data_renderer.rb +146 -0
- data/lib/kronk/diff.rb +4 -92
- data/lib/kronk/path/transaction.rb +2 -0
- data/lib/kronk/player.rb +233 -0
- data/lib/kronk/player/benchmark.rb +261 -0
- data/lib/kronk/player/input_reader.rb +54 -0
- data/lib/kronk/player/output.rb +49 -0
- data/lib/kronk/player/request_parser.rb +24 -0
- data/lib/kronk/player/stream.rb +50 -0
- data/lib/kronk/player/suite.rb +123 -0
- data/lib/kronk/plist_parser.rb +4 -0
- data/lib/kronk/request.rb +265 -241
- data/lib/kronk/response.rb +330 -149
- data/lib/kronk/test/assertions.rb +2 -2
- data/lib/kronk/xml_parser.rb +7 -1
- data/test/mocks/cookies.yml +32 -0
- data/test/mocks/get_request.txt +6 -0
- data/test/test_assertions.rb +6 -6
- data/test/test_cmd.rb +708 -0
- data/test/test_diff.rb +210 -75
- data/test/test_helper.rb +140 -0
- data/test/test_helper_methods.rb +4 -4
- data/test/test_input_reader.rb +103 -0
- data/test/test_kronk.rb +142 -141
- data/test/test_player.rb +589 -0
- data/test/test_request.rb +147 -212
- data/test/test_request_parser.rb +31 -0
- data/test/test_response.rb +206 -15
- metadata +41 -74
- data/bin/yzma +0 -13
- data/lib/kronk/data_set.rb +0 -144
- data/lib/yzma.rb +0 -174
- data/lib/yzma/randomizer.rb +0 -54
- data/lib/yzma/report.rb +0 -47
- data/test/test_data_set.rb +0 -213
data/test/test_diff.rb
CHANGED
@@ -44,62 +44,62 @@ class TestDiff < Test::Unit::TestCase
|
|
44
44
|
end
|
45
45
|
|
46
46
|
|
47
|
-
def
|
47
|
+
def test_ordered_data_string_json
|
48
48
|
expected = <<STR
|
49
49
|
{
|
50
|
-
"acks"
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
"acks": [
|
51
|
+
[
|
52
|
+
56,
|
53
|
+
78
|
54
54
|
],
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
[
|
56
|
+
"12",
|
57
|
+
"34"
|
58
58
|
]
|
59
59
|
],
|
60
|
-
"root"
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
"root": [
|
61
|
+
[
|
62
|
+
"B1",
|
63
|
+
"B2"
|
64
64
|
],
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
[
|
66
|
+
"A1",
|
67
|
+
"A2"
|
68
68
|
],
|
69
|
-
[
|
70
|
-
"C1",
|
71
|
-
"C2",
|
72
69
|
[
|
73
|
-
"
|
74
|
-
"
|
70
|
+
"C1",
|
71
|
+
"C2",
|
72
|
+
[
|
73
|
+
"C3a",
|
74
|
+
"C3b"
|
75
75
|
]
|
76
76
|
],
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
{
|
78
|
+
":tests": [
|
79
|
+
"D3a",
|
80
|
+
"D3b"
|
81
81
|
],
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
"test": [
|
83
|
+
[
|
84
|
+
"D1a\\nContent goes here",
|
85
|
+
"D1b"
|
86
86
|
],
|
87
|
-
|
87
|
+
"D2"
|
88
88
|
]
|
89
89
|
}
|
90
90
|
],
|
91
|
-
"subs"
|
92
|
-
|
93
|
-
|
91
|
+
"subs": [
|
92
|
+
"a",
|
93
|
+
"b"
|
94
94
|
],
|
95
|
-
"tests"
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
95
|
+
"tests": {
|
96
|
+
":foo": ":bar",
|
97
|
+
"test": [
|
98
|
+
[
|
99
|
+
1,
|
100
|
+
2
|
101
101
|
],
|
102
|
-
|
102
|
+
2.123
|
103
103
|
]
|
104
104
|
}
|
105
105
|
}
|
@@ -109,69 +109,204 @@ STR
|
|
109
109
|
end
|
110
110
|
|
111
111
|
|
112
|
-
def
|
112
|
+
def test_ordered_data_string_struct_json
|
113
113
|
expected = <<STR
|
114
114
|
{
|
115
|
-
"acks"
|
116
|
-
|
117
|
-
|
118
|
-
|
115
|
+
"acks": [
|
116
|
+
[
|
117
|
+
"Fixnum",
|
118
|
+
"Fixnum"
|
119
119
|
],
|
120
|
-
|
121
|
-
|
122
|
-
|
120
|
+
[
|
121
|
+
"String",
|
122
|
+
"String"
|
123
123
|
]
|
124
124
|
],
|
125
|
-
"root"
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
"root": [
|
126
|
+
[
|
127
|
+
"String",
|
128
|
+
"String"
|
129
129
|
],
|
130
|
-
|
131
|
-
|
132
|
-
|
130
|
+
[
|
131
|
+
"String",
|
132
|
+
"String"
|
133
|
+
],
|
134
|
+
[
|
135
|
+
"String",
|
136
|
+
"String",
|
137
|
+
[
|
138
|
+
"String",
|
139
|
+
"String"
|
140
|
+
]
|
141
|
+
],
|
142
|
+
{
|
143
|
+
":tests": [
|
144
|
+
"String",
|
145
|
+
"String"
|
146
|
+
],
|
147
|
+
"test": [
|
148
|
+
[
|
149
|
+
"String",
|
150
|
+
"String"
|
151
|
+
],
|
152
|
+
"String"
|
153
|
+
]
|
154
|
+
}
|
155
|
+
],
|
156
|
+
"subs": [
|
157
|
+
"String",
|
158
|
+
"String"
|
159
|
+
],
|
160
|
+
"tests": {
|
161
|
+
":foo": "Symbol",
|
162
|
+
"test": [
|
163
|
+
[
|
164
|
+
"Fixnum",
|
165
|
+
"Fixnum"
|
166
|
+
],
|
167
|
+
"Float"
|
168
|
+
]
|
169
|
+
}
|
170
|
+
}
|
171
|
+
STR
|
172
|
+
|
173
|
+
assert_equal expected.strip,
|
174
|
+
Kronk::Diff.ordered_data_string(mock_data, true)
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
def test_ordered_data_string_ruby
|
179
|
+
with_config :render_lang => 'ruby' do
|
180
|
+
expected = <<STR
|
181
|
+
{
|
182
|
+
"acks" => [
|
183
|
+
[
|
184
|
+
56,
|
185
|
+
78
|
186
|
+
],
|
187
|
+
[
|
188
|
+
"12",
|
189
|
+
"34"
|
190
|
+
]
|
191
|
+
],
|
192
|
+
"root" => [
|
193
|
+
[
|
194
|
+
"B1",
|
195
|
+
"B2"
|
196
|
+
],
|
197
|
+
[
|
198
|
+
"A1",
|
199
|
+
"A2"
|
200
|
+
],
|
201
|
+
[
|
202
|
+
"C1",
|
203
|
+
"C2",
|
204
|
+
[
|
205
|
+
"C3a",
|
206
|
+
"C3b"
|
207
|
+
]
|
208
|
+
],
|
209
|
+
{
|
210
|
+
:tests => [
|
211
|
+
"D3a",
|
212
|
+
"D3b"
|
213
|
+
],
|
214
|
+
"test" => [
|
215
|
+
[
|
216
|
+
"D1a\\nContent goes here",
|
217
|
+
"D1b"
|
218
|
+
],
|
219
|
+
"D2"
|
220
|
+
]
|
221
|
+
}
|
222
|
+
],
|
223
|
+
"subs" => [
|
224
|
+
"a",
|
225
|
+
"b"
|
226
|
+
],
|
227
|
+
"tests" => {
|
228
|
+
:foo => :bar,
|
229
|
+
"test" => [
|
230
|
+
[
|
231
|
+
1,
|
232
|
+
2
|
233
|
+
],
|
234
|
+
2.123
|
235
|
+
]
|
236
|
+
}
|
237
|
+
}
|
238
|
+
STR
|
239
|
+
|
240
|
+
assert_equal expected.strip, Kronk::Diff.ordered_data_string(mock_data)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
|
245
|
+
def test_ordered_data_string_struct_ruby
|
246
|
+
with_config :render_lang => 'ruby' do
|
247
|
+
expected = <<STR
|
248
|
+
{
|
249
|
+
"acks" => [
|
250
|
+
[
|
251
|
+
Fixnum,
|
252
|
+
Fixnum
|
133
253
|
],
|
134
|
-
[
|
135
|
-
String,
|
136
|
-
String,
|
137
254
|
[
|
138
255
|
String,
|
139
256
|
String
|
140
|
-
|
257
|
+
]
|
258
|
+
],
|
259
|
+
"root" => [
|
260
|
+
[
|
261
|
+
String,
|
262
|
+
String
|
141
263
|
],
|
142
|
-
|
143
|
-
:tests => [
|
264
|
+
[
|
144
265
|
String,
|
145
266
|
String
|
146
|
-
|
147
|
-
|
267
|
+
],
|
268
|
+
[
|
269
|
+
String,
|
270
|
+
String,
|
148
271
|
[
|
149
272
|
String,
|
150
273
|
String
|
274
|
+
]
|
275
|
+
],
|
276
|
+
{
|
277
|
+
:tests => [
|
278
|
+
String,
|
279
|
+
String
|
280
|
+
],
|
281
|
+
"test" => [
|
282
|
+
[
|
283
|
+
String,
|
284
|
+
String
|
151
285
|
],
|
152
|
-
|
286
|
+
String
|
153
287
|
]
|
154
288
|
}
|
155
289
|
],
|
156
|
-
"subs" => [
|
157
|
-
|
158
|
-
|
290
|
+
"subs" => [
|
291
|
+
String,
|
292
|
+
String
|
159
293
|
],
|
160
|
-
"tests" => {
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
294
|
+
"tests" => {
|
295
|
+
:foo => Symbol,
|
296
|
+
"test" => [
|
297
|
+
[
|
298
|
+
Fixnum,
|
299
|
+
Fixnum
|
166
300
|
],
|
167
|
-
|
301
|
+
Float
|
168
302
|
]
|
169
303
|
}
|
170
304
|
}
|
171
305
|
STR
|
172
306
|
|
173
|
-
|
174
|
-
|
307
|
+
assert_equal expected.strip,
|
308
|
+
Kronk::Diff.ordered_data_string(mock_data, true)
|
309
|
+
end
|
175
310
|
end
|
176
311
|
|
177
312
|
|
data/test/test_helper.rb
CHANGED
@@ -40,3 +40,143 @@ def mock_data
|
|
40
40
|
"subs"=>["a", "b"]
|
41
41
|
}
|
42
42
|
end
|
43
|
+
|
44
|
+
MOCK_REQUIRES = Hash.new 0
|
45
|
+
|
46
|
+
def mock_require str
|
47
|
+
MOCK_REQUIRES[str] += 1
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def clear_mock_require str
|
52
|
+
MOCK_REQUIRES.delete str
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
alias kernel_require require
|
57
|
+
def require str
|
58
|
+
if MOCK_REQUIRES[str] > 0
|
59
|
+
MOCK_REQUIRES[str] = MOCK_REQUIRES[str] - 1
|
60
|
+
return
|
61
|
+
end
|
62
|
+
kernel_require str
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def assert_require req, msg=nil
|
67
|
+
assert MOCK_REQUIRES.has_key?(req), msg || "Expected mock require '#{req}'"
|
68
|
+
assert_equal 0, MOCK_REQUIRES[req],
|
69
|
+
msg || "Expected require '#{req}' #{MOCK_REQUIRES[req]} more times"
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
$catch_exit = nil
|
74
|
+
alias kernel_exit exit
|
75
|
+
def exit status=true
|
76
|
+
if $catch_exit
|
77
|
+
throw :exited, status
|
78
|
+
end
|
79
|
+
kernel_exit status
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def assert_exit num=true
|
84
|
+
$catch_exit = true
|
85
|
+
status = catch :exited do
|
86
|
+
yield if block_given?
|
87
|
+
end
|
88
|
+
$catch_exit = false
|
89
|
+
|
90
|
+
assert_equal num,status,
|
91
|
+
"Expected exit status #{num.inspect} but got #{status.inspect}"
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
def expect_compare_output str1, str2=nil, opts={}
|
96
|
+
opts = str2 if opts.empty? && Hash === str2
|
97
|
+
str2 = str1 if !str2 || Hash === str2
|
98
|
+
tim = opts.delete(:times) || 1
|
99
|
+
|
100
|
+
kronk = Kronk.new opts
|
101
|
+
kronk.compare StringIO.new(str1), StringIO.new(str2)
|
102
|
+
|
103
|
+
$stdout.expects(:puts).with(kronk.diff.formatted).times(tim)
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
def expect_request_output str, opts={}
|
108
|
+
res = Kronk::Response.new str
|
109
|
+
tim = opts.delete(:times) || 1
|
110
|
+
$stdout.expects(:puts).with(res.stringify opts).times(tim)
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
def expect_error_output str
|
115
|
+
$stderr.expects(:puts).with "\nError: #{str}"
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
IRB = Module.new
|
120
|
+
def with_irb_mock
|
121
|
+
mock_require "irb"
|
122
|
+
|
123
|
+
$stdout.expects(:puts).with "\nHTTP Response is in $http_response"
|
124
|
+
$stdout.expects(:puts).with "Response data is in $response\n\n"
|
125
|
+
::IRB.expects :start
|
126
|
+
|
127
|
+
yield
|
128
|
+
|
129
|
+
$http_response = nil
|
130
|
+
$response = nil
|
131
|
+
clear_mock_require 'irb'
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
def with_config config={}
|
136
|
+
old_conf = Kronk.config
|
137
|
+
Kronk.instance_variable_set "@config", Kronk.config.merge(config)
|
138
|
+
yield
|
139
|
+
|
140
|
+
ensure
|
141
|
+
Kronk.instance_variable_set "@config", old_conf
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
def expect_request req_method, url, options={}
|
146
|
+
uri = URI.parse url
|
147
|
+
|
148
|
+
resp = Kronk::Response.new(options[:returns] || mock_200_response)
|
149
|
+
resp.stubs(:code).returns(options[:status] || '200')
|
150
|
+
|
151
|
+
http = mock 'http'
|
152
|
+
socket = mock 'socket'
|
153
|
+
req = mock 'req'
|
154
|
+
res = mock 'res'
|
155
|
+
|
156
|
+
res.stubs(:to_hash).returns Hash.new
|
157
|
+
|
158
|
+
data = options[:data]
|
159
|
+
data &&= Hash === data ? Kronk::Request.build_query(data) : data.to_s
|
160
|
+
|
161
|
+
headers = options[:headers] || Hash.new
|
162
|
+
headers['User-Agent'] ||= Kronk.config[:user_agents]['kronk']
|
163
|
+
|
164
|
+
req.expects(:start).yields(http).returns res
|
165
|
+
|
166
|
+
http.expects(:instance_variable_get).with("@socket").returns socket
|
167
|
+
|
168
|
+
socket.expects(:debug_output=)
|
169
|
+
|
170
|
+
Kronk::Request::VanillaRequest.expects(:new).
|
171
|
+
with(req_method.to_s.upcase, uri.request_uri, headers).returns req
|
172
|
+
|
173
|
+
Net::HTTP.expects(:new).with(uri.host, uri.port).returns req
|
174
|
+
|
175
|
+
http.expects(:request).with(req, data).returns res
|
176
|
+
|
177
|
+
Kronk::Response.expects(:new).returns resp
|
178
|
+
|
179
|
+
yield http, req, resp if block_given?
|
180
|
+
|
181
|
+
resp
|
182
|
+
end
|