httpthumbnailer 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
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