jmeter-ruby 3.0.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.
Files changed (266) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +22 -0
  3. data/.github/workflows/ci.yml +54 -0
  4. data/.gitignore +24 -0
  5. data/.rspec +1 -0
  6. data/.ruby-version +1 -0
  7. data/CHANGES.md +77 -0
  8. data/Gemfile +23 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +434 -0
  11. data/Rakefile +18 -0
  12. data/examples/OS_process_sampler.rb +24 -0
  13. data/examples/assertion_results.rb +18 -0
  14. data/examples/basic_auth.rb +11 -0
  15. data/examples/browser_headers.rb +7 -0
  16. data/examples/composite_graph.rb +29 -0
  17. data/examples/constant_throughput_timer.rb +11 -0
  18. data/examples/csv_data_set.rb +11 -0
  19. data/examples/dummy_sampler.rb +9 -0
  20. data/examples/duration_assertion.rb +10 -0
  21. data/examples/etsy_login_browse.rb +61 -0
  22. data/examples/extract.rb +12 -0
  23. data/examples/foreach_controller.rb +29 -0
  24. data/examples/header_manager.rb +29 -0
  25. data/examples/http_cache_manager.rb +11 -0
  26. data/examples/http_cookie_manager.rb +11 -0
  27. data/examples/http_request_defaults.rb +11 -0
  28. data/examples/http_request_post.rb +11 -0
  29. data/examples/http_request_with_files.rb +13 -0
  30. data/examples/http_request_with_query_params.rb +8 -0
  31. data/examples/jmeter_plugins_graphs.rb +22 -0
  32. data/examples/json_path_assertions.rb +11 -0
  33. data/examples/json_path_extractor.rb +10 -0
  34. data/examples/json_path_postprocessor.rb +10 -0
  35. data/examples/jsr223_assertion.rb +13 -0
  36. data/examples/ldap_sampler.rb +16 -0
  37. data/examples/loadosophia.rb +18 -0
  38. data/examples/loop_controller.rb +10 -0
  39. data/examples/loops_with_counter.rb +15 -0
  40. data/examples/once_only_controller.rb +15 -0
  41. data/examples/perfmon.rb +46 -0
  42. data/examples/real_custom_methods.rb +19 -0
  43. data/examples/real_page_objects.rb +41 -0
  44. data/examples/real_redis_data_set_with_setup.rb +123 -0
  45. data/examples/real_user_objects_github.rb +112 -0
  46. data/examples/regular_expression_extractor.rb +12 -0
  47. data/examples/response_assertion.rb +15 -0
  48. data/examples/response_time_percentiles_graph.rb +11 -0
  49. data/examples/rsync.rb +16 -0
  50. data/examples/sample_transaction.rb +18 -0
  51. data/examples/simple_data_writer_listener.rb +11 -0
  52. data/examples/stepping_thread_group.rb +30 -0
  53. data/examples/test_fragment.rb +14 -0
  54. data/examples/think_time.rb +15 -0
  55. data/examples/thread_groups.rb +7 -0
  56. data/examples/throughput_controller.rb +14 -0
  57. data/examples/throughput_shaping_timer.rb +20 -0
  58. data/examples/ultimate_thread_group.rb +39 -0
  59. data/examples/unicode.rb +8 -0
  60. data/examples/user_defined_variables.rb +10 -0
  61. data/examples/user_parameters.rb +28 -0
  62. data/examples/uuid_per_iteration.rb +15 -0
  63. data/jmeter-ruby.gemspec +28 -0
  64. data/lib/jmeter-ruby/DSL.md +235 -0
  65. data/lib/jmeter-ruby/dsl/access_log_sampler.rb +32 -0
  66. data/lib/jmeter-ruby/dsl/aggregate_graph.rb +55 -0
  67. data/lib/jmeter-ruby/dsl/aggregate_report.rb +55 -0
  68. data/lib/jmeter-ruby/dsl/ajp13_sampler.rb +41 -0
  69. data/lib/jmeter-ruby/dsl/assertion_results.rb +55 -0
  70. data/lib/jmeter-ruby/dsl/beanshell_assertion.rb +28 -0
  71. data/lib/jmeter-ruby/dsl/beanshell_listener.rb +28 -0
  72. data/lib/jmeter-ruby/dsl/beanshell_postprocessor.rb +28 -0
  73. data/lib/jmeter-ruby/dsl/beanshell_preprocessor.rb +28 -0
  74. data/lib/jmeter-ruby/dsl/beanshell_sampler.rb +28 -0
  75. data/lib/jmeter-ruby/dsl/beanshell_timer.rb +28 -0
  76. data/lib/jmeter-ruby/dsl/bsf_assertion.rb +28 -0
  77. data/lib/jmeter-ruby/dsl/bsf_listener.rb +28 -0
  78. data/lib/jmeter-ruby/dsl/bsf_postprocessor.rb +28 -0
  79. data/lib/jmeter-ruby/dsl/bsf_preprocessor.rb +28 -0
  80. data/lib/jmeter-ruby/dsl/bsf_sampler.rb +28 -0
  81. data/lib/jmeter-ruby/dsl/bsf_timer.rb +28 -0
  82. data/lib/jmeter-ruby/dsl/compare_assertion.rb +27 -0
  83. data/lib/jmeter-ruby/dsl/comparison_assertion_visualizer.rb +55 -0
  84. data/lib/jmeter-ruby/dsl/constant_throughput_timer.rb +26 -0
  85. data/lib/jmeter-ruby/dsl/constant_timer.rb +25 -0
  86. data/lib/jmeter-ruby/dsl/counter.rb +31 -0
  87. data/lib/jmeter-ruby/dsl/cssjquery_extractor.rb +31 -0
  88. data/lib/jmeter-ruby/dsl/csv_data_set_config.rb +33 -0
  89. data/lib/jmeter-ruby/dsl/debug_postprocessor.rb +28 -0
  90. data/lib/jmeter-ruby/dsl/debug_sampler.rb +27 -0
  91. data/lib/jmeter-ruby/dsl/distribution_graphalpha.rb +55 -0
  92. data/lib/jmeter-ruby/dsl/duration_assertion.rb +25 -0
  93. data/lib/jmeter-ruby/dsl/foreach_controller.rb +27 -0
  94. data/lib/jmeter-ruby/dsl/ftp_request.rb +34 -0
  95. data/lib/jmeter-ruby/dsl/ftp_request_defaults.rb +32 -0
  96. data/lib/jmeter-ruby/dsl/gaussian_random_timer.rb +26 -0
  97. data/lib/jmeter-ruby/dsl/generate_summary_results.rb +23 -0
  98. data/lib/jmeter-ruby/dsl/graph_results.rb +55 -0
  99. data/lib/jmeter-ruby/dsl/html_assertion.rb +30 -0
  100. data/lib/jmeter-ruby/dsl/html_link_parser.rb +23 -0
  101. data/lib/jmeter-ruby/dsl/html_parameter_mask.rb +32 -0
  102. data/lib/jmeter-ruby/dsl/http_authorization_manager.rb +33 -0
  103. data/lib/jmeter-ruby/dsl/http_cache_manager.rb +26 -0
  104. data/lib/jmeter-ruby/dsl/http_cookie_manager.rb +28 -0
  105. data/lib/jmeter-ruby/dsl/http_header_manager.rb +30 -0
  106. data/lib/jmeter-ruby/dsl/http_request.rb +41 -0
  107. data/lib/jmeter-ruby/dsl/http_request_defaults.rb +41 -0
  108. data/lib/jmeter-ruby/dsl/http_url_rewriting_modifier.rb +30 -0
  109. data/lib/jmeter-ruby/dsl/if_controller.rb +27 -0
  110. data/lib/jmeter-ruby/dsl/include_controller.rb +25 -0
  111. data/lib/jmeter-ruby/dsl/java_request.rb +69 -0
  112. data/lib/jmeter-ruby/dsl/java_request_defaults.rb +69 -0
  113. data/lib/jmeter-ruby/dsl/jdbc_connection_configuration.rb +37 -0
  114. data/lib/jmeter-ruby/dsl/jdbc_postprocessor.rb +33 -0
  115. data/lib/jmeter-ruby/dsl/jdbc_preprocessor.rb +33 -0
  116. data/lib/jmeter-ruby/dsl/jdbc_request.rb +33 -0
  117. data/lib/jmeter-ruby/dsl/jms_pointtopoint.rb +41 -0
  118. data/lib/jmeter-ruby/dsl/jms_publisher.rb +43 -0
  119. data/lib/jmeter-ruby/dsl/jms_subscriber.rb +35 -0
  120. data/lib/jmeter-ruby/dsl/json_path_postprocessor.rb +27 -0
  121. data/lib/jmeter-ruby/dsl/jsr223_assertion.rb +29 -0
  122. data/lib/jmeter-ruby/dsl/jsr223_listener.rb +29 -0
  123. data/lib/jmeter-ruby/dsl/jsr223_postprocessor.rb +29 -0
  124. data/lib/jmeter-ruby/dsl/jsr223_preprocessor.rb +29 -0
  125. data/lib/jmeter-ruby/dsl/jsr223_sampler.rb +29 -0
  126. data/lib/jmeter-ruby/dsl/jsr223_timer.rb +29 -0
  127. data/lib/jmeter-ruby/dsl/junit_request.rb +37 -0
  128. data/lib/jmeter-ruby/dsl/keystore_configuration.rb +28 -0
  129. data/lib/jmeter-ruby/dsl/ldap_extended_request.rb +42 -0
  130. data/lib/jmeter-ruby/dsl/ldap_extended_request_defaults.rb +42 -0
  131. data/lib/jmeter-ruby/dsl/ldap_request.rb +35 -0
  132. data/lib/jmeter-ruby/dsl/ldap_request_defaults.rb +39 -0
  133. data/lib/jmeter-ruby/dsl/login_config_element.rb +26 -0
  134. data/lib/jmeter-ruby/dsl/loop_controller.rb +26 -0
  135. data/lib/jmeter-ruby/dsl/mail_reader_sampler.rb +37 -0
  136. data/lib/jmeter-ruby/dsl/mailer_visualizer.rb +64 -0
  137. data/lib/jmeter-ruby/dsl/md5hex_assertion.rb +25 -0
  138. data/lib/jmeter-ruby/dsl/module_controller.rb +25 -0
  139. data/lib/jmeter-ruby/dsl/monitor_results.rb +55 -0
  140. data/lib/jmeter-ruby/dsl/once_only_controller.rb +23 -0
  141. data/lib/jmeter-ruby/dsl/os_process_sampler.rb +34 -0
  142. data/lib/jmeter-ruby/dsl/poisson_random_timer.rb +26 -0
  143. data/lib/jmeter-ruby/dsl/random_controller.rb +25 -0
  144. data/lib/jmeter-ruby/dsl/random_order_controller.rb +23 -0
  145. data/lib/jmeter-ruby/dsl/random_variable.rb +30 -0
  146. data/lib/jmeter-ruby/dsl/recording_controller.rb +23 -0
  147. data/lib/jmeter-ruby/dsl/regex_user_parameters.rb +27 -0
  148. data/lib/jmeter-ruby/dsl/regular_expression_extractor.rb +32 -0
  149. data/lib/jmeter-ruby/dsl/response_assertion.rb +31 -0
  150. data/lib/jmeter-ruby/dsl/response_time_graph.rb +55 -0
  151. data/lib/jmeter-ruby/dsl/result_status_action_handler.rb +25 -0
  152. data/lib/jmeter-ruby/dsl/runtime_controller.rb +25 -0
  153. data/lib/jmeter-ruby/dsl/save_responses_to_a_file.rb +29 -0
  154. data/lib/jmeter-ruby/dsl/setup_thread_group.rb +36 -0
  155. data/lib/jmeter-ruby/dsl/simple_config_element.rb +23 -0
  156. data/lib/jmeter-ruby/dsl/simple_controller.rb +23 -0
  157. data/lib/jmeter-ruby/dsl/simple_data_writer.rb +55 -0
  158. data/lib/jmeter-ruby/dsl/smime_assertion.rb +35 -0
  159. data/lib/jmeter-ruby/dsl/smtp_sampler.rb +51 -0
  160. data/lib/jmeter-ruby/dsl/soapxmlrpc_request.rb +33 -0
  161. data/lib/jmeter-ruby/dsl/spline_visualizer.rb +55 -0
  162. data/lib/jmeter-ruby/dsl/summary_report.rb +55 -0
  163. data/lib/jmeter-ruby/dsl/switch_controller.rb +25 -0
  164. data/lib/jmeter-ruby/dsl/synchronizing_timer.rb +26 -0
  165. data/lib/jmeter-ruby/dsl/tcp_sampler.rb +33 -0
  166. data/lib/jmeter-ruby/dsl/tcp_sampler_config.rb +31 -0
  167. data/lib/jmeter-ruby/dsl/test_action.rb +27 -0
  168. data/lib/jmeter-ruby/dsl/test_fragment.rb +23 -0
  169. data/lib/jmeter-ruby/dsl/test_plan.rb +31 -0
  170. data/lib/jmeter-ruby/dsl/thread_group.rb +37 -0
  171. data/lib/jmeter-ruby/dsl/throughput_controller.rb +32 -0
  172. data/lib/jmeter-ruby/dsl/transaction_controller.rb +26 -0
  173. data/lib/jmeter-ruby/dsl/uniform_random_timer.rb +26 -0
  174. data/lib/jmeter-ruby/dsl/user_defined_variables.rb +33 -0
  175. data/lib/jmeter-ruby/dsl/user_parameters.rb +30 -0
  176. data/lib/jmeter-ruby/dsl/view_results_in_table.rb +55 -0
  177. data/lib/jmeter-ruby/dsl/view_results_tree.rb +55 -0
  178. data/lib/jmeter-ruby/dsl/while_controller.rb +25 -0
  179. data/lib/jmeter-ruby/dsl/xml_assertion.rb +23 -0
  180. data/lib/jmeter-ruby/dsl/xml_schema_assertion.rb +25 -0
  181. data/lib/jmeter-ruby/dsl/xpath_assertion.rb +31 -0
  182. data/lib/jmeter-ruby/dsl/xpath_extractor.rb +31 -0
  183. data/lib/jmeter-ruby/dsl.rb +102 -0
  184. data/lib/jmeter-ruby/extend/assertions/response_assertion.rb +36 -0
  185. data/lib/jmeter-ruby/extend/config_elements/header_manager.rb +13 -0
  186. data/lib/jmeter-ruby/extend/config_elements/http_cache_manager.rb +12 -0
  187. data/lib/jmeter-ruby/extend/config_elements/http_cookie_manager.rb +36 -0
  188. data/lib/jmeter-ruby/extend/config_elements/http_request_defaults.rb +39 -0
  189. data/lib/jmeter-ruby/extend/config_elements/user_defined_variables.rb +13 -0
  190. data/lib/jmeter-ruby/extend/config_elements/user_parameters.rb +31 -0
  191. data/lib/jmeter-ruby/extend/controllers/foreach_controller.rb +27 -0
  192. data/lib/jmeter-ruby/extend/controllers/loop_controller.rb +11 -0
  193. data/lib/jmeter-ruby/extend/controllers/module_controller.rb +23 -0
  194. data/lib/jmeter-ruby/extend/controllers/throughput_controller.rb +15 -0
  195. data/lib/jmeter-ruby/extend/controllers/transaction_controller.rb +14 -0
  196. data/lib/jmeter-ruby/extend/misc/aliases.rb +21 -0
  197. data/lib/jmeter-ruby/extend/misc/exists.rb +13 -0
  198. data/lib/jmeter-ruby/extend/misc/rsync.rb +24 -0
  199. data/lib/jmeter-ruby/extend/misc/uuid.rb +12 -0
  200. data/lib/jmeter-ruby/extend/misc/with_helpers.rb +27 -0
  201. data/lib/jmeter-ruby/extend/plugins/jmeter_plugins.rb +120 -0
  202. data/lib/jmeter-ruby/extend/processors/extract.rb +28 -0
  203. data/lib/jmeter-ruby/extend/processors/regular_expression_extractor.rb +25 -0
  204. data/lib/jmeter-ruby/extend/samplers/http_request.rb +58 -0
  205. data/lib/jmeter-ruby/extend/samplers/jms_pointtopoint.rb +26 -0
  206. data/lib/jmeter-ruby/extend/samplers/soapxmlrpc_request.rb +9 -0
  207. data/lib/jmeter-ruby/extend/threads/setup_thread_group.rb +18 -0
  208. data/lib/jmeter-ruby/extend/threads/thread_group.rb +19 -0
  209. data/lib/jmeter-ruby/extend/timers/constant_throughput_timer.rb +11 -0
  210. data/lib/jmeter-ruby/extend/timers/random_timer.rb +14 -0
  211. data/lib/jmeter-ruby/helpers/fallback_content_proxy.rb +54 -0
  212. data/lib/jmeter-ruby/helpers/helper.rb +75 -0
  213. data/lib/jmeter-ruby/helpers/logger-colors.rb +48 -0
  214. data/lib/jmeter-ruby/helpers/parser.rb +135 -0
  215. data/lib/jmeter-ruby/helpers/strip-heredoc.rb +5 -0
  216. data/lib/jmeter-ruby/helpers/user-agents.rb +27 -0
  217. data/lib/jmeter-ruby/idl.rb +70 -0
  218. data/lib/jmeter-ruby/idl.xml +1488 -0
  219. data/lib/jmeter-ruby/plugins/active_threads_over_time.rb +57 -0
  220. data/lib/jmeter-ruby/plugins/composite_graph.rb +71 -0
  221. data/lib/jmeter-ruby/plugins/console_status_logger.rb +15 -0
  222. data/lib/jmeter-ruby/plugins/dummy_sampler.rb +26 -0
  223. data/lib/jmeter-ruby/plugins/jmx_collector.rb +73 -0
  224. data/lib/jmeter-ruby/plugins/json_path_assertion.rb +19 -0
  225. data/lib/jmeter-ruby/plugins/json_path_extractor.rb +20 -0
  226. data/lib/jmeter-ruby/plugins/latencies_over_time.rb +49 -0
  227. data/lib/jmeter-ruby/plugins/loadosophia_uploader.rb +63 -0
  228. data/lib/jmeter-ruby/plugins/perfmon_collector.rb +80 -0
  229. data/lib/jmeter-ruby/plugins/redis_data_set.rb +39 -0
  230. data/lib/jmeter-ruby/plugins/response_codes_per_second.rb +49 -0
  231. data/lib/jmeter-ruby/plugins/response_times_distribution.rb +49 -0
  232. data/lib/jmeter-ruby/plugins/response_times_over_time.rb +50 -0
  233. data/lib/jmeter-ruby/plugins/response_times_percentiles.rb +51 -0
  234. data/lib/jmeter-ruby/plugins/stepping_thread_group.rb +30 -0
  235. data/lib/jmeter-ruby/plugins/transactions_per_second.rb +50 -0
  236. data/lib/jmeter-ruby/plugins/ultimate_thread_group.rb +23 -0
  237. data/lib/jmeter-ruby/plugins/variable_throughput_timer.rb +27 -0
  238. data/lib/jmeter-ruby/version.rb +12 -0
  239. data/lib/jmeter-ruby.rb +27 -0
  240. data/mise.toml +2 -0
  241. data/script/release +162 -0
  242. data/spec/constant_throughput_timer_spec.rb +20 -0
  243. data/spec/csv_data_set_config_spec.rb +33 -0
  244. data/spec/header_manager_spec.rb +37 -0
  245. data/spec/http_cache_manager_spec.rb +29 -0
  246. data/spec/http_cookie_manager_spec.rb +169 -0
  247. data/spec/http_request_defaults_spec.rb +57 -0
  248. data/spec/http_request_spec.rb +305 -0
  249. data/spec/jmeter_plugins_spec.rb +245 -0
  250. data/spec/json_extractor_spec.rb +19 -0
  251. data/spec/json_path_assertion_spec.rb +28 -0
  252. data/spec/logic_controller_spec.rb +148 -0
  253. data/spec/loop_controller_spec.rb +19 -0
  254. data/spec/module_controller_spec.rb +56 -0
  255. data/spec/regular_expression_extractor_spec.rb +63 -0
  256. data/spec/response_assertion_spec.rb +69 -0
  257. data/spec/setup_thread_group_spec.rb +31 -0
  258. data/spec/spec_helper.rb +19 -0
  259. data/spec/thread_group_spec.rb +57 -0
  260. data/spec/throughput_controller_spec.rb +24 -0
  261. data/spec/transaction_controller_spec.rb +30 -0
  262. data/spec/user_defined_variables_spec.rb +22 -0
  263. data/spec/user_parameters_spec.rb +45 -0
  264. data/spec/with_helpers_spec.rb +57 -0
  265. data/spec/xpath_extractor_spec.rb +15 -0
  266. metadata +360 -0
@@ -0,0 +1,27 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def foreach_controller(params = {}, &block)
4
+ node = JmeterRuby::ForeachController.new(params).tap do |node|
5
+ if params[:start_index]
6
+ params[:startIndex] = params[:start_index]
7
+ node.doc.children.first.add_child (
8
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
9
+ <stringProp name="ForeachController.startIndex"/>
10
+ EOS
11
+ )
12
+ end
13
+
14
+ if params[:end_index]
15
+ params[:endIndex] = params[:end_index]
16
+ node.doc.children.first.add_child (
17
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
18
+ <stringProp name="ForeachController.endIndex"/>
19
+ EOS
20
+ )
21
+ end
22
+ end
23
+
24
+ attach_node(node, &block)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def loop_controller(params, &block)
4
+ params[:loops] = params[:count] || 1
5
+
6
+ super
7
+ end
8
+
9
+ alias loops loop_controller
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def module_controller(params, &block)
4
+ node = JmeterRuby::ModuleController.new(params)
5
+
6
+ if params[:test_fragment]
7
+ params[:test_fragment].kind_of?(String) &&
8
+ params[:test_fragment].split('/')
9
+ elsif params[:node_path]
10
+ params[:node_path]
11
+ else
12
+ []
13
+ end.each_with_index do |node_name, index|
14
+ node.doc.at_xpath('//collectionProp') <<
15
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
16
+ <stringProp name="node_#{index}">#{node_name}</stringProp>
17
+ EOS
18
+ end
19
+
20
+ attach_node(node, &block)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def throughput_controller(params = {}, &block)
4
+ params[:style] = 1 if params[:percent]
5
+ params[:maxThroughput] = params[:total] || params[:percent] || 1
6
+
7
+ node = JmeterRuby::ThroughputController.new(params)
8
+ node.doc.xpath(".//FloatProperty/value").first.content = params[:maxThroughput].to_f
9
+
10
+ attach_node(node, &block)
11
+ end
12
+
13
+ alias throughput throughput_controller
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def transaction_controller(*args, &block)
4
+ params = args.shift || {}
5
+ params = { name: params }.merge(args.shift || {}) if params.class == String
6
+ params[:parent] = params[:parent] || false
7
+ params[:includeTimers] = params[:include_timers] || false
8
+ node = JmeterRuby::TransactionController.new(params)
9
+ attach_node(node, &block)
10
+ end
11
+
12
+ alias transaction transaction_controller
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ alias auth http_authorization_manager
4
+ alias soap soapxmlrpc_request
5
+ alias ldap ldap_request
6
+ alias ldap_ext ldap_extended_request
7
+ alias ldap_extended ldap_extended_request
8
+ alias If if_controller
9
+ alias Switch switch_controller
10
+ alias While while_controller
11
+ alias Interleave random_controller
12
+ alias Random_order random_order_controller
13
+ alias Simple simple_controller
14
+ alias Once once_only_controller
15
+ alias view_results view_results_tree
16
+ alias log simple_data_writer
17
+ alias response_graph response_time_graph
18
+ alias bsh_pre beanshell_preprocessor
19
+ alias bsh_post beanshell_postprocessor
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def exists(variable, &block)
4
+ params ||= {}
5
+ params[:condition] = "\"${#{variable}}\" != \"\\${#{variable}}\""
6
+ params[:useExpression] = false
7
+ params[:name] = "if ${#{variable}}"
8
+ node = JmeterRuby::IfController.new(params)
9
+
10
+ attach_node(node, &block)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def rsync(params = {})
4
+ logger.warn "Test file upload via rsync ..."
5
+
6
+ file(params)
7
+
8
+ cmd = "#{params[:rsync_bin_path]} #{params[:rsync_params]} #{params[:file]} #{params[:remote_user]}@#{params[:remote_host]}:#{params[:remote_path]}"
9
+
10
+ logger.debug cmd if params[:debug]
11
+
12
+ Open3.popen2e("#{cmd}") do |stdin, stdout_err, wait_thr|
13
+ while line = stdout_err.gets
14
+ logger.debug line.chomp if params[:debug]
15
+ end
16
+
17
+ exit_status = wait_thr.value
18
+ abort "Sorry there was an error: #{cmd}" unless exit_status.success?
19
+ end
20
+
21
+ logger.info "Upload complete at: #{params[:remote_host]}:#{params[:remote_path]}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def uuid_per_iteration(params = {}, &block)
4
+ params[:name] ||= '__UUID'
5
+ params[:variable] ||= 'UUID'
6
+
7
+ dummy_sampler name: params[:name], response_data: '${__UUID}' do
8
+ regex pattern: '(.*)', name: params[:variable], match_number: 1
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def with_user_agent(device)
4
+ http_header_manager name: 'User-Agent', value: JmeterRuby::UserAgent.new(device).string
5
+ end
6
+
7
+ def with_browser(device)
8
+ http_header_manager name: 'User-Agent', value: JmeterRuby::UserAgent.new(device).string
9
+ http_header_manager [
10
+ { name: 'Accept-Encoding', value: 'gzip,deflate,sdch' },
11
+ { name: 'Accept', value: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' }
12
+ ]
13
+ end
14
+
15
+ def with_xhr
16
+ http_header_manager name: 'X-Requested-With', value: 'XMLHttpRequest'
17
+ end
18
+
19
+ def with_gzip
20
+ http_header_manager name: 'Accept-Encoding', value: 'gzip, deflate'
21
+ end
22
+
23
+ def with_json
24
+ http_header_manager name: 'Accept', value: 'text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8, application/json'
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,120 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def response_codes_per_second(params = {}, &block)
4
+ node = JmeterRuby::Plugins::ResponseCodesPerSecond.new(params)
5
+ attach_node(node, &block)
6
+ end
7
+
8
+ def response_times_distribution(params = {}, &block)
9
+ node = JmeterRuby::Plugins::ResponseTimesDistribution.new(params)
10
+ attach_node(node, &block)
11
+ end
12
+
13
+ def response_times_over_time(params = {}, &block)
14
+ node = JmeterRuby::Plugins::ResponseTimesOverTime.new(params)
15
+ attach_node(node, &block)
16
+ end
17
+
18
+ def response_times_percentiles(params = {}, &block)
19
+ node = JmeterRuby::Plugins::ResponseTimesPercentiles.new(params)
20
+ attach_node(node, &block)
21
+ end
22
+
23
+ def transactions_per_second(params = {}, &block)
24
+ node = JmeterRuby::Plugins::TransactionsPerSecond.new(params)
25
+ attach_node(node, &block)
26
+ end
27
+
28
+ def latencies_over_time(params = {}, &block)
29
+ node = JmeterRuby::Plugins::LatenciesOverTime.new(params)
30
+ attach_node(node, &block)
31
+ end
32
+
33
+ def console_status_logger(params = {}, &block)
34
+ node = JmeterRuby::Plugins::ConsoleStatusLogger.new(params)
35
+ attach_node(node, &block)
36
+ end
37
+
38
+ alias console console_status_logger
39
+
40
+ def throughput_shaper(params = {}, &block)
41
+ node = JmeterRuby::Plugins::ThroughputShapingTimer.new(params)
42
+ attach_node(node, &block)
43
+ end
44
+
45
+ alias shaper throughput_shaper
46
+
47
+ def dummy_sampler(params = {}, &block)
48
+ node = JmeterRuby::Plugins::DummySampler.new(params)
49
+ attach_node(node, &block)
50
+ end
51
+
52
+ alias dummy dummy_sampler
53
+
54
+ def stepping_thread_group(params = {}, &block)
55
+ node = JmeterRuby::Plugins::SteppingThreadGroup.new(params)
56
+ attach_node(node, &block)
57
+ end
58
+
59
+ alias step stepping_thread_group
60
+
61
+ def ultimate_thread_group(params = {}, &block)
62
+ node = JmeterRuby::Plugins::UltimateThreadGroup.new(params)
63
+
64
+ (params.kind_of?(Array) ? params : params[:threads]).each_with_index do |group, index|
65
+ node.doc.at_xpath('//collectionProp') <<
66
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
67
+ <collectionProp name="index">
68
+ <stringProp name="#{group[:start_threads]}">#{group[:start_threads]}</stringProp>
69
+ <stringProp name="#{group[:initial_delay]}">#{group[:initial_delay]}</stringProp>
70
+ <stringProp name="#{group[:start_time]}">#{group[:start_time]}</stringProp>
71
+ <stringProp name="#{group[:hold_time]}">#{group[:hold_time]}</stringProp>
72
+ <stringProp name="#{group[:stop_time]}">#{group[:stop_time]}</stringProp>
73
+ </collectionProp>
74
+ EOS
75
+ end
76
+
77
+ attach_node(node, &block)
78
+ end
79
+
80
+ alias ultimate ultimate_thread_group
81
+
82
+ def composite_graph(params = {}, &block)
83
+ node = JmeterRuby::Plugins::CompositeGraph.new(params)
84
+ attach_node(node, &block)
85
+ end
86
+
87
+ alias composite composite_graph
88
+
89
+ def active_threads_over_time(params = {}, &block)
90
+ node = JmeterRuby::Plugins::ActiveThreadsOverTime.new(params)
91
+ attach_node(node, &block)
92
+ end
93
+
94
+ alias active_threads active_threads_over_time
95
+
96
+ def perfmon_collector(params = {}, &block)
97
+ node = JmeterRuby::Plugins::PerfmonCollector.new(params)
98
+ attach_node(node, &block)
99
+ end
100
+
101
+ alias perfmon perfmon_collector
102
+
103
+ def loadosophia_uploader(params = {}, &block)
104
+ node = JmeterRuby::Plugins::LoadosophiaUploader.new(params)
105
+ attach_node(node, &block)
106
+ end
107
+
108
+ alias loadosophia loadosophia_uploader
109
+
110
+ def redis_data_set(params = {}, &block)
111
+ node = JmeterRuby::Plugins::RedisDataSet.new(params)
112
+ attach_node(node, &block)
113
+ end
114
+
115
+ def jmx_collector(params = {}, &block)
116
+ node = JmeterRuby::Plugins::JMXCollector.new(params)
117
+ attach_node(node, &block)
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,28 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def extract(params, &block)
4
+ node = if params[:regex]
5
+ params[:refname] = params[:name]
6
+ params[:regex] = params[:regex] #CGI.escapeHTML
7
+ params[:template] = params[:template] || "$1$"
8
+ JmeterRuby::RegularExpressionExtractor.new(params)
9
+ elsif params[:xpath]
10
+ params[:refname] = params[:name]
11
+ params[:xpathQuery] = params[:xpath]
12
+ JmeterRuby::XpathExtractor.new(params)
13
+ elsif params[:json]
14
+ params[:VAR] = params[:name]
15
+ params[:JSONPATH] = params[:json]
16
+ JmeterRuby::Plugins::JsonPathExtractor.new(params)
17
+ elsif params[:css]
18
+ params[:refname] = params[:name]
19
+ params[:expr] = params[:css]
20
+ JmeterRuby::CssjqueryExtractor.new(params)
21
+ end
22
+
23
+ attach_node(node, &block)
24
+ end
25
+
26
+ alias web_reg_save_param extract
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def regular_expression_extractor(params, &block)
4
+ params[:refname] = params[:name]
5
+ params[:regex] = params[:pattern]
6
+ params[:template] = params[:template] || "$1$"
7
+
8
+ node = JmeterRuby::RegularExpressionExtractor.new(params).tap do |node|
9
+ if params[:variable]
10
+ node.doc.xpath("//stringProp[@name='Sample.scope']").first.content = 'variable'
11
+
12
+ node.doc.children.first.add_child (
13
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
14
+ <stringProp name="Scope.variable">#{params[:variable]}</stringProp>
15
+ EOS
16
+ )
17
+ end
18
+ end
19
+
20
+ attach_node(node, &block)
21
+ end
22
+
23
+ alias regex regular_expression_extractor
24
+ end
25
+ end
@@ -0,0 +1,58 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def http_request(*args, &block)
4
+ params = args.shift || {}
5
+ params = { url: params }.merge(args.shift || {}) if params.class == String
6
+
7
+ params[:method] ||= case __callee__.to_s
8
+ when 'visit'
9
+ 'GET'
10
+ when 'submit'
11
+ 'POST'
12
+ else
13
+ __callee__.to_s.upcase
14
+ end
15
+
16
+ params[:name] ||= params[:url]
17
+
18
+ parse_http_request(params)
19
+
20
+ if params[:sample]
21
+ transaction name: params[:name], parent: true do
22
+ loops count: params[:sample].to_i do
23
+ params.delete(:sample)
24
+ attach_node(http_request_node(params), &block)
25
+ end
26
+ end
27
+ else
28
+ attach_node(http_request_node(params), &block)
29
+ end
30
+ end
31
+
32
+ def http_request_node(params)
33
+ JmeterRuby::HttpRequest.new(params).tap do |node|
34
+ node.doc.children.first.add_child (
35
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
36
+ <stringProp name="HTTPSampler.implementation">#{params[:implementation]}</stringProp>
37
+ EOS
38
+ ) if params[:implementation]
39
+
40
+ node.doc.children.first.add_child (
41
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
42
+ <stringProp name="TestPlan.comments">#{params[:comments]}</stringProp>
43
+ EOS
44
+ ) if params[:comments]
45
+ end
46
+ end
47
+
48
+ alias request http_request
49
+ alias get http_request
50
+ alias visit http_request
51
+ alias post http_request
52
+ alias submit http_request
53
+ alias delete http_request
54
+ alias patch http_request
55
+ alias put http_request
56
+ alias head http_request
57
+ end
58
+ end
@@ -0,0 +1,26 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def jms_pointtopoint(params, &block)
4
+
5
+ node = JmeterRuby::JmsPointtopoint.new(params).tap do |node|
6
+
7
+ if params[:jndi_properties]
8
+ params[:jndi_properties].map do |property_name, property_value|
9
+ node.doc.xpath('//collectionProp').first.add_child (
10
+ Nokogiri::XML(<<-EOS.strip_heredoc).children
11
+ <elementProp name="#{property_name}" elementType="Argument">
12
+ <stringProp name="Argument.name">#{property_name}</stringProp>
13
+ <stringProp name="Argument.value">#{property_value}</stringProp>
14
+ <stringProp name="Argument.metadata">=</stringProp>
15
+ </elementProp>
16
+ EOS
17
+ )
18
+ end
19
+ end
20
+
21
+ attach_node(node, &block)
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def soapxmlrpc_request(params, &block)
4
+ params[:method] ||= 'POST'
5
+
6
+ super
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def setup_thread_group(*args, &block)
4
+ params = args.shift || {}
5
+ params = { count: params }.merge(args.shift || {}) if params.class == Integer
6
+ params[:num_threads] = params[:count] || 1
7
+ params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
8
+ params[:start_time] = params[:start_time] || Time.now.to_i * 1000
9
+ params[:end_time] = params[:end_time] || Time.now.to_i * 1000
10
+ params[:duration] ||= 60
11
+ params[:continue_forever] ||= false
12
+ params[:loops] = -1 if params[:continue_forever]
13
+ node = JmeterRuby::SetupThreadGroup.new(params)
14
+
15
+ attach_node(node, &block)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def thread_group(*args, &block)
4
+ params = args.shift || {}
5
+ params = { count: params }.merge(args.shift || {}) if params.class == Integer
6
+ params[:num_threads] = params[:count] || 1
7
+ params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
8
+ params[:start_time] = params[:start_time] || Time.now.to_i * 1000
9
+ params[:end_time] = params[:end_time] || Time.now.to_i * 1000
10
+ params[:duration] ||= 60
11
+ params[:continue_forever] ||= false
12
+ params[:loops] = -1 if params[:continue_forever]
13
+ node = JmeterRuby::ThreadGroup.new(params)
14
+ attach_node(node, &block)
15
+ end
16
+
17
+ alias threads thread_group
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def constant_throughput_timer(params, &block)
4
+ params[:value] ||= params[:throughput] || 0.0
5
+
6
+ node = JmeterRuby::ConstantThroughputTimer.new(params)
7
+ node.doc.xpath('//stringProp[@name="throughput"]').first.content = params[:value]
8
+ attach_node(node, &block)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module JmeterRuby
2
+ class ExtendedDSL < DSL
3
+ def random_timer(delay=0, range=0, &block)
4
+ params = {}
5
+ params[:delay] = delay
6
+ params[:range] = range
7
+ node = JmeterRuby::GaussianRandomTimer.new(params)
8
+
9
+ attach_node(node, &block)
10
+ end
11
+
12
+ alias think_time random_timer
13
+ end
14
+ end
@@ -0,0 +1,54 @@
1
+ require 'set'
2
+
3
+ module JmeterRuby
4
+
5
+ class FallbackContextProxy
6
+ NON_PROXIED_METHODS = Set[:object_id, :__send__, :__id__, :==, :equal?, :"!", :"!=", :instance_eval,
7
+ :instance_variables, :instance_variable_get, :instance_variable_set,
8
+ :remove_instance_variable]
9
+
10
+ NON_PROXIED_INSTANCE_VARIABLES = Set[:@__receiver__, :@__fallback__]
11
+
12
+ instance_methods.each do |method|
13
+ unless NON_PROXIED_METHODS.include?(method.to_sym)
14
+ undef_method(method)
15
+ end
16
+ end
17
+
18
+ def initialize(receiver, fallback)
19
+ @__receiver__ = receiver
20
+ @__fallback__ = fallback
21
+ end
22
+
23
+ def id
24
+ @__receiver__.__send__(:id)
25
+ end
26
+
27
+ # Special case due to `Kernel#sub`'s existence
28
+ def sub(*args, &block)
29
+ __proxy_method__(:sub, *args, &block)
30
+ end
31
+
32
+ # Special case to allow proxy instance variables
33
+ def instance_variables
34
+ # Ruby 1.8.x returns string names, convert to symbols
35
+ super.map(&:to_sym) - NON_PROXIED_INSTANCE_VARIABLES.to_a
36
+ end
37
+
38
+ def method_missing(method, *args, &block)
39
+ __proxy_method__(method, *args, &block)
40
+ end
41
+
42
+ def __proxy_method__(method, *args, &block)
43
+ begin
44
+ @__receiver__.__send__(method.to_sym, *args, &block)
45
+ rescue ::NoMethodError => e
46
+ begin
47
+ @__fallback__.__send__(method.to_sym, *args, &block)
48
+ rescue ::NoMethodError
49
+ raise(e)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,75 @@
1
+ module JmeterRuby
2
+ def dsl_eval(dsl, &block)
3
+ block_context = eval("self", block.binding)
4
+ proxy_context = JmeterRuby::FallbackContextProxy.new(dsl, block_context)
5
+ begin
6
+ block_context.instance_variables.each { |ivar| proxy_context.instance_variable_set(ivar, block_context.instance_variable_get(ivar)) }
7
+ proxy_context.instance_eval(&block)
8
+ ensure
9
+ block_context.instance_variables.each { |ivar| block_context.instance_variable_set(ivar, proxy_context.instance_variable_get(ivar)) }
10
+ end
11
+ dsl
12
+ end
13
+
14
+ module_function :dsl_eval
15
+
16
+ module Helper
17
+ def update(params)
18
+ params.delete(:name)
19
+ enabled_disabled(params)
20
+ if params.class == Array
21
+ update_collection params
22
+ else
23
+ params.each do |name, value|
24
+ node = @doc.children.xpath("//*[contains(@name,\"#{name.to_s}\")]")
25
+ if value.class == Nokogiri::XML::Builder
26
+ node.first.children = value.doc.at_xpath('//builder').children
27
+ else
28
+ node.first.content = value unless node.empty?
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+
35
+ def enabled_disabled(params)
36
+ return unless params.is_a?(Hash)
37
+ @doc.children.first.attributes['enabled'].value = params[:enabled].to_s.empty? ? 'true' : 'false'
38
+ end
39
+
40
+ def update_at_xpath(params)
41
+ params[:update_at_xpath].each do |fragment|
42
+ if fragment[:xpath]
43
+ @doc.at_xpath(fragment[:xpath]) << fragment[:value]
44
+ else
45
+ fragment.each do |xpath, value|
46
+ @doc.at_xpath(xpath).content = value
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def update_collection(params)
53
+ elements = @doc.at_xpath("//collectionProp/elementProp")
54
+ params.each_with_index do |param, index|
55
+ param.each do |name, value|
56
+ next unless elements && elements.element_children
57
+ element = elements.element_children.xpath("//*[contains(@name,\"#{name}\")]")
58
+ element.last.content = value
59
+ end
60
+ if index != params.size - 1 && elements
61
+ @doc.at_xpath("//collectionProp") << elements.dup
62
+ end
63
+ end
64
+ end
65
+
66
+ def enabled(params)
67
+ #default to true unless explicitly set to false
68
+ if params.has_key?(:enabled) && params[:enabled] == false
69
+ 'false'
70
+ else
71
+ 'true'
72
+ end
73
+ end
74
+ end
75
+ end