ruby-jmeter 2.1.7 → 2.11.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.
- data/.ruby-version +1 -1
- data/README.md +19 -16
- data/examples/basic_meta_fu.rb +63 -0
- data/examples/basic_preprocessor_user_parameters.rb +21 -0
- data/lib/ruby-jmeter/dsl.rb +32 -4
- data/lib/ruby-jmeter/dsl/constant_throughput_timer.rb +1 -1
- data/lib/ruby-jmeter/dsl/csv_data_set_config.rb +1 -1
- data/lib/ruby-jmeter/dsl/http_request.rb +1 -1
- data/lib/ruby-jmeter/dsl/http_request_defaults.rb +4 -10
- data/lib/ruby-jmeter/dsl/if_controller.rb +1 -1
- data/lib/ruby-jmeter/dsl/jdbc_postprocessor.rb +1 -0
- data/lib/ruby-jmeter/dsl/jdbc_preprocessor.rb +1 -0
- data/lib/ruby-jmeter/dsl/jdbc_request.rb +1 -0
- data/lib/ruby-jmeter/dsl/jms_pointtopoint.rb +8 -2
- data/lib/ruby-jmeter/dsl/jms_publisher.rb +8 -2
- data/lib/ruby-jmeter/dsl/keystore_configuration.rb +1 -0
- data/lib/ruby-jmeter/dsl/ldap_request_defaults.rb +4 -5
- data/lib/ruby-jmeter/dsl/loop_controller.rb +1 -1
- data/lib/ruby-jmeter/dsl/response_assertion.rb +2 -2
- data/lib/ruby-jmeter/dsl/thread_group.rb +1 -1
- data/lib/ruby-jmeter/dsl/user_defined_variables.rb +5 -4
- data/lib/ruby-jmeter/dsl/user_parameters.rb +1 -2
- data/lib/ruby-jmeter/helpers/helper.rb +8 -2
- data/lib/ruby-jmeter/idl.xml +46 -36
- data/lib/ruby-jmeter/version.rb +1 -1
- data/spec/dsl_spec.rb +72 -10
- metadata +4 -2
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.9.3-
|
1
|
+
1.9.3-p484
|
data/README.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# RubyJmeter
|
2
2
|
|
3
|
+
[](https://travis-ci.org/flood-io/ruby-jmeter)
|
4
|
+
[](https://codeclimate.com/github/flood-io/ruby-jmeter)
|
5
|
+
|
3
6
|
Tired of using the JMeter GUI or looking at hairy XML files?
|
4
7
|
|
5
|
-
This gem lets you write test plans for JMeter in your favourite text editor, and optionally run them on [flood.io](http://flood.io).
|
8
|
+
This gem lets you write test plans for JMeter in your favourite text editor, and optionally run them on [flood.io](http://flood.io).
|
6
9
|
|
7
10
|
## Installation
|
8
11
|
|
@@ -32,7 +35,7 @@ test do
|
|
32
35
|
end.jmx
|
33
36
|
```
|
34
37
|
|
35
|
-
So in this example, we just created a test plan, with 10 threads, each of which visited the search page at Google.
|
38
|
+
So in this example, we just created a test plan, with 10 threads, each of which visited the search page at Google.
|
36
39
|
|
37
40
|
### Generating a JMeter Test Plan (JMX)
|
38
41
|
Note also how we called the `jmx` method of the test. Calling this method will write the contents of the JMeter test plan to file like this.
|
@@ -89,9 +92,9 @@ test do
|
|
89
92
|
visit name: 'Google Search', url: 'http://google.com'
|
90
93
|
end
|
91
94
|
end.run(
|
92
|
-
path: '/usr/share/jmeter/bin/',
|
93
|
-
file: 'jmeter.jmx',
|
94
|
-
log: 'jmeter.log',
|
95
|
+
path: '/usr/share/jmeter/bin/',
|
96
|
+
file: 'jmeter.jmx',
|
97
|
+
log: 'jmeter.log',
|
95
98
|
jtl: 'results.jtl')
|
96
99
|
```
|
97
100
|
|
@@ -102,16 +105,16 @@ You can also execute JMeter test plans on flood.io using our API. To do so, you
|
|
102
105
|
To execute the test on flood.io, call the `grid` method on the test and pass it the API token like this.
|
103
106
|
|
104
107
|
```ruby
|
105
|
-
test do
|
108
|
+
test do
|
106
109
|
threads count: 10 do
|
107
110
|
visit name: 'Google Search', url: 'http://google.com'
|
108
|
-
end
|
111
|
+
end
|
109
112
|
end.grid('OxtZ-4v-v0koSz5Y0enEQQ')
|
110
113
|
```
|
111
114
|
|
112
115
|
This will then provide you with a link to the live test results on flood.io like this.
|
113
116
|
|
114
|
-
```
|
117
|
+
```
|
115
118
|
Results at: http://prod.flood.io/shared?testguid=73608030311611e2962f123141011033&run_id=339&tags=jmeter&domain=altentee.com&cluster=54.251.48.129&status=running&view=
|
116
119
|
```
|
117
120
|
|
@@ -148,7 +151,7 @@ threads count: 100
|
|
148
151
|
threads count: 100, continue_forever: true
|
149
152
|
threads count: 100, loops: 10
|
150
153
|
threads count: 100, rampup: 30, duration: 60
|
151
|
-
threads count: 100, scheduler: true,
|
154
|
+
threads count: 100, scheduler: true,
|
152
155
|
start_time: Time.now.to_i * 1000,
|
153
156
|
end_time: (Time.now.to_i * 1000) + (3600 * 1000)
|
154
157
|
```
|
@@ -222,15 +225,15 @@ You can use the `visit` method to navigate to pages:
|
|
222
225
|
```ruby
|
223
226
|
visit name: 'Google Search', url: 'http://google.com'
|
224
227
|
visit name: 'Google Search', url: 'http://google.com'
|
225
|
-
visit name: 'Google Search', url: 'http://google.com',
|
226
|
-
method: 'POST',
|
228
|
+
visit name: 'Google Search', url: 'http://google.com',
|
229
|
+
method: 'POST',
|
227
230
|
'DO_MULTIPART_POST': 'true'
|
228
231
|
visit name: 'Google Search', url: 'http://google.com',
|
229
232
|
use_keepalive: 'false'
|
230
|
-
visit name: 'Google Search', url: 'http://google.com',
|
233
|
+
visit name: 'Google Search', url: 'http://google.com',
|
231
234
|
connect_timeout: '1000',
|
232
235
|
response_timeout: '60000'
|
233
|
-
visit name: 'View Login', url: '/login',
|
236
|
+
visit name: 'View Login', url: '/login',
|
234
237
|
protocol: "https",
|
235
238
|
port: 443
|
236
239
|
```
|
@@ -287,10 +290,10 @@ visit name: "Altentee", url: "http://altentee.com" do
|
|
287
290
|
extract regex: "content='(.+?)' name='csrf-token'", name: 'csrf-token'
|
288
291
|
extract regex: 'value="(.+?)" name="JESSIONSID"', name: 'JSESSIONID'
|
289
292
|
web_reg_save_param regex: 'value="(.+?)" name="VIEWSTATE"', name: 'VIEWSTATE'
|
290
|
-
extract name: 'username', regex: 'value="(.+?)", name="username"',
|
293
|
+
extract name: 'username', regex: 'value="(.+?)", name="username"',
|
291
294
|
default: 'Tim Koopmans',
|
292
295
|
match_number: 1
|
293
|
-
extract name: 'shopping_item', regex: 'id="(.+?)" name="book"',
|
296
|
+
extract name: 'shopping_item', regex: 'id="(.+?)" name="book"',
|
294
297
|
match_number: 0 # random
|
295
298
|
end
|
296
299
|
```
|
@@ -306,7 +309,7 @@ end
|
|
306
309
|
```
|
307
310
|
|
308
311
|
|
309
|
-
This method takes 3 parameters: the matching rule, the test string, and an optional parameters hash. This is based on the [Response Assertion](http://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion).
|
312
|
+
This method takes 3 parameters: the matching rule, the test string, and an optional parameters hash. This is based on the [Response Assertion](http://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion).
|
310
313
|
|
311
314
|
```ruby
|
312
315
|
visit "Altentee", "http://altentee.com" do
|
@@ -0,0 +1,63 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'ruby-jmeter'
|
3
|
+
|
4
|
+
class Test
|
5
|
+
def initialize options = {}
|
6
|
+
@users = options[:users]
|
7
|
+
@ramp = options[:ramp]
|
8
|
+
@duration = options[:duration]
|
9
|
+
@region = options[:region] || 'ap-southeast-2'
|
10
|
+
@name = options[:name]
|
11
|
+
end
|
12
|
+
|
13
|
+
def flood domain
|
14
|
+
@domain = domain
|
15
|
+
test_plan.grid ENV['FLOOD_IO_KEY'], region: @region, name: @name
|
16
|
+
end
|
17
|
+
|
18
|
+
def jmeter domain
|
19
|
+
@domain = domain
|
20
|
+
test_plan.run path: '/usr/share/jmeter/bin/', gui:true
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_plan
|
24
|
+
test do
|
25
|
+
grab_dsl self
|
26
|
+
defaults domain: @domain,
|
27
|
+
protocol: 'http',
|
28
|
+
image_parser: true,
|
29
|
+
concurrentDwn: true,
|
30
|
+
concurrentPool: 4
|
31
|
+
|
32
|
+
cookies
|
33
|
+
|
34
|
+
plan
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def plan
|
39
|
+
threads @users, {ramp_time: @ramp, duration: @duration, scheduler: true, continue_forever: true} do
|
40
|
+
random_timer 5000, 10000
|
41
|
+
|
42
|
+
transaction '01_GET_home_page' do
|
43
|
+
visit '/'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def grab_dsl dsl
|
49
|
+
@dsl = dsl
|
50
|
+
end
|
51
|
+
|
52
|
+
def method_missing method, *args, &block
|
53
|
+
@dsl.__send__ method, *args, &block
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
test = Test.new users:10, ramp: 30, duration: 30, name: 'Test Number 1'
|
58
|
+
|
59
|
+
# test locally with JMeter
|
60
|
+
test.jmeter 'google.com'
|
61
|
+
|
62
|
+
# test distributed with flood
|
63
|
+
# test.flood 'google.com'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'ruby-jmeter'
|
3
|
+
|
4
|
+
test do
|
5
|
+
# user parameters with multiple values
|
6
|
+
visit name: 'Home Page', url: 'http://google.com/' do
|
7
|
+
user_parameters names: ['name1', 'name2'],
|
8
|
+
thread_values: {
|
9
|
+
user_1: [
|
10
|
+
'value1',
|
11
|
+
'value2'
|
12
|
+
],
|
13
|
+
|
14
|
+
user_2: [
|
15
|
+
'value1',
|
16
|
+
'value2'
|
17
|
+
]
|
18
|
+
}
|
19
|
+
end
|
20
|
+
# end.run(path: '/usr/share/jmeter/bin/', gui: true)
|
21
|
+
end.out
|
data/lib/ruby-jmeter/dsl.rb
CHANGED
@@ -156,10 +156,10 @@ module RubyJmeter
|
|
156
156
|
params[:url] = params[:key] if URI.parse(URI::encode(params[:key])).scheme
|
157
157
|
|
158
158
|
params[:url] = if params[:host]
|
159
|
-
"http://#{params[:host]}
|
159
|
+
"http://#{params[:host]}/data/#{params[:command]}/#{params[:key]}?type=text"
|
160
160
|
end
|
161
161
|
|
162
|
-
params[:url] = 'http://54.252.206.143
|
162
|
+
params[:url] = 'http://54.252.206.143/data/' if params[:stub]
|
163
163
|
|
164
164
|
get name: '__testdata', url: params[:url] do
|
165
165
|
extract name: params[:name],
|
@@ -252,6 +252,34 @@ module RubyJmeter
|
|
252
252
|
##
|
253
253
|
# Other Elements
|
254
254
|
|
255
|
+
def user_parameters(params, &block)
|
256
|
+
if params.is_a?(Hash)
|
257
|
+
params['Argument.name'] = params[:name]
|
258
|
+
end
|
259
|
+
|
260
|
+
params[:names] = Nokogiri::XML::Builder.new do |b|
|
261
|
+
b.builder do
|
262
|
+
params[:names].each do |name|
|
263
|
+
b.stringProp name, name: name
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
params[:thread_values] = Nokogiri::XML::Builder.new do |b|
|
269
|
+
b.builder do
|
270
|
+
params[:thread_values].map do |user, values|
|
271
|
+
b.collectionProp name: user do
|
272
|
+
values.each_with_index.map do |value, index|
|
273
|
+
b.stringProp value, name: index
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
super
|
281
|
+
end
|
282
|
+
|
255
283
|
alias_method :bsh_pre, :beanshell_preprocessor
|
256
284
|
|
257
285
|
alias_method :bsh_post, :beanshell_postprocessor
|
@@ -284,7 +312,7 @@ module RubyJmeter
|
|
284
312
|
|
285
313
|
def response_assertion(params={}, &block)
|
286
314
|
params[:test_type] = parse_test_type(params)
|
287
|
-
params[
|
315
|
+
params["0"] = params.values.first
|
288
316
|
node = RubyJmeter::ResponseAssertion.new(params)
|
289
317
|
node.doc.xpath("//stringProp[@name='Assertion.scope']").remove if
|
290
318
|
params[:scope] == 'main' || params['scope'] == 'main'
|
@@ -405,7 +433,7 @@ module RubyJmeter
|
|
405
433
|
response = RestClient.post "#{params[:endpoint] ? params[:endpoint] : 'https://api.flood.io'}/floods?auth_token=#{token}",
|
406
434
|
{
|
407
435
|
:flood => {
|
408
|
-
:tool => 'jmeter-2.
|
436
|
+
:tool => 'jmeter-2.11',
|
409
437
|
:url => params[:url],
|
410
438
|
:name => params[:name],
|
411
439
|
:notes => params[:notes],
|
@@ -14,7 +14,7 @@ module RubyJmeter
|
|
14
14
|
testname = params.kind_of?(Array) ? 'ConstantThroughputTimer' : (params[:name] || 'ConstantThroughputTimer')
|
15
15
|
@doc = Nokogiri::XML(<<-EOS.strip_heredoc)
|
16
16
|
<ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="#{testname}" enabled="true">
|
17
|
-
<
|
17
|
+
<intProp name="calcMode">0</intProp>
|
18
18
|
<doubleProp>
|
19
19
|
<name>throughput</name>
|
20
20
|
<value>0.0</value>
|
@@ -19,7 +19,7 @@ module RubyJmeter
|
|
19
19
|
<stringProp name="filename"/>
|
20
20
|
<boolProp name="quotedData">false</boolProp>
|
21
21
|
<boolProp name="recycle">true</boolProp>
|
22
|
-
<stringProp name="shareMode">
|
22
|
+
<stringProp name="shareMode">shareMode.all</stringProp>
|
23
23
|
<boolProp name="stopThread">false</boolProp>
|
24
24
|
<stringProp name="variableNames"/>
|
25
25
|
</CSVDataSet>)
|
@@ -29,9 +29,9 @@ module RubyJmeter
|
|
29
29
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
30
30
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
31
31
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
32
|
+
<stringProp name="HTTPSampler.implementation"/>
|
32
33
|
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
33
34
|
<stringProp name="HTTPSampler.embedded_url_re"/>
|
34
|
-
<stringProp name="HTTPSampler.implementation"/>
|
35
35
|
</HTTPSamplerProxy>)
|
36
36
|
EOS
|
37
37
|
update params
|
@@ -24,17 +24,11 @@ module RubyJmeter
|
|
24
24
|
<stringProp name="HTTPSampler.protocol"/>
|
25
25
|
<stringProp name="HTTPSampler.contentEncoding"/>
|
26
26
|
<stringProp name="HTTPSampler.path">/</stringProp>
|
27
|
-
<stringProp name="HTTPSampler.method">GET</stringProp>
|
28
|
-
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
29
|
-
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
30
|
-
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
31
|
-
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
32
|
-
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
33
|
-
<boolProp name="HTTPSampler.image_parser">false</boolProp>
|
34
|
-
<stringProp name="HTTPSampler.embedded_url_re"/>
|
35
|
-
<boolProp name="HTTPSampler.concurrentDwn">false</boolProp>
|
36
|
-
<stringProp name="HTTPSampler.concurrentPool">4</stringProp>
|
37
27
|
<stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
|
28
|
+
<boolProp name="HTTPSampler.image_parser">true</boolProp>
|
29
|
+
<boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
|
30
|
+
<stringProp name="HTTPSampler.concurrentPool">4</stringProp>
|
31
|
+
<stringProp name="HTTPSampler.embedded_url_re"> </stringProp>
|
38
32
|
</ConfigTestElement>)
|
39
33
|
EOS
|
40
34
|
update params
|
@@ -16,7 +16,7 @@ module RubyJmeter
|
|
16
16
|
<IfController guiclass="IfControllerPanel" testclass="IfController" testname="#{testname}" enabled="true">
|
17
17
|
<stringProp name="IfController.condition"/>
|
18
18
|
<boolProp name="IfController.evaluateAll">false</boolProp>
|
19
|
-
<boolProp name="IfController.useExpression">
|
19
|
+
<boolProp name="IfController.useExpression">true</boolProp>
|
20
20
|
</IfController>)
|
21
21
|
EOS
|
22
22
|
update params
|
@@ -27,8 +27,14 @@ module RubyJmeter
|
|
27
27
|
<elementProp name="JMSSampler.jndiProperties" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
|
28
28
|
<collectionProp name="Arguments.arguments"/>
|
29
29
|
</elementProp>
|
30
|
-
<elementProp name="arguments" elementType="
|
31
|
-
<collectionProp name="
|
30
|
+
<elementProp name="arguments" elementType="JMSProperties">
|
31
|
+
<collectionProp name="JMSProperties.properties">
|
32
|
+
<elementProp name="" elementType="JMSProperty">
|
33
|
+
<stringProp name="JMSProperty.name"> </stringProp>
|
34
|
+
<stringProp name="JMSProperty.value"/>
|
35
|
+
<stringProp name="JMSProperty.type">java.lang.String</stringProp>
|
36
|
+
</elementProp>
|
37
|
+
</collectionProp>
|
32
38
|
</elementProp>
|
33
39
|
</JMSSampler>)
|
34
40
|
EOS
|
@@ -28,8 +28,14 @@ module RubyJmeter
|
|
28
28
|
<stringProp name="jms.config_msg_type">jms_text_message</stringProp>
|
29
29
|
<stringProp name="jms.iterations">1</stringProp>
|
30
30
|
<boolProp name="jms.authenticate">false</boolProp>
|
31
|
-
<elementProp name="jms.jmsProperties" elementType="
|
32
|
-
<collectionProp name="
|
31
|
+
<elementProp name="jms.jmsProperties" elementType="JMSProperties">
|
32
|
+
<collectionProp name="JMSProperties.properties">
|
33
|
+
<elementProp name="" elementType="JMSProperty">
|
34
|
+
<stringProp name="JMSProperty.name"> </stringProp>
|
35
|
+
<stringProp name="JMSProperty.value"/>
|
36
|
+
<stringProp name="JMSProperty.type">java.lang.String</stringProp>
|
37
|
+
</elementProp>
|
38
|
+
</collectionProp>
|
33
39
|
</elementProp>
|
34
40
|
</PublisherSampler>)
|
35
41
|
EOS
|
@@ -17,18 +17,17 @@ module RubyJmeter
|
|
17
17
|
<stringProp name="servername"/>
|
18
18
|
<stringProp name="port"/>
|
19
19
|
<stringProp name="rootdn"/>
|
20
|
-
<boolProp name="user_defined">
|
20
|
+
<boolProp name="user_defined">true</boolProp>
|
21
21
|
<stringProp name="test">add</stringProp>
|
22
22
|
<stringProp name="base_entry_dn"/>
|
23
23
|
<elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
|
24
24
|
<collectionProp name="Arguments.arguments">
|
25
|
-
<elementProp name="
|
26
|
-
<stringProp name="Argument.name"
|
27
|
-
<stringProp name="Argument.value"
|
25
|
+
<elementProp name=" " elementType="Argument">
|
26
|
+
<stringProp name="Argument.name"> </stringProp>
|
27
|
+
<stringProp name="Argument.value"> </stringProp>
|
28
28
|
<stringProp name="Argument.metadata">=</stringProp>
|
29
29
|
</elementProp>
|
30
30
|
</collectionProp>
|
31
|
-
<stringProp name="TestPlan.comments"/>
|
32
31
|
</elementProp>
|
33
32
|
</ConfigTestElement>)
|
34
33
|
EOS
|
@@ -15,7 +15,7 @@ module RubyJmeter
|
|
15
15
|
@doc = Nokogiri::XML(<<-EOS.strip_heredoc)
|
16
16
|
<LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="#{testname}" enabled="true">
|
17
17
|
<boolProp name="LoopController.continue_forever">true</boolProp>
|
18
|
-
<
|
18
|
+
<stringProp name="LoopController.loops">1</stringProp>
|
19
19
|
</LoopController>)
|
20
20
|
EOS
|
21
21
|
update params
|
@@ -15,11 +15,11 @@ module RubyJmeter
|
|
15
15
|
@doc = Nokogiri::XML(<<-EOS.strip_heredoc)
|
16
16
|
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="#{testname}" enabled="true">
|
17
17
|
<collectionProp name="Asserion.test_strings">
|
18
|
-
<stringProp name="
|
18
|
+
<stringProp name="0"/>
|
19
19
|
</collectionProp>
|
20
20
|
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
21
21
|
<boolProp name="Assertion.assume_success">false</boolProp>
|
22
|
-
<intProp name="Assertion.test_type">
|
22
|
+
<intProp name="Assertion.test_type">16</intProp>
|
23
23
|
<stringProp name="Assertion.scope">all</stringProp>
|
24
24
|
</ResponseAssertion>)
|
25
25
|
EOS
|
@@ -17,7 +17,7 @@ module RubyJmeter
|
|
17
17
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
18
18
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="#{testname}" enabled="true">
|
19
19
|
<boolProp name="LoopController.continue_forever">false</boolProp>
|
20
|
-
<intProp name="LoopController.loops"
|
20
|
+
<intProp name="LoopController.loops">-1</intProp>
|
21
21
|
</elementProp>
|
22
22
|
<stringProp name="ThreadGroup.num_threads">1</stringProp>
|
23
23
|
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
|
@@ -15,13 +15,14 @@ module RubyJmeter
|
|
15
15
|
@doc = Nokogiri::XML(<<-EOS.strip_heredoc)
|
16
16
|
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="#{testname}" enabled="true">
|
17
17
|
<collectionProp name="Arguments.arguments">
|
18
|
-
<elementProp name="
|
19
|
-
<stringProp name="Argument.name"
|
20
|
-
<stringProp name="Argument.value"
|
18
|
+
<elementProp name=" " elementType="Argument">
|
19
|
+
<stringProp name="Argument.name"> </stringProp>
|
20
|
+
<stringProp name="Argument.value"> </stringProp>
|
21
21
|
<stringProp name="Argument.metadata">=</stringProp>
|
22
|
+
<stringProp name="Argument.desc"> </stringProp>
|
22
23
|
</elementProp>
|
23
24
|
</collectionProp>
|
24
|
-
<stringProp name="TestPlan.comments"
|
25
|
+
<stringProp name="TestPlan.comments"> </stringProp>
|
25
26
|
</Arguments>)
|
26
27
|
EOS
|
27
28
|
update params
|
@@ -15,8 +15,7 @@ module RubyJmeter
|
|
15
15
|
@doc = Nokogiri::XML(<<-EOS.strip_heredoc)
|
16
16
|
<UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="#{testname}" enabled="true">
|
17
17
|
<collectionProp name="UserParameters.names"/>
|
18
|
-
<collectionProp name="UserParameters.thread_values"
|
19
|
-
<collectionProp name="1"/>
|
18
|
+
<collectionProp name="UserParameters.thread_values"/>
|
20
19
|
</collectionProp>
|
21
20
|
<boolProp name="UserParameters.per_iteration">false</boolProp>
|
22
21
|
</UserParameters>)
|
@@ -22,7 +22,12 @@ module RubyJmeter
|
|
22
22
|
else
|
23
23
|
params.each do |name, value|
|
24
24
|
node = @doc.children.xpath("//*[contains(@name,\"#{name.to_s}\")]")
|
25
|
-
|
25
|
+
if value.class == Nokogiri::XML::Builder
|
26
|
+
node.first << value.doc.at_xpath('//builder').children
|
27
|
+
else
|
28
|
+
node.first.content = value unless node.empty?
|
29
|
+
end
|
30
|
+
|
26
31
|
end
|
27
32
|
end
|
28
33
|
end
|
@@ -37,10 +42,11 @@ module RubyJmeter
|
|
37
42
|
elements = @doc.at_xpath("//collectionProp/elementProp")
|
38
43
|
params.each_with_index do |param, index|
|
39
44
|
param.each do |name, value|
|
45
|
+
next unless elements && elements.element_children
|
40
46
|
element = elements.element_children.xpath("//*[contains(@name,\"#{name}\")]")
|
41
47
|
element.last.content = value
|
42
48
|
end
|
43
|
-
if index != params.size - 1
|
49
|
+
if index != params.size - 1 && elements
|
44
50
|
@doc.at_xpath("//collectionProp") << elements.dup
|
45
51
|
end
|
46
52
|
end
|
data/lib/ruby-jmeter/idl.xml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<jmeterTestPlan version="1.2" properties="2.
|
2
|
+
<jmeterTestPlan version="1.2" properties="2.6" jmeter="2.11 r1554548">
|
3
3
|
<hashTree>
|
4
4
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
|
5
5
|
<stringProp name="TestPlan.comments"></stringProp>
|
@@ -27,7 +27,7 @@
|
|
27
27
|
<stringProp name="filename"></stringProp>
|
28
28
|
<boolProp name="quotedData">false</boolProp>
|
29
29
|
<boolProp name="recycle">true</boolProp>
|
30
|
-
<stringProp name="shareMode">
|
30
|
+
<stringProp name="shareMode">shareMode.all</stringProp>
|
31
31
|
<boolProp name="stopThread">false</boolProp>
|
32
32
|
<stringProp name="variableNames"></stringProp>
|
33
33
|
</CSVDataSet>
|
@@ -86,17 +86,11 @@
|
|
86
86
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
87
87
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
88
88
|
<stringProp name="HTTPSampler.path">/</stringProp>
|
89
|
-
<stringProp name="HTTPSampler.method">GET</stringProp>
|
90
|
-
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
91
|
-
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
92
|
-
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
93
|
-
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
94
|
-
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
95
|
-
<boolProp name="HTTPSampler.image_parser">false</boolProp>
|
96
|
-
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
97
|
-
<boolProp name="HTTPSampler.concurrentDwn">false</boolProp>
|
98
|
-
<stringProp name="HTTPSampler.concurrentPool">4</stringProp>
|
99
89
|
<stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
|
90
|
+
<boolProp name="HTTPSampler.image_parser">true</boolProp>
|
91
|
+
<boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
|
92
|
+
<stringProp name="HTTPSampler.concurrentPool">4</stringProp>
|
93
|
+
<stringProp name="HTTPSampler.embedded_url_re"> </stringProp>
|
100
94
|
</ConfigTestElement>
|
101
95
|
<hashTree/>
|
102
96
|
<JavaConfig guiclass="JavaConfigGui" testclass="JavaConfig" testname="Java Request Defaults" enabled="true">
|
@@ -167,6 +161,7 @@
|
|
167
161
|
<stringProp name="endIndex"></stringProp>
|
168
162
|
<stringProp name="preload">True</stringProp>
|
169
163
|
<stringProp name="startIndex"></stringProp>
|
164
|
+
<stringProp name="clientCertAliasVarName"></stringProp>
|
170
165
|
</KeystoreConfig>
|
171
166
|
<hashTree/>
|
172
167
|
<ConfigTestElement guiclass="LdapExtConfigGui" testclass="ConfigTestElement" testname="LDAP Extended Request Defaults" enabled="true">
|
@@ -194,18 +189,17 @@
|
|
194
189
|
<stringProp name="servername"></stringProp>
|
195
190
|
<stringProp name="port"></stringProp>
|
196
191
|
<stringProp name="rootdn"></stringProp>
|
197
|
-
<boolProp name="user_defined">
|
192
|
+
<boolProp name="user_defined">true</boolProp>
|
198
193
|
<stringProp name="test">add</stringProp>
|
199
194
|
<stringProp name="base_entry_dn"></stringProp>
|
200
195
|
<elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
201
196
|
<collectionProp name="Arguments.arguments">
|
202
|
-
|
203
|
-
<stringProp name="Argument.name"
|
204
|
-
<stringProp name="Argument.value"
|
197
|
+
<elementProp name=" " elementType="Argument">
|
198
|
+
<stringProp name="Argument.name"> </stringProp>
|
199
|
+
<stringProp name="Argument.value"> </stringProp>
|
205
200
|
<stringProp name="Argument.metadata">=</stringProp>
|
206
201
|
</elementProp>
|
207
202
|
</collectionProp>
|
208
|
-
<stringProp name="TestPlan.comments"></stringProp>
|
209
203
|
</elementProp>
|
210
204
|
</ConfigTestElement>
|
211
205
|
<hashTree/>
|
@@ -237,20 +231,21 @@
|
|
237
231
|
<hashTree/>
|
238
232
|
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
239
233
|
<collectionProp name="Arguments.arguments">
|
240
|
-
<elementProp name="
|
241
|
-
<stringProp name="Argument.name"
|
242
|
-
<stringProp name="Argument.value"
|
234
|
+
<elementProp name=" " elementType="Argument">
|
235
|
+
<stringProp name="Argument.name"> </stringProp>
|
236
|
+
<stringProp name="Argument.value"> </stringProp>
|
243
237
|
<stringProp name="Argument.metadata">=</stringProp>
|
238
|
+
<stringProp name="Argument.desc"> </stringProp>
|
244
239
|
</elementProp>
|
245
240
|
</collectionProp>
|
246
|
-
<stringProp name="TestPlan.comments"
|
241
|
+
<stringProp name="TestPlan.comments"> </stringProp>
|
247
242
|
</Arguments>
|
248
243
|
<hashTree/>
|
249
244
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
|
250
245
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
251
246
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
252
247
|
<boolProp name="LoopController.continue_forever">false</boolProp>
|
253
|
-
<intProp name="LoopController.loops"
|
248
|
+
<intProp name="LoopController.loops">-1</intProp>
|
254
249
|
</elementProp>
|
255
250
|
<stringProp name="ThreadGroup.num_threads">1</stringProp>
|
256
251
|
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
|
@@ -271,7 +266,7 @@
|
|
271
266
|
<IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller" enabled="true">
|
272
267
|
<stringProp name="IfController.condition"></stringProp>
|
273
268
|
<boolProp name="IfController.evaluateAll">false</boolProp>
|
274
|
-
<boolProp name="IfController.useExpression">
|
269
|
+
<boolProp name="IfController.useExpression">true</boolProp>
|
275
270
|
</IfController>
|
276
271
|
<hashTree/>
|
277
272
|
<IncludeController guiclass="IncludeControllerGui" testclass="IncludeController" testname="Include Controller" enabled="true">
|
@@ -280,7 +275,7 @@
|
|
280
275
|
<hashTree/>
|
281
276
|
<LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
282
277
|
<boolProp name="LoopController.continue_forever">true</boolProp>
|
283
|
-
<
|
278
|
+
<stringProp name="LoopController.loops">1</stringProp>
|
284
279
|
</LoopController>
|
285
280
|
<hashTree/>
|
286
281
|
<ModuleController guiclass="ModuleControllerGui" testclass="ModuleController" testname="Module Controller" enabled="true"/>
|
@@ -340,7 +335,7 @@
|
|
340
335
|
</BSFTimer>
|
341
336
|
<hashTree/>
|
342
337
|
<ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="Constant Throughput Timer" enabled="true">
|
343
|
-
<
|
338
|
+
<intProp name="calcMode">0</intProp>
|
344
339
|
<doubleProp>
|
345
340
|
<name>throughput</name>
|
346
341
|
<value>0.0</value>
|
@@ -422,6 +417,7 @@
|
|
422
417
|
<stringProp name="queryType">Select Statement</stringProp>
|
423
418
|
<stringProp name="resultVariable"></stringProp>
|
424
419
|
<stringProp name="variableNames"></stringProp>
|
420
|
+
<stringProp name="queryTimeout"></stringProp>
|
425
421
|
</JDBCPreProcessor>
|
426
422
|
<hashTree/>
|
427
423
|
<JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="JSR223 PreProcessor" enabled="true">
|
@@ -442,6 +438,7 @@
|
|
442
438
|
<collectionProp name="UserParameters.names"/>
|
443
439
|
<collectionProp name="UserParameters.thread_values">
|
444
440
|
<collectionProp name="1"/>
|
441
|
+
<collectionProp name="1"/>
|
445
442
|
</collectionProp>
|
446
443
|
<boolProp name="UserParameters.per_iteration">false</boolProp>
|
447
444
|
</UserParameters>
|
@@ -528,7 +525,6 @@
|
|
528
525
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
529
526
|
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
530
527
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
531
|
-
<stringProp name="HTTPSampler.implementation"></stringProp>
|
532
528
|
</HTTPSamplerProxy>
|
533
529
|
<hashTree/>
|
534
530
|
<JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java Request" enabled="true">
|
@@ -587,6 +583,7 @@
|
|
587
583
|
<stringProp name="queryType">Select Statement</stringProp>
|
588
584
|
<stringProp name="resultVariable"></stringProp>
|
589
585
|
<stringProp name="variableNames"></stringProp>
|
586
|
+
<stringProp name="queryTimeout"></stringProp>
|
590
587
|
</JDBCSampler>
|
591
588
|
<hashTree/>
|
592
589
|
<JMSSampler guiclass="JMSSamplerGui" testclass="JMSSampler" testname="JMS Point-to-Point" enabled="true">
|
@@ -603,8 +600,14 @@
|
|
603
600
|
<elementProp name="JMSSampler.jndiProperties" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
604
601
|
<collectionProp name="Arguments.arguments"/>
|
605
602
|
</elementProp>
|
606
|
-
<elementProp name="arguments" elementType="
|
607
|
-
<collectionProp name="
|
603
|
+
<elementProp name="arguments" elementType="JMSProperties">
|
604
|
+
<collectionProp name="JMSProperties.properties">
|
605
|
+
<elementProp name="" elementType="JMSProperty">
|
606
|
+
<stringProp name="JMSProperty.name"> </stringProp>
|
607
|
+
<stringProp name="JMSProperty.value"></stringProp>
|
608
|
+
<stringProp name="JMSProperty.type">java.lang.String</stringProp>
|
609
|
+
</elementProp>
|
610
|
+
</collectionProp>
|
608
611
|
</elementProp>
|
609
612
|
</JMSSampler>
|
610
613
|
<hashTree/>
|
@@ -623,8 +626,14 @@
|
|
623
626
|
<stringProp name="jms.config_msg_type">jms_text_message</stringProp>
|
624
627
|
<stringProp name="jms.iterations">1</stringProp>
|
625
628
|
<boolProp name="jms.authenticate">false</boolProp>
|
626
|
-
<elementProp name="jms.jmsProperties" elementType="
|
627
|
-
<collectionProp name="
|
629
|
+
<elementProp name="jms.jmsProperties" elementType="JMSProperties">
|
630
|
+
<collectionProp name="JMSProperties.properties">
|
631
|
+
<elementProp name="" elementType="JMSProperty">
|
632
|
+
<stringProp name="JMSProperty.name"> </stringProp>
|
633
|
+
<stringProp name="JMSProperty.value"></stringProp>
|
634
|
+
<stringProp name="JMSProperty.type">java.lang.String</stringProp>
|
635
|
+
</elementProp>
|
636
|
+
</collectionProp>
|
628
637
|
</elementProp>
|
629
638
|
</PublisherSampler>
|
630
639
|
<hashTree/>
|
@@ -828,6 +837,7 @@
|
|
828
837
|
<stringProp name="queryType">Select Statement</stringProp>
|
829
838
|
<stringProp name="resultVariable"></stringProp>
|
830
839
|
<stringProp name="variableNames"></stringProp>
|
840
|
+
<stringProp name="queryTimeout"></stringProp>
|
831
841
|
</JDBCPostProcessor>
|
832
842
|
<hashTree/>
|
833
843
|
<JSR223PostProcessor guiclass="TestBeanGUI" testclass="JSR223PostProcessor" testname="JSR223 PostProcessor" enabled="true">
|
@@ -920,12 +930,12 @@
|
|
920
930
|
<hashTree/>
|
921
931
|
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
|
922
932
|
<collectionProp name="Asserion.test_strings">
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
933
|
+
<stringProp name="0"></stringProp>
|
934
|
+
</collectionProp>
|
935
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
936
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
937
|
+
<intProp name="Assertion.test_type">16</intProp>
|
938
|
+
<stringProp name="Assertion.scope">all</stringProp>
|
929
939
|
</ResponseAssertion>
|
930
940
|
<hashTree/>
|
931
941
|
<SMIMEAssertion guiclass="SMIMEAssertionGui" testclass="SMIMEAssertion" testname="SMIME Assertion" enabled="true">
|
data/lib/ruby-jmeter/version.rb
CHANGED
data/spec/dsl_spec.rb
CHANGED
@@ -65,7 +65,7 @@ describe "DSL" do
|
|
65
65
|
end.to_doc
|
66
66
|
end
|
67
67
|
|
68
|
-
let(:
|
68
|
+
let(:config_fragment) { doc.search("//ConfigTestElement").first }
|
69
69
|
let(:sampler_fragment) { doc.search("//HTTPSamplerProxy").first }
|
70
70
|
|
71
71
|
it 'should match on implementation' do
|
@@ -73,13 +73,13 @@ describe "DSL" do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'should match on defaults' do
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
76
|
+
config_fragment.search(".//stringProp[@name='HTTPSampler.domain']").text.should == 'example.com'
|
77
|
+
config_fragment.search(".//stringProp[@name='HTTPSampler.protocol']").text.should == 'https'
|
78
|
+
config_fragment.search(".//stringProp[@name='HTTPSampler.implementation']").text.should == 'HttpClient3.1'
|
79
|
+
config_fragment.search(".//boolProp[@name='HTTPSampler.image_parser']").text.should == 'true'
|
80
|
+
config_fragment.search(".//boolProp[@name='HTTPSampler.concurrentDwn']").text.should == 'true'
|
81
|
+
config_fragment.search(".//stringProp[@name='HTTPSampler.concurrentPool']").text.should == '5'
|
82
|
+
config_fragment.search(".//stringProp[@name='HTTPSampler.embedded_url_re']").text.should == 'http.+?example.com'
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
@@ -295,6 +295,29 @@ describe "DSL" do
|
|
295
295
|
end
|
296
296
|
|
297
297
|
|
298
|
+
describe 'get_with_parameterized_domain' do
|
299
|
+
let(:doc) do
|
300
|
+
test do
|
301
|
+
threads do
|
302
|
+
transaction name: "TC_01", parent: true, include_timers: true do
|
303
|
+
visit url: "/home?location=melbourne", domain: "${custom_domain}"
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end.to_doc
|
307
|
+
end
|
308
|
+
|
309
|
+
let(:fragment) { doc.search("//HTTPSamplerProxy").first }
|
310
|
+
|
311
|
+
it 'should match on path' do
|
312
|
+
fragment.search(".//stringProp[@name='HTTPSampler.path']").text.should == '/home'
|
313
|
+
end
|
314
|
+
|
315
|
+
it 'should match on domain' do
|
316
|
+
fragment.search(".//stringProp[@name='HTTPSampler.domain']").text.should == '${custom_domain}'
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
|
298
321
|
describe 'https' do
|
299
322
|
let(:doc) do
|
300
323
|
test do
|
@@ -314,6 +337,45 @@ describe "DSL" do
|
|
314
337
|
end
|
315
338
|
|
316
339
|
|
340
|
+
describe 'user_parameters' do
|
341
|
+
let(:doc) do
|
342
|
+
test do
|
343
|
+
threads do
|
344
|
+
transaction name: "TC_02", parent: true, include_timers: true do
|
345
|
+
visit url: "/" do
|
346
|
+
user_parameters names: ['name1', 'name2'],
|
347
|
+
thread_values: {
|
348
|
+
user_1: [
|
349
|
+
'value1',
|
350
|
+
'value2'
|
351
|
+
],
|
352
|
+
|
353
|
+
user_2: [
|
354
|
+
'value1',
|
355
|
+
'value2'
|
356
|
+
]
|
357
|
+
}
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end.to_doc
|
362
|
+
end
|
363
|
+
|
364
|
+
let(:names) { doc.search("//collectionProp[@name='UserParameters.names']").first }
|
365
|
+
let(:thread_values) { doc.search("//collectionProp[@name='UserParameters.thread_values']").first }
|
366
|
+
|
367
|
+
it 'should match on names' do
|
368
|
+
names.search(".//stringProp[@name='name1']").text.should == 'name1'
|
369
|
+
names.search(".//stringProp[@name='name2']").text.should == 'name2'
|
370
|
+
end
|
371
|
+
|
372
|
+
it 'should match on thread values' do
|
373
|
+
thread_values.search(".//stringProp[@name='0']").first.text.should == 'value1'
|
374
|
+
thread_values.search(".//stringProp[@name='1']").first.text.should == 'value2'
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
|
317
379
|
describe 'xhr' do
|
318
380
|
let(:doc) do
|
319
381
|
test do
|
@@ -446,7 +508,7 @@ describe "DSL" do
|
|
446
508
|
let(:fragment) { doc.search("//LoopController").first }
|
447
509
|
|
448
510
|
it 'should match on Loops' do
|
449
|
-
fragment.search(".//
|
511
|
+
fragment.search(".//stringProp[@name='LoopController.loops']").text.should == '5'
|
450
512
|
end
|
451
513
|
end
|
452
514
|
|
@@ -547,7 +609,7 @@ describe "DSL" do
|
|
547
609
|
let(:fragment) { doc.search("//ResponseAssertion").first }
|
548
610
|
|
549
611
|
it 'should match on match' do
|
550
|
-
fragment.search(".//stringProp[@name='
|
612
|
+
fragment.search(".//stringProp[@name='0']").text.should == 'Welcome'
|
551
613
|
end
|
552
614
|
|
553
615
|
it 'should match on scope' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-jmeter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-01-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -77,7 +77,9 @@ files:
|
|
77
77
|
- examples/basic_header.rb
|
78
78
|
- examples/basic_http_request_defaults.rb
|
79
79
|
- examples/basic_ldap_ext.rb
|
80
|
+
- examples/basic_meta_fu.rb
|
80
81
|
- examples/basic_post.rb
|
82
|
+
- examples/basic_preprocessor_user_parameters.rb
|
81
83
|
- examples/basic_query_params.rb
|
82
84
|
- examples/basic_run.rb
|
83
85
|
- examples/basic_simple_data_writer.rb
|