httpthumbnailer 0.0.13 → 0.0.14

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.13
1
+ 0.0.14
data/bin/httpthumbnailer CHANGED
@@ -8,6 +8,7 @@ options = CLI.new do
8
8
  switch :no_bind, :description => "Do not bind to TCP socket - useful with -s fastcgi option"
9
9
  switch :no_logging, :description => "Disable logging"
10
10
  switch :debug, :description => "Enable debugging"
11
+ switch :no_optimization, :description => "Disable size hinting and related optimization (loading, prescaling)"
11
12
  option :bind, :short => :b, :default => IP.new('127.0.0.1'), :cast => IP, :description => "HTTP server bind address - use 0.0.0.0 to bind to all interfaces"
12
13
  option :port, :short => :p, :default => 3100, :cast => Integer, :description => "HTTP server TCP port"
13
14
  option :server, :short => :s, :default => 'mongrel', :description => "Rack server handler like thin, mongrel, webrick, fastcgi etc."
@@ -39,6 +40,7 @@ sinatra.set :lock, true
39
40
  sinatra.set :boundary, "thumnail image data"
40
41
  sinatra.set :logging, (not options.no_logging)
41
42
  sinatra.set :debug, options.debug
43
+ sinatra.set :optimization, (not options.no_optimization)
42
44
  sinatra.set :limit_memory, options.limit_memory
43
45
  sinatra.set :limit_map, options.limit_map
44
46
  sinatra.set :limit_disk, options.limit_disk
@@ -90,7 +92,14 @@ end
90
92
 
91
93
  sinatra.put %r{^/thumbnail/(.*)} do |specs|
92
94
  thumbnail_specs = ThumbnailSpecs.from_uri(specs)
93
- $thumbnailer.load(request.body) do |original_image_handler|
95
+
96
+ opts = {}
97
+ if settings.optimization
98
+ biggest_spec = thumbnail_specs.biggest_spec
99
+ opts.merge!({'max-width' => biggest_spec.width, 'max-height' => biggest_spec.height})
100
+ end
101
+
102
+ $thumbnailer.load(request.body, opts) do |original_image_handler|
94
103
  status 200
95
104
  headers "Content-Type" => "multipart/mixed; boundary=\"#{settings.boundary}\""
96
105
 
@@ -141,9 +141,20 @@ Feature: Generating set of thumbnails with single PUT request
141
141
  And third part mime type will be image/jpeg
142
142
  And there will be no leaked images
143
143
 
144
+ Scenario: Handing of large image data - possible thanks to loading size optimization
145
+ Given test-large.jpg file content as request body
146
+ When I do PUT request http://localhost:3100/thumbnail/crop,16,16,PNG/crop,32,32,JPEG
147
+ Then response status will be 200
148
+ And I will get multipart response
149
+ Then first part will contain PNG image of size 16x16
150
+ And first part mime type will be image/png
151
+ Then second part will contain JPEG image of size 32x32
152
+ And second part mime type will be image/jpeg
153
+ And there will be no leaked images
154
+
144
155
  Scenario: Memory limits exhausted while loading
145
156
  Given test-large.jpg file content as request body
146
- When I do PUT request http://localhost:3100/thumbnail/crop,16,16,PNG
157
+ When I do PUT request http://localhost:3100/thumbnail/crop,7000,7000,PNG
147
158
  Then response status will be 413
148
159
  And response content type will be text/plain
149
160
  And response body will be CRLF endend lines like
@@ -168,3 +179,37 @@ Feature: Generating set of thumbnails with single PUT request
168
179
  And third part mime type will be image/jpeg
169
180
  And there will be no leaked images
170
181
 
182
+ Scenario: Quality option - JPEG
183
+ Given test.jpg file content as request body
184
+ When I do PUT request http://localhost:3100/thumbnail/crop,32,32,JPEG,quality:10/crop,32,32,JPG,quality:80/crop,32,32,JPEG,quality:90
185
+ Then response status will be 200
186
+ And I will get multipart response
187
+ And first part mime type will be image/jpeg
188
+ And second part mime type will be image/jpeg
189
+ And third part mime type will be image/jpeg
190
+ Then first part will contain body smaller than second part
191
+ Then second part will contain body smaller than third part
192
+
193
+ Scenario: Quality option - JPEG - default 85
194
+ Given test.jpg file content as request body
195
+ When I do PUT request http://localhost:3100/thumbnail/crop,32,32,JPEG,quality:84/crop,32,32,JPG/crop,32,32,JPEG,quality:86
196
+ Then response status will be 200
197
+ And I will get multipart response
198
+ And first part mime type will be image/jpeg
199
+ And second part mime type will be image/jpeg
200
+ And third part mime type will be image/jpeg
201
+ Then first part will contain body smaller than second part
202
+ Then second part will contain body smaller than third part
203
+
204
+ Scenario: Quality option - PNG (XY where X - zlib compresion level, Y - filter)
205
+ Given test.jpg file content as request body
206
+ When I do PUT request http://localhost:3100/thumbnail/crop,64,64,PNG,quality:90/crop,64,64,PNG,quality:50/crop,64,64,PNG,quality:10
207
+ Then response status will be 200
208
+ And I will get multipart response
209
+ And first part mime type will be image/png
210
+ And second part mime type will be image/png
211
+ And third part mime type will be image/png
212
+ Then first part will contain body smaller than second part
213
+ Then second part will contain body smaller than third part
214
+ And there will be no leaked images
215
+
@@ -76,6 +76,17 @@ Then /(.*) part will contain (.*) image of size (.*)x(.*)/ do |part, format, wid
76
76
  @image.rows.should == height.to_i
77
77
  end
78
78
 
79
+ Then /(.*) part will contain body of size within (.*) of (.*)/ do |part, margin, size|
80
+ data = @response_multipart.part[part_no(part)].body
81
+ data.length.should be_within(margin.to_i).of(size.to_i)
82
+ end
83
+
84
+ Then /(.*) part will contain body smaller than (.*) part/ do |part, big_part|
85
+ data = @response_multipart.part[part_no(part)].body
86
+ data_big = @response_multipart.part[part_no(big_part)].body
87
+ data.length.should < data_big.length
88
+ end
89
+
79
90
  And /(.*) part body will be saved as (.*) for human inspection/ do |part, file|
80
91
  data = @response_multipart.part[part_no(part)].body
81
92
  (support_dir + file).open('w'){|f| f.write(data)}
@@ -62,7 +62,7 @@ def start_server(cmd, pid_file, log_file, test_url)
62
62
  stop_server(pid_file) if Process.pid == ppid
63
63
  end
64
64
 
65
- Timeout.timeout(10) do
65
+ Timeout.timeout(20) do
66
66
  begin
67
67
  get test_url
68
68
  rescue Errno::ECONNREFUSED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "httpthumbnailer"
8
- s.version = "0.0.13"
8
+ s.version = "0.0.14"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jakub Pastuszek"]
12
- s.date = "2011-12-01"
12
+ s.date = "2011-12-02"
13
13
  s.description = "Provides HTTP API for thumbnailing images"
14
14
  s.email = "jpastuszek@gmail.com"
15
15
  s.executables = ["httpthumbnailer"]
@@ -38,6 +38,17 @@ Gem::Specification.new do |s|
38
38
  "lib/httpthumbnailer/multipart_response.rb",
39
39
  "lib/httpthumbnailer/thumbnail_specs.rb",
40
40
  "lib/httpthumbnailer/thumbnailer.rb",
41
+ "load_test/extralarge.jpg",
42
+ "load_test/large.jpg",
43
+ "load_test/large.png",
44
+ "load_test/load_test.jmx",
45
+ "load_test/medium.jpg",
46
+ "load_test/small.jpg",
47
+ "load_test/tiny.jpg",
48
+ "load_test/v0.0.13-loading.csv",
49
+ "load_test/v0.0.13.csv",
50
+ "load_test/v0.0.14-no-optimization.csv",
51
+ "load_test/v0.0.14.csv",
41
52
  "spec/multipart_response_spec.rb",
42
53
  "spec/spec_helper.rb",
43
54
  "spec/thumbnail_specs_spec.rb",
@@ -24,5 +24,19 @@ class ThumbnailSpecs < Array
24
24
  end
25
25
  ts
26
26
  end
27
+
28
+ def biggest_spec
29
+ max_field = -1
30
+ max_spec = nil
31
+ each do |spec|
32
+ field = spec.width * spec.height
33
+ if max_field < field
34
+ max_field = field
35
+ max_spec = spec
36
+ end
37
+ end
38
+
39
+ max_spec
40
+ end
27
41
  end
28
42
 
@@ -89,22 +89,54 @@ class Thumbnailer
89
89
  @options = options
90
90
  @logger = (options[:logger] or Logger.new('/dev/null'))
91
91
 
92
+
93
+ mw = options['max-width']
94
+ mh = options['max-height']
95
+ if mw and mh
96
+ mw = mw.to_i
97
+ mh = mh.to_i
98
+ @logger.info "Using max size hint of: #{mw}x#{mh}"
99
+ end
100
+
92
101
  begin
93
- @image = Magick::Image.from_blob(io.read).first.strip!
102
+ @image = Magick::Image.from_blob(io.read) do |info|
103
+ if mw and mh
104
+ define('jpeg', 'size', "#{mw*2}x#{mh*2}")
105
+ define('jbig', 'size', "#{mw*2}x#{mh*2}")
106
+ end
107
+ end.first.strip!
108
+ @logger.info "Loaded image: #{@image.inspect}"
109
+
110
+ if mw and mh
111
+ f = find_prescale_factor(mw, mh)
112
+ if f > 1
113
+ prescale(f)
114
+ @logger.info "Prescaled image by factor of #{f}: #{@image.inspect}"
115
+ end
116
+ end
94
117
  rescue Magick::ImageMagickError => e
95
118
  raise ImageTooLargeError, e if e.message =~ /cache resources exhausted/
96
119
  raise UnsupportedMediaTypeError, e
97
120
  end
121
+
98
122
  @methods = methods
99
123
  end
100
124
 
125
+ def prescale(f)
126
+ @image.sample!(@image.columns / f, @image.rows / f)
127
+ end
128
+
101
129
  def thumbnail(spec)
102
130
  begin
131
+ quality = (spec.options['quality'] or default_quality(spec.format))
132
+ quality = quality.to_i if quality
133
+
103
134
  ImageHandler.new do
104
135
  process_image(@image, spec).render_on_background!((spec.options['background-color'] or 'white').sub(/^0x/, '#'))
105
136
  end.use do |thumb|
106
- thumb.to_blob do |inf|
107
- inf.format = spec.format
137
+ thumb.to_blob do
138
+ self.format = spec.format
139
+ self.quality = quality if quality
108
140
  end
109
141
  end
110
142
  rescue Magick::ImageMagickError => e
@@ -119,6 +151,26 @@ class Thumbnailer
119
151
 
120
152
  private
121
153
 
154
+ def default_quality(format)
155
+ case format
156
+ when /png/i
157
+ 95 # max zlib compression, adaptive filtering (photo)
158
+ when /jpeg|jpg/i
159
+ 85
160
+ else
161
+ nil
162
+ end
163
+ end
164
+
165
+ def find_prescale_factor(max_width, max_height, factor = 1)
166
+ new_factor = factor * 2
167
+ if @image.columns / new_factor > max_width * 2 and @image.rows / new_factor > max_height * 2
168
+ find_prescale_factor(max_width, max_height, factor * 2)
169
+ else
170
+ factor
171
+ end
172
+ end
173
+
122
174
  def process_image(image, spec)
123
175
  impl = @methods[spec.method] or raise UnsupportedMethodError.new(spec.method)
124
176
  copy = image.copy
@@ -155,9 +207,9 @@ class Thumbnailer
155
207
  end
156
208
  end
157
209
 
158
- def load(io)
210
+ def load(io, options = {})
159
211
  h = ImageHandler.new do
160
- OriginalImage.new(io, @methods, @options)
212
+ OriginalImage.new(io, @methods, @options.merge(options))
161
213
  end
162
214
 
163
215
  begin
Binary file
Binary file
Binary file
@@ -0,0 +1,718 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <jmeterTestPlan version="1.2" properties="2.1">
3
+ <hashTree>
4
+ <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Plan testów" 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="Zmienne zdefiniowane przez użytkownika" enabled="true">
9
+ <collectionProp name="Arguments.arguments">
10
+ <elementProp name="media" elementType="Argument">
11
+ <stringProp name="Argument.name">media</stringProp>
12
+ <stringProp name="Argument.value">/Users/jpastuszek/Documents/httpthumbnailer/load_test</stringProp>
13
+ <stringProp name="Argument.metadata">=</stringProp>
14
+ </elementProp>
15
+ </collectionProp>
16
+ </elementProp>
17
+ <stringProp name="TestPlan.user_define_classpath"></stringProp>
18
+ </TestPlan>
19
+ <hashTree>
20
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Grupa wątków" enabled="true">
21
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
22
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
23
+ <boolProp name="LoopController.continue_forever">false</boolProp>
24
+ <intProp name="LoopController.loops">-1</intProp>
25
+ </elementProp>
26
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
27
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
28
+ <longProp name="ThreadGroup.start_time">1322835045000</longProp>
29
+ <longProp name="ThreadGroup.end_time">1322835045000</longProp>
30
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
31
+ <stringProp name="ThreadGroup.duration"></stringProp>
32
+ <stringProp name="ThreadGroup.delay"></stringProp>
33
+ </ThreadGroup>
34
+ <hashTree>
35
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="tiny" enabled="true">
36
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
37
+ <collectionProp name="Arguments.arguments"/>
38
+ </elementProp>
39
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
40
+ <stringProp name="HTTPSampler.port">3100</stringProp>
41
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
42
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
43
+ <stringProp name="HTTPSampler.protocol"></stringProp>
44
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
45
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
46
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
47
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
48
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
49
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
50
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
51
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
52
+ <collectionProp name="HTTPFileArgs.files">
53
+ <elementProp name="${media}/tiny.jpg" elementType="HTTPFileArg">
54
+ <stringProp name="File.path">${media}/tiny.jpg</stringProp>
55
+ <stringProp name="File.paramname"></stringProp>
56
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
57
+ </elementProp>
58
+ </collectionProp>
59
+ </elementProp>
60
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
61
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
62
+ </HTTPSamplerProxy>
63
+ <hashTree>
64
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
65
+ <collectionProp name="Asserion.test_strings">
66
+ <stringProp name="693218829">test/plain</stringProp>
67
+ </collectionProp>
68
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
69
+ <boolProp name="Assertion.assume_success">false</boolProp>
70
+ <intProp name="Assertion.test_type">6</intProp>
71
+ </ResponseAssertion>
72
+ <hashTree/>
73
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
74
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
75
+ <stringProp name="SizeAssertion.size">50000</stringProp>
76
+ <intProp name="SizeAssertion.operator">5</intProp>
77
+ </SizeAssertion>
78
+ <hashTree/>
79
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
80
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
81
+ <objProp>
82
+ <name>saveConfig</name>
83
+ <value class="SampleSaveConfiguration">
84
+ <time>true</time>
85
+ <latency>true</latency>
86
+ <timestamp>true</timestamp>
87
+ <success>true</success>
88
+ <label>true</label>
89
+ <code>true</code>
90
+ <message>true</message>
91
+ <threadName>true</threadName>
92
+ <dataType>true</dataType>
93
+ <encoding>false</encoding>
94
+ <assertions>true</assertions>
95
+ <subresults>true</subresults>
96
+ <responseData>false</responseData>
97
+ <samplerData>false</samplerData>
98
+ <xml>true</xml>
99
+ <fieldNames>false</fieldNames>
100
+ <responseHeaders>false</responseHeaders>
101
+ <requestHeaders>false</requestHeaders>
102
+ <responseDataOnError>false</responseDataOnError>
103
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
104
+ <assertionsResultsToSave>0</assertionsResultsToSave>
105
+ <bytes>true</bytes>
106
+ </value>
107
+ </objProp>
108
+ <stringProp name="filename"></stringProp>
109
+ </ResultCollector>
110
+ <hashTree/>
111
+ </hashTree>
112
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="small" enabled="true">
113
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
114
+ <collectionProp name="Arguments.arguments"/>
115
+ </elementProp>
116
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
117
+ <stringProp name="HTTPSampler.port">3100</stringProp>
118
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
119
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
120
+ <stringProp name="HTTPSampler.protocol"></stringProp>
121
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
122
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
123
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
124
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
125
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
126
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
127
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
128
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
129
+ <collectionProp name="HTTPFileArgs.files">
130
+ <elementProp name="${media}/small.jpg" elementType="HTTPFileArg">
131
+ <stringProp name="File.path">${media}/small.jpg</stringProp>
132
+ <stringProp name="File.paramname"></stringProp>
133
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
134
+ </elementProp>
135
+ </collectionProp>
136
+ </elementProp>
137
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
138
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
139
+ </HTTPSamplerProxy>
140
+ <hashTree>
141
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
142
+ <collectionProp name="Asserion.test_strings">
143
+ <stringProp name="693218829">test/plain</stringProp>
144
+ </collectionProp>
145
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
146
+ <boolProp name="Assertion.assume_success">false</boolProp>
147
+ <intProp name="Assertion.test_type">6</intProp>
148
+ </ResponseAssertion>
149
+ <hashTree/>
150
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
151
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
152
+ <stringProp name="SizeAssertion.size">50000</stringProp>
153
+ <intProp name="SizeAssertion.operator">5</intProp>
154
+ </SizeAssertion>
155
+ <hashTree/>
156
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
157
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
158
+ <objProp>
159
+ <name>saveConfig</name>
160
+ <value class="SampleSaveConfiguration">
161
+ <time>true</time>
162
+ <latency>true</latency>
163
+ <timestamp>true</timestamp>
164
+ <success>true</success>
165
+ <label>true</label>
166
+ <code>true</code>
167
+ <message>true</message>
168
+ <threadName>true</threadName>
169
+ <dataType>true</dataType>
170
+ <encoding>false</encoding>
171
+ <assertions>true</assertions>
172
+ <subresults>true</subresults>
173
+ <responseData>false</responseData>
174
+ <samplerData>false</samplerData>
175
+ <xml>true</xml>
176
+ <fieldNames>false</fieldNames>
177
+ <responseHeaders>false</responseHeaders>
178
+ <requestHeaders>false</requestHeaders>
179
+ <responseDataOnError>false</responseDataOnError>
180
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
181
+ <assertionsResultsToSave>0</assertionsResultsToSave>
182
+ <bytes>true</bytes>
183
+ </value>
184
+ </objProp>
185
+ <stringProp name="filename"></stringProp>
186
+ </ResultCollector>
187
+ <hashTree/>
188
+ </hashTree>
189
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="medium" enabled="true">
190
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
191
+ <collectionProp name="Arguments.arguments"/>
192
+ </elementProp>
193
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
194
+ <stringProp name="HTTPSampler.port">3100</stringProp>
195
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
196
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
197
+ <stringProp name="HTTPSampler.protocol"></stringProp>
198
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
199
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
200
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
201
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
202
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
203
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
204
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
205
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
206
+ <collectionProp name="HTTPFileArgs.files">
207
+ <elementProp name="${media}/medium.jpg" elementType="HTTPFileArg">
208
+ <stringProp name="File.path">${media}/medium.jpg</stringProp>
209
+ <stringProp name="File.paramname"></stringProp>
210
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
211
+ </elementProp>
212
+ </collectionProp>
213
+ </elementProp>
214
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
215
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
216
+ </HTTPSamplerProxy>
217
+ <hashTree>
218
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
219
+ <collectionProp name="Asserion.test_strings">
220
+ <stringProp name="693218829">test/plain</stringProp>
221
+ </collectionProp>
222
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
223
+ <boolProp name="Assertion.assume_success">false</boolProp>
224
+ <intProp name="Assertion.test_type">6</intProp>
225
+ </ResponseAssertion>
226
+ <hashTree/>
227
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
228
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
229
+ <stringProp name="SizeAssertion.size">50000</stringProp>
230
+ <intProp name="SizeAssertion.operator">5</intProp>
231
+ </SizeAssertion>
232
+ <hashTree/>
233
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
234
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
235
+ <objProp>
236
+ <name>saveConfig</name>
237
+ <value class="SampleSaveConfiguration">
238
+ <time>true</time>
239
+ <latency>true</latency>
240
+ <timestamp>true</timestamp>
241
+ <success>true</success>
242
+ <label>true</label>
243
+ <code>true</code>
244
+ <message>true</message>
245
+ <threadName>true</threadName>
246
+ <dataType>true</dataType>
247
+ <encoding>false</encoding>
248
+ <assertions>true</assertions>
249
+ <subresults>true</subresults>
250
+ <responseData>false</responseData>
251
+ <samplerData>false</samplerData>
252
+ <xml>true</xml>
253
+ <fieldNames>false</fieldNames>
254
+ <responseHeaders>false</responseHeaders>
255
+ <requestHeaders>false</requestHeaders>
256
+ <responseDataOnError>false</responseDataOnError>
257
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
258
+ <assertionsResultsToSave>0</assertionsResultsToSave>
259
+ <bytes>true</bytes>
260
+ </value>
261
+ </objProp>
262
+ <stringProp name="filename"></stringProp>
263
+ </ResultCollector>
264
+ <hashTree/>
265
+ </hashTree>
266
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="large" enabled="true">
267
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
268
+ <collectionProp name="Arguments.arguments"/>
269
+ </elementProp>
270
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
271
+ <stringProp name="HTTPSampler.port">3100</stringProp>
272
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
273
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
274
+ <stringProp name="HTTPSampler.protocol"></stringProp>
275
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
276
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
277
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
278
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
279
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
280
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
281
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
282
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
283
+ <collectionProp name="HTTPFileArgs.files">
284
+ <elementProp name="${media}/large.jpg" elementType="HTTPFileArg">
285
+ <stringProp name="File.path">${media}/large.jpg</stringProp>
286
+ <stringProp name="File.paramname"></stringProp>
287
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
288
+ </elementProp>
289
+ </collectionProp>
290
+ </elementProp>
291
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
292
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
293
+ </HTTPSamplerProxy>
294
+ <hashTree>
295
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
296
+ <collectionProp name="Asserion.test_strings">
297
+ <stringProp name="693218829">test/plain</stringProp>
298
+ </collectionProp>
299
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
300
+ <boolProp name="Assertion.assume_success">false</boolProp>
301
+ <intProp name="Assertion.test_type">6</intProp>
302
+ </ResponseAssertion>
303
+ <hashTree/>
304
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
305
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
306
+ <stringProp name="SizeAssertion.size">50000</stringProp>
307
+ <intProp name="SizeAssertion.operator">5</intProp>
308
+ </SizeAssertion>
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>true</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
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="extra large" enabled="true">
344
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
345
+ <collectionProp name="Arguments.arguments"/>
346
+ </elementProp>
347
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
348
+ <stringProp name="HTTPSampler.port">3100</stringProp>
349
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
350
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
351
+ <stringProp name="HTTPSampler.protocol"></stringProp>
352
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
353
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,200,50,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
354
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
355
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
356
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
357
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
358
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
359
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
360
+ <collectionProp name="HTTPFileArgs.files">
361
+ <elementProp name="${media}/extralarge.jpg" elementType="HTTPFileArg">
362
+ <stringProp name="File.path">${media}/extralarge.jpg</stringProp>
363
+ <stringProp name="File.paramname"></stringProp>
364
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
365
+ </elementProp>
366
+ </collectionProp>
367
+ </elementProp>
368
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
369
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
370
+ </HTTPSamplerProxy>
371
+ <hashTree>
372
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
373
+ <collectionProp name="Asserion.test_strings">
374
+ <stringProp name="693218829">test/plain</stringProp>
375
+ </collectionProp>
376
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
377
+ <boolProp name="Assertion.assume_success">false</boolProp>
378
+ <intProp name="Assertion.test_type">6</intProp>
379
+ </ResponseAssertion>
380
+ <hashTree/>
381
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
382
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
383
+ <stringProp name="SizeAssertion.size">50000</stringProp>
384
+ <intProp name="SizeAssertion.operator">5</intProp>
385
+ </SizeAssertion>
386
+ <hashTree/>
387
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
388
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
389
+ <objProp>
390
+ <name>saveConfig</name>
391
+ <value class="SampleSaveConfiguration">
392
+ <time>true</time>
393
+ <latency>true</latency>
394
+ <timestamp>true</timestamp>
395
+ <success>true</success>
396
+ <label>true</label>
397
+ <code>true</code>
398
+ <message>true</message>
399
+ <threadName>true</threadName>
400
+ <dataType>true</dataType>
401
+ <encoding>false</encoding>
402
+ <assertions>true</assertions>
403
+ <subresults>true</subresults>
404
+ <responseData>false</responseData>
405
+ <samplerData>false</samplerData>
406
+ <xml>true</xml>
407
+ <fieldNames>false</fieldNames>
408
+ <responseHeaders>false</responseHeaders>
409
+ <requestHeaders>false</requestHeaders>
410
+ <responseDataOnError>false</responseDataOnError>
411
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
412
+ <assertionsResultsToSave>0</assertionsResultsToSave>
413
+ <bytes>true</bytes>
414
+ </value>
415
+ </objProp>
416
+ <stringProp name="filename"></stringProp>
417
+ </ResultCollector>
418
+ <hashTree/>
419
+ </hashTree>
420
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="extra large w prescale" enabled="true">
421
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
422
+ <collectionProp name="Arguments.arguments"/>
423
+ </elementProp>
424
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
425
+ <stringProp name="HTTPSampler.port">3100</stringProp>
426
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
427
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
428
+ <stringProp name="HTTPSampler.protocol"></stringProp>
429
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
430
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,100,100,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
431
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
432
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
433
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
434
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
435
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
436
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
437
+ <collectionProp name="HTTPFileArgs.files">
438
+ <elementProp name="${media}/extralarge.jpg" elementType="HTTPFileArg">
439
+ <stringProp name="File.path">${media}/extralarge.jpg</stringProp>
440
+ <stringProp name="File.paramname"></stringProp>
441
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
442
+ </elementProp>
443
+ </collectionProp>
444
+ </elementProp>
445
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
446
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
447
+ </HTTPSamplerProxy>
448
+ <hashTree>
449
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
450
+ <collectionProp name="Asserion.test_strings">
451
+ <stringProp name="693218829">test/plain</stringProp>
452
+ </collectionProp>
453
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
454
+ <boolProp name="Assertion.assume_success">false</boolProp>
455
+ <intProp name="Assertion.test_type">6</intProp>
456
+ </ResponseAssertion>
457
+ <hashTree/>
458
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
459
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
460
+ <stringProp name="SizeAssertion.size">8000</stringProp>
461
+ <intProp name="SizeAssertion.operator">5</intProp>
462
+ </SizeAssertion>
463
+ <hashTree/>
464
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
465
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
466
+ <objProp>
467
+ <name>saveConfig</name>
468
+ <value class="SampleSaveConfiguration">
469
+ <time>true</time>
470
+ <latency>true</latency>
471
+ <timestamp>true</timestamp>
472
+ <success>true</success>
473
+ <label>true</label>
474
+ <code>true</code>
475
+ <message>true</message>
476
+ <threadName>true</threadName>
477
+ <dataType>true</dataType>
478
+ <encoding>false</encoding>
479
+ <assertions>true</assertions>
480
+ <subresults>true</subresults>
481
+ <responseData>false</responseData>
482
+ <samplerData>false</samplerData>
483
+ <xml>true</xml>
484
+ <fieldNames>false</fieldNames>
485
+ <responseHeaders>false</responseHeaders>
486
+ <requestHeaders>false</requestHeaders>
487
+ <responseDataOnError>false</responseDataOnError>
488
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
489
+ <assertionsResultsToSave>0</assertionsResultsToSave>
490
+ <bytes>true</bytes>
491
+ </value>
492
+ </objProp>
493
+ <stringProp name="filename"></stringProp>
494
+ </ResultCollector>
495
+ <hashTree/>
496
+ </hashTree>
497
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="large PNG" enabled="true">
498
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
499
+ <collectionProp name="Arguments.arguments"/>
500
+ </elementProp>
501
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
502
+ <stringProp name="HTTPSampler.port">3100</stringProp>
503
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
504
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
505
+ <stringProp name="HTTPSampler.protocol"></stringProp>
506
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
507
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,129,310,JPEG/fit,60,60,JPEG</stringProp>
508
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
509
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
510
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
511
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
512
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
513
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
514
+ <collectionProp name="HTTPFileArgs.files">
515
+ <elementProp name="${media}/large.png" elementType="HTTPFileArg">
516
+ <stringProp name="File.path">${media}/large.png</stringProp>
517
+ <stringProp name="File.paramname"></stringProp>
518
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
519
+ </elementProp>
520
+ </collectionProp>
521
+ </elementProp>
522
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
523
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
524
+ </HTTPSamplerProxy>
525
+ <hashTree>
526
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
527
+ <collectionProp name="Asserion.test_strings">
528
+ <stringProp name="693218829">test/plain</stringProp>
529
+ </collectionProp>
530
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
531
+ <boolProp name="Assertion.assume_success">false</boolProp>
532
+ <intProp name="Assertion.test_type">6</intProp>
533
+ </ResponseAssertion>
534
+ <hashTree/>
535
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
536
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
537
+ <stringProp name="SizeAssertion.size">50000</stringProp>
538
+ <intProp name="SizeAssertion.operator">5</intProp>
539
+ </SizeAssertion>
540
+ <hashTree/>
541
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
542
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
543
+ <objProp>
544
+ <name>saveConfig</name>
545
+ <value class="SampleSaveConfiguration">
546
+ <time>true</time>
547
+ <latency>true</latency>
548
+ <timestamp>true</timestamp>
549
+ <success>true</success>
550
+ <label>true</label>
551
+ <code>true</code>
552
+ <message>true</message>
553
+ <threadName>true</threadName>
554
+ <dataType>true</dataType>
555
+ <encoding>false</encoding>
556
+ <assertions>true</assertions>
557
+ <subresults>true</subresults>
558
+ <responseData>false</responseData>
559
+ <samplerData>false</samplerData>
560
+ <xml>true</xml>
561
+ <fieldNames>false</fieldNames>
562
+ <responseHeaders>false</responseHeaders>
563
+ <requestHeaders>false</requestHeaders>
564
+ <responseDataOnError>false</responseDataOnError>
565
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
566
+ <assertionsResultsToSave>0</assertionsResultsToSave>
567
+ <bytes>true</bytes>
568
+ </value>
569
+ </objProp>
570
+ <stringProp name="filename"></stringProp>
571
+ </ResultCollector>
572
+ <hashTree/>
573
+ </hashTree>
574
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="large PNG w prescale" enabled="true">
575
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
576
+ <collectionProp name="Arguments.arguments"/>
577
+ </elementProp>
578
+ <stringProp name="HTTPSampler.domain">localhost</stringProp>
579
+ <stringProp name="HTTPSampler.port">3100</stringProp>
580
+ <stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
581
+ <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
582
+ <stringProp name="HTTPSampler.protocol"></stringProp>
583
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
584
+ <stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
585
+ <stringProp name="HTTPSampler.method">PUT</stringProp>
586
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
587
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
588
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
589
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
590
+ <elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
591
+ <collectionProp name="HTTPFileArgs.files">
592
+ <elementProp name="${media}/large.png" elementType="HTTPFileArg">
593
+ <stringProp name="File.path">${media}/large.png</stringProp>
594
+ <stringProp name="File.paramname"></stringProp>
595
+ <stringProp name="File.mimetype">image/jpeg</stringProp>
596
+ </elementProp>
597
+ </collectionProp>
598
+ </elementProp>
599
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
600
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
601
+ </HTTPSamplerProxy>
602
+ <hashTree>
603
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
604
+ <collectionProp name="Asserion.test_strings">
605
+ <stringProp name="693218829">test/plain</stringProp>
606
+ </collectionProp>
607
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
608
+ <boolProp name="Assertion.assume_success">false</boolProp>
609
+ <intProp name="Assertion.test_type">6</intProp>
610
+ </ResponseAssertion>
611
+ <hashTree/>
612
+ <SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
613
+ <stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
614
+ <stringProp name="SizeAssertion.size">50000</stringProp>
615
+ <intProp name="SizeAssertion.operator">5</intProp>
616
+ </SizeAssertion>
617
+ <hashTree/>
618
+ <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
619
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
620
+ <objProp>
621
+ <name>saveConfig</name>
622
+ <value class="SampleSaveConfiguration">
623
+ <time>true</time>
624
+ <latency>true</latency>
625
+ <timestamp>true</timestamp>
626
+ <success>true</success>
627
+ <label>true</label>
628
+ <code>true</code>
629
+ <message>true</message>
630
+ <threadName>true</threadName>
631
+ <dataType>true</dataType>
632
+ <encoding>false</encoding>
633
+ <assertions>true</assertions>
634
+ <subresults>true</subresults>
635
+ <responseData>false</responseData>
636
+ <samplerData>false</samplerData>
637
+ <xml>true</xml>
638
+ <fieldNames>false</fieldNames>
639
+ <responseHeaders>false</responseHeaders>
640
+ <requestHeaders>false</requestHeaders>
641
+ <responseDataOnError>false</responseDataOnError>
642
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
643
+ <assertionsResultsToSave>0</assertionsResultsToSave>
644
+ <bytes>true</bytes>
645
+ </value>
646
+ </objProp>
647
+ <stringProp name="filename"></stringProp>
648
+ </ResultCollector>
649
+ <hashTree/>
650
+ </hashTree>
651
+ </hashTree>
652
+ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
653
+ <boolProp name="ResultCollector.error_logging">true</boolProp>
654
+ <objProp>
655
+ <name>saveConfig</name>
656
+ <value class="SampleSaveConfiguration">
657
+ <time>true</time>
658
+ <latency>true</latency>
659
+ <timestamp>true</timestamp>
660
+ <success>true</success>
661
+ <label>true</label>
662
+ <code>true</code>
663
+ <message>true</message>
664
+ <threadName>true</threadName>
665
+ <dataType>true</dataType>
666
+ <encoding>false</encoding>
667
+ <assertions>true</assertions>
668
+ <subresults>true</subresults>
669
+ <responseData>false</responseData>
670
+ <samplerData>false</samplerData>
671
+ <xml>true</xml>
672
+ <fieldNames>false</fieldNames>
673
+ <responseHeaders>false</responseHeaders>
674
+ <requestHeaders>false</requestHeaders>
675
+ <responseDataOnError>false</responseDataOnError>
676
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
677
+ <assertionsResultsToSave>0</assertionsResultsToSave>
678
+ <bytes>true</bytes>
679
+ </value>
680
+ </objProp>
681
+ <stringProp name="filename"></stringProp>
682
+ </ResultCollector>
683
+ <hashTree/>
684
+ <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Dane zagregowane" enabled="true">
685
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
686
+ <objProp>
687
+ <name>saveConfig</name>
688
+ <value class="SampleSaveConfiguration">
689
+ <time>true</time>
690
+ <latency>true</latency>
691
+ <timestamp>true</timestamp>
692
+ <success>true</success>
693
+ <label>true</label>
694
+ <code>true</code>
695
+ <message>true</message>
696
+ <threadName>true</threadName>
697
+ <dataType>true</dataType>
698
+ <encoding>false</encoding>
699
+ <assertions>true</assertions>
700
+ <subresults>true</subresults>
701
+ <responseData>false</responseData>
702
+ <samplerData>false</samplerData>
703
+ <xml>true</xml>
704
+ <fieldNames>false</fieldNames>
705
+ <responseHeaders>false</responseHeaders>
706
+ <requestHeaders>false</requestHeaders>
707
+ <responseDataOnError>false</responseDataOnError>
708
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
709
+ <assertionsResultsToSave>0</assertionsResultsToSave>
710
+ <bytes>true</bytes>
711
+ </value>
712
+ </objProp>
713
+ <stringProp name="filename"></stringProp>
714
+ </ResultCollector>
715
+ <hashTree/>
716
+ </hashTree>
717
+ </hashTree>
718
+ </jmeterTestPlan>
Binary file
Binary file
Binary file
@@ -0,0 +1,7 @@
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
+ tiny,16,55,46,50,43,187,0.0,0.9256045354622238,67.94967748466966
3
+ small,16,141,140,145,132,150,0.0,0.921605898277749,77.99539917055469
4
+ medium,16,118,114,129,110,137,0.0,0.9236808682600162,82.94996969172152
5
+ large,16,146,146,154,128,163,0.0625,0.9237875288683602,93.9015025079388
6
+ extra large,15,678,675,691,655,747,0.0,0.8956293288750896,89.44310747925125
7
+ RAZEM,79,222,140,675,43,747,0.012658227848101266,4.471613743136922,401.30654964057277
@@ -0,0 +1,7 @@
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
+ tiny,11,54,56,59,47,66,0.0,0.17140898183064793,13.240004713746998
3
+ small,11,79,80,85,72,87,0.0,0.17137159593693524,14.533449349956378
4
+ medium,11,127,129,133,110,140,0.0,0.1712595360423478,15.379741870037364
5
+ large,11,452,477,510,114,516,0.09090909090909091,0.17129153819801302,16.917609378406365
6
+ extra large,10,5654,5604,5868,5408,6147,0.0,0.157855688329729,15.774623760832847
7
+ RAZEM,54,1192,126,5604,47,6147,0.018518518518518517,0.8372482441043769,75.29186798416981
@@ -0,0 +1,10 @@
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
+ tiny,5,54,54,54,49,60,0.0,0.08831113780069944,6.821345464339962
3
+ small,5,77,78,80,73,81,0.0,0.088281512085739,7.486858469286862
4
+ medium,5,122,120,133,111,133,0.0,0.08818808755313333,7.919617522752526
5
+ large,5,511,507,521,491,537,0.0,0.0875871492134674,9.501409468827735
6
+ extra large,4,6220,5973,6931,5748,6931,0.0,0.08261219769098907,4.524873370990727
7
+ extra large w prescale,4,6066,6046,6257,5825,6257,0.0,0.08256615613260124,4.769001826776204
8
+ large PNG,4,532,536,568,486,568,0.0,0.0931619154089808,9.325471341065771
9
+ large PNG w prescale,4,547,541,571,533,571,0.0,0.0930925339787749,10.098630812465089
10
+ RAZEM,36,1591,500,6046,49,6931,0.0,0.6278996755851676,53.82679507360379
@@ -0,0 +1,10 @@
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
+ tiny,48,51,50,57,42,72,0.0,0.3999566713606026,29.36127232049861
3
+ small,48,147,146,154,138,171,0.0,0.39959707295144065,33.81785345609843
4
+ medium,48,118,119,125,105,132,0.0,0.3996968965201389,35.89426455771041
5
+ large,48,143,142,153,130,183,0.0,0.3995804405374357,43.283068403176664
6
+ extra large,48,656,647,676,636,894,0.0,0.3977757704833804,21.74248576708571
7
+ extra large w prescale,48,593,590,604,579,654,0.0,0.39787468605200554,23.01534097031689
8
+ large PNG,48,509,505,540,483,587,0.0,0.39790766884134265,39.83040221833525
9
+ large PNG w prescale,48,326,307,361,299,608,0.0,0.39849898714840765,43.22196289808389
10
+ RAZEM,384,318,183,642,42,894,0.0,3.1306559702587684,265.0230977596243
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpthumbnailer
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 13
10
- version: 0.0.13
9
+ - 14
10
+ version: 0.0.14
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jakub Pastuszek
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-01 00:00:00 Z
18
+ date: 2011-12-02 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :runtime
@@ -274,6 +274,17 @@ files:
274
274
  - lib/httpthumbnailer/multipart_response.rb
275
275
  - lib/httpthumbnailer/thumbnail_specs.rb
276
276
  - lib/httpthumbnailer/thumbnailer.rb
277
+ - load_test/extralarge.jpg
278
+ - load_test/large.jpg
279
+ - load_test/large.png
280
+ - load_test/load_test.jmx
281
+ - load_test/medium.jpg
282
+ - load_test/small.jpg
283
+ - load_test/tiny.jpg
284
+ - load_test/v0.0.13-loading.csv
285
+ - load_test/v0.0.13.csv
286
+ - load_test/v0.0.14-no-optimization.csv
287
+ - load_test/v0.0.14.csv
277
288
  - spec/multipart_response_spec.rb
278
289
  - spec/spec_helper.rb
279
290
  - spec/thumbnail_specs_spec.rb