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.
- checksums.yaml +7 -0
- data/.gitattributes +22 -0
- data/.github/workflows/ci.yml +54 -0
- data/.gitignore +24 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/CHANGES.md +77 -0
- data/Gemfile +23 -0
- data/LICENSE.txt +21 -0
- data/README.md +434 -0
- data/Rakefile +18 -0
- data/examples/OS_process_sampler.rb +24 -0
- data/examples/assertion_results.rb +18 -0
- data/examples/basic_auth.rb +11 -0
- data/examples/browser_headers.rb +7 -0
- data/examples/composite_graph.rb +29 -0
- data/examples/constant_throughput_timer.rb +11 -0
- data/examples/csv_data_set.rb +11 -0
- data/examples/dummy_sampler.rb +9 -0
- data/examples/duration_assertion.rb +10 -0
- data/examples/etsy_login_browse.rb +61 -0
- data/examples/extract.rb +12 -0
- data/examples/foreach_controller.rb +29 -0
- data/examples/header_manager.rb +29 -0
- data/examples/http_cache_manager.rb +11 -0
- data/examples/http_cookie_manager.rb +11 -0
- data/examples/http_request_defaults.rb +11 -0
- data/examples/http_request_post.rb +11 -0
- data/examples/http_request_with_files.rb +13 -0
- data/examples/http_request_with_query_params.rb +8 -0
- data/examples/jmeter_plugins_graphs.rb +22 -0
- data/examples/json_path_assertions.rb +11 -0
- data/examples/json_path_extractor.rb +10 -0
- data/examples/json_path_postprocessor.rb +10 -0
- data/examples/jsr223_assertion.rb +13 -0
- data/examples/ldap_sampler.rb +16 -0
- data/examples/loadosophia.rb +18 -0
- data/examples/loop_controller.rb +10 -0
- data/examples/loops_with_counter.rb +15 -0
- data/examples/once_only_controller.rb +15 -0
- data/examples/perfmon.rb +46 -0
- data/examples/real_custom_methods.rb +19 -0
- data/examples/real_page_objects.rb +41 -0
- data/examples/real_redis_data_set_with_setup.rb +123 -0
- data/examples/real_user_objects_github.rb +112 -0
- data/examples/regular_expression_extractor.rb +12 -0
- data/examples/response_assertion.rb +15 -0
- data/examples/response_time_percentiles_graph.rb +11 -0
- data/examples/rsync.rb +16 -0
- data/examples/sample_transaction.rb +18 -0
- data/examples/simple_data_writer_listener.rb +11 -0
- data/examples/stepping_thread_group.rb +30 -0
- data/examples/test_fragment.rb +14 -0
- data/examples/think_time.rb +15 -0
- data/examples/thread_groups.rb +7 -0
- data/examples/throughput_controller.rb +14 -0
- data/examples/throughput_shaping_timer.rb +20 -0
- data/examples/ultimate_thread_group.rb +39 -0
- data/examples/unicode.rb +8 -0
- data/examples/user_defined_variables.rb +10 -0
- data/examples/user_parameters.rb +28 -0
- data/examples/uuid_per_iteration.rb +15 -0
- data/jmeter-ruby.gemspec +28 -0
- data/lib/jmeter-ruby/DSL.md +235 -0
- data/lib/jmeter-ruby/dsl/access_log_sampler.rb +32 -0
- data/lib/jmeter-ruby/dsl/aggregate_graph.rb +55 -0
- data/lib/jmeter-ruby/dsl/aggregate_report.rb +55 -0
- data/lib/jmeter-ruby/dsl/ajp13_sampler.rb +41 -0
- data/lib/jmeter-ruby/dsl/assertion_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/beanshell_assertion.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_listener.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_preprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_sampler.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_timer.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_assertion.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_listener.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_preprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_sampler.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_timer.rb +28 -0
- data/lib/jmeter-ruby/dsl/compare_assertion.rb +27 -0
- data/lib/jmeter-ruby/dsl/comparison_assertion_visualizer.rb +55 -0
- data/lib/jmeter-ruby/dsl/constant_throughput_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/constant_timer.rb +25 -0
- data/lib/jmeter-ruby/dsl/counter.rb +31 -0
- data/lib/jmeter-ruby/dsl/cssjquery_extractor.rb +31 -0
- data/lib/jmeter-ruby/dsl/csv_data_set_config.rb +33 -0
- data/lib/jmeter-ruby/dsl/debug_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/debug_sampler.rb +27 -0
- data/lib/jmeter-ruby/dsl/distribution_graphalpha.rb +55 -0
- data/lib/jmeter-ruby/dsl/duration_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/foreach_controller.rb +27 -0
- data/lib/jmeter-ruby/dsl/ftp_request.rb +34 -0
- data/lib/jmeter-ruby/dsl/ftp_request_defaults.rb +32 -0
- data/lib/jmeter-ruby/dsl/gaussian_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/generate_summary_results.rb +23 -0
- data/lib/jmeter-ruby/dsl/graph_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/html_assertion.rb +30 -0
- data/lib/jmeter-ruby/dsl/html_link_parser.rb +23 -0
- data/lib/jmeter-ruby/dsl/html_parameter_mask.rb +32 -0
- data/lib/jmeter-ruby/dsl/http_authorization_manager.rb +33 -0
- data/lib/jmeter-ruby/dsl/http_cache_manager.rb +26 -0
- data/lib/jmeter-ruby/dsl/http_cookie_manager.rb +28 -0
- data/lib/jmeter-ruby/dsl/http_header_manager.rb +30 -0
- data/lib/jmeter-ruby/dsl/http_request.rb +41 -0
- data/lib/jmeter-ruby/dsl/http_request_defaults.rb +41 -0
- data/lib/jmeter-ruby/dsl/http_url_rewriting_modifier.rb +30 -0
- data/lib/jmeter-ruby/dsl/if_controller.rb +27 -0
- data/lib/jmeter-ruby/dsl/include_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/java_request.rb +69 -0
- data/lib/jmeter-ruby/dsl/java_request_defaults.rb +69 -0
- data/lib/jmeter-ruby/dsl/jdbc_connection_configuration.rb +37 -0
- data/lib/jmeter-ruby/dsl/jdbc_postprocessor.rb +33 -0
- data/lib/jmeter-ruby/dsl/jdbc_preprocessor.rb +33 -0
- data/lib/jmeter-ruby/dsl/jdbc_request.rb +33 -0
- data/lib/jmeter-ruby/dsl/jms_pointtopoint.rb +41 -0
- data/lib/jmeter-ruby/dsl/jms_publisher.rb +43 -0
- data/lib/jmeter-ruby/dsl/jms_subscriber.rb +35 -0
- data/lib/jmeter-ruby/dsl/json_path_postprocessor.rb +27 -0
- data/lib/jmeter-ruby/dsl/jsr223_assertion.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_listener.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_postprocessor.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_preprocessor.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_sampler.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_timer.rb +29 -0
- data/lib/jmeter-ruby/dsl/junit_request.rb +37 -0
- data/lib/jmeter-ruby/dsl/keystore_configuration.rb +28 -0
- data/lib/jmeter-ruby/dsl/ldap_extended_request.rb +42 -0
- data/lib/jmeter-ruby/dsl/ldap_extended_request_defaults.rb +42 -0
- data/lib/jmeter-ruby/dsl/ldap_request.rb +35 -0
- data/lib/jmeter-ruby/dsl/ldap_request_defaults.rb +39 -0
- data/lib/jmeter-ruby/dsl/login_config_element.rb +26 -0
- data/lib/jmeter-ruby/dsl/loop_controller.rb +26 -0
- data/lib/jmeter-ruby/dsl/mail_reader_sampler.rb +37 -0
- data/lib/jmeter-ruby/dsl/mailer_visualizer.rb +64 -0
- data/lib/jmeter-ruby/dsl/md5hex_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/module_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/monitor_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/once_only_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/os_process_sampler.rb +34 -0
- data/lib/jmeter-ruby/dsl/poisson_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/random_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/random_order_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/random_variable.rb +30 -0
- data/lib/jmeter-ruby/dsl/recording_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/regex_user_parameters.rb +27 -0
- data/lib/jmeter-ruby/dsl/regular_expression_extractor.rb +32 -0
- data/lib/jmeter-ruby/dsl/response_assertion.rb +31 -0
- data/lib/jmeter-ruby/dsl/response_time_graph.rb +55 -0
- data/lib/jmeter-ruby/dsl/result_status_action_handler.rb +25 -0
- data/lib/jmeter-ruby/dsl/runtime_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/save_responses_to_a_file.rb +29 -0
- data/lib/jmeter-ruby/dsl/setup_thread_group.rb +36 -0
- data/lib/jmeter-ruby/dsl/simple_config_element.rb +23 -0
- data/lib/jmeter-ruby/dsl/simple_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/simple_data_writer.rb +55 -0
- data/lib/jmeter-ruby/dsl/smime_assertion.rb +35 -0
- data/lib/jmeter-ruby/dsl/smtp_sampler.rb +51 -0
- data/lib/jmeter-ruby/dsl/soapxmlrpc_request.rb +33 -0
- data/lib/jmeter-ruby/dsl/spline_visualizer.rb +55 -0
- data/lib/jmeter-ruby/dsl/summary_report.rb +55 -0
- data/lib/jmeter-ruby/dsl/switch_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/synchronizing_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/tcp_sampler.rb +33 -0
- data/lib/jmeter-ruby/dsl/tcp_sampler_config.rb +31 -0
- data/lib/jmeter-ruby/dsl/test_action.rb +27 -0
- data/lib/jmeter-ruby/dsl/test_fragment.rb +23 -0
- data/lib/jmeter-ruby/dsl/test_plan.rb +31 -0
- data/lib/jmeter-ruby/dsl/thread_group.rb +37 -0
- data/lib/jmeter-ruby/dsl/throughput_controller.rb +32 -0
- data/lib/jmeter-ruby/dsl/transaction_controller.rb +26 -0
- data/lib/jmeter-ruby/dsl/uniform_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/user_defined_variables.rb +33 -0
- data/lib/jmeter-ruby/dsl/user_parameters.rb +30 -0
- data/lib/jmeter-ruby/dsl/view_results_in_table.rb +55 -0
- data/lib/jmeter-ruby/dsl/view_results_tree.rb +55 -0
- data/lib/jmeter-ruby/dsl/while_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/xml_assertion.rb +23 -0
- data/lib/jmeter-ruby/dsl/xml_schema_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/xpath_assertion.rb +31 -0
- data/lib/jmeter-ruby/dsl/xpath_extractor.rb +31 -0
- data/lib/jmeter-ruby/dsl.rb +102 -0
- data/lib/jmeter-ruby/extend/assertions/response_assertion.rb +36 -0
- data/lib/jmeter-ruby/extend/config_elements/header_manager.rb +13 -0
- data/lib/jmeter-ruby/extend/config_elements/http_cache_manager.rb +12 -0
- data/lib/jmeter-ruby/extend/config_elements/http_cookie_manager.rb +36 -0
- data/lib/jmeter-ruby/extend/config_elements/http_request_defaults.rb +39 -0
- data/lib/jmeter-ruby/extend/config_elements/user_defined_variables.rb +13 -0
- data/lib/jmeter-ruby/extend/config_elements/user_parameters.rb +31 -0
- data/lib/jmeter-ruby/extend/controllers/foreach_controller.rb +27 -0
- data/lib/jmeter-ruby/extend/controllers/loop_controller.rb +11 -0
- data/lib/jmeter-ruby/extend/controllers/module_controller.rb +23 -0
- data/lib/jmeter-ruby/extend/controllers/throughput_controller.rb +15 -0
- data/lib/jmeter-ruby/extend/controllers/transaction_controller.rb +14 -0
- data/lib/jmeter-ruby/extend/misc/aliases.rb +21 -0
- data/lib/jmeter-ruby/extend/misc/exists.rb +13 -0
- data/lib/jmeter-ruby/extend/misc/rsync.rb +24 -0
- data/lib/jmeter-ruby/extend/misc/uuid.rb +12 -0
- data/lib/jmeter-ruby/extend/misc/with_helpers.rb +27 -0
- data/lib/jmeter-ruby/extend/plugins/jmeter_plugins.rb +120 -0
- data/lib/jmeter-ruby/extend/processors/extract.rb +28 -0
- data/lib/jmeter-ruby/extend/processors/regular_expression_extractor.rb +25 -0
- data/lib/jmeter-ruby/extend/samplers/http_request.rb +58 -0
- data/lib/jmeter-ruby/extend/samplers/jms_pointtopoint.rb +26 -0
- data/lib/jmeter-ruby/extend/samplers/soapxmlrpc_request.rb +9 -0
- data/lib/jmeter-ruby/extend/threads/setup_thread_group.rb +18 -0
- data/lib/jmeter-ruby/extend/threads/thread_group.rb +19 -0
- data/lib/jmeter-ruby/extend/timers/constant_throughput_timer.rb +11 -0
- data/lib/jmeter-ruby/extend/timers/random_timer.rb +14 -0
- data/lib/jmeter-ruby/helpers/fallback_content_proxy.rb +54 -0
- data/lib/jmeter-ruby/helpers/helper.rb +75 -0
- data/lib/jmeter-ruby/helpers/logger-colors.rb +48 -0
- data/lib/jmeter-ruby/helpers/parser.rb +135 -0
- data/lib/jmeter-ruby/helpers/strip-heredoc.rb +5 -0
- data/lib/jmeter-ruby/helpers/user-agents.rb +27 -0
- data/lib/jmeter-ruby/idl.rb +70 -0
- data/lib/jmeter-ruby/idl.xml +1488 -0
- data/lib/jmeter-ruby/plugins/active_threads_over_time.rb +57 -0
- data/lib/jmeter-ruby/plugins/composite_graph.rb +71 -0
- data/lib/jmeter-ruby/plugins/console_status_logger.rb +15 -0
- data/lib/jmeter-ruby/plugins/dummy_sampler.rb +26 -0
- data/lib/jmeter-ruby/plugins/jmx_collector.rb +73 -0
- data/lib/jmeter-ruby/plugins/json_path_assertion.rb +19 -0
- data/lib/jmeter-ruby/plugins/json_path_extractor.rb +20 -0
- data/lib/jmeter-ruby/plugins/latencies_over_time.rb +49 -0
- data/lib/jmeter-ruby/plugins/loadosophia_uploader.rb +63 -0
- data/lib/jmeter-ruby/plugins/perfmon_collector.rb +80 -0
- data/lib/jmeter-ruby/plugins/redis_data_set.rb +39 -0
- data/lib/jmeter-ruby/plugins/response_codes_per_second.rb +49 -0
- data/lib/jmeter-ruby/plugins/response_times_distribution.rb +49 -0
- data/lib/jmeter-ruby/plugins/response_times_over_time.rb +50 -0
- data/lib/jmeter-ruby/plugins/response_times_percentiles.rb +51 -0
- data/lib/jmeter-ruby/plugins/stepping_thread_group.rb +30 -0
- data/lib/jmeter-ruby/plugins/transactions_per_second.rb +50 -0
- data/lib/jmeter-ruby/plugins/ultimate_thread_group.rb +23 -0
- data/lib/jmeter-ruby/plugins/variable_throughput_timer.rb +27 -0
- data/lib/jmeter-ruby/version.rb +12 -0
- data/lib/jmeter-ruby.rb +27 -0
- data/mise.toml +2 -0
- data/script/release +162 -0
- data/spec/constant_throughput_timer_spec.rb +20 -0
- data/spec/csv_data_set_config_spec.rb +33 -0
- data/spec/header_manager_spec.rb +37 -0
- data/spec/http_cache_manager_spec.rb +29 -0
- data/spec/http_cookie_manager_spec.rb +169 -0
- data/spec/http_request_defaults_spec.rb +57 -0
- data/spec/http_request_spec.rb +305 -0
- data/spec/jmeter_plugins_spec.rb +245 -0
- data/spec/json_extractor_spec.rb +19 -0
- data/spec/json_path_assertion_spec.rb +28 -0
- data/spec/logic_controller_spec.rb +148 -0
- data/spec/loop_controller_spec.rb +19 -0
- data/spec/module_controller_spec.rb +56 -0
- data/spec/regular_expression_extractor_spec.rb +63 -0
- data/spec/response_assertion_spec.rb +69 -0
- data/spec/setup_thread_group_spec.rb +31 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/thread_group_spec.rb +57 -0
- data/spec/throughput_controller_spec.rb +24 -0
- data/spec/transaction_controller_spec.rb +30 -0
- data/spec/user_defined_variables_spec.rb +22 -0
- data/spec/user_parameters_spec.rb +45 -0
- data/spec/with_helpers_spec.rb +57 -0
- data/spec/xpath_extractor_spec.rb +15 -0
- 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
|