ruby-jmeter 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/.gitattributes +22 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +27 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +333 -0
  7. data/Rakefile +6 -0
  8. data/bin/grid +25 -0
  9. data/examples/basic_assertion.rb +13 -0
  10. data/examples/basic_auth.rb +11 -0
  11. data/examples/basic_cache.rb +11 -0
  12. data/examples/basic_cookies.rb +11 -0
  13. data/examples/basic_extract.rb +10 -0
  14. data/examples/basic_gc_dummy_sampler.rb +10 -0
  15. data/examples/basic_gc_results.rb +23 -0
  16. data/examples/basic_google.rb +8 -0
  17. data/examples/basic_grid.rb +8 -0
  18. data/examples/basic_header.rb +19 -0
  19. data/examples/basic_ldap_ext.rb +16 -0
  20. data/examples/basic_post.rb +15 -0
  21. data/examples/basic_query_params.rb +8 -0
  22. data/examples/basic_think_time.rb +15 -0
  23. data/examples/basic_throughput_controller.rb +14 -0
  24. data/examples/basic_throughput_shaping_timer.rb +21 -0
  25. data/examples/etsy_login_browse.rb +64 -0
  26. data/lib/ruby-jmeter.rb +18 -0
  27. data/lib/ruby-jmeter/DSL.md +237 -0
  28. data/lib/ruby-jmeter/dsl.rb +419 -0
  29. data/lib/ruby-jmeter/dsl/access_log_sampler.rb +32 -0
  30. data/lib/ruby-jmeter/dsl/aggregate_graph.rb +55 -0
  31. data/lib/ruby-jmeter/dsl/aggregate_report.rb +55 -0
  32. data/lib/ruby-jmeter/dsl/ajp13_sampler.rb +41 -0
  33. data/lib/ruby-jmeter/dsl/assertion_results.rb +55 -0
  34. data/lib/ruby-jmeter/dsl/beanshell_assertion.rb +28 -0
  35. data/lib/ruby-jmeter/dsl/beanshell_listener.rb +28 -0
  36. data/lib/ruby-jmeter/dsl/beanshell_postprocessor.rb +28 -0
  37. data/lib/ruby-jmeter/dsl/beanshell_preprocessor.rb +28 -0
  38. data/lib/ruby-jmeter/dsl/beanshell_sampler.rb +28 -0
  39. data/lib/ruby-jmeter/dsl/beanshell_timer.rb +28 -0
  40. data/lib/ruby-jmeter/dsl/bsf_assertion.rb +28 -0
  41. data/lib/ruby-jmeter/dsl/bsf_listener.rb +28 -0
  42. data/lib/ruby-jmeter/dsl/bsf_postprocessor.rb +28 -0
  43. data/lib/ruby-jmeter/dsl/bsf_preprocessor.rb +28 -0
  44. data/lib/ruby-jmeter/dsl/bsf_sampler.rb +28 -0
  45. data/lib/ruby-jmeter/dsl/bsf_timer.rb +28 -0
  46. data/lib/ruby-jmeter/dsl/compare_assertion.rb +27 -0
  47. data/lib/ruby-jmeter/dsl/comparison_assertion_visualizer.rb +55 -0
  48. data/lib/ruby-jmeter/dsl/constant_throughput_timer.rb +30 -0
  49. data/lib/ruby-jmeter/dsl/constant_timer.rb +25 -0
  50. data/lib/ruby-jmeter/dsl/counter.rb +31 -0
  51. data/lib/ruby-jmeter/dsl/cssjquery_extractor.rb +30 -0
  52. data/lib/ruby-jmeter/dsl/csv_data_set_config.rb +32 -0
  53. data/lib/ruby-jmeter/dsl/debug_postprocessor.rb +28 -0
  54. data/lib/ruby-jmeter/dsl/debug_sampler.rb +27 -0
  55. data/lib/ruby-jmeter/dsl/distribution_graphalpha.rb +55 -0
  56. data/lib/ruby-jmeter/dsl/duration_assertion.rb +25 -0
  57. data/lib/ruby-jmeter/dsl/foreach_controller.rb +29 -0
  58. data/lib/ruby-jmeter/dsl/ftp_request.rb +34 -0
  59. data/lib/ruby-jmeter/dsl/ftp_request_defaults.rb +32 -0
  60. data/lib/ruby-jmeter/dsl/gaussian_random_timer.rb +26 -0
  61. data/lib/ruby-jmeter/dsl/generate_summary_results.rb +23 -0
  62. data/lib/ruby-jmeter/dsl/graph_results.rb +55 -0
  63. data/lib/ruby-jmeter/dsl/html_assertion.rb +30 -0
  64. data/lib/ruby-jmeter/dsl/html_link_parser.rb +23 -0
  65. data/lib/ruby-jmeter/dsl/html_parameter_mask.rb +32 -0
  66. data/lib/ruby-jmeter/dsl/http_authorization_manager.rb +33 -0
  67. data/lib/ruby-jmeter/dsl/http_cache_manager.rb +26 -0
  68. data/lib/ruby-jmeter/dsl/http_cookie_manager.rb +27 -0
  69. data/lib/ruby-jmeter/dsl/http_header_manager.rb +30 -0
  70. data/lib/ruby-jmeter/dsl/http_request.rb +41 -0
  71. data/lib/ruby-jmeter/dsl/http_request_defaults.rb +44 -0
  72. data/lib/ruby-jmeter/dsl/http_url_rewriting_modifier.rb +29 -0
  73. data/lib/ruby-jmeter/dsl/if_controller.rb +27 -0
  74. data/lib/ruby-jmeter/dsl/include_controller.rb +25 -0
  75. data/lib/ruby-jmeter/dsl/java_request.rb +69 -0
  76. data/lib/ruby-jmeter/dsl/java_request_defaults.rb +69 -0
  77. data/lib/ruby-jmeter/dsl/jdbc_connection_configuration.rb +37 -0
  78. data/lib/ruby-jmeter/dsl/jdbc_postprocessor.rb +31 -0
  79. data/lib/ruby-jmeter/dsl/jdbc_preprocessor.rb +31 -0
  80. data/lib/ruby-jmeter/dsl/jdbc_request.rb +31 -0
  81. data/lib/ruby-jmeter/dsl/jms_pointtopoint.rb +40 -0
  82. data/lib/ruby-jmeter/dsl/jms_publisher.rb +41 -0
  83. data/lib/ruby-jmeter/dsl/jms_subscriber.rb +35 -0
  84. data/lib/ruby-jmeter/dsl/jsr223_assertion.rb +29 -0
  85. data/lib/ruby-jmeter/dsl/jsr223_listener.rb +29 -0
  86. data/lib/ruby-jmeter/dsl/jsr223_postprocessor.rb +29 -0
  87. data/lib/ruby-jmeter/dsl/jsr223_preprocessor.rb +29 -0
  88. data/lib/ruby-jmeter/dsl/jsr223_sampler.rb +29 -0
  89. data/lib/ruby-jmeter/dsl/jsr223_timer.rb +29 -0
  90. data/lib/ruby-jmeter/dsl/junit_request.rb +37 -0
  91. data/lib/ruby-jmeter/dsl/keystore_configuration.rb +27 -0
  92. data/lib/ruby-jmeter/dsl/ldap_extended_request.rb +42 -0
  93. data/lib/ruby-jmeter/dsl/ldap_extended_request_defaults.rb +42 -0
  94. data/lib/ruby-jmeter/dsl/ldap_request.rb +35 -0
  95. data/lib/ruby-jmeter/dsl/ldap_request_defaults.rb +40 -0
  96. data/lib/ruby-jmeter/dsl/login_config_element.rb +26 -0
  97. data/lib/ruby-jmeter/dsl/loop_controller.rb +26 -0
  98. data/lib/ruby-jmeter/dsl/mail_reader_sampler.rb +37 -0
  99. data/lib/ruby-jmeter/dsl/mailer_visualizer.rb +64 -0
  100. data/lib/ruby-jmeter/dsl/md5hex_assertion.rb +25 -0
  101. data/lib/ruby-jmeter/dsl/module_controller.rb +23 -0
  102. data/lib/ruby-jmeter/dsl/monitor_results.rb +55 -0
  103. data/lib/ruby-jmeter/dsl/once_only_controller.rb +23 -0
  104. data/lib/ruby-jmeter/dsl/os_process_sampler.rb +34 -0
  105. data/lib/ruby-jmeter/dsl/poisson_random_timer.rb +26 -0
  106. data/lib/ruby-jmeter/dsl/random_controller.rb +25 -0
  107. data/lib/ruby-jmeter/dsl/random_order_controller.rb +23 -0
  108. data/lib/ruby-jmeter/dsl/random_variable.rb +30 -0
  109. data/lib/ruby-jmeter/dsl/recording_controller.rb +23 -0
  110. data/lib/ruby-jmeter/dsl/regex_user_parameters.rb +27 -0
  111. data/lib/ruby-jmeter/dsl/regular_expression_extractor.rb +31 -0
  112. data/lib/ruby-jmeter/dsl/response_assertion.rb +31 -0
  113. data/lib/ruby-jmeter/dsl/response_time_graph.rb +55 -0
  114. data/lib/ruby-jmeter/dsl/result_status_action_handler.rb +25 -0
  115. data/lib/ruby-jmeter/dsl/runtime_controller.rb +25 -0
  116. data/lib/ruby-jmeter/dsl/save_responses_to_a_file.rb +29 -0
  117. data/lib/ruby-jmeter/dsl/simple_config_element.rb +23 -0
  118. data/lib/ruby-jmeter/dsl/simple_controller.rb +23 -0
  119. data/lib/ruby-jmeter/dsl/simple_data_writer.rb +55 -0
  120. data/lib/ruby-jmeter/dsl/smime_assertion.rb +35 -0
  121. data/lib/ruby-jmeter/dsl/smtp_sampler.rb +51 -0
  122. data/lib/ruby-jmeter/dsl/soapxmlrpc_request.rb +33 -0
  123. data/lib/ruby-jmeter/dsl/spline_visualizer.rb +55 -0
  124. data/lib/ruby-jmeter/dsl/summary_report.rb +55 -0
  125. data/lib/ruby-jmeter/dsl/switch_controller.rb +25 -0
  126. data/lib/ruby-jmeter/dsl/synchronizing_timer.rb +25 -0
  127. data/lib/ruby-jmeter/dsl/tcp_sampler.rb +33 -0
  128. data/lib/ruby-jmeter/dsl/tcp_sampler_config.rb +31 -0
  129. data/lib/ruby-jmeter/dsl/test_action.rb +27 -0
  130. data/lib/ruby-jmeter/dsl/test_plan.rb +31 -0
  131. data/lib/ruby-jmeter/dsl/thread_group.rb +36 -0
  132. data/lib/ruby-jmeter/dsl/throughput_controller.rb +32 -0
  133. data/lib/ruby-jmeter/dsl/transaction_controller.rb +26 -0
  134. data/lib/ruby-jmeter/dsl/uniform_random_timer.rb +26 -0
  135. data/lib/ruby-jmeter/dsl/user_defined_variables.rb +32 -0
  136. data/lib/ruby-jmeter/dsl/user_parameters.rb +29 -0
  137. data/lib/ruby-jmeter/dsl/view_results_in_table.rb +55 -0
  138. data/lib/ruby-jmeter/dsl/view_results_tree.rb +55 -0
  139. data/lib/ruby-jmeter/dsl/while_controller.rb +25 -0
  140. data/lib/ruby-jmeter/dsl/xml_assertion.rb +23 -0
  141. data/lib/ruby-jmeter/dsl/xml_schema_assertion.rb +25 -0
  142. data/lib/ruby-jmeter/dsl/xpath_assertion.rb +30 -0
  143. data/lib/ruby-jmeter/dsl/xpath_extractor.rb +30 -0
  144. data/lib/ruby-jmeter/helpers/fallback_content_proxy.rb +54 -0
  145. data/lib/ruby-jmeter/helpers/helper.rb +41 -0
  146. data/lib/ruby-jmeter/helpers/jmeter.properties +28 -0
  147. data/lib/ruby-jmeter/helpers/logger-colors.rb +48 -0
  148. data/lib/ruby-jmeter/helpers/parser.rb +106 -0
  149. data/lib/ruby-jmeter/helpers/strip-heredoc.rb +5 -0
  150. data/lib/ruby-jmeter/helpers/user-agents.rb +27 -0
  151. data/lib/ruby-jmeter/idl.rb +70 -0
  152. data/lib/ruby-jmeter/idl.xml +1513 -0
  153. data/lib/ruby-jmeter/plugins/gc_console_status_logger.rb +14 -0
  154. data/lib/ruby-jmeter/plugins/gc_dummy_sampler.rb +23 -0
  155. data/lib/ruby-jmeter/plugins/gc_latencies_over_time.rb +48 -0
  156. data/lib/ruby-jmeter/plugins/gc_response_codes_per_second.rb +48 -0
  157. data/lib/ruby-jmeter/plugins/gc_response_times_distribution.rb +47 -0
  158. data/lib/ruby-jmeter/plugins/gc_response_times_over_time.rb +48 -0
  159. data/lib/ruby-jmeter/plugins/gc_response_times_percentiles.rb +48 -0
  160. data/lib/ruby-jmeter/plugins/gc_transactions_per_second.rb +48 -0
  161. data/lib/ruby-jmeter/plugins/gc_variable_throughput_timer.rb +26 -0
  162. data/lib/ruby-jmeter/version.rb +3 -0
  163. data/ruby-jmeter.gemspec +22 -0
  164. data/spec/dsl_spec.rb +491 -0
  165. data/spec/spec_helper.rb +10 -0
  166. data/spec/stub.rb +31 -0
  167. metadata +244 -0
@@ -0,0 +1,419 @@
1
+ module RubyJmeter
2
+ class ExtendedDSL < DSL
3
+ include Parser
4
+ attr_accessor :root
5
+
6
+ def initialize(params = {})
7
+ @root = Nokogiri::XML(<<-EOF.strip_heredoc)
8
+ <?xml version="1.0" encoding="UTF-8"?>
9
+ <jmeterTestPlan version="1.2" properties="2.1">
10
+ <hashTree>
11
+ </hashTree>
12
+ </jmeterTestPlan>
13
+ EOF
14
+ node = RubyJmeter::TestPlan.new(params)
15
+
16
+ @current_node = @root.at_xpath("//jmeterTestPlan/hashTree")
17
+ @current_node = attach_to_last(node)
18
+
19
+ variables :name => 'testguid',
20
+ :value => '${__P(testguid,${__time(,)})}',
21
+ :comments => 'flood.io uuid automatically generated by DSL'
22
+ end
23
+
24
+ ##
25
+ # Config Elements
26
+
27
+ def user_defined_variables(params, &block)
28
+ params['Argument.name'] = params[:name]
29
+ super
30
+ end
31
+
32
+ alias_method :variables, :user_defined_variables
33
+
34
+ alias_method :defaults, :http_request_defaults
35
+
36
+ def http_cookie_manager(params={}, &block)
37
+ params[:clearEachIteration] = true if params.keys.include? 'clear_each_iteration'
38
+ super
39
+ end
40
+
41
+ alias_method :cookies, :http_cookie_manager
42
+
43
+ def http_cache_manager(params={}, &block)
44
+ params[:clearEachIteration] = true if params.keys.include? 'clear_each_iteration'
45
+ super
46
+ end
47
+
48
+ alias_method :cache, :http_cache_manager
49
+
50
+ def with_user_agent(device)
51
+ http_header_manager name: 'User-Agent',
52
+ value: RubyJmeter::UserAgent.new(device).string
53
+ end
54
+
55
+ def http_header_manager(params, &block)
56
+ params['Header.name'] = params[:name]
57
+ super
58
+ end
59
+
60
+ alias_method :header, :http_header_manager
61
+
62
+ alias_method :auth, :http_authorization_manager
63
+
64
+ def thread_group(*args, &block)
65
+ params = args.shift || {}
66
+ params = { count: params }.merge(args.shift || {}) if params.class == Fixnum
67
+ params[:num_threads] = params[:count] || 1
68
+ params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
69
+ params[:start_time] = params[:start_time] || Time.now.to_i * 1000
70
+ params[:end_time] = params[:end_time] || Time.now.to_i * 1000
71
+ params[:duration] ||= 60
72
+ params[:continue_forever] ||= false
73
+ params[:loops] = -1 if params[:continue_forever]
74
+ node = RubyJmeter::ThreadGroup.new(params)
75
+ attach_node(node, &block)
76
+ end
77
+
78
+ alias_method :threads, :thread_group
79
+
80
+ ##
81
+ # HTTP Samplers
82
+
83
+ def get(*args, &block)
84
+ params = args.shift || {}
85
+ params = { url: params }.merge(args.shift || {}) if params.class == String
86
+ params[:method] ||= 'GET'
87
+ params[:name] ||= params[:url]
88
+ parse_http_request(params)
89
+ node = RubyJmeter::HttpRequest.new(params)
90
+ attach_node(node, &block)
91
+ end
92
+
93
+ alias_method :visit, :get
94
+
95
+ def post(*args, &block)
96
+ params = args.shift || {}
97
+ params = { url: params }.merge(args.shift || {}) if params.class == String
98
+ params[:method] ||= 'POST'
99
+ params[:name] ||= params[:url]
100
+ parse_http_request(params)
101
+ node = RubyJmeter::HttpRequest.new(params)
102
+ attach_node(node, &block)
103
+ end
104
+
105
+ alias_method :submit, :post
106
+
107
+ def delete(*args, &block)
108
+ params = args.shift || {}
109
+ params = { url: params }.merge(args.shift || {}) if params.class == String
110
+ params[:method] ||= 'DELETE'
111
+ params[:name] ||= params[:url]
112
+ parse_http_request(params)
113
+ node = RubyJmeter::HttpRequest.new(params)
114
+ attach_node(node, &block)
115
+ end
116
+
117
+ def put(*args, &block)
118
+ params = args.shift || {}
119
+ params = { url: params }.merge(args.shift || {}) if params.class == String
120
+ params[:method] ||= 'PUT'
121
+ params[:name] ||= params[:url]
122
+ parse_http_request(params)
123
+ node = RubyJmeter::HttpRequest.new(params)
124
+ attach_node(node, &block)
125
+ end
126
+
127
+ def with_xhr
128
+ http_header_manager name: 'X-Requested-With',
129
+ value: 'XMLHttpRequest'
130
+ end
131
+
132
+ ##
133
+ # Other Samplers
134
+
135
+ def soapxmlrpc_request(params, &block)
136
+ params[:method] ||= 'POST'
137
+ super
138
+ end
139
+
140
+ alias_method :soap, :soapxmlrpc_request
141
+
142
+ alias_method :ldap, :ldap_request
143
+
144
+ alias_method :ldap_ext, :ldap_extended_request
145
+
146
+ alias_method :ldap_extended, :ldap_extended_request
147
+
148
+
149
+ ##
150
+ # Controllers
151
+
152
+ def transaction_controller(*args, &block)
153
+ params = args.shift || {}
154
+ params = { name: params }.merge(args.shift || {}) if params.class == String
155
+ params[:parent] ||= true
156
+ params[:includeTimers] = params[:include_timers] || false
157
+ node = RubyJmeter::TransactionController.new(params)
158
+ attach_node(node, &block)
159
+ end
160
+
161
+ alias_method :transaction, :transaction_controller
162
+
163
+ def exists(variable, &block)
164
+ params ||= {}
165
+ params[:condition] = "'${#{variable}}'.length > 0"
166
+ node = RubyJmeter::IfController.new(params)
167
+ attach_node(node, &block)
168
+ end
169
+
170
+ alias_method :If, :if_controller
171
+
172
+ def loop_controller(params, &block)
173
+ params[:loops] = params[:count] || 1
174
+ super
175
+ end
176
+
177
+ alias_method :Loop, :loop_controller
178
+
179
+ def throughput_controller(params, &block)
180
+ params[:style] = 1 if params[:percent]
181
+ params[:maxThroughput] = params[:total] || params[:percent] || 1
182
+
183
+ node = RubyJmeter::ThroughputController.new(params)
184
+ node.doc.xpath(".//FloatProperty/value").first.content = params[:maxThroughput].to_f
185
+
186
+ attach_node(node, &block)
187
+ end
188
+
189
+ alias_method :Throughput, :throughput_controller
190
+
191
+ alias_method :Switch, :switch_controller
192
+
193
+ alias_method :While, :while_controller
194
+
195
+ alias_method :Interleave, :random_controller
196
+
197
+ alias_method :Random_order, :random_order_controller
198
+
199
+ alias_method :Simple, :simple_controller
200
+
201
+ alias_method :Once, :once_only_controller
202
+
203
+ ##
204
+ # Listeners
205
+
206
+ alias_method :view_results, :view_results_tree
207
+
208
+ alias_method :log, :simple_data_writer
209
+
210
+ alias_method :response_graph, :response_time_graph
211
+
212
+ ##
213
+ # Other Elements
214
+
215
+ alias_method :bsh_pre, :beanshell_preprocessor
216
+
217
+ alias_method :bsh_post, :beanshell_postprocessor
218
+
219
+ def extract(params, &block)
220
+ node = if params[:regex]
221
+ params[:refname] = params[:name]
222
+ params[:regex] = params[:regex] #CGI.escapeHTML
223
+ params[:template] = params[:template] || "$1$"
224
+ RubyJmeter::RegularExpressionExtractor.new(params)
225
+ else
226
+ params[:refname] = params[:name]
227
+ params[:xpathQuery] = params[:xpath]
228
+ RubyJmeter::XpathExtractor.new(params)
229
+ end
230
+ attach_node(node, &block)
231
+ end
232
+
233
+ alias_method :web_reg_save_param, :extract
234
+
235
+ def random_timer(delay=0, range=0, &block)
236
+ params={}
237
+ params[:delay] = delay
238
+ params[:range] = range
239
+ node = RubyJmeter::GaussianRandomTimer.new(params)
240
+ attach_node(node, &block)
241
+ end
242
+
243
+ alias_method :think_time, :random_timer
244
+
245
+ def response_assertion(params={}, &block)
246
+ params[:test_type] = parse_test_type(params)
247
+ params[:match] = params.values.first
248
+ node = RubyJmeter::ResponseAssertion.new(params)
249
+ node.doc.xpath("//stringProp[@name='Assertion.scope']").remove if
250
+ params[:scope] == 'main' || params['scope'] == 'main'
251
+ attach_node(node, &block)
252
+ end
253
+
254
+ alias_method :assert, :response_assertion
255
+
256
+ alias_method :web_reg_find, :response_assertion
257
+
258
+ ##
259
+ # JMeter Plugins
260
+
261
+ def response_codes_per_second(name="jp@gc - Response Codes per Second", params={}, &block)
262
+ node = RubyJmeter::GCResponseCodesPerSecond.new(name, params)
263
+ attach_node(node, &block)
264
+ end
265
+
266
+ def response_times_distribution(name="jp@gc - Response Times Distribution", params={}, &block)
267
+ node = RubyJmeter::GCResponseTimesDistribution.new(name, params)
268
+ attach_node(node, &block)
269
+ end
270
+
271
+ def response_times_over_time(name="jp@gc - Response Times Over Time", params={}, &block)
272
+ node = RubyJmeter::GCResponseTimesOverTime.new(name, params)
273
+ attach_node(node, &block)
274
+ end
275
+
276
+ def response_times_percentiles(name="jp@gc - Response Times Percentiles", params={}, &block)
277
+ node = RubyJmeter::GCResponseTimesPercentiles.new(name, params)
278
+ attach_node(node, &block)
279
+ end
280
+
281
+ def transactions_per_second(name="jp@gc - Transactions per Second", params={}, &block)
282
+ node = RubyJmeter::GCTransactionsPerSecond.new(name, params)
283
+ attach_node(node, &block)
284
+ end
285
+
286
+ def latencies_over_time(name="jp@gc - Response Latencies Over Time", params={}, &block)
287
+ node = RubyJmeter::GCLatenciesOverTime.new(name, params)
288
+ attach_node(node, &block)
289
+ end
290
+
291
+ def console_status_logger(name="jp@gc - Console Status Logger", params={}, &block)
292
+ node = RubyJmeter::GCConsoleStatusLogger.new(name, params)
293
+ attach_node(node, &block)
294
+ end
295
+
296
+ alias_method :console, :console_status_logger
297
+
298
+ def throughput_shaper(name="jp@gc - Throughput Shaping Timer", steps=[], params={}, &block)
299
+ node = RubyJmeter::GCThroughputShapingTimer.new(name, steps)
300
+ attach_node(node, &block)
301
+ end
302
+
303
+ alias_method :shaper, :throughput_shaper
304
+
305
+ def dummy_sampler(name="jp@gc - Dummy Sampler", params={}, &block)
306
+ node = RubyJmeter::GCDummySampler.new(name, params)
307
+ attach_node(node, &block)
308
+ end
309
+
310
+ alias_method :dummy, :dummy_sampler
311
+
312
+ # API Methods
313
+
314
+ def out(params={})
315
+ puts doc.to_xml(:indent => 2)
316
+ end
317
+
318
+ def jmx(params={})
319
+ file(params)
320
+ logger.info "Test plan saved to: #{params[:file]}"
321
+ end
322
+
323
+ def to_xml
324
+ doc.to_xml(:indent => 2)
325
+ end
326
+
327
+ def to_doc
328
+ doc.clone
329
+ end
330
+
331
+ def run(params={})
332
+ file(params)
333
+ logger.warn "Test executing locally ..."
334
+ cmd = "#{params[:path]}jmeter #{"-n" unless params[:gui] } -t #{params[:file]} -j #{params[:log] ? params[:log] : 'jmeter.log' } -l #{params[:jtl] ? params[:jtl] : 'jmeter.jtl' }"
335
+ logger.debug cmd if params[:debug]
336
+ Open3.popen2e("#{cmd} -q #{File.dirname(__FILE__)}/helpers/jmeter.properties") do |stdin, stdout_err, wait_thr|
337
+ while line = stdout_err.gets
338
+ logger.debug line.chomp if params[:debug]
339
+ end
340
+
341
+ exit_status = wait_thr.value
342
+ unless exit_status.success?
343
+ abort "FAILED !!! #{cmd}"
344
+ end
345
+ end
346
+ logger.info "Local Results at: #{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}"
347
+ end
348
+
349
+ def grid(token, params={})
350
+ if params[:region] == 'local'
351
+ logger.info "Starting test ..."
352
+ params[:started] = Time.now
353
+ run params
354
+ params[:completed] = Time.now
355
+ logger.info "Completed test ..."
356
+ logger.debug "Uploading results ..." if params[:debug]
357
+ end
358
+ RestClient.proxy = params[:proxy] if params[:proxy]
359
+ begin
360
+ file = Tempfile.new(['jmeter', '.jmx'])
361
+ file.write(doc.to_xml(:indent => 2))
362
+ file.rewind
363
+ response = RestClient.post "#{params[:endpoint] ? params[:endpoint] : 'https://flood.io'}/api?token=#{token}",
364
+ {
365
+ :attachment => File.new("#{file.path}", 'rb'),
366
+ :results => (File.new("#{params[:jtl] ? params[:jtl] : 'jmeter.jtl'}", 'rb') if params[:region] == 'local'),
367
+ :multipart => true,
368
+ :content_type => 'application/octet-stream',
369
+ :started => params[:started],
370
+ :completed => params[:completed]
371
+ }.merge(params)
372
+ logger.info "Flood results at: #{JSON.parse(response)["results"]}" if response.code == 200
373
+ rescue => e
374
+ logger.fatal "Sorry there was an error: #{e.message}"
375
+ end
376
+ end
377
+
378
+ private
379
+
380
+ def hash_tree
381
+ Nokogiri::XML::Node.new("hashTree", @root)
382
+ end
383
+
384
+ def attach_to_last(node)
385
+ ht = hash_tree
386
+ last_node = @current_node
387
+ last_node << node.doc.children << ht
388
+ ht
389
+ end
390
+
391
+ def attach_node(node, &block)
392
+ ht = attach_to_last(node)
393
+ previous = @current_node
394
+ @current_node = ht
395
+ self.instance_exec(&block) if block
396
+ @current_node = previous
397
+ end
398
+
399
+ def file(params={})
400
+ params[:file] ||= 'jmeter.jmx'
401
+ File.open(params[:file], 'w') { |file| file.write(doc.to_xml(:indent => 2)) }
402
+ end
403
+
404
+ def doc
405
+ Nokogiri::XML(@root.to_s, &:noblanks)
406
+ end
407
+
408
+ def logger
409
+ @log ||= Logger.new(STDOUT)
410
+ @log.level = Logger::DEBUG
411
+ @log
412
+ end
413
+
414
+ end
415
+ end
416
+
417
+ def test(params = {}, &block)
418
+ RubyJmeter.dsl_eval(RubyJmeter::ExtendedDSL.new(params), &block)
419
+ end
@@ -0,0 +1,32 @@
1
+ module RubyJmeter
2
+ class DSL
3
+ def access_log_sampler(params={}, &block)
4
+ node = RubyJmeter::AccessLogSampler.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+ end
8
+
9
+ class AccessLogSampler
10
+ attr_accessor :doc
11
+ include Helper
12
+
13
+ def initialize(params={})
14
+ params[:name] ||= 'AccessLogSampler'
15
+ @doc = Nokogiri::XML(<<-EOS.strip_heredoc)
16
+ <AccessLogSampler guiclass="TestBeanGUI" testclass="AccessLogSampler" testname="#{params[:name]}" enabled="true">
17
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
18
+ <collectionProp name="Arguments.arguments"/>
19
+ </elementProp>
20
+ <stringProp name="domain"/>
21
+ <boolProp name="imageParsing">false</boolProp>
22
+ <stringProp name="logFile"/>
23
+ <stringProp name="parserClassName">org.apache.jmeter.protocol.http.util.accesslog.TCLogParser</stringProp>
24
+ <stringProp name="portString"/>
25
+ </AccessLogSampler>)
26
+ EOS
27
+ update params
28
+ update_at_xpath params if params[:update_at_xpath]
29
+ end
30
+ end
31
+
32
+ end