bigbench 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/README.textile +60 -22
  2. data/Rakefile +7 -0
  3. data/bigbench.gemspec +5 -0
  4. data/dev/net_http.rb +78 -0
  5. data/dev/test.rb +13 -0
  6. data/dev/tracking.rb +49 -0
  7. data/doc/BigBench.html +22 -17
  8. data/doc/BigBench/Benchmark.html +12 -8
  9. data/doc/BigBench/Benchmark/Benchmark.html +17 -27
  10. data/doc/BigBench/Benchmark/Looper.html +340 -0
  11. data/doc/BigBench/Bot.html +4 -2
  12. data/doc/BigBench/Configuration.html +20 -11
  13. data/doc/BigBench/Configuration/Config.html +23 -8
  14. data/doc/BigBench/Configuration/InvalidOptions.html +5 -3
  15. data/doc/BigBench/Executor.html +4 -2
  16. data/doc/BigBench/Executor/InvalidCommand.html +4 -2
  17. data/doc/BigBench/Fragment.html +46 -29
  18. data/doc/BigBench/Fragment/Fragment.html +18 -28
  19. data/doc/BigBench/Output.html +4 -2
  20. data/doc/BigBench/Runner.html +12 -9
  21. data/doc/BigBench/Runner/NoBenchmarksDefined.html +4 -2
  22. data/doc/BigBench/Store.html +4 -2
  23. data/doc/BigBench/Tracker.html +4 -2
  24. data/doc/BigBench/Tracker/Tracker.html +5 -3
  25. data/doc/EventMachineLoop.html +296 -0
  26. data/doc/Float.html +4 -2
  27. data/doc/Gemfile.html +4 -2
  28. data/doc/Helpers.html +4 -2
  29. data/doc/Object.html +87 -2
  30. data/doc/Rakefile.html +10 -3
  31. data/doc/created.rid +36 -31
  32. data/doc/index.html +4 -2
  33. data/doc/js/search_index.js +1 -1
  34. data/doc/lib/bigbench/help/executor_txt.html +4 -2
  35. data/doc/table_of_contents.html +31 -16
  36. data/lib/bigbench.rb +3 -0
  37. data/lib/bigbench/benchmark.rb +11 -21
  38. data/lib/bigbench/benchmark/looper.rb +43 -0
  39. data/lib/bigbench/configuration.rb +17 -10
  40. data/lib/bigbench/fragment.rb +47 -34
  41. data/lib/bigbench/runner.rb +8 -7
  42. data/lib/bigbench/tracker.rb +3 -3
  43. data/lib/bigbench/version.rb +1 -1
  44. data/spec/benchmark_spec.rb +14 -7
  45. data/spec/configure_spec.rb +3 -3
  46. data/spec/fragment_spec.rb +186 -24
  47. data/spec/helpers.rb +2 -4
  48. data/spec/lib/test_web_server.rb +44 -15
  49. data/spec/looper_spec.rb +47 -0
  50. data/spec/tests/local.rb +1 -1
  51. data/spec/webserver_spec.rb +91 -21
  52. metadata +77 -15
@@ -30,7 +30,7 @@ describe BigBench::Fragment do
30
30
  fragments.size.should == 1
31
31
  fragments.first.uri.to_s.should == "http://localhost:3001/"
32
32
  fragments.first.method.should == :get
33
- fragments.first.params.should == {}
33
+ fragments.first.options.should == {}
34
34
  end
35
35
 
36
36
  it "POST" do
@@ -38,7 +38,7 @@ describe BigBench::Fragment do
38
38
  fragments.size.should == 1
39
39
  fragments.first.uri.to_s.should == "http://localhost:3001/login"
40
40
  fragments.first.method.should == :post
41
- fragments.first.params.should == { :user => "tommy@test.com", :password => "secret" }
41
+ fragments.first.options.should == { :user => "tommy@test.com", :password => "secret" }
42
42
  end
43
43
 
44
44
  it "PUT" do
@@ -46,7 +46,7 @@ describe BigBench::Fragment do
46
46
  fragments.size.should == 1
47
47
  fragments.first.uri.to_s.should == "http://localhost:3001/books"
48
48
  fragments.first.method.should == :put
49
- fragments.first.params.should == { :book => "A Book" }
49
+ fragments.first.options.should == { :book => "A Book" }
50
50
  end
51
51
 
52
52
  it "DELETE" do
@@ -54,7 +54,7 @@ describe BigBench::Fragment do
54
54
  fragments.size.should == 1
55
55
  fragments.first.uri.to_s.should == "http://localhost:3001/books/5"
56
56
  fragments.first.method.should == :delete
57
- fragments.first.params.should == { :user => "tommy@test.com", :password => "secret" }
57
+ fragments.first.options.should == { :user => "tommy@test.com", :password => "secret" }
58
58
  end
59
59
 
60
60
  end
@@ -64,45 +64,207 @@ describe BigBench::Fragment do
64
64
  it "GET" do
65
65
  fragment = BigBench::Fragment.parse(@benchmark){ get "/" }.first
66
66
  result = nil
67
- Net::HTTP.start(fragment.uri.host, fragment.uri.port) do |http|
68
- result = fragment.run!(http)
69
- end
70
- result.code.to_i.should == 200
71
- result.body.should == "Test"
67
+
68
+ EventMachine.run { |http|
69
+ start = Time.now
70
+ http = fragment.run!
71
+
72
+ http.callback {
73
+ fragment.track!(start, Time.now, http)
74
+ http.response_header.status.should == 200
75
+ http.response.should match(/Test/)
76
+ EventMachine.stop
77
+ }
78
+
79
+ http.errback { puts "Error"; EventMachine.stop }
80
+ }
81
+
72
82
  @benchmark.tracker.trackings.size.should == 1
73
83
  end
74
84
 
75
85
  it "POST" do
76
86
  fragment = BigBench::Fragment.parse(@benchmark){ post "/" }.first
77
87
  result = nil
78
- Net::HTTP.start(fragment.uri.host, fragment.uri.port) do |http|
79
- result = fragment.run!(http)
80
- end
81
- result.code.to_i.should == 200
82
- result.body.should == "Test"
88
+
89
+ EventMachine.run { |http|
90
+ start = Time.now
91
+ http = fragment.run!
92
+
93
+ http.callback {
94
+ fragment.track!(start, Time.now, http)
95
+ http.response_header.status.should == 200
96
+ http.response.should match(/Test/)
97
+ EventMachine.stop
98
+ }
99
+
100
+ http.errback { puts "Error"; EventMachine.stop }
101
+ }
102
+
83
103
  @benchmark.tracker.trackings.size.should == 1
84
104
  end
85
105
 
86
106
  it "PUT" do
87
107
  fragment = BigBench::Fragment.parse(@benchmark){ put "/" }.first
88
108
  result = nil
89
- Net::HTTP.start(fragment.uri.host, fragment.uri.port) do |http|
90
- result = fragment.run!(http)
91
- end
92
- result.code.to_i.should == 200
93
- result.body.should == "Test"
109
+
110
+ EventMachine.run { |http|
111
+ start = Time.now
112
+ http = fragment.run!
113
+
114
+ http.callback {
115
+ fragment.track!(start, Time.now, http)
116
+ http.response_header.status.should == 200
117
+ http.response.should match(/Test/)
118
+ EventMachine.stop
119
+ }
120
+
121
+ http.errback { puts "Error"; EventMachine.stop }
122
+ }
123
+
94
124
  @benchmark.tracker.trackings.size.should == 1
95
125
  end
96
126
 
97
127
  it "DELETE" do
98
128
  fragment = BigBench::Fragment.parse(@benchmark){ delete "/" }.first
99
129
  result = nil
100
- Net::HTTP.start(fragment.uri.host, fragment.uri.port) do |http|
101
- result = fragment.run!(http)
102
- end
103
- result.code.to_i.should == 200
104
- result.body.should == "Test"
130
+
131
+ EventMachine.run { |http|
132
+ start = Time.now
133
+ http = fragment.run!
134
+
135
+ http.callback {
136
+ fragment.track!(start, Time.now, http)
137
+ http.response_header.status.should == 200
138
+ http.response.should match(/Test/)
139
+ EventMachine.stop
140
+ }
141
+
142
+ http.errback { puts "Error"; EventMachine.stop }
143
+ }
144
+
145
+ @benchmark.tracker.trackings.size.should == 1
146
+ end
147
+
148
+ end
149
+
150
+ context "should run basic auth fragments" do
151
+
152
+ it "and track a 401 if no authorization was provided" do
153
+ fragment = BigBench::Fragment.parse(@benchmark){ get "/basic/auth" }.first
154
+ result = nil
155
+
156
+ EventMachine.run { |http|
157
+ start = Time.now
158
+ http = fragment.run!
159
+
160
+ http.callback {
161
+ fragment.track!(start, Time.now, http)
162
+ http.response_header.status.should == 401
163
+ EventMachine.stop
164
+ }
165
+
166
+ http.errback { puts "Error"; EventMachine.stop }
167
+ }
168
+
169
+ @benchmark.tracker.trackings.size.should == 1
170
+ @benchmark.tracker.trackings.first[:status] == 401
171
+ end
172
+
173
+ it "and work with fragment authorization" do
174
+ fragment = BigBench::Fragment.parse(@benchmark){
175
+ get "/basic/auth", :basic_auth => ['admin', 'secret']
176
+ }.first
177
+ result = nil
178
+
179
+ EventMachine.run { |http|
180
+ start = Time.now
181
+ http = fragment.run!
182
+
183
+ http.callback {
184
+ fragment.track!(start, Time.now, http)
185
+ http.response_header.status.should == 200
186
+ http.response.should match(/Test/)
187
+ EventMachine.stop
188
+ }
189
+
190
+ http.errback { puts "Error"; EventMachine.stop }
191
+ }
192
+
193
+ @benchmark.tracker.trackings.size.should == 1
194
+ @benchmark.tracker.trackings.first[:status] == 200
195
+ end
196
+
197
+ it "and work with config authorization" do
198
+ BigBench.config.basic_auth = ['admin', 'secret']
199
+ fragment = BigBench::Fragment.parse(@benchmark){
200
+ get "/basic/auth"
201
+ }.first
202
+ result = nil
203
+
204
+ EventMachine.run { |http|
205
+ start = Time.now
206
+ http = fragment.run!
207
+
208
+ http.callback {
209
+ fragment.track!(start, Time.now, http)
210
+ http.response_header.status.should == 200
211
+ http.response.should match(/Test/)
212
+ EventMachine.stop
213
+ }
214
+
215
+ http.errback { puts "Error"; EventMachine.stop }
216
+ }
217
+
218
+ @benchmark.tracker.trackings.size.should == 1
219
+ @benchmark.tracker.trackings.first[:status] == 200
220
+ end
221
+ end
222
+
223
+ context "should send params in body" do
224
+
225
+ it "and track a 406 if no params were provided" do
226
+ fragment = BigBench::Fragment.parse(@benchmark){ post "/post/content" }.first
227
+ result = nil
228
+
229
+ EventMachine.run { |http|
230
+ start = Time.now
231
+ http = fragment.run!
232
+
233
+ http.callback {
234
+ fragment.track!(start, Time.now, http)
235
+ http.response_header.status.should == 406
236
+ EventMachine.stop
237
+ }
238
+
239
+ http.errback { puts "Error"; EventMachine.stop }
240
+ }
241
+
242
+ @benchmark.tracker.trackings.size.should == 1
243
+ @benchmark.tracker.trackings.first[:status] == 406
244
+ end
245
+
246
+ it "and work with params supplied" do
247
+ fragment = BigBench::Fragment.parse(@benchmark){
248
+ post "/post/content", :params => { :name => "bigbench", :id => 1 }
249
+ }.first
250
+ result = nil
251
+
252
+ EventMachine.run { |http|
253
+ start = Time.now
254
+ http = fragment.run!
255
+
256
+ http.callback {
257
+ fragment.track!(start, Time.now, http)
258
+ http.response_header.status.should == 200
259
+ http.response.should match(/Test/)
260
+ EventMachine.stop
261
+ }
262
+
263
+ http.errback { puts "Error"; EventMachine.stop }
264
+ }
265
+
105
266
  @benchmark.tracker.trackings.size.should == 1
267
+ @benchmark.tracker.trackings.first[:status] == 200
106
268
  end
107
269
 
108
270
  end
@@ -2,16 +2,14 @@ require 'bigbench'
2
2
  require 'rack'
3
3
  require 'active_support/all'
4
4
  require 'net/http'
5
- require 'thin'
6
- require 'lib/test_web_server'
5
+ require 'eventmachine'
6
+ require 'em-http'
7
7
 
8
8
  module Helpers
9
9
  end
10
10
 
11
11
  RSpec.configure do |config|
12
12
  config.include Helpers
13
- config.before(:all) { TestWebServer.start }
14
- config.after(:all) { TestWebServer.stop }
15
13
  config.before(:each) {
16
14
  BigBench::Configuration.reset!
17
15
  BigBench::Benchmark.reset!
@@ -1,18 +1,47 @@
1
- module TestWebServer
2
- mattr_accessor :server
3
-
4
- def self.start
5
- TestWebServer.server = Thread.new {
6
- app = proc { [200, {'Content-Type' => 'text/plain'}, ['Test']] }
7
- Rack::Handler::Thin.run(app,:Port => 3001)
8
- }
9
- puts "Starting Test Webserver"
10
- sleep 2
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+
4
+ set :port, 3001
5
+
6
+ helpers do
7
+ def protected!
8
+ unless authorized?
9
+ response['WWW-Authenticate'] = %(Basic realm="BigBench TestWebServer")
10
+ throw(:halt, [401, "Not authorized\n"])
11
+ end
11
12
  end
12
-
13
- def self.stop
14
- Thread.kill(TestWebServer.server)
15
- puts "Stopping Test Webserver"
13
+
14
+ def authorized?
15
+ @auth ||= Rack::Auth::Basic::Request.new(request.env)
16
+ @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['admin', 'secret']
16
17
  end
17
-
18
+ end
19
+
20
+ # Base HTTP Verbs
21
+ get "/" do
22
+ "Test"
23
+ end
24
+
25
+ put "/" do
26
+ "Test"
27
+ end
28
+
29
+ post "/" do
30
+ "Test"
31
+ end
32
+
33
+ delete "/" do
34
+ "Test"
35
+ end
36
+
37
+ # Basic Auth URL
38
+ get "/basic/auth" do
39
+ protected!
40
+ "Test"
41
+ end
42
+
43
+ # Needs Body Params
44
+ post "/post/content" do
45
+ status 406 unless params[:name] == "bigbench" and params[:id] == "1"
46
+ "Test"
18
47
  end
@@ -0,0 +1,47 @@
1
+ require_relative "./helpers"
2
+
3
+ describe BigBench::Benchmark::Looper do
4
+
5
+ before(:each) do
6
+ @benchmark = BigBench::Benchmark::Benchmark.new("a test benchmark", "http://localhost:3001", {}) do
7
+ get "/"
8
+ get "/logout"
9
+ end
10
+ @benchmark.start = Time.now
11
+ end
12
+
13
+ it "should get the next fragment" do
14
+ looper = BigBench::Benchmark::Looper.new(@benchmark)
15
+ looper.next_fragment.path.should == "/"
16
+ looper.next_fragment.path.should == "/logout"
17
+ looper.next_fragment.path.should == "/"
18
+ looper.next_fragment.path.should == "/logout"
19
+ looper.next_fragment.path.should == "/"
20
+ looper.next_fragment.path.should == "/logout"
21
+ end
22
+
23
+ it "should do nothing if benchmark is not running" do
24
+ looper = BigBench::Benchmark::Looper.new(@benchmark)
25
+ looper.loop!
26
+
27
+ looper.loops.should == 0
28
+ end
29
+
30
+
31
+ it "should loop through the fragments as long as the benchmark is running" do
32
+ looper = BigBench::Benchmark::Looper.new(@benchmark)
33
+
34
+ EventMachine.run {
35
+
36
+ timer = Thread.new{ sleep(5); @benchmark.is_running = false; EventMachine.stop }
37
+ @benchmark.is_running = true
38
+ @benchmark.start = Time.now
39
+
40
+ looper.loop!
41
+ }
42
+
43
+ looper.loops.should > 1000
44
+ @benchmark.tracker.trackings.size.should == looper.loops
45
+ end
46
+
47
+ end
@@ -1,7 +1,7 @@
1
1
  BigBench.configure = {
2
2
  :duration => 1.seconds,
3
3
  :output => "spec/temp/local.ljson",
4
- :threads => 1
4
+ :users => 1
5
5
  }
6
6
 
7
7
  benchmark "index page" => "http://localhost:3001" do
@@ -1,34 +1,104 @@
1
1
  require_relative "./helpers"
2
2
 
3
- describe TestWebServer do
3
+ describe "TestWebServer" do
4
4
 
5
5
  it "should respond to mock GET requests" do
6
- uri = URI('http://localhost:3001/')
7
- Net::HTTP.start(uri.host, uri.port) do |http|
8
- request = Net::HTTP::Get.new(uri.request_uri)
9
- last_response = http.request(request)
10
- last_response.code.should == '200'
11
- last_response.body.should == 'Test'
12
- end
6
+ EventMachine.run {
7
+ http = EventMachine::HttpRequest.new('http://localhost:3001/').get
8
+
9
+ http.callback {
10
+ http.response_header.status.should == 200
11
+ http.response.should match(/Test/)
12
+ EventMachine.stop
13
+ }
14
+
15
+ http.errback { puts "Error"; EventMachine.stop }
16
+ }
13
17
  end
14
18
 
15
19
  it "should respond to mock POST requests" do
16
- uri = URI('http://localhost:3001/')
17
- Net::HTTP.start(uri.host, uri.port) do |http|
18
- request = Net::HTTP::Post.new(uri.request_uri)
19
- last_response = http.request(request)
20
- last_response.code.should == '200'
21
- last_response.body.should == 'Test'
22
- end
20
+ EventMachine.run {
21
+ http = EventMachine::HttpRequest.new('http://localhost:3001/').put
22
+
23
+ http.callback {
24
+ http.response_header.status.should == 200
25
+ http.response.should match(/Test/)
26
+ EventMachine.stop
27
+ }
28
+
29
+ http.errback { puts "Error"; EventMachine.stop }
30
+ }
23
31
  end
24
32
 
25
33
  it "should respond to mock PUT requests" do
26
- uri = URI('http://localhost:3001/')
27
- Net::HTTP.start(uri.host, uri.port) do |http|
28
- request = Net::HTTP::Put.new(uri.request_uri)
29
- last_response = http.request(request)
30
- last_response.code.should == '200'
31
- last_response.body.should == 'Test'
34
+ EventMachine.run {
35
+ http = EventMachine::HttpRequest.new('http://localhost:3001/').post
36
+
37
+ http.callback {
38
+ http.response_header.status.should == 200
39
+ http.response.should match(/Test/)
40
+ EventMachine.stop
41
+ }
42
+
43
+ http.errback { puts "Error"; EventMachine.stop }
44
+ }
45
+ end
46
+
47
+ context "should need basic auth" do
48
+ it "and fail without basic auth credentials" do
49
+ EventMachine.run {
50
+ http = EventMachine::HttpRequest.new('http://localhost:3001/basic/auth').get
51
+
52
+ http.callback {
53
+ http.response_header.status.should == 401
54
+ EventMachine.stop
55
+ }
56
+
57
+ http.errback { puts "Error"; EventMachine.stop }
58
+ }
59
+ end
60
+
61
+ it "and work with basic auth supplied" do
62
+ EventMachine.run {
63
+ http = EventMachine::HttpRequest.new('http://localhost:3001/basic/auth').get :head => {'authorization' => ['admin', 'secret']}
64
+
65
+ http.callback {
66
+ http.response_header.status.should == 200
67
+ http.response.should match(/Test/)
68
+ EventMachine.stop
69
+ }
70
+
71
+ http.errback { puts "Error"; EventMachine.stop }
72
+ }
73
+ end
74
+ end
75
+
76
+ context "should need a body" do
77
+ it "and fail without the right params set" do
78
+ EventMachine.run {
79
+ http = EventMachine::HttpRequest.new('http://localhost:3001/post/content').post
80
+
81
+ http.callback {
82
+ http.response_header.status.should == 406
83
+ EventMachine.stop
84
+ }
85
+
86
+ http.errback { puts "Error"; EventMachine.stop }
87
+ }
88
+ end
89
+
90
+ it "and work with params set" do
91
+ EventMachine.run {
92
+ http = EventMachine::HttpRequest.new('http://localhost:3001/post/content').post :body => { :name => "bigbench", :id => 1 }
93
+
94
+ http.callback {
95
+ http.response_header.status.should == 200
96
+ http.response.should match(/Test/)
97
+ EventMachine.stop
98
+ }
99
+
100
+ http.errback { puts "Error"; EventMachine.stop }
101
+ }
32
102
  end
33
103
  end
34
104