gridinit-jmeter 0.2.4 → 0.2.5

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 (32) hide show
  1. data/Gemfile +4 -2
  2. data/gridinit-jmeter.gemspec +2 -2
  3. data/lib/gridinit-jmeter.rb +6 -1
  4. data/lib/gridinit-jmeter/config/random_variable.rb +24 -0
  5. data/lib/gridinit-jmeter/controllers/if_controller.rb +2 -2
  6. data/lib/gridinit-jmeter/controllers/interleave.rb +18 -0
  7. data/lib/gridinit-jmeter/controllers/random_order.rb +16 -0
  8. data/lib/gridinit-jmeter/controllers/simple.rb +17 -0
  9. data/lib/gridinit-jmeter/controllers/switch.rb +20 -0
  10. data/lib/gridinit-jmeter/dsl.rb +120 -131
  11. data/lib/gridinit-jmeter/helpers/dsl_helper.rb +10 -1
  12. data/lib/gridinit-jmeter/listeners/aggregate_report.rb +47 -0
  13. data/lib/gridinit-jmeter/listeners/gc_latencies_over_time.rb +1 -1
  14. data/lib/gridinit-jmeter/listeners/gc_response_codes_per_second.rb +1 -1
  15. data/lib/gridinit-jmeter/listeners/gc_response_times_distribution.rb +1 -1
  16. data/lib/gridinit-jmeter/listeners/gc_response_times_over_time.rb +1 -1
  17. data/lib/gridinit-jmeter/listeners/gc_response_times_percentiles.rb +1 -1
  18. data/lib/gridinit-jmeter/listeners/gc_transactions_per_second.rb +1 -1
  19. data/lib/gridinit-jmeter/listeners/graph_visualizer.rb +1 -1
  20. data/lib/gridinit-jmeter/listeners/response_time_graph_visualizer.rb +1 -1
  21. data/lib/gridinit-jmeter/listeners/simple_data_writer.rb +1 -1
  22. data/lib/gridinit-jmeter/listeners/stat_visualizer.rb +1 -1
  23. data/lib/gridinit-jmeter/listeners/summary_report.rb +1 -1
  24. data/lib/gridinit-jmeter/listeners/table_visualizer.rb +1 -1
  25. data/lib/gridinit-jmeter/listeners/view_results_full_visualizer.rb +14 -3
  26. data/lib/gridinit-jmeter/post_processors/regex_extractor.rb +13 -3
  27. data/lib/gridinit-jmeter/pre_processors/bean_shell_pre_processor.rb +3 -1
  28. data/lib/gridinit-jmeter/threads/thread_group.rb +2 -1
  29. data/lib/gridinit-jmeter/version.rb +1 -1
  30. data/spec/dsl_spec.rb +125 -2
  31. metadata +9 -7
  32. data/.rbenv-version +0 -1
data/Gemfile CHANGED
@@ -12,8 +12,10 @@ platforms :jruby do
12
12
  end
13
13
 
14
14
  group :development do
15
- gem 'pry'
16
- gem 'pry-nav'
15
+ gem 'pry', :require => 'pry'
16
+ gem 'pry-nav', :require => 'pry-nav'
17
+ gem 'pry-debugger'
18
+ gem 'awesome_print', :require => 'ap'
17
19
  end
18
20
 
19
21
  group :test do
@@ -17,6 +17,6 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.files = `git ls-files`.split($/)
19
19
  gem.executables << 'grid'
20
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
- gem.require_paths = ["lib"]
20
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ gem.require_paths = ['lib']
22
22
  end
@@ -40,7 +40,7 @@ require 'gridinit-jmeter/helpers/user-agents'
40
40
  # require 'gridinit-jmeter/config/ldap_extended_request_defaults'
41
41
  # require 'gridinit-jmeter/config/ldap_request_defaults'
42
42
  # require 'gridinit-jmeter/config/login_config_element'
43
- # require 'gridinit-jmeter/config/random_variable'
43
+ require 'gridinit-jmeter/config/random_variable'
44
44
  # require 'gridinit-jmeter/config/simple_config_element'
45
45
  # require 'gridinit-jmeter/config/tcp_sampler_config'
46
46
  require 'gridinit-jmeter/config/user_defined_variable'
@@ -90,6 +90,7 @@ require 'gridinit-jmeter/helpers/user-agents'
90
90
  require 'gridinit-jmeter/listeners/stat_visualizer'
91
91
  require 'gridinit-jmeter/listeners/simple_data_writer'
92
92
  require 'gridinit-jmeter/listeners/summary_report'
93
+ require 'gridinit-jmeter/listeners/aggregate_report'
93
94
  require 'gridinit-jmeter/listeners/gc_latencies_over_time'
94
95
  require 'gridinit-jmeter/listeners/gc_response_codes_per_second'
95
96
  require 'gridinit-jmeter/listeners/gc_response_times_distribution'
@@ -105,6 +106,10 @@ require 'gridinit-jmeter/helpers/user-agents'
105
106
  require 'gridinit-jmeter/controllers/loop_controller'
106
107
  require 'gridinit-jmeter/controllers/throughput'
107
108
  require 'gridinit-jmeter/controllers/while_controller'
109
+ require 'gridinit-jmeter/controllers/switch'
110
+ require 'gridinit-jmeter/controllers/random_order'
111
+ require 'gridinit-jmeter/controllers/simple'
112
+ require 'gridinit-jmeter/controllers/interleave'
108
113
 
109
114
  # SAMPLERS
110
115
  require 'gridinit-jmeter/samplers/http_sampler'
@@ -0,0 +1,24 @@
1
+ module Gridinit
2
+ module Jmeter
3
+
4
+ class RandomVariableConfig
5
+ attr_accessor :doc
6
+ include Helper
7
+ def initialize(name, min, max, params={})
8
+ @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
+ <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="#{name}" enabled="#{enabled(params)}">
10
+ <stringProp name="maximumValue">#{max}</stringProp>
11
+ <stringProp name="minimumValue">#{min}</stringProp>
12
+ <stringProp name="outputFormat"></stringProp>
13
+ <boolProp name="perThread">false</boolProp>
14
+ <stringProp name="randomSeed"></stringProp>
15
+ <stringProp name="variableName">#{name}</stringProp>
16
+ </RandomVariableConfig>
17
+
18
+ EOF
19
+ update params
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -4,10 +4,10 @@ module Gridinit
4
4
  class IfController
5
5
  attr_accessor :doc
6
6
  include Helper
7
- def initialize(name, params={})
7
+ def initialize(name, condition, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
9
  <IfController guiclass="IfControllerPanel" testclass="IfController" testname="#{name}" enabled="true">
10
- <stringProp name="IfController.condition"></stringProp>
10
+ <stringProp name="IfController.condition">#{condition}</stringProp>
11
11
  <boolProp name="IfController.evaluateAll">false</boolProp>
12
12
  </IfController>
13
13
  EOF
@@ -0,0 +1,18 @@
1
+ module Gridinit
2
+ module Jmeter
3
+
4
+ class InterleaveController
5
+ attr_accessor :doc
6
+ include Helper
7
+ def initialize(name, params={})
8
+ @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
+ <InterleaveControl guiclass="InterleaveControlGui" testclass="InterleaveControl" testname="#{name}" enabled="true">
10
+ <intProp name="InterleaveControl.style">1</intProp>
11
+ </InterleaveControl>
12
+ EOF
13
+ update params
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ module Gridinit
2
+ module Jmeter
3
+
4
+ class RandomOrderController
5
+ attr_accessor :doc
6
+ include Helper
7
+ def initialize(name, params={})
8
+ @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
+ <RandomOrderController guiclass="RandomOrderControllerGui" testclass="RandomOrderController" testname="#{name}" enabled="true"/>
10
+ EOF
11
+ update params
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Gridinit
2
+ module Jmeter
3
+
4
+ class SimpleController
5
+ attr_accessor :doc
6
+ include Helper
7
+
8
+ def initialize(name, params={})
9
+ @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
10
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="#{name}" enabled="true"/>
11
+ EOF
12
+ update params
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Gridinit
2
+ module Jmeter
3
+
4
+ class SwitchController
5
+ attr_accessor :doc
6
+ include Helper
7
+
8
+ def initialize(name, switch_value, params={})
9
+ @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
10
+ <SwitchController guiclass="SwitchControllerGui" testclass="SwitchController" testname="#{name}" enabled="#{enabled(params)}">
11
+ <stringProp name="SwitchController.value">#{switch_value}</stringProp>
12
+ </SwitchController>
13
+
14
+ EOF
15
+ update params
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -28,7 +28,10 @@ module Gridinit
28
28
  </jmeterTestPlan>
29
29
  EOF
30
30
  node = Gridinit::Jmeter::TestPlan.new
31
- @root.at_xpath("//jmeterTestPlan/hashTree") << node.doc.children << hash_tree
31
+
32
+
33
+ @current_node = @root.at_xpath("//jmeterTestPlan/hashTree")
34
+ @current_node = attach_to_last(node)
32
35
 
33
36
  variables(
34
37
  :name => 'testguid',
@@ -38,97 +41,87 @@ module Gridinit
38
41
 
39
42
  def variables(params={}, &block)
40
43
  node = Gridinit::Jmeter::UserDefinedVariable.new(params)
41
- attach_to_last(node, caller)
42
- self.instance_exec(&block) if block
44
+ attach_node(node, &block)
43
45
  end
44
46
 
45
47
  def defaults(params={}, &block)
46
48
  node = Gridinit::Jmeter::RequestDefaults.new(params)
47
- attach_to_last(node, caller)
48
- self.instance_exec(&block) if block
49
+ attach_node(node, &block)
49
50
  end
50
51
 
51
52
  def cookies(params={}, &block)
52
53
  node = Gridinit::Jmeter::CookieManager.new(params)
53
- attach_to_last(node, caller)
54
- self.instance_exec(&block) if block
54
+ attach_node(node, &block)
55
55
  end
56
56
 
57
57
  def cache(params={}, &block)
58
58
  node = Gridinit::Jmeter::CacheManager.new(params)
59
- attach_to_last(node, caller)
60
- self.instance_exec(&block) if block
59
+ attach_node(node, &block)
61
60
  end
62
61
 
63
62
  def header(params={}, &block)
64
63
  node = Gridinit::Jmeter::HeaderManager.new(params)
65
- attach_to_last(node, caller)
66
- self.instance_exec(&block) if block
64
+ attach_node(node, &block)
67
65
  end
68
66
 
69
67
  def with_xhr(params={}, &block)
70
68
  node = Gridinit::Jmeter::HeaderManager.new(
71
69
  params.merge('X-Requested-With' => 'XMLHttpRequest')
72
70
  )
73
- attach_to_last(node, caller)
74
- self.instance_exec(&block) if block
71
+ attach_node(node, &block)
75
72
  end
76
73
 
77
74
  def with_user_agent(device, params={}, &block)
78
75
  node = Gridinit::Jmeter::HeaderManager.new(
79
76
  params.merge('User-Agent' => Gridinit::Jmeter::UserAgent.new(device).string)
80
77
  )
81
- attach_to_last(node, caller)
82
- self.instance_exec(&block) if block
78
+ attach_node(node, &block)
83
79
  end
84
80
 
85
81
  def auth(params={}, &block)
86
82
  node = Gridinit::Jmeter::AuthManager.new(params)
87
- attach_to_last(node, caller)
88
- self.instance_exec(&block) if block
83
+ attach_node(node, &block)
89
84
  end
90
85
 
91
86
  def threads(num_threads=1, params={}, &block)
92
87
  node = Gridinit::Jmeter::ThreadGroup.new(num_threads, params)
93
- attach_to_last(node, caller)
94
- self.instance_exec(&block) if block
88
+ attach_node(node, &block)
95
89
  end
96
90
 
97
91
  def transaction(name="Transaction Contoller", params={}, &block)
98
92
  node = Gridinit::Jmeter::Transaction.new(name, params)
99
- attach_to_last(node, caller)
100
- self.instance_exec(&block) if block
93
+ attach_node(node, &block)
101
94
  end
102
95
 
103
96
  def exists(var, params={}, &block)
104
97
  params[:condition] = "'${#{var}}'.length > 0"
105
- node = Gridinit::Jmeter::IfController.new("if #{var}", params)
106
- attach_to_last(node, caller)
107
- self.instance_exec(&block) if block
98
+ node = Gridinit::Jmeter::IfController.new("if #{var}", params)
99
+ attach_node(node, &block)
108
100
  end
109
101
 
110
102
  def once(name="do once", params={}, &block)
111
103
  node = Gridinit::Jmeter::OnceOnly.new(name, params)
112
- attach_to_last(node, caller)
113
- self.instance_exec(&block) if block
104
+ attach_node(node, &block)
114
105
  end
115
106
 
116
107
  def throughput(name="throughput", percent=100.0, params={}, &block)
117
108
  node = Gridinit::Jmeter::Throughput.new(name, percent, params)
118
- attach_to_last(node, caller)
119
- self.instance_exec(&block) if block
109
+ attach_node(node, &block)
120
110
  end
121
111
 
122
- def If(name="If Controller", params={}, &block)
123
- node = Gridinit::Jmeter::IfController.new(name, params)
124
- attach_to_last(node, caller)
125
- self.instance_exec(&block) if block
112
+ def If(name="If Controller", condition="", params={}, &block)
113
+ node = Gridinit::Jmeter::IfController.new(name, condition, params)
114
+ attach_node(node, &block)
126
115
  end
127
116
 
128
117
  def Loop(loops=1, params={}, &block)
129
118
  node = Gridinit::Jmeter::LoopController.new(loops, params)
130
- attach_to_last(node, caller)
131
- self.instance_exec(&block) if block
119
+ attach_node(node, &block)
120
+ end
121
+
122
+ def Switch(name, switch_value, params={}, &block)
123
+ node = Gridinit::Jmeter::SwitchController.new(name, switch_value, params)
124
+ attach_node(node, &block)
132
125
  end
133
126
 
134
127
  def While(condition, params={}, &block)
@@ -139,153 +132,170 @@ module Gridinit
139
132
 
140
133
  def counter(name="counter", params={}, &block)
141
134
  node = Gridinit::Jmeter::CounterConfig.new(name, params)
142
- attach_to_last(node, caller)
143
- self.instance_exec(&block) if block
135
+ attach_node(node, &block)
136
+ end
137
+
138
+ def random_variable(name, min, max, params={}, &block)
139
+ node = Gridinit::Jmeter::RandomVariableConfig.new(name, min, max, params)
140
+ attach_node(node, &block)
141
+ end
142
+
143
+ def random_order(name='Random Order Controller', params={}, &block)
144
+ node = Gridinit::Jmeter::RandomOrderController.new(name, params)
145
+ attach_node(node, &block)
146
+ end
147
+
148
+ def interleave(name='Interleave Controller', params={}, &block)
149
+ node = Gridinit::Jmeter::InterleaveController.new(name, params)
150
+ attach_node(node, &block)
151
+ end
152
+
153
+ def simple(name='Simple Controller', params={}, &block)
154
+ node = Gridinit::Jmeter::SimpleController.new(name, params)
155
+ attach_node(node, &block)
144
156
  end
145
157
 
146
158
  def bsh_pre(script, params={}, &block)
147
159
  node = Gridinit::Jmeter::BeanShellPreProcessor.new(script, params)
148
- attach_to_last(node, caller)
149
- self.instance_exec(&block) if block
160
+ attach_node(node, &block)
150
161
  end
151
162
 
152
163
  def visit(name="HTTP Request", url="", params={}, &block)
153
- params[:method] = 'GET' if params[:method] == nil
164
+ params[:method] ||= 'GET'
154
165
  node = Gridinit::Jmeter::HttpSampler.new(name, url, params)
155
- attach_to_last(node, caller)
156
- self.instance_exec(&block) if block
166
+ node = Gridinit::Jmeter::HttpSampler.new(name, url, params)
167
+ attach_node(node, &block)
157
168
  end
158
169
 
159
170
  alias_method :get, :visit
160
171
 
161
172
  def submit(name="HTTP Request", url="", params={}, &block)
162
- params[:method] = 'POST'
163
- node = Gridinit::Jmeter::HttpSampler.new(name, url, params)
164
- attach_to_last(node, caller)
165
- self.instance_exec(&block) if block
173
+ params[:method] ||= 'POST'
174
+ node = Gridinit::Jmeter::HttpSampler.new(name, url, params)
175
+ attach_node(node, &block)
166
176
  end
167
177
 
168
178
  alias_method :post, :submit
169
179
 
180
+ def delete(name="HTTP Request", url="", params={}, &block)
181
+ params[:method] ||= 'DELETE'
182
+ node = Gridinit::Jmeter::HttpSampler.new(name, url, params)
183
+ attach_node(node, &block)
184
+ end
185
+
186
+ def put(name="HTTP Request", url="", params={}, &block)
187
+ params[:method] ||= 'PUT'
188
+ node = Gridinit::Jmeter::HttpSampler.new(name, url, params)
189
+ attach_node(node, &block)
190
+ end
191
+
170
192
  def extract(*args, &block)
171
193
  node = case args.first
172
- when :regex
173
- Gridinit::Jmeter::RegexExtractor.new(*args[1..-1])
174
- when :xpath
175
- Gridinit::Jmeter::XpathExtractor.new(*args[1..-1])
176
- else
177
- Gridinit::Jmeter::RegexExtractor.new(*args)
178
- end
179
- attach_to_last(node, caller)
180
- self.instance_exec(&block) if block
194
+ when :regex
195
+ Gridinit::Jmeter::RegexExtractor.new(*args[1..-1])
196
+ when :xpath
197
+ Gridinit::Jmeter::XpathExtractor.new(*args[1..-1])
198
+ else
199
+ Gridinit::Jmeter::RegexExtractor.new(*args)
200
+ end
201
+ attach_node(node, &block)
181
202
  end
182
203
 
183
204
  alias_method :web_reg_save_param, :extract
184
205
 
185
206
  def random_timer(delay=0, range=0, &block)
186
207
  node = Gridinit::Jmeter::GaussianRandomTimer.new(delay, range)
187
- attach_to_last(node, caller)
188
- self.instance_exec(&block) if block
208
+ attach_node(node, &block)
189
209
  end
190
210
 
191
211
  alias_method :think_time, :random_timer
192
212
 
193
213
  def assert(match="contains", pattern="", params={}, &block)
194
214
  node = Gridinit::Jmeter::ResponseAssertion.new(match, pattern, params)
195
- attach_to_last(node, caller)
196
- self.instance_exec(&block) if block
215
+ attach_node(node, &block)
197
216
  end
198
217
 
199
218
  alias_method :web_reg_find, :assert
200
219
 
201
220
  def view_results_full_visualizer(name="View Results Tree", params={}, &block)
202
221
  node = Gridinit::Jmeter::ViewResultsFullVisualizer.new(name, params)
203
- attach_to_last(node, caller)
204
- self.instance_exec(&block) if block
222
+ attach_node(node, &block)
205
223
  end
206
224
 
207
225
  alias_method :view_results, :view_results_full_visualizer
208
226
 
209
227
  def table_visualizer(name="View Results in Table", params={}, &block)
210
228
  node = Gridinit::Jmeter::TableVisualizer.new(name, params)
211
- attach_to_last(node, caller)
212
- self.instance_exec(&block) if block
229
+ attach_node(node, &block)
213
230
  end
214
231
 
215
232
  def graph_visualizer(name="Graph Results", params={}, &block)
216
233
  node = Gridinit::Jmeter::GraphVisualizer.new(name, params)
217
- attach_to_last(node, caller)
218
- self.instance_exec(&block) if block
234
+ attach_node(node, &block)
219
235
  end
220
236
 
221
237
  def stat_visualizer(name="Stat Results", params={}, &block)
222
238
  node = Gridinit::Jmeter::StatVisualizer.new(name, params)
223
- attach_to_last(node, caller)
224
- self.instance_exec(&block) if block
239
+ attach_node(node, &block)
225
240
  end
226
241
 
227
242
  def simple_data_writer(name="Simple Data Writer", params={}, &block)
228
243
  node = Gridinit::Jmeter::SimpleDataWriter.new(name, params)
229
- attach_to_last(node, caller)
230
- self.instance_exec(&block) if block
244
+ attach_node(node, &block)
231
245
  end
232
246
 
233
247
  alias_method :log, :simple_data_writer
234
248
 
235
249
  def response_time_graph_visualizer(name="Reponse Time Graph", params={}, &block)
236
250
  node = Gridinit::Jmeter::ResponseTimeGraphVisualizer.new(name, params)
237
- attach_to_last(node, caller)
238
- self.instance_exec(&block) if block
251
+ attach_node(node, &block)
239
252
  end
240
253
 
241
254
  alias_method :response_graph, :response_time_graph_visualizer
242
255
 
243
256
  def summary_report(name="Summary Report", params={}, &block)
244
257
  node = Gridinit::Jmeter::SummaryReport.new(name, params)
245
- attach_to_last(node, caller)
246
- self.instance_exec(&block) if block
258
+ attach_node(node, &block)
259
+ end
260
+
261
+ def aggregate_report(name="Aggregate Report", params={}, &block)
262
+ node = Gridinit::Jmeter::AggregateReport.new(name, params)
263
+ attach_node(node, &block)
247
264
  end
248
265
 
249
266
  def ldap_ext(name="LDAPExtSampler", params={}, &block)
250
267
  node = Gridinit::Jmeter::LDAPExtSampler.new(name, params)
251
- attach_to_last(node, caller)
252
- self.instance_exec(&block) if block
268
+ attach_node(node, &block)
253
269
  end
254
270
 
255
271
  def gc_response_codes_per_second(name="jp@gc - Response Codes per Second", params={}, &block)
256
272
  node = Gridinit::Jmeter::GCResponseCodesPerSecond.new(name, params)
257
- attach_to_last(node, caller)
258
- self.instance_exec(&block) if block
273
+ attach_node(node, &block)
259
274
  end
260
275
 
261
276
  def gc_response_times_distribution(name="jp@gc - Response Times Distribution", params={}, &block)
262
277
  node = Gridinit::Jmeter::GCResponseTimesDistribution.new(name, params)
263
- attach_to_last(node, caller)
264
- self.instance_exec(&block) if block
278
+ attach_node(node, &block)
265
279
  end
266
280
 
267
281
  def gc_response_times_over_time(name="jp@gc - Response Times Over Time", params={}, &block)
268
282
  node = Gridinit::Jmeter::GCResponseTimesOverTime.new(name, params)
269
- attach_to_last(node, caller)
270
- self.instance_exec(&block) if block
283
+ attach_node(node, &block)
271
284
  end
272
285
 
273
286
  def gc_response_times_percentiles(name="jp@gc - Response Times Percentiles", params={}, &block)
274
287
  node = Gridinit::Jmeter::GCResponseTimesPercentiles.new(name, params)
275
- attach_to_last(node, caller)
276
- self.instance_exec(&block) if block
288
+ attach_node(node, &block)
277
289
  end
278
290
 
279
291
  def gc_transactions_per_second(name="jp@gc - Transactions per Second", params={}, &block)
280
292
  node = Gridinit::Jmeter::GCTransactionsPerSecond.new(name, params)
281
- attach_to_last(node, caller)
282
- self.instance_exec(&block) if block
293
+ attach_node(node, &block)
283
294
  end
284
295
 
285
296
  def gc_latencies_over_time(name="jp@gc - Response Latencies Over Time", params={}, &block)
286
297
  node = Gridinit::Jmeter::GCLatenciesOverTime.new(name, params)
287
- attach_to_last(node, caller)
288
- self.instance_exec(&block) if block
298
+ attach_node(node, &block)
289
299
  end
290
300
 
291
301
  def gc_console_status_logger(name="jp@gc - Console Status Logger", params={}, &block)
@@ -298,8 +308,7 @@ module Gridinit
298
308
 
299
309
  def throughput_shaper(name="jp@gc - Throughput Shaping Timer", steps=[], params={}, &block)
300
310
  node = Gridinit::Jmeter::ThroughputShapingTimer.new(name, steps)
301
- attach_to_last(node, caller)
302
- self.instance_exec(&block) if block
311
+ attach_node(node, &block)
303
312
  end
304
313
 
305
314
  alias_method :shaper, :throughput_shaper
@@ -313,6 +322,14 @@ module Gridinit
313
322
  logger.info "Test plan saved to: #{params[:file]}"
314
323
  end
315
324
 
325
+ def to_xml
326
+ doc.to_xml(:indent => 2)
327
+ end
328
+
329
+ def to_doc
330
+ doc.clone
331
+ end
332
+
316
333
  def run(params={})
317
334
  file(params)
318
335
  logger.warn "Test executing locally ..."
@@ -367,47 +384,19 @@ module Gridinit
367
384
  Nokogiri::XML::Node.new("hashTree", @root)
368
385
  end
369
386
 
370
- def attach_to_last(node, calling_method)
371
- xpath = xpath_from(calling_method)
372
- last_node = @root.xpath(xpath).last
373
- last_node << node.doc.children << hash_tree
374
- end
375
-
376
- def xpath_from(calling_method)
377
- case calling_method.grep(/dsl/)[1][/`.*'/][1..-2]
378
- when 'threads'
379
- '//ThreadGroup/following-sibling::hashTree'
380
- when 'transaction'
381
- '//TransactionController/following-sibling::hashTree'
382
- when 'throughput'
383
- '//ThroughputController/following-sibling::hashTree'
384
- when 'once'
385
- '//OnceOnlyController/following-sibling::hashTree'
386
- when 'exists'
387
- '//IfController/following-sibling::hashTree'
388
- when 'Loop'
389
- '//LoopController/following-sibling::hashTree'
390
- when 'While'
391
- '//WhileController/following-sibling::hashTree'
392
- when 'counter'
393
- '//CounterConfig/following-sibling::hashTree'
394
- when 'bsh_pre'
395
- '//BeanShellPreProcessor/following-sibling::hashTree'
396
- when 'visit'
397
- '//HTTPSamplerProxy/following-sibling::hashTree'
398
- when 'submit'
399
- '//HTTPSamplerProxy/following-sibling::hashTree'
400
- when 'post'
401
- '//HTTPSamplerProxy/following-sibling::hashTree'
402
- when 'extract'
403
- '//RegexExtractor/following-sibling::hashTree'
404
- when 'random_timer'
405
- '//GaussianRandomTimer/following-sibling::hashTree'
406
- when 'throughput_shaper'
407
- '//kg.apc.jmeter.timers.VariableThroughputTimer/following-sibling::hashTree'
408
- else
409
- '//TestPlan/following-sibling::hashTree'
410
- end
387
+ def attach_to_last(node)
388
+ ht = hash_tree
389
+ last_node = @current_node
390
+ last_node << node.doc.children << ht
391
+ ht
392
+ end
393
+
394
+ def attach_node(node, &block)
395
+ ht = attach_to_last(node)
396
+ previous = @current_node
397
+ @current_node = ht
398
+ self.instance_exec(&block) if block
399
+ @current_node = previous
411
400
  end
412
401
 
413
402
  def file(params={})
@@ -416,11 +405,11 @@ module Gridinit
416
405
  end
417
406
 
418
407
  def doc
419
- Nokogiri::XML(@root.to_s,&:noblanks)
408
+ Nokogiri::XML(@root.to_s, &:noblanks)
420
409
  end
421
410
 
422
411
  def logger
423
- @log ||= Logger.new(STDOUT)
412
+ @log ||= Logger.new(STDOUT)
424
413
  @log.level = Logger::DEBUG
425
414
  @log
426
415
  end
@@ -4,7 +4,16 @@ module Gridinit
4
4
  def update(params)
5
5
  params.each do |name, value|
6
6
  node = @doc.children.xpath("//*[contains(@name,\"#{name.to_s}\")]")
7
- node.first.content = value unless node.empty?
7
+ node.first.content = value unless node.empty?
8
+ end
9
+ end
10
+
11
+ def enabled(params)
12
+ #default to true unless explicitly set to false
13
+ if params.has_key?(:enabled) && params[:enabled] == false
14
+ 'false'
15
+ else
16
+ 'true'
8
17
  end
9
18
  end
10
19
  end
@@ -0,0 +1,47 @@
1
+ module Gridinit
2
+ module Jmeter
3
+
4
+ class AggregateReport
5
+ attr_accessor :doc
6
+ include Helper
7
+
8
+ def initialize(name, params={})
9
+ @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
10
+ <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
11
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
12
+ <objProp>
13
+ <name>saveConfig</name>
14
+ <value class="SampleSaveConfiguration">
15
+ <time>true</time>
16
+ <latency>true</latency>
17
+ <timestamp>true</timestamp>
18
+ <success>true</success>
19
+ <label>true</label>
20
+ <code>true</code>
21
+ <message>true</message>
22
+ <threadName>true</threadName>
23
+ <dataType>true</dataType>
24
+ <encoding>false</encoding>
25
+ <assertions>true</assertions>
26
+ <subresults>true</subresults>
27
+ <responseData>false</responseData>
28
+ <samplerData>false</samplerData>
29
+ <xml>false</xml>
30
+ <fieldNames>false</fieldNames>
31
+ <responseHeaders>false</responseHeaders>
32
+ <requestHeaders>false</requestHeaders>
33
+ <responseDataOnError>false</responseDataOnError>
34
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
35
+ <assertionsResultsToSave>0</assertionsResultsToSave>
36
+ <bytes>true</bytes>
37
+ </value>
38
+ </objProp>
39
+ <stringProp name="filename"></stringProp>
40
+ </ResultCollector>
41
+ EOF
42
+ update params
43
+ end
44
+ end
45
+
46
+ end
47
+ end
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.LatenciesOverTimeGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="true">
9
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.LatenciesOverTimeGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseCodesPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="true">
9
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseCodesPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesDistributionGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="true">
9
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesDistributionGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesOverTimeGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="true">
9
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesOverTimeGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesPercentilesGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="true">
9
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.ResponseTimesPercentilesGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.TransactionsPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="true">
9
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.TransactionsPerSecondGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="#{name}" enabled="true">
9
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -7,7 +7,7 @@ module Gridinit
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
9
 
10
- <ResultCollector guiclass="RespTimeGraphVisualizer" testclass="ResultCollector" testname="#{name}" enabled="true">
10
+ <ResultCollector guiclass="RespTimeGraphVisualizer" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
11
11
  <boolProp name="ResultCollector.error_logging">false</boolProp>
12
12
  <objProp>
13
13
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="#{name}" enabled="true">
9
+ <ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="#{name}" enabled="true">
9
+ <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="#{name}" enabled="true">
9
+ <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -6,7 +6,7 @@ module Gridinit
6
6
  include Helper
7
7
  def initialize(name, params={})
8
8
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="#{name}" enabled="true">
9
+ <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
10
10
  <boolProp name="ResultCollector.error_logging">false</boolProp>
11
11
  <objProp>
12
12
  <name>saveConfig</name>
@@ -4,10 +4,11 @@ module Gridinit
4
4
  class ViewResultsFullVisualizer
5
5
  attr_accessor :doc
6
6
  include Helper
7
+
7
8
  def initialize(name, params={})
8
9
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
- <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="#{name}" enabled="true">
10
- <boolProp name="ResultCollector.error_logging">false</boolProp>
10
+ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="#{name}" enabled="#{enabled(params)}">
11
+ <boolProp name="ResultCollector.error_logging">#{error_only(params)}</boolProp>
11
12
  <objProp>
12
13
  <name>saveConfig</name>
13
14
  <value class="SampleSaveConfiguration">
@@ -40,7 +41,17 @@ module Gridinit
40
41
  EOF
41
42
  update params
42
43
  end
43
- end
44
+
45
+ def error_only(params)
46
+ #default to true unless explicitly set to false
47
+ if params.has_key?(:error_only) && params[:error_only] == true
48
+ 'true'
49
+ else
50
+ 'false'
51
+ end
52
+ end
53
+ end
54
+
44
55
 
45
56
  end
46
57
  end
@@ -4,21 +4,31 @@ module Gridinit
4
4
  class RegexExtractor
5
5
  attr_accessor :doc
6
6
  include Helper
7
+
7
8
  def initialize(name, regex, params={})
8
9
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
10
  <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="#{name}" enabled="true">
10
- <stringProp name="RegexExtractor.useHeaders">false</stringProp>
11
+ <stringProp name="RegexExtractor.useHeaders">#{use_headers_type(params)}</stringProp>
11
12
  <stringProp name="RegexExtractor.refname">#{name}</stringProp>
12
13
  <stringProp name="RegexExtractor.regex">#{CGI.escapeHTML regex}</stringProp>
13
14
  <stringProp name="RegexExtractor.template">$1$</stringProp>
14
- <stringProp name="RegexExtractor.default"></stringProp>
15
+ <stringProp name="RegexExtractor.default">#{params[:default]}</stringProp>
15
16
  <stringProp name="RegexExtractor.match_number">0</stringProp>
16
17
  <stringProp name="Sample.scope">all</stringProp>
17
18
  </RegexExtractor>
18
19
  EOF
19
20
  update params
20
21
  end
21
- end
22
+
23
+ def use_headers_type(params)
24
+ #default to true unless explicitly set to false
25
+ if params.has_key?(:match_on)
26
+ params[:match_on]
27
+ else
28
+ 'false'
29
+ end
30
+ end
31
+ end
22
32
 
23
33
  end
24
34
  end
@@ -10,7 +10,9 @@ module Gridinit
10
10
  <stringProp name="filename"></stringProp>
11
11
  <stringProp name="parameters"></stringProp>
12
12
  <boolProp name="resetInterpreter">false</boolProp>
13
- <stringProp name="script">#{script}</stringProp>
13
+ <stringProp name="script"><![CDATA[
14
+ #{script}
15
+ ]]></stringProp>
14
16
  </BeanShellPreProcessor>
15
17
  EOF
16
18
  update params
@@ -5,6 +5,7 @@ module Gridinit
5
5
  attr_accessor :doc
6
6
  include Helper
7
7
  def initialize(num_threads, params={})
8
+ params[:ramp_time] ||= num_threads/2
8
9
  @doc = Nokogiri::XML(<<-EOF.strip_heredoc)
9
10
  <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
10
11
  <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
@@ -13,7 +14,7 @@ module Gridinit
13
14
  <stringProp name="LoopController.loops">1</stringProp>
14
15
  </elementProp>
15
16
  <stringProp name="ThreadGroup.num_threads">#{num_threads}</stringProp>
16
- <stringProp name="ThreadGroup.ramp_time">1</stringProp>
17
+ <stringProp name="ThreadGroup.ramp_time">#{params[:ramp_time]}</stringProp>
17
18
  <longProp name="ThreadGroup.start_time">1352677419000</longProp>
18
19
  <longProp name="ThreadGroup.end_time">1352677419000</longProp>
19
20
  <boolProp name="ThreadGroup.scheduler">false</boolProp>
@@ -1,5 +1,5 @@
1
1
  module Gridinit
2
2
  module Jmeter
3
- VERSION = "0.2.4"
3
+ VERSION = "0.2.5"
4
4
  end
5
5
  end
data/spec/dsl_spec.rb CHANGED
@@ -21,15 +21,138 @@ describe "DSL" do
21
21
  it "should output a test plan to stdout" do
22
22
  $stdout.should_receive(:puts).with(/jmeterTestPlan/i)
23
23
  test do
24
- end.jmx
24
+ end.out
25
25
  end
26
26
 
27
27
  it "should output a test plan to jmx file" do
28
28
  file = mock('file')
29
- File.should_receive(:open).with("/tmp/jmeter.jmx", "w").and_yield(file)
29
+ File.should_receive(:open).with("jmeter.jmx", "w").and_yield(file)
30
30
  file.should_receive(:write).with(/jmeterTestPlan/i)
31
31
  test do
32
32
  end.jmx
33
33
  end
34
34
 
35
+ describe 'Disabled reports' do
36
+ let(:doc) do
37
+ test do
38
+ aggregate_report('Aggregate Report disabled', {enabled: false})
39
+ aggregate_report('Aggregate Report enabled', {enabled: true})
40
+ aggregate_report('Aggregate Report default', {enabled: true})
41
+ end.to_doc
42
+ end
43
+
44
+ let(:aggregate_report_disabled) { doc.search("//ResultCollector[@testname='Aggregate Report disabled']").first }
45
+ let(:aggregate_report_enabled) { doc.search("//ResultCollector[@testname='Aggregate Report enabled']").first }
46
+ let(:aggregate_report_default) { doc.search("//ResultCollector[@testname='Aggregate Report default']").first }
47
+
48
+ it 'should disable Aggregate Report disabled' do
49
+ aggregate_report_disabled.attributes['enabled'].value.should == 'false'
50
+ end
51
+
52
+ it 'should disable Aggregate Report enabled' do
53
+ aggregate_report_enabled.attributes['enabled'].value.should == 'true'
54
+ end
55
+ it 'should disable Aggregate Report default' do
56
+ aggregate_report_enabled.attributes['enabled'].value.should == 'true'
57
+ end
58
+ end
59
+
60
+ describe do
61
+
62
+ let(:doc) do
63
+ test do
64
+ view_results_full_visualizer('View Results Tree error_only', {error_only: true})
65
+ view_results_full_visualizer('View Results Tree not error_only', {error_only: false})
66
+ view_results_full_visualizer('View Results Tree default')
67
+ end.to_doc
68
+ end
69
+
70
+ let(:report_errors_only) { doc.search("//ResultCollector[@testname='View Results Tree error_only']").first }
71
+ let(:report_not_errors_only) { doc.search("//ResultCollector[@testname='View Results Tree not error_only']").first }
72
+ let(:report_default) { doc.search("//ResultCollector[@testname='View Results Tree default']").first }
73
+
74
+ it 'should be true when errors only' do
75
+ error_logging = report_errors_only.children.first
76
+ error_logging.attributes['name'].value.should == 'ResultCollector.error_logging'
77
+ error_logging.text.should == 'true'
78
+ end
79
+
80
+ it 'should be false when not errors only' do
81
+ error_logging = report_not_errors_only.children.first
82
+ error_logging.attributes['name'].value.should == 'ResultCollector.error_logging'
83
+ error_logging.text.should == 'false'
84
+ end
85
+ it 'should default to false when not given' do
86
+ error_logging = report_default.children.first
87
+ error_logging.attributes['name'].value.should == 'ResultCollector.error_logging'
88
+ error_logging.text.should == 'false'
89
+ end
90
+ end
91
+
92
+ describe 'extract use_headers_type' do
93
+
94
+ let(:doc) do
95
+ test do
96
+ extract :regex, 'match on url', 'blah', {match_on: 'URL'}
97
+ extract :regex, 'match on default', 'blah'
98
+ end.to_doc
99
+ end
100
+
101
+ let(:extract_url) { doc.search("//RegexExtractor[@testname='match on url']").first }
102
+ let(:extract) { doc.search("//RegexExtractor[@testname='match on default']").first }
103
+
104
+ it 'should match on URL' do
105
+ extract_url.search(".//stringProp[@name='RegexExtractor.useHeaders']").text.should == 'URL'
106
+ end
107
+
108
+ it 'should default to false' do
109
+ extract.search(".//stringProp[@name='RegexExtractor.useHeaders']").text.should == 'false'
110
+ end
111
+
112
+ end
113
+
114
+ describe 'Nested controllers' do
115
+
116
+ let(:doc) do
117
+ test do
118
+ simple 'blah1.1' do
119
+ simple 'blah2.1'
120
+ simple 'blah2.2' do
121
+ simple 'blah3.1'
122
+ end
123
+ simple 'blah2.3'
124
+ end
125
+ simple 'blah1.2'
126
+ end.to_doc
127
+ end
128
+
129
+ let(:blah1_1) { doc.search("//GenericController[@testname='blah1.1']").first }
130
+ let(:blah1_2) { doc.search("//GenericController[@testname='blah1.2']").first }
131
+
132
+ let(:blah2_1) { doc.search("//GenericController[@testname='blah2.1']").first }
133
+ let(:blah2_2) { doc.search("//GenericController[@testname='blah2.2']").first }
134
+ let(:blah2_3) { doc.search("//GenericController[@testname='blah2.3']").first }
135
+
136
+ let(:blah3_1) { doc.search("//GenericController[@testname='blah3.1']").first }
137
+
138
+ it 'nodes should have hashTree as its parent' do
139
+ [blah1_1, blah1_2, blah2_1, blah2_2, blah2_3, blah3_1].each do |node|
140
+ node.parent.name.should == 'hashTree'
141
+ end
142
+ end
143
+
144
+ describe 'blah3_1' do
145
+ it 'parent parent should be blah2_2' do
146
+ blah3_1.parent.should == blah2_2.next
147
+ end
148
+ end
149
+
150
+ describe 'blah1_2' do
151
+ it 'previous non hashTree sibling is blah1_1' do
152
+ blah1_2.previous.previous.should == blah1_1
153
+ end
154
+ end
155
+
156
+ end
157
+
35
158
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gridinit-jmeter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
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: 2013-04-08 00:00:00.000000000 Z
12
+ date: 2013-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -53,7 +53,6 @@ extra_rdoc_files: []
53
53
  files:
54
54
  - .gitattributes
55
55
  - .gitignore
56
- - .rbenv-version
57
56
  - .rspec
58
57
  - .travis.yml
59
58
  - Gemfile
@@ -93,11 +92,16 @@ files:
93
92
  - lib/gridinit-jmeter/config/cookie_manager.rb
94
93
  - lib/gridinit-jmeter/config/counter_config.rb
95
94
  - lib/gridinit-jmeter/config/header_manager.rb
95
+ - lib/gridinit-jmeter/config/random_variable.rb
96
96
  - lib/gridinit-jmeter/config/request_defaults.rb
97
97
  - lib/gridinit-jmeter/config/user_defined_variable.rb
98
98
  - lib/gridinit-jmeter/controllers/if_controller.rb
99
+ - lib/gridinit-jmeter/controllers/interleave.rb
99
100
  - lib/gridinit-jmeter/controllers/loop_controller.rb
100
101
  - lib/gridinit-jmeter/controllers/once_only.rb
102
+ - lib/gridinit-jmeter/controllers/random_order.rb
103
+ - lib/gridinit-jmeter/controllers/simple.rb
104
+ - lib/gridinit-jmeter/controllers/switch.rb
101
105
  - lib/gridinit-jmeter/controllers/throughput.rb
102
106
  - lib/gridinit-jmeter/controllers/transaction.rb
103
107
  - lib/gridinit-jmeter/controllers/while_controller.rb
@@ -108,6 +112,7 @@ files:
108
112
  - lib/gridinit-jmeter/helpers/logger-colors.rb
109
113
  - lib/gridinit-jmeter/helpers/strip-heredoc.rb
110
114
  - lib/gridinit-jmeter/helpers/user-agents.rb
115
+ - lib/gridinit-jmeter/listeners/aggregate_report.rb
111
116
  - lib/gridinit-jmeter/listeners/gc_console_status_logger.rb
112
117
  - lib/gridinit-jmeter/listeners/gc_latencies_over_time.rb
113
118
  - lib/gridinit-jmeter/listeners/gc_response_codes_per_second.rb
@@ -159,7 +164,4 @@ rubygems_version: 1.8.23
159
164
  signing_key:
160
165
  specification_version: 3
161
166
  summary: This is a Ruby based DSL for writing JMeter test plans
162
- test_files:
163
- - spec/dsl_spec.rb
164
- - spec/spec_helper.rb
165
- - spec/stub.rb
167
+ test_files: []
data/.rbenv-version DELETED
@@ -1 +0,0 @@
1
- 1.9.3-p385