httpimagestore 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. data/Gemfile +10 -12
  2. data/Gemfile.lock +57 -55
  3. data/README.md +829 -0
  4. data/VERSION +1 -1
  5. data/bin/httpimagestore +114 -180
  6. data/features/cache-control.feature +26 -90
  7. data/features/compatibility.feature +129 -0
  8. data/features/error-reporting.feature +207 -0
  9. data/features/health-check.feature +30 -0
  10. data/features/s3-store-and-thumbnail.feature +65 -0
  11. data/features/step_definitions/httpimagestore_steps.rb +66 -26
  12. data/features/support/env.rb +32 -5
  13. data/features/support/test.empty +0 -0
  14. data/httpimagestore.gemspec +60 -47
  15. data/lib/httpimagestore/aws_sdk_regions_hack.rb +23 -0
  16. data/lib/httpimagestore/configuration/file.rb +120 -0
  17. data/lib/httpimagestore/configuration/handler.rb +239 -0
  18. data/lib/httpimagestore/configuration/output.rb +119 -0
  19. data/lib/httpimagestore/configuration/path.rb +77 -0
  20. data/lib/httpimagestore/configuration/s3.rb +194 -0
  21. data/lib/httpimagestore/configuration/thumbnailer.rb +244 -0
  22. data/lib/httpimagestore/configuration.rb +126 -29
  23. data/lib/httpimagestore/error_reporter.rb +36 -0
  24. data/lib/httpimagestore/ruby_string_template.rb +26 -0
  25. data/load_test/load_test.1k.23a022f6e.m1.small-comp.csv +3 -0
  26. data/load_test/load_test.1k.ec9bde794.m1.small.csv +4 -0
  27. data/load_test/load_test.jmx +344 -0
  28. data/load_test/thumbnail_specs.csv +11 -0
  29. data/spec/configuration_file_spec.rb +309 -0
  30. data/spec/configuration_handler_spec.rb +124 -0
  31. data/spec/configuration_output_spec.rb +338 -0
  32. data/spec/configuration_path_spec.rb +92 -0
  33. data/spec/configuration_s3_spec.rb +571 -0
  34. data/spec/configuration_spec.rb +80 -105
  35. data/spec/configuration_thumbnailer_spec.rb +417 -0
  36. data/spec/ruby_string_template_spec.rb +43 -0
  37. data/spec/spec_helper.rb +61 -0
  38. data/spec/support/compute.jpg +0 -0
  39. data/spec/support/cuba_response_env.rb +40 -0
  40. data/spec/support/full.cfg +49 -0
  41. metadata +138 -84
  42. data/README.rdoc +0 -23
  43. data/features/httpimagestore.feature +0 -167
  44. data/lib/httpimagestore/image_path.rb +0 -54
  45. data/lib/httpimagestore/s3_service.rb +0 -37
  46. data/lib/httpimagestore/thumbnail_class.rb +0 -13
  47. data/spec/image_path_spec.rb +0 -72
  48. data/spec/test.cfg +0 -8
@@ -0,0 +1,36 @@
1
+ class ErrorReporter < Controler
2
+ self.define do
3
+ on error(
4
+ Rack::UnhandledRequest::UnhandledRequestError,
5
+ Configuration::S3NoSuchKeyError,
6
+ Configuration::NoSuchFileError
7
+ ) do |error|
8
+ write_error 404, error
9
+ end
10
+
11
+ on error MemoryLimit::MemoryLimitedExceededError do |error|
12
+ write_error 413, error
13
+ end
14
+
15
+ on error Configuration::Thumbnail::ThumbnailingError do |error|
16
+ status = defined?(error.remote_error.status) ? error.remote_error.status : 500
17
+ write_error status, error
18
+ end
19
+
20
+ on error Configuration::ZeroBodyLengthError do |error|
21
+ write_error 400, error
22
+ end
23
+
24
+ on error StandardError do |error|
25
+ log.error "unhandled error while processing request: #{env['REQUEST_METHOD']} #{env['SCRIPT_NAME']}[#{env["PATH_INFO"]}]", error
26
+ log.debug {
27
+ out = StringIO.new
28
+ PP::pp(env, out, 200)
29
+ "Request: \n" + out.string
30
+ }
31
+
32
+ write_error 500, error
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,26 @@
1
+ class RubyStringTemplate
2
+ class NoValueForTemplatePlaceholderError < ArgumentError
3
+ def initialize(name, template)
4
+ super "no value for '\#{#{name}}' in template '#{template}'"
5
+ end
6
+ end
7
+
8
+ def initialize(template, &resolver)
9
+ @template = template.to_s
10
+ @resolver = resolver ? resolver : ->(locals, name){locals[name]}
11
+ end
12
+
13
+ def render(locals = {})
14
+ template = @template
15
+ while tag = template.match(/(#\{[^\}]+\})/m)
16
+ tag = tag.captures.first
17
+ name = tag.match(/#\{([^\}]*)\}/).captures.first.to_sym
18
+ value = @resolver.call(locals, name)
19
+ value or fail NoValueForTemplatePlaceholderError.new(name, @template)
20
+ value = value.to_s
21
+ template = template.gsub(tag, value)
22
+ end
23
+ template
24
+ end
25
+ end
26
+
@@ -0,0 +1,3 @@
1
+ sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
2
+ classes,985,15101,8288,36838,857,211337,0.017258883248730966,0.10672951825329396,0.16322841998894347
3
+ TOTAL,985,15101,8288,36838,857,211337,0.017258883248730966,0.10672951825329396,0.16322841998894347
@@ -0,0 +1,4 @@
1
+ sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
2
+ original,989,7755,2917,21931,164,96522,0.0010111223458038423,0.10461638578207254,0.020651782131933853
3
+ thumbnail fit,43516,905,748,1558,76,11358,0.0010111223458038423,4.594225650846874,97.8148328278794
4
+ TOTAL,44505,1058,758,1621,76,96522,0.0010111223458038423,4.689206890273507,97.63903046024716
@@ -0,0 +1,344 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <jmeterTestPlan version="1.2" properties="2.4" jmeter="2.9 r1437961">
3
+ <hashTree>
4
+ <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
5
+ <stringProp name="TestPlan.comments"></stringProp>
6
+ <boolProp name="TestPlan.functional_mode">false</boolProp>
7
+ <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
8
+ <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
9
+ <collectionProp name="Arguments.arguments">
10
+ <elementProp name="iss_server" elementType="Argument">
11
+ <stringProp name="Argument.name">iss_server</stringProp>
12
+ <stringProp name="Argument.value">test.iss.whatclinic.com</stringProp>
13
+ <stringProp name="Argument.metadata">=</stringProp>
14
+ </elementProp>
15
+ <elementProp name="test_data_dir" elementType="Argument">
16
+ <stringProp name="Argument.name">test_data_dir</stringProp>
17
+ <stringProp name="Argument.value">${__property(user.dir)}/Documents/test_data</stringProp>
18
+ <stringProp name="Argument.metadata">=</stringProp>
19
+ </elementProp>
20
+ <elementProp name="test_data_list" elementType="Argument">
21
+ <stringProp name="Argument.name">test_data_list</stringProp>
22
+ <stringProp name="Argument.value">tatoos-1k.csv</stringProp>
23
+ <stringProp name="Argument.metadata">=</stringProp>
24
+ </elementProp>
25
+ </collectionProp>
26
+ </elementProp>
27
+ <stringProp name="TestPlan.user_define_classpath"></stringProp>
28
+ </TestPlan>
29
+ <hashTree>
30
+ <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
31
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
32
+ <collectionProp name="Arguments.arguments"/>
33
+ </elementProp>
34
+ <stringProp name="HTTPSampler.domain">${iss_server}</stringProp>
35
+ <stringProp name="HTTPSampler.port">3000</stringProp>
36
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
37
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
38
+ <stringProp name="HTTPSampler.protocol"></stringProp>
39
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
40
+ <stringProp name="HTTPSampler.path"></stringProp>
41
+ <stringProp name="HTTPSampler.implementation">Java</stringProp>
42
+ <stringProp name="HTTPSampler.concurrentPool">4</stringProp>
43
+ </ConfigTestElement>
44
+ <hashTree/>
45
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Compatibility API" enabled="true">
46
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
47
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
48
+ <boolProp name="LoopController.continue_forever">false</boolProp>
49
+ <intProp name="LoopController.loops">-1</intProp>
50
+ </elementProp>
51
+ <stringProp name="ThreadGroup.num_threads">5</stringProp>
52
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
53
+ <longProp name="ThreadGroup.start_time">1373912751000</longProp>
54
+ <longProp name="ThreadGroup.end_time">1373912751000</longProp>
55
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
56
+ <stringProp name="ThreadGroup.duration"></stringProp>
57
+ <stringProp name="ThreadGroup.delay"></stringProp>
58
+ </ThreadGroup>
59
+ <hashTree>
60
+ <CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="test files" enabled="true">
61
+ <stringProp name="delimiter">,</stringProp>
62
+ <stringProp name="fileEncoding"></stringProp>
63
+ <stringProp name="filename">${test_data_dir}/${test_data_list}</stringProp>
64
+ <boolProp name="quotedData">true</boolProp>
65
+ <boolProp name="recycle">false</boolProp>
66
+ <stringProp name="shareMode">All threads</stringProp>
67
+ <boolProp name="stopThread">true</boolProp>
68
+ <stringProp name="variableNames">test_file</stringProp>
69
+ </CSVDataSet>
70
+ <hashTree/>
71
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="classes" enabled="true">
72
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
73
+ <collectionProp name="Arguments.arguments"/>
74
+ </elementProp>
75
+ <stringProp name="HTTPSampler.domain"></stringProp>
76
+ <stringProp name="HTTPSampler.port"></stringProp>
77
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
78
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
79
+ <stringProp name="HTTPSampler.protocol"></stringProp>
80
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
81
+ <stringProp name="HTTPSampler.path">/thumbnail/original,search,search_thumb,brochure,brochure_thumb,admin,dmin_thumb,treatment_thumb,staff_member_thumb,consultation,clinic_google_map_thumb</stringProp>
82
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
83
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
84
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
85
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
86
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
87
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
88
+ <collectionProp name="HTTPFileArgs.files">
89
+ <elementProp name="${test_data_dir}/${test_file}" elementType="HTTPFileArg">
90
+ <stringProp name="File.path">${test_data_dir}/${test_file}</stringProp>
91
+ <stringProp name="File.paramname"></stringProp>
92
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
93
+ </elementProp>
94
+ </collectionProp>
95
+ </elementProp>
96
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
97
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
98
+ </HTTPSamplerProxy>
99
+ <hashTree>
100
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="contains path" enabled="true">
101
+ <collectionProp name="Asserion.test_strings">
102
+ <stringProp name="-1604815031">dev/httpimagestore/compat</stringProp>
103
+ </collectionProp>
104
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
105
+ <boolProp name="Assertion.assume_success">false</boolProp>
106
+ <intProp name="Assertion.test_type">16</intProp>
107
+ </ResponseAssertion>
108
+ <hashTree/>
109
+ </hashTree>
110
+ </hashTree>
111
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="API v1" enabled="false">
112
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
113
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
114
+ <boolProp name="LoopController.continue_forever">false</boolProp>
115
+ <intProp name="LoopController.loops">-1</intProp>
116
+ </elementProp>
117
+ <stringProp name="ThreadGroup.num_threads">5</stringProp>
118
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
119
+ <longProp name="ThreadGroup.start_time">1373879489000</longProp>
120
+ <longProp name="ThreadGroup.end_time">1373879489000</longProp>
121
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
122
+ <stringProp name="ThreadGroup.duration"></stringProp>
123
+ <stringProp name="ThreadGroup.delay"></stringProp>
124
+ </ThreadGroup>
125
+ <hashTree>
126
+ <CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="test files" enabled="true">
127
+ <stringProp name="delimiter">,</stringProp>
128
+ <stringProp name="fileEncoding"></stringProp>
129
+ <stringProp name="filename">${test_data_dir}/${test_data_list}</stringProp>
130
+ <boolProp name="quotedData">true</boolProp>
131
+ <boolProp name="recycle">false</boolProp>
132
+ <stringProp name="shareMode">All threads</stringProp>
133
+ <boolProp name="stopThread">true</boolProp>
134
+ <stringProp name="variableNames">test_file</stringProp>
135
+ </CSVDataSet>
136
+ <hashTree/>
137
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="original" enabled="true">
138
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
139
+ <collectionProp name="Arguments.arguments"/>
140
+ </elementProp>
141
+ <stringProp name="HTTPSampler.domain"></stringProp>
142
+ <stringProp name="HTTPSampler.port"></stringProp>
143
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
144
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
145
+ <stringProp name="HTTPSampler.protocol"></stringProp>
146
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
147
+ <stringProp name="HTTPSampler.path">/v1/original</stringProp>
148
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
149
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
150
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
151
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
152
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
153
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
154
+ <collectionProp name="HTTPFileArgs.files">
155
+ <elementProp name="${test_data_dir}/${test_file}" elementType="HTTPFileArg">
156
+ <stringProp name="File.path">${test_data_dir}/${test_file}</stringProp>
157
+ <stringProp name="File.paramname"></stringProp>
158
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
159
+ </elementProp>
160
+ </collectionProp>
161
+ </elementProp>
162
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
163
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
164
+ </HTTPSamplerProxy>
165
+ <hashTree>
166
+ <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="store_path extractor" enabled="true">
167
+ <stringProp name="RegexExtractor.useHeaders">unescaped</stringProp>
168
+ <stringProp name="RegexExtractor.refname">store_path</stringProp>
169
+ <stringProp name="RegexExtractor.regex">([^\r]+)</stringProp>
170
+ <stringProp name="RegexExtractor.template">$1$</stringProp>
171
+ <stringProp name="RegexExtractor.default"></stringProp>
172
+ <stringProp name="RegexExtractor.match_number">1</stringProp>
173
+ </RegexExtractor>
174
+ <hashTree/>
175
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="contains path" enabled="true">
176
+ <collectionProp name="Asserion.test_strings">
177
+ <stringProp name="1768443330">dev/httpimagestore/v1</stringProp>
178
+ </collectionProp>
179
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
180
+ <boolProp name="Assertion.assume_success">false</boolProp>
181
+ <intProp name="Assertion.test_type">16</intProp>
182
+ </ResponseAssertion>
183
+ <hashTree/>
184
+ </hashTree>
185
+ <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="iterations" enabled="true">
186
+ <boolProp name="LoopController.continue_forever">true</boolProp>
187
+ <stringProp name="LoopController.loops">4</stringProp>
188
+ </LoopController>
189
+ <hashTree>
190
+ <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="specs counter" enabled="true">
191
+ <boolProp name="LoopController.continue_forever">true</boolProp>
192
+ <stringProp name="LoopController.loops">11</stringProp>
193
+ </LoopController>
194
+ <hashTree>
195
+ <CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="thumbnail specs" enabled="true">
196
+ <stringProp name="filename">thumbnail_specs.csv</stringProp>
197
+ <stringProp name="fileEncoding"></stringProp>
198
+ <stringProp name="variableNames">method,width,height,options</stringProp>
199
+ <stringProp name="delimiter">,</stringProp>
200
+ <boolProp name="quotedData">true</boolProp>
201
+ <boolProp name="recycle">true</boolProp>
202
+ <boolProp name="stopThread">false</boolProp>
203
+ <stringProp name="shareMode">Current thread</stringProp>
204
+ </CSVDataSet>
205
+ <hashTree/>
206
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="thumbnail fit" enabled="true">
207
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
208
+ <collectionProp name="Arguments.arguments"/>
209
+ </elementProp>
210
+ <stringProp name="HTTPSampler.domain"></stringProp>
211
+ <stringProp name="HTTPSampler.port"></stringProp>
212
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
213
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
214
+ <stringProp name="HTTPSampler.protocol"></stringProp>
215
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
216
+ <stringProp name="HTTPSampler.path">/v1/thumbnail/${__BeanShell(vars.get(&quot;store_path&quot;).replace(&quot;/&quot;\, &quot;%2f&quot;))}/${method}/${width}/${height}/${options}</stringProp>
217
+ <stringProp name="HTTPSampler.method">GET</stringProp>
218
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
219
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
220
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
221
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
222
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
223
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
224
+ </HTTPSamplerProxy>
225
+ <hashTree>
226
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
227
+ <collectionProp name="Asserion.test_strings">
228
+ <stringProp name="-722923736">Content-Type: image/</stringProp>
229
+ </collectionProp>
230
+ <stringProp name="Assertion.test_field">Assertion.response_headers</stringProp>
231
+ <boolProp name="Assertion.assume_success">false</boolProp>
232
+ <intProp name="Assertion.test_type">16</intProp>
233
+ </ResponseAssertion>
234
+ <hashTree/>
235
+ </hashTree>
236
+ </hashTree>
237
+ </hashTree>
238
+ <DebugPostProcessor guiclass="TestBeanGUI" testclass="DebugPostProcessor" testname="Debug PostProcessor" enabled="false">
239
+ <boolProp name="displayJMeterProperties">false</boolProp>
240
+ <boolProp name="displayJMeterVariables">true</boolProp>
241
+ <boolProp name="displaySamplerProperties">false</boolProp>
242
+ <boolProp name="displaySystemProperties">false</boolProp>
243
+ </DebugPostProcessor>
244
+ <hashTree/>
245
+ </hashTree>
246
+ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
247
+ <boolProp name="ResultCollector.error_logging">true</boolProp>
248
+ <objProp>
249
+ <name>saveConfig</name>
250
+ <value class="SampleSaveConfiguration">
251
+ <time>true</time>
252
+ <latency>true</latency>
253
+ <timestamp>true</timestamp>
254
+ <success>true</success>
255
+ <label>true</label>
256
+ <code>true</code>
257
+ <message>true</message>
258
+ <threadName>true</threadName>
259
+ <dataType>true</dataType>
260
+ <encoding>false</encoding>
261
+ <assertions>true</assertions>
262
+ <subresults>true</subresults>
263
+ <responseData>false</responseData>
264
+ <samplerData>false</samplerData>
265
+ <xml>false</xml>
266
+ <fieldNames>false</fieldNames>
267
+ <responseHeaders>false</responseHeaders>
268
+ <requestHeaders>false</requestHeaders>
269
+ <responseDataOnError>false</responseDataOnError>
270
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
271
+ <assertionsResultsToSave>0</assertionsResultsToSave>
272
+ <bytes>true</bytes>
273
+ </value>
274
+ </objProp>
275
+ <stringProp name="filename"></stringProp>
276
+ </ResultCollector>
277
+ <hashTree/>
278
+ <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report" enabled="true">
279
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
280
+ <objProp>
281
+ <name>saveConfig</name>
282
+ <value class="SampleSaveConfiguration">
283
+ <time>true</time>
284
+ <latency>true</latency>
285
+ <timestamp>true</timestamp>
286
+ <success>true</success>
287
+ <label>true</label>
288
+ <code>true</code>
289
+ <message>true</message>
290
+ <threadName>true</threadName>
291
+ <dataType>true</dataType>
292
+ <encoding>false</encoding>
293
+ <assertions>true</assertions>
294
+ <subresults>true</subresults>
295
+ <responseData>false</responseData>
296
+ <samplerData>false</samplerData>
297
+ <xml>false</xml>
298
+ <fieldNames>false</fieldNames>
299
+ <responseHeaders>false</responseHeaders>
300
+ <requestHeaders>false</requestHeaders>
301
+ <responseDataOnError>false</responseDataOnError>
302
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
303
+ <assertionsResultsToSave>0</assertionsResultsToSave>
304
+ <bytes>true</bytes>
305
+ </value>
306
+ </objProp>
307
+ <stringProp name="filename"></stringProp>
308
+ </ResultCollector>
309
+ <hashTree/>
310
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
311
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
312
+ <objProp>
313
+ <name>saveConfig</name>
314
+ <value class="SampleSaveConfiguration">
315
+ <time>true</time>
316
+ <latency>true</latency>
317
+ <timestamp>true</timestamp>
318
+ <success>true</success>
319
+ <label>true</label>
320
+ <code>true</code>
321
+ <message>true</message>
322
+ <threadName>true</threadName>
323
+ <dataType>true</dataType>
324
+ <encoding>false</encoding>
325
+ <assertions>true</assertions>
326
+ <subresults>true</subresults>
327
+ <responseData>false</responseData>
328
+ <samplerData>false</samplerData>
329
+ <xml>false</xml>
330
+ <fieldNames>false</fieldNames>
331
+ <responseHeaders>false</responseHeaders>
332
+ <requestHeaders>false</requestHeaders>
333
+ <responseDataOnError>false</responseDataOnError>
334
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
335
+ <assertionsResultsToSave>0</assertionsResultsToSave>
336
+ <bytes>true</bytes>
337
+ </value>
338
+ </objProp>
339
+ <stringProp name="filename"></stringProp>
340
+ </ResultCollector>
341
+ <hashTree/>
342
+ </hashTree>
343
+ </hashTree>
344
+ </jmeterTestPlan>
@@ -0,0 +1,11 @@
1
+ "crop","input","input","background-color:0xF0F0F0"
2
+ "pad","162","162","background-color:0xF0F0F0"
3
+ "pad","28","28","background-color:0xF0F0F0"
4
+ "pad","264","264","background-color:0xF0F0F0"
5
+ "pad","40","40","background-color:0xF0F0F0"
6
+ "pad","160","160","background-color:0xF0F0F0"
7
+ "pad","65","65","background-color:0xF0F0F0"
8
+ "pad","80","60","background-color:0xF0F0F0"
9
+ "pad","50","50","background-color:0xF0F0F0"
10
+ "pad","126","126","background-color:0xF0F0F0"
11
+ "pad","74","74","background-color:0xF0F0F0"