rfuzz 0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +55 -0
- data/LICENSE +55 -0
- data/README +252 -0
- data/Rakefile +48 -0
- data/doc/rdoc/classes/RFuzz.html +146 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.html +481 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000010.html +24 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000011.html +34 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000012.html +49 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000013.html +49 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000014.html +57 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000015.html +37 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000016.html +26 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000017.html +34 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000018.html +18 -0
- data/doc/rdoc/classes/RFuzz/HttpClient.src/M000019.html +26 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.html +294 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000001.html +26 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000002.html +18 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000003.html +26 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000004.html +18 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000005.html +32 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000006.html +18 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000007.html +20 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000008.html +20 -0
- data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000009.html +32 -0
- data/doc/rdoc/classes/RFuzz/HttpResponse.html +180 -0
- data/doc/rdoc/classes/RFuzz/Notifier.html +252 -0
- data/doc/rdoc/classes/RFuzz/Notifier.src/M000044.html +17 -0
- data/doc/rdoc/classes/RFuzz/Notifier.src/M000045.html +17 -0
- data/doc/rdoc/classes/RFuzz/Notifier.src/M000046.html +17 -0
- data/doc/rdoc/classes/RFuzz/Notifier.src/M000047.html +17 -0
- data/doc/rdoc/classes/RFuzz/Notifier.src/M000048.html +17 -0
- data/doc/rdoc/classes/RFuzz/Notifier.src/M000049.html +17 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.html +362 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000032.html +21 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000033.html +23 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000036.html +22 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000037.html +20 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000038.html +22 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000039.html +20 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000040.html +18 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000041.html +18 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000042.html +22 -0
- data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000043.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.html +383 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000056.html +19 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000057.html +23 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000058.html +26 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000059.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000060.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000061.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000062.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000063.html +19 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000064.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000065.html +23 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000066.html +18 -0
- data/doc/rdoc/classes/RFuzz/Sampler.src/M000067.html +20 -0
- data/doc/rdoc/classes/RFuzz/Session.html +415 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000020.html +31 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000021.html +18 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000022.html +18 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000023.html +34 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000024.html +19 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000025.html +19 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000026.html +26 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000027.html +29 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000028.html +19 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000029.html +18 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000030.html +18 -0
- data/doc/rdoc/classes/RFuzz/Session.src/M000031.html +23 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.html +242 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000050.html +19 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000051.html +19 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000052.html +18 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000053.html +18 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000054.html +28 -0
- data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000055.html +18 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/COPYING.html +168 -0
- data/doc/rdoc/files/LICENSE.html +168 -0
- data/doc/rdoc/files/README.html +473 -0
- data/doc/rdoc/files/lib/rfuzz/client_rb.html +111 -0
- data/doc/rdoc/files/lib/rfuzz/random_rb.html +116 -0
- data/doc/rdoc/files/lib/rfuzz/rfuzz_rb.html +109 -0
- data/doc/rdoc/files/lib/rfuzz/session_rb.html +111 -0
- data/doc/rdoc/files/lib/rfuzz/stats_rb.html +113 -0
- data/doc/rdoc/fr_class_index.html +35 -0
- data/doc/rdoc/fr_file_index.html +34 -0
- data/doc/rdoc/fr_method_index.html +93 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/examples/amazon_headers.rb +38 -0
- data/examples/hpricot_pudding.rb +22 -0
- data/examples/kill_routes.rb +26 -0
- data/examples/mongrel_test_suite/lib/gen.rb +24 -0
- data/examples/mongrel_test_suite/test/camping/static_files.rb +9 -0
- data/examples/mongrel_test_suite/test/camping/upload_file.rb +9 -0
- data/examples/mongrel_test_suite/test/camping/upload_progress.rb +9 -0
- data/examples/mongrel_test_suite/test/http/base_protocol.rb +23 -0
- data/examples/mongrel_test_suite/test/nitro/upload_file.rb +9 -0
- data/examples/mongrel_test_suite/test/nitro/upload_progress.rb +9 -0
- data/examples/mongrel_test_suite/test/rails/static_files.rb +9 -0
- data/examples/mongrel_test_suite/test/rails/upload_file.rb +9 -0
- data/examples/mongrel_test_suite/test/rails/upload_progress.rb +9 -0
- data/examples/perftest.rb +30 -0
- data/ext/fuzzrnd/ext_help.h +14 -0
- data/ext/fuzzrnd/extconf.rb +6 -0
- data/ext/fuzzrnd/fuzzrnd.c +149 -0
- data/ext/http11_client/ext_help.h +14 -0
- data/ext/http11_client/extconf.rb +6 -0
- data/ext/http11_client/http11_client.c +288 -0
- data/ext/http11_client/http11_parser.c +629 -0
- data/ext/http11_client/http11_parser.h +46 -0
- data/ext/http11_client/http11_parser.rl +169 -0
- data/lib/rfuzz/client.rb +498 -0
- data/lib/rfuzz/random.rb +110 -0
- data/lib/rfuzz/rfuzz.rb +12 -0
- data/lib/rfuzz/session.rb +154 -0
- data/lib/rfuzz/stats.rb +159 -0
- data/resources/defaults.yaml +2 -0
- data/resources/words.txt +3310 -0
- data/test/coverage/index.html +388 -0
- data/test/coverage/lib-rfuzz-client_rb.html +1127 -0
- data/test/coverage/lib-rfuzz-random_rb.html +739 -0
- data/test/coverage/lib-rfuzz-session_rb.html +783 -0
- data/test/coverage/lib-rfuzz-stats_rb.html +788 -0
- data/test/server.rb +101 -0
- data/test/test_client.rb +164 -0
- data/test/test_fuzzrnd.rb +31 -0
- data/test/test_httpparser.rb +48 -0
- data/test/test_random.rb +75 -0
- data/test/test_session.rb +33 -0
- data/test/test_stats.rb +45 -0
- data/tools/rakehelp.rb +119 -0
- metadata +201 -0
data/test/server.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mongrel'
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'rfuzz/random'
|
5
|
+
|
6
|
+
$cookies_count = 0
|
7
|
+
|
8
|
+
class CookieHandler < Mongrel::HttpHandler
|
9
|
+
def process(request, response)
|
10
|
+
if request.params["HTTP_COOKIE"]
|
11
|
+
$cookies_count += 1
|
12
|
+
end
|
13
|
+
|
14
|
+
response.start do |head,out|
|
15
|
+
head["Set-Cookie"] = "_session_id=ASDFADSFASDFADSFADSFDSAFADSF"
|
16
|
+
out.write("test")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns one of three things to the client as the response body depending
|
22
|
+
# on what the client sends:
|
23
|
+
# * the body if larger than 0
|
24
|
+
# * the HTTP_X_TESTSEND if that's given
|
25
|
+
# * the REQUEST_METHOD if nothing else
|
26
|
+
class TestHandler < Mongrel::HttpHandler
|
27
|
+
def process(request, response)
|
28
|
+
response.start do |head,out|
|
29
|
+
head["Content-Type"] = "text/html"
|
30
|
+
if request.body.length > 0
|
31
|
+
out.write(request.body.read)
|
32
|
+
elsif request.params["HTTP_X_TESTSEND"]
|
33
|
+
out.write(request.params["HTTP_X_TESTSEND"])
|
34
|
+
else
|
35
|
+
out.write(request.params["REQUEST_METHOD"])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# Returns a test chunked encoding with @random size chunks and then
|
43
|
+
# sets the X-Real-Length header to what the resulting body should be,
|
44
|
+
# and X-MD5-Sum to the hash that should result.
|
45
|
+
class ChunkedHandler < Mongrel::HttpHandler
|
46
|
+
def process(request, response)
|
47
|
+
response.start do |head,out|
|
48
|
+
head['Transfer-Encoding'] = "chunked"
|
49
|
+
|
50
|
+
chunks = []
|
51
|
+
@rand = RFuzz::RandomGenerator.new(open("resources/words.txt").read.split("\n"))
|
52
|
+
(@rand.num(20)+10).times {
|
53
|
+
chunks << @rand.base64(@rand.num(60)+10).join('')
|
54
|
+
}
|
55
|
+
|
56
|
+
result_body = chunks.join('')
|
57
|
+
head['X-Real-Length'] = result_body.length
|
58
|
+
head['X-MD5-Sum'] = Digest::MD5.new(result_body)
|
59
|
+
|
60
|
+
chunks.each_with_index {|c,i|
|
61
|
+
# chunk header
|
62
|
+
out.write("#{c.length.to_s(base=16)}#{random_chunk_header}\r\n")
|
63
|
+
out.write(c)
|
64
|
+
out.write("\r\n")
|
65
|
+
}
|
66
|
+
|
67
|
+
case @rand.num(4)
|
68
|
+
when 0
|
69
|
+
out.write("0\r\n")
|
70
|
+
when 1
|
71
|
+
out.write("\r\n")
|
72
|
+
when 2
|
73
|
+
out.write("0\r\n#{@random_chunk_header}")
|
74
|
+
when 3
|
75
|
+
out.write("\r\n#{@random_chunk_header}")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def random_chunk_header
|
81
|
+
if @rand.num(1) == 0
|
82
|
+
hash = @rand.hash_of(1,5,:words)[0]
|
83
|
+
hash.collect {|k,v| ";#{k}=#{v}"}
|
84
|
+
else
|
85
|
+
""
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
config = Mongrel::Configurator.new :host => "127.0.0.1", :port => "3001" do
|
91
|
+
listener do
|
92
|
+
uri "/cookies", :handler => CookieHandler.new
|
93
|
+
uri "/test", :handler => TestHandler.new
|
94
|
+
uri "/chunked", :handler => ChunkedHandler.new
|
95
|
+
uri "/error404", :handler => Mongrel::Error404Handler.new("file missing")
|
96
|
+
redirect "/redir", "/test"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
$server = Thread.new { config.run; config.join }
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
|
2
|
+
# Copyright (c) 2006 Zed A. Shaw
|
3
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'rfuzz/client'
|
7
|
+
load 'test/server.rb'
|
8
|
+
require 'digest/md5'
|
9
|
+
|
10
|
+
include RFuzz
|
11
|
+
|
12
|
+
class TestNotifier < Notifier
|
13
|
+
attr_reader :event_count
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@event_count = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def connect(state)
|
20
|
+
@event_count += 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def send_request(state)
|
24
|
+
@event_count += 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def read_header(state)
|
28
|
+
@event_count += 1
|
29
|
+
end
|
30
|
+
|
31
|
+
def read_body(state)
|
32
|
+
@event_count += 1
|
33
|
+
end
|
34
|
+
|
35
|
+
def close(state)
|
36
|
+
@event_count += 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class RFuzzClientTest < Test::Unit::TestCase
|
41
|
+
|
42
|
+
def setup
|
43
|
+
@port = 3001
|
44
|
+
@host = "127.0.0.1"
|
45
|
+
@client = HttpClient.new(@host, @port, :redirect => 10)
|
46
|
+
end
|
47
|
+
|
48
|
+
def tearDown
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_cookies
|
52
|
+
cl = HttpClient.new(@host, @port)
|
53
|
+
cl.get("/cookies")
|
54
|
+
assert cl.cookies["_session_id"]
|
55
|
+
assert_equal 0, $cookies_count
|
56
|
+
cl.get("/cookies")
|
57
|
+
assert cl.cookies["_session_id"]
|
58
|
+
assert_equal 1, $cookies_count
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_get
|
62
|
+
resp = @client.get("/test/get")
|
63
|
+
assert_method "GET", resp
|
64
|
+
resp = @client.get("/test/get/query", :query => {"q" => "test"}, :head => { "X-TestSend" => "Status"})
|
65
|
+
assert_header("Status", resp)
|
66
|
+
resp = @client.get("/test/get/query/header",
|
67
|
+
:query => {"q" => "test", "a" => [1,2,3]},
|
68
|
+
:head => { "X-TestSend" => "Status"})
|
69
|
+
assert_header("Status", resp)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_redirect
|
73
|
+
resp = @client.get("/redir")
|
74
|
+
assert_equal "200", resp.http_status, "wrong status"
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_post
|
78
|
+
resp = @client.post("/test/post")
|
79
|
+
assert_method "POST", resp
|
80
|
+
resp = @client.post("/test/post/header", :head => {"X-TestSend" => "Status"}, :body => "TEST BODY")
|
81
|
+
assert_body "TEST BODY", resp
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_put
|
85
|
+
resp = @client.put("/test/put")
|
86
|
+
assert_method("PUT",resp)
|
87
|
+
resp = @client.put("/test/put/header", :head => {"X-TestSend" => "Status"})
|
88
|
+
assert_header("Status", resp)
|
89
|
+
resp = @client.put("/test/put/header/multi", :head => {"X-TestSend" => ["Status", "AGAIN"]})
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_delete
|
93
|
+
resp = @client.delete("/test/delete")
|
94
|
+
assert_method("DELETE", resp)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_head
|
98
|
+
resp = @client.head("/test/head")
|
99
|
+
assert_method("HEAD", resp)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_status
|
103
|
+
resp = @client.get("/error404")
|
104
|
+
assert_status "404", resp
|
105
|
+
resp = @client.get("/test/200")
|
106
|
+
assert_status "200", resp
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_overrides
|
110
|
+
cl = HttpClient.new(@host, @port, :head => {"X-Override" => "Test"})
|
111
|
+
assert cl.options[:head], "missing override header"
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_allowed_methods
|
115
|
+
cl = HttpClient.new(@host, @port, :allowed_methods => [:nada])
|
116
|
+
assert_raises RuntimeError do
|
117
|
+
cl.get("/test/wrongmethod")
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
def test_notifier
|
123
|
+
cl = HttpClient.new(@host, @port, :notifier => TestNotifier.new)
|
124
|
+
cl.get("/test/notifier")
|
125
|
+
assert_equal 10, cl.notifier.event_count, "not all events fired"
|
126
|
+
|
127
|
+
# try to get notified about errors
|
128
|
+
assert_raises Errno::ECONNREFUSED do
|
129
|
+
cl = HttpClient.new(@host, "300", :notifier => TestNotifier.new)
|
130
|
+
cl.get("/test/notifier/fail")
|
131
|
+
end
|
132
|
+
|
133
|
+
assert_equal 2, cl.notifier.event_count, "not all events fired"
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
def test_chunked_encoding
|
138
|
+
50.times do
|
139
|
+
resp = @client.get("/chunked")
|
140
|
+
assert_equal resp["X_REAL_LENGTH"].to_i, resp.http_body.length
|
141
|
+
assert_equal resp["X_MD5_SUM"],Digest::MD5.new(resp.http_body).to_s
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
def assert_method(method, resp)
|
147
|
+
assert_equal method, resp.http_body
|
148
|
+
end
|
149
|
+
|
150
|
+
def assert_body(body, resp)
|
151
|
+
assert_equal body, resp.http_body
|
152
|
+
end
|
153
|
+
|
154
|
+
def assert_header(sent, resp)
|
155
|
+
assert_equal sent, resp.http_body
|
156
|
+
end
|
157
|
+
|
158
|
+
def assert_status(status, resp)
|
159
|
+
assert_equal status, resp.http_status
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2006 Zed A. Shaw
|
2
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'fuzzrnd'
|
6
|
+
|
7
|
+
include RFuzz
|
8
|
+
|
9
|
+
class FuzzRndTest < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def test_seed_data
|
12
|
+
fr = FuzzRnd.new("TEST SEED")
|
13
|
+
d1 = fr.data(100)
|
14
|
+
assert_equal 100, d1.length, "wrong length"
|
15
|
+
|
16
|
+
d2 = fr.seed("TEST SEED").data(100)
|
17
|
+
assert_equal 100, d2.length, "wrong length"
|
18
|
+
|
19
|
+
assert_equal d1,d2, "same keys should produce same random"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def test_gen_numbers
|
24
|
+
fr = FuzzRnd.new("TEST SEED")
|
25
|
+
ints = fr.data(100 * 4).unpack("N*")
|
26
|
+
assert_equal 100,ints.length, "didn't get 100 ints"
|
27
|
+
|
28
|
+
floats = fr.data(50 * 8).unpack("G*")
|
29
|
+
assert_equal 50,floats.length, "didn't get 50 floats"
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
# Copyright (c) 2006 Zed A. Shaw
|
3
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'http11_client'
|
7
|
+
require 'socket'
|
8
|
+
|
9
|
+
include RFuzz
|
10
|
+
|
11
|
+
class HttpClientParserTest < Test::Unit::TestCase
|
12
|
+
|
13
|
+
def test_parse_simple
|
14
|
+
parser = HttpClientParser.new
|
15
|
+
req = HttpResponse.new
|
16
|
+
http = "HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n01234567890123456789"
|
17
|
+
nread = parser.execute(req, http, 0)
|
18
|
+
assert_equal 39, nread, "Failed to parse the full HTTP request after #{nread}"
|
19
|
+
assert parser.finished?, "Parser didn't finish"
|
20
|
+
assert !parser.error?, "Parser had error"
|
21
|
+
assert nread == parser.nread, "Number read returned from execute does not match"
|
22
|
+
assert_equal "20", req["CONTENT_LENGTH"], "Wrong content length header"
|
23
|
+
parser.reset
|
24
|
+
assert parser.nread == 0, "Number read after reset should be 0"
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse(body, size, expect_req)
|
28
|
+
parser = HttpClientParser.new
|
29
|
+
req = HttpResponse.new
|
30
|
+
nread = parser.execute(req, body, 0)
|
31
|
+
assert_equal nread, body.length
|
32
|
+
assert !parser.error?
|
33
|
+
assert parser.finished?
|
34
|
+
|
35
|
+
# check data results
|
36
|
+
assert_equal size, req.http_chunk_size.to_i
|
37
|
+
expect_req.each {|k,v|assert_not_nil k; assert_equal req[k.upcase], v}
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_http_parser
|
41
|
+
parse "3;test=stuff;lone\r\n", 3, {"test" => "stuff", "lone" => ""}
|
42
|
+
parse "0\r\n",0,{}
|
43
|
+
parse "\r\n",0,{}
|
44
|
+
parse ";test;test2=test2\r\n",0,{"test" => "", "test2" => "test2"}
|
45
|
+
parse "0;test;test2=test2\r\n",0,{"test" => "", "test2" => "test2"}
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/test/test_random.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright (c) 2006 Zed A. Shaw
|
2
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'socket'
|
6
|
+
require 'rfuzz/random'
|
7
|
+
|
8
|
+
include RFuzz
|
9
|
+
|
10
|
+
class RandomGeneratorTest < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
@rand = RandomGenerator.new(open("resources/words.txt").read.split("\n"))
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_headers
|
16
|
+
h = @rand.headers(20,10)
|
17
|
+
assert_equal 20,h.length, "wrong number of headers"
|
18
|
+
|
19
|
+
[:words,:base64,:uris,:byte_array,:ints,:floats].each do |t|
|
20
|
+
h = @rand.headers(20,10,type=t)
|
21
|
+
assert_equal 20,h.length
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_queries
|
27
|
+
q = @rand.queries(20,10)
|
28
|
+
assert_equal 20,q.length, "wrong number of queries"
|
29
|
+
|
30
|
+
[:base64,:uris,:byte_array,:ints,:floats].each do |t|
|
31
|
+
q = @rand.queries(20,10,type=t)
|
32
|
+
assert_equal 20,q.length
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_uris
|
38
|
+
u = @rand.uris(20, 10)
|
39
|
+
assert_equal 20,u.length,"wrong number of uris"
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_words
|
43
|
+
w = @rand.words(100)
|
44
|
+
assert_equal 100,w.length,"wrong number of words"
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_bytes
|
48
|
+
b = @rand.bytes(100)
|
49
|
+
assert_not_nil b
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_base64
|
53
|
+
b = @rand.base64(100,20)
|
54
|
+
assert_not_nil b
|
55
|
+
assert_equal 100,b.length
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_num
|
59
|
+
b1 = @rand.num(100)
|
60
|
+
assert_not_nil b1
|
61
|
+
assert b1 < 100, "returned by greater than 10"
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_ints
|
65
|
+
i = @rand.ints(100)
|
66
|
+
assert_equal 100, i.length, "wrong length"
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_floats
|
70
|
+
f = @rand.floats(100)
|
71
|
+
assert_equal 100, f.length, "wrong length"
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2006 Zed A. Shaw
|
2
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'rfuzz/session'
|
6
|
+
include RFuzz
|
7
|
+
|
8
|
+
class SessionTest < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_simple_session
|
11
|
+
s = Session.new :host => "localhost", :port => 3001
|
12
|
+
s.run 3, :save_as => ["test/runs.csv","test/counts.csv"] do |c,r|
|
13
|
+
len = r.num(10) + 1
|
14
|
+
s.count :len, len
|
15
|
+
uris = r.uris(10,len)
|
16
|
+
|
17
|
+
uris.each do |u|
|
18
|
+
s.count_errors(:legal) do
|
19
|
+
# first sample for legal uris
|
20
|
+
resp = c.get(u)
|
21
|
+
s.count resp.http_status
|
22
|
+
s.track :status, resp.http_status
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
assert_equal 3, s.tracking.length
|
28
|
+
assert File.exist?("test/runs.csv")
|
29
|
+
assert File.exist?("test/counts.csv")
|
30
|
+
File.unlink "test/counts.csv"
|
31
|
+
File.unlink "test/runs.csv"
|
32
|
+
end
|
33
|
+
end
|