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,169 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'http_cookie_manager' do
6
+ describe 'the clear_each_iteration option should be respected' do
7
+ let(:doc) do
8
+ test do
9
+ cookies clear_each_iteration: true
10
+ end.to_doc
11
+ end
12
+
13
+ let(:cookies_fragment) { doc.search('//CookieManager') }
14
+
15
+ it 'should match on clearEachIteration' do
16
+ expect(cookies_fragment.search(".//boolProp[@name='CookieManager.clearEachIteration']").first.text).to eq 'true'
17
+ end
18
+ end
19
+
20
+ describe 'the user_defined_cookie option should be respected' do
21
+ context 'when the user_defined_cookie option is empty' do
22
+ let(:doc) do
23
+ test do
24
+ cookies
25
+ end.to_doc
26
+ end
27
+
28
+ let(:cookies_fragment) { doc.search('//CookieManager') }
29
+
30
+ it 'should not populate the collectionProp' do
31
+ expect(cookies_fragment.search("..//collectionProp[@name='CookieManager.cookies']").children.count).to eq 0
32
+ end
33
+ end
34
+
35
+ context 'when the user_defined_cookie option is set' do
36
+ let(:cookie_name) { 'cookie_1' }
37
+ let(:cookie_value) { 'cookie_value' }
38
+ let(:cookie_domain) { 'example.com' }
39
+ let(:cookie_path) { '/' }
40
+ let(:cookie_secure) { true }
41
+
42
+ let(:cookies_fragment) { doc.search('//CookieManager') }
43
+ let(:elements) { cookies_fragment.search("..//collectionProp[@name='CookieManager.cookies']").children }
44
+
45
+ context 'with all the cookie attributes provided' do
46
+ let(:doc) do
47
+ test do
48
+ cookies user_defined_cookies: [
49
+ {
50
+ name: cookie_name,
51
+ value: cookie_value,
52
+ domain: cookie_domain,
53
+ path: cookie_path,
54
+ secure: cookie_secure
55
+ }
56
+ ]
57
+ end.to_doc
58
+ end
59
+
60
+ it 'should add an element to the cookie manager collection' do
61
+ expect(elements.count).to eq 1
62
+ end
63
+
64
+ it 'should add the correct name to the collection element' do
65
+ expect(elements.first.attribute('name').value).to eq cookie_name
66
+ end
67
+
68
+ it 'should add the correct elementType to the collection element' do
69
+ expect(elements.first.attribute('elementType').value).to eq 'Cookie'
70
+ end
71
+
72
+ it 'should add the correct testName to the collection element' do
73
+ expect(elements.first.attribute('testname').value).to eq cookie_name
74
+ end
75
+
76
+ it 'should add a Cookie.value stringProp to the element' do
77
+ expect(elements.first.search("//stringProp[@name='Cookie.value']").text).to eq cookie_value
78
+ end
79
+
80
+ it 'should add a Cookie.domain stringProp to the element' do
81
+ expect(elements.first.search("//stringProp[@name='Cookie.domain']").text).to eq cookie_domain
82
+ end
83
+
84
+ it 'should add a Cookie.path stringProp to the element' do
85
+ expect(elements.first.search("//stringProp[@name='Cookie.path']").text).to eq cookie_path
86
+ end
87
+
88
+ it 'should add a Cookie.secure boolProp to the element' do
89
+ expect(elements.first.search("//boolProp[@name='Cookie.secure']").text).to eq 'true'
90
+ end
91
+
92
+ it 'should add a Cookie.expires longProp to the element' do
93
+ expect(elements.first.search("//longProp[@name='Cookie.expires']").text).to eq '0'
94
+ end
95
+
96
+ it 'should add a Cookie.path_specified boolProp to the element' do
97
+ expect(elements.first.search("//boolProp[@name='Cookie.path_specified']").text).to eq 'true'
98
+ end
99
+
100
+ it 'should add a Cookie.domain_specified boolProp to the element' do
101
+ expect(elements.first.search("//boolProp[@name='Cookie.domain_specified']").text).to eq 'true'
102
+ end
103
+ end
104
+
105
+ context 'without optional cookie attributes provided' do
106
+ let(:doc) do
107
+ test do
108
+ cookies user_defined_cookies: [
109
+ {
110
+ name: cookie_name,
111
+ value: cookie_value
112
+ }
113
+ ]
114
+ end.to_doc
115
+ end
116
+
117
+ it 'should add a default Cookie.secure boolProp to the element' do
118
+ expect(elements.first.search("//boolProp[@name='Cookie.secure']").text).to eq 'false'
119
+ end
120
+
121
+ it 'should add a default Cookie.domain stringProp to the element' do
122
+ expect(elements.first.search("//stringProp[@name='Cookie.domain']").text).to eq ''
123
+ end
124
+
125
+ it 'should add a default Cookie.path stringProp to the element' do
126
+ expect(elements.first.search("//stringProp[@name='Cookie.path']").text).to eq ''
127
+ end
128
+ end
129
+
130
+ context 'without required cookie attributes provided' do
131
+ it 'should raise an error if name is not provided' do
132
+ expect { test { cookies user_defined_cookies: [{ value: cookie_value }] } }
133
+ .to raise_error('Cookie name must be provided.')
134
+ end
135
+ it 'should raise an error if value is not provided' do
136
+ expect { test { cookies user_defined_cookies: [{ name: cookie_name }] } }
137
+ .to raise_error('Cookie value must be provided.')
138
+ end
139
+ end
140
+
141
+ context 'when multiple cookies are set' do
142
+ let(:doc) do
143
+ test do
144
+ cookies user_defined_cookies: [
145
+ {
146
+ name: cookie_name,
147
+ value: cookie_value,
148
+ domain: cookie_domain,
149
+ path: cookie_path,
150
+ secure: cookie_secure
151
+ },
152
+ {
153
+ name: cookie_name,
154
+ value: cookie_value,
155
+ domain: cookie_domain,
156
+ path: cookie_path,
157
+ secure: cookie_secure
158
+ }
159
+ ]
160
+ end.to_doc
161
+ end
162
+
163
+ it 'should add multiple elements to the cookie manager collection' do
164
+ expect(elements.count).to eq 2
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'regular_expression_extractor' do
4
+ describe 'standard scope' do
5
+ let(:doc) do
6
+ test do
7
+ defaults domain: 'example.com',
8
+ protocol: 'https',
9
+ implementation: 'HttpClient3.1',
10
+ download_resources: true,
11
+ use_concurrent_pool: 5,
12
+ urls_must_match: 'http.+?example.com',
13
+ proxy_host: 'proxy',
14
+ proxy_port: 8080
15
+ end.to_doc
16
+ end
17
+
18
+ let(:config_fragment) { doc.search('//ConfigTestElement').first }
19
+ let(:sampler_fragment) { doc.search('//HTTPSamplerProxy').first }
20
+
21
+ it 'matches on domain' do
22
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.domain']").text).to eq 'example.com'
23
+ end
24
+
25
+ it 'matches on protocol' do
26
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.protocol']").text).to eq 'https'
27
+ end
28
+
29
+ it 'matches on implementation' do
30
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.implementation']").text).to eq 'HttpClient3.1'
31
+ end
32
+
33
+ it 'matches on image_parser' do
34
+ expect(config_fragment.search(".//boolProp[@name='HTTPSampler.image_parser']").text).to eq 'true'
35
+ end
36
+
37
+ it 'matches on concurrent download' do
38
+ expect(config_fragment.search(".//boolProp[@name='HTTPSampler.concurrentDwn']").text).to eq 'true'
39
+ end
40
+
41
+ it 'matches on concurrent pool' do
42
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.concurrentPool']").text).to eq '5'
43
+ end
44
+
45
+ it 'matches on embedded url regex' do
46
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.embedded_url_re']").text).to eq 'http.+?example.com'
47
+ end
48
+
49
+ it 'matches on proxy_host' do
50
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.proxyHost']").text).to eq 'proxy'
51
+ end
52
+
53
+ it 'matches on proxy_port' do
54
+ expect(config_fragment.search(".//stringProp[@name='HTTPSampler.proxyPort']").text).to eq '8080'
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,305 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'http_request' do
4
+ describe 'get basic' do
5
+ let(:doc) do
6
+ test do
7
+ threads count: 1 do
8
+ get name: 'Home Page', url: 'https://flooded.io/'
9
+ end
10
+ end.to_doc
11
+ end
12
+
13
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
14
+
15
+ it 'matches on method' do
16
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'GET'
17
+ end
18
+
19
+ it 'matches on domain' do
20
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.domain']").text).to eq 'flooded.io'
21
+ end
22
+
23
+ it 'matches on port' do
24
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.port']").text).to eq '443'
25
+ end
26
+
27
+ it 'matches on protocol' do
28
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.protocol']").text).to eq 'https'
29
+ end
30
+
31
+ it 'matches on path' do
32
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.path']").text).to eq '/'
33
+ end
34
+ end
35
+
36
+ describe 'get with options' do
37
+ let(:doc) do
38
+ test do
39
+ threads count: 1 do
40
+ get name: 'Home Page', url: 'https://flooded.io/', follow_redirects: false, use_keepalive: false
41
+ end
42
+ end.to_doc
43
+ end
44
+
45
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
46
+
47
+ it 'matches on domain' do
48
+ expect(fragment.search(".//boolProp[@name='HTTPSampler.follow_redirects']").text).to eq 'false'
49
+ end
50
+
51
+ it 'matches on port' do
52
+ expect(fragment.search(".//boolProp[@name='HTTPSampler.use_keepalive']").text).to eq 'false'
53
+ end
54
+ end
55
+
56
+ describe 'visit' do
57
+ let(:doc) do
58
+ test do
59
+ threads count: 1 do
60
+ visit name: 'Home Page', url: 'https://flooded.io/'
61
+ end
62
+ end.to_doc
63
+ end
64
+
65
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
66
+
67
+ it 'matches on method' do
68
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'GET'
69
+ end
70
+ end
71
+
72
+ describe 'visit variations' do
73
+ let(:doc) do
74
+ test do
75
+ threads do
76
+ visit url: "/home?location=melbourne&location=sydney", always_encode: true
77
+ end
78
+ end.to_doc
79
+ end
80
+
81
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
82
+
83
+ it 'should match on path' do
84
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.path']").text).to eq '/home'
85
+ end
86
+
87
+ context 'first argument' do
88
+ it 'should match on always_encode' do
89
+ expect(fragment.search(".//boolProp[@name='HTTPArgument.always_encode']")[0].text).to eq 'true'
90
+ end
91
+
92
+ it 'should match on query param name: location' do
93
+ expect(fragment.search(".//stringProp[@name='Argument.name']")[0].text).to eq 'location'
94
+ end
95
+
96
+ it 'should match on query param value: melbourne' do
97
+ expect(fragment.search(".//stringProp[@name='Argument.value']")[0].text).to eq 'melbourne'
98
+ end
99
+ end
100
+
101
+ context 'second argument' do
102
+ it 'should match on always_encode' do
103
+ expect(fragment.search(".//boolProp[@name='HTTPArgument.always_encode']")[1].text).to eq 'true'
104
+ end
105
+
106
+ it 'should match on query param name: location' do
107
+ expect(fragment.search(".//stringProp[@name='Argument.name']")[1].text).to eq 'location'
108
+ end
109
+
110
+ it 'should match on query param value: sydney' do
111
+ expect(fragment.search(".//stringProp[@name='Argument.value']")[1].text).to eq 'sydney'
112
+ end
113
+ end
114
+ end
115
+
116
+ describe 'visit old syntax' do
117
+ let(:doc) do
118
+ test do
119
+ threads do
120
+ visit "/home?location=melbourne", always_encode: true
121
+ end
122
+ end.to_doc
123
+ end
124
+
125
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
126
+
127
+ it 'should match on path' do
128
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.path']").text).to eq '/home'
129
+ end
130
+ end
131
+
132
+ describe 'https' do
133
+ let(:doc) do
134
+ test do
135
+ threads do
136
+ visit url: "https://example.com"
137
+ end
138
+ end.to_doc
139
+ end
140
+
141
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
142
+
143
+ it 'should match on protocol' do
144
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.protocol']").text).to eq 'https'
145
+ end
146
+ end
147
+
148
+ describe 'post' do
149
+ let(:doc) do
150
+ test do
151
+ threads count: 1 do
152
+ post name: 'Home Page', url: 'https://flooded.io/'
153
+ end
154
+ end.to_doc
155
+ end
156
+
157
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
158
+
159
+ it 'matches on method' do
160
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'POST'
161
+ end
162
+ end
163
+
164
+ describe 'post raw_path' do
165
+ let(:doc) do
166
+ test do
167
+ threads do
168
+ transaction name: "TC_02" do
169
+ post url: "/home?location=melbourne", raw_path: true
170
+ end
171
+ end
172
+ end.to_doc
173
+ end
174
+
175
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
176
+
177
+ it 'should match on path' do
178
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.path']").text).to eq '/home?location=melbourne'
179
+ end
180
+ end
181
+
182
+ describe 'post raw body containing xml entities' do
183
+ let(:doc) do
184
+ test do
185
+ threads do
186
+ post url: 'http://example.com', raw_body: 'username=my_name&password=my_password&email="my name <test@example.com>"'
187
+ end
188
+ end.to_doc
189
+ end
190
+
191
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
192
+
193
+ it 'escape raw_body' do
194
+ expect(fragment.search(".//stringProp[@name='Argument.value']").text).to eq 'username=my_name&password=my_password&email="my name <test@example.com>"'
195
+ end
196
+ end
197
+
198
+ describe 'submit' do
199
+ let(:doc) do
200
+ test do
201
+ threads count: 1 do
202
+ submit name: 'Home Page', url: 'https://flooded.io/'
203
+ end
204
+ end.to_doc
205
+ end
206
+
207
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
208
+
209
+ it 'matches on method' do
210
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'POST'
211
+ end
212
+ end
213
+
214
+ describe 'submit variations' do
215
+ let(:doc) do
216
+ test do
217
+ threads do
218
+ submit url: '/', fill_in: { username: 'tim', password: 'password' }
219
+ end
220
+ end.to_doc
221
+ end
222
+
223
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
224
+
225
+ it 'should match on POST' do
226
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'POST'
227
+ end
228
+
229
+ it 'should have no files' do
230
+ expect(fragment.search(".//elementProp[@name='HTTPsampler.Files']").length).to eq 0
231
+ end
232
+ end
233
+
234
+ describe 'submit_with_files' do
235
+ let(:doc) do
236
+ test do
237
+ threads do
238
+ transaction name: "TC_03", parent: true, include_timers: true do
239
+ submit url: "/", fill_in: { username: 'tim', password: 'password' },
240
+ files: [{path: '/tmp/foo', paramname: 'fileup', mimetype: 'text/plain'},
241
+ {path: '/tmp/bar', paramname: 'otherfileup'}]
242
+ end
243
+ end
244
+ end.to_doc
245
+ end
246
+
247
+ let(:fragment) { doc.search("//HTTPSamplerProxy/elementProp[@name='HTTPsampler.Files']").first }
248
+
249
+ it 'should have two files' do
250
+ expect(fragment.search("./collectionProp/elementProp[@elementType='HTTPFileArg']").length).to eq 2
251
+ end
252
+
253
+ it 'should have one empty mimetype' do
254
+ expect(fragment.search("./collectionProp/elementProp[@elementType='HTTPFileArg']/stringProp[@name='File.mimetype' and normalize-space(.) = '']").length).to eq 1
255
+ end
256
+ end
257
+
258
+ describe 'patch' do
259
+ let(:doc) do
260
+ test do
261
+ threads count: 1 do
262
+ patch name: 'Home Page', url: 'https://flooded.io/'
263
+ end
264
+ end.to_doc
265
+ end
266
+
267
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
268
+
269
+ it 'matches on method' do
270
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'PATCH'
271
+ end
272
+ end
273
+
274
+ describe 'head' do
275
+ let(:doc) do
276
+ test do
277
+ threads count: 1 do
278
+ head name: 'Home Page', url: 'https://flooded.io/'
279
+ end
280
+ end.to_doc
281
+ end
282
+
283
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
284
+
285
+ it 'matches on method' do
286
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'HEAD'
287
+ end
288
+ end
289
+
290
+ describe 'put' do
291
+ let(:doc) do
292
+ test do
293
+ threads count: 1 do
294
+ put name: 'Home Page', url: 'https://flooded.io/'
295
+ end
296
+ end.to_doc
297
+ end
298
+
299
+ let(:fragment) { doc.search('//HTTPSamplerProxy').first }
300
+
301
+ it 'matches on method' do
302
+ expect(fragment.search(".//stringProp[@name='HTTPSampler.method']").text).to eq 'PUT'
303
+ end
304
+ end
305
+ end