SQS 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,22 @@
1
+ 0.1.5
2
+ 2007-07-18
3
+ * sqs_queue_test.rb is now dependent on the assert_statistically gem. You can still
4
+ run SQS without assert_statistically, but you will need assert_statistically to run
5
+ the tests.
6
+ * http://developer.amazonwebservices.com/connect/thread.jspa?threadID=15618&tstart=0
7
+ is now resolved and tested.
8
+ * Exceptions are now custom SQS:: classes, generated from the error code returned in
9
+ the web service XML. No more generic RuntimeErrors!
10
+ * http://developer.amazonwebservices.com/connect/thread.jspa?messageID=61724&#61724
11
+ is now resolved and tested.
12
+ * Changed SQS.reasons_not_to_retry to SQS.reasons_to_retry and it's now being used!
13
+ (See http://developer.amazonwebservices.com/connect/thread.jspa?messageID=56888&#56888)
14
+ * The user can now SQS.add_reasons_to_retry and SQS.remove_reasons_to_retry
15
+ * The user can now set the number of times to retry, when a request fails and the
16
+ error code is included? in SQS.reasons_to_retry
17
+ * Add a random sleep between retries
18
+ * Ensure that retrying doesn't sleep on the final iteration of the loop
19
+
1
20
  0.1.4
2
21
  2007-06-12
3
22
  * Upped the API version to 2007-05-01
@@ -21,6 +40,7 @@ message as it comes.
21
40
  http://developer.amazonwebservices.com/connect/thread.jspa?threadID=15618&tstart=0
22
41
  Is unresolved
23
42
 
43
+
24
44
  0.1.3
25
45
  2007-04-25
26
46
  * Missed one "include REXML."
data/lib/sqs.rb CHANGED
@@ -94,7 +94,7 @@ class SQS
94
94
  return queue if queue.name == params[:name]
95
95
  end
96
96
 
97
- raise "Could not find the queue named '#{params[:name]}'"
97
+ raise SQS::UnavailableQueue, "Could not find the queue named '#{params[:name]}'"
98
98
  rescue Exception => e
99
99
  raise e
100
100
  end
@@ -147,7 +147,12 @@ class SQS
147
147
  end
148
148
 
149
149
  def self.retry_attempts
150
- 10
150
+ @@retry_attempts
151
+ end
152
+ def self.retry_attempts=( new_value )
153
+ @@retry_attempts = new_value.to_i
154
+ rescue NoMethodError
155
+ raise ArgumentError.new( $!.message )
151
156
  end
152
157
 
153
158
  def self.params_for_query( t=nil )
@@ -171,15 +176,70 @@ class SQS
171
176
  def self.increment_counter
172
177
  @@counter += 1
173
178
  end
179
+
180
+ def self.reasons_to_retry
181
+ @@reasons_to_retry.dup
182
+ end
183
+ def self.add_reasons_to_retry( *string_or_array )
184
+ @@reasons_to_retry += (
185
+ string_or_array[0].is_a?( String ) ?
186
+ string_or_array :
187
+ string_or_array[0]
188
+ )
189
+ @@reasons_to_retry.uniq!
190
+ rescue TypeError
191
+ raise ArgumentError.new( $!.message )
192
+ end
193
+
194
+ def self.remove_reasons_to_retry( *string_or_array )
195
+ @@reasons_to_retry -= (
196
+ string_or_array[0].is_a?( String ) ?
197
+ string_or_array :
198
+ string_or_array[0]
199
+ )
200
+ rescue TypeError
201
+ raise ArgumentError.new( $!.message )
202
+ end
203
+ class <<self
204
+ alias :add_reason_to_retry :add_reasons_to_retry
205
+ alias :remove_reason_to_retry :remove_reasons_to_retry
206
+ end
207
+
174
208
  protected
209
+ @@retry_attempts = 10;
175
210
  @@counter = 0;
176
211
  @@secret_access_key = 'Replace this with your secret access key'
177
212
  @@access_key_id = 'Replace this with your access key id'
178
213
  @@url_for_query = 'http://queue.amazonaws.com/'
179
-
214
+ @@exception_classes = {}
215
+ @@reasons_to_retry = [ 'ServiceUnavailable' ]
216
+
217
+ def self.get_exception_class( s=nil )
218
+ raise ArgumentError, "Please specify an error code" if s.to_s.empty?
219
+ class_name = s.to_s.gsub( /[^a-z0-9]/i, '' )
220
+ class_name = "#{$1.capitalize}#{$2}" if class_name =~ /^(.)(.*)/
221
+ class_name = class_name.to_sym
222
+ @@exception_classes[class_name] ||= eval( "class #{class_name.to_s} < RuntimeError ; end ; #{class_name.to_s}" , binding, __FILE__, __LINE__ )
223
+ end
224
+
225
+ def self.get_exception( params=nil )
226
+ raise ArgumentError, "You must pass a Hash to SQS.get_exception" unless params.is_a?( Hash )
227
+
228
+ if params[:document].respond_to?( :error_code ) && params[:document].respond_to?( :error_message )
229
+ doc = params[:document]
230
+ error_code = params[:document].error_code
231
+ error_message = params[:document].error_message
232
+ else
233
+ raise ArgumentError, "Cannot determine error code and message"
234
+ end
235
+ if params[:url].respond_to?( :to_s )
236
+ url = params[:url].to_s
237
+ else
238
+ raise ArgumentError, "Cannot determine url"
239
+ end
240
+ attempts = params[:attempts].respond_to?( :to_i ) ? attempts = params[:attempts].to_i : 0
180
241
 
181
- def self.reasons_not_to_retry
182
- [ 'Success', 'InvalidParameterValue' ]
242
+ self.get_exception_class( error_code ).new( "#{error_message} #{attempts > 0 ? "(After #{attempts} attempt#{attempts == 1 ? '' : 's'}) " : ''}(The XML returned from #{url} was #{doc})" )
183
243
  end
184
244
 
185
245
  def self.call_web_service( params )
@@ -193,6 +253,7 @@ class SQS
193
253
  retries = self.retry_attempts
194
254
  end
195
255
 
256
+
196
257
  if !params[:queue].nil?
197
258
  if params[:queue].respond_to?( :url )
198
259
  url = params[:queue].url
@@ -203,28 +264,41 @@ class SQS
203
264
  else
204
265
  url = "#{self.url_for_query}"
205
266
  end
206
- url += "?#{self.prepare_parameters_for_query( params )}&Signature="
207
-
208
- url_encoded_signature = url_encode( self.create_signature( params ) )
209
- response = Net::HTTP.get( URI.parse( url + url_encoded_signature ) )
210
- self.increment_counter
211
- doc = REXML::Document.new( response )
212
- status = doc.status
213
-
214
- unless status == 'Success'
215
- error_code = doc.error_code
216
- error_message = doc.error_message
217
- case error_code
218
- when 'AuthFailure', 'InvalidParameterValue', 'AWS.SimpleQueueService.NonEmptyQueue'
219
- raise( "#{error_code}: #{error_message} (#{url}#{url_encoded_signature})" )
220
- else
221
- raise( "Unknown Error: #{doc} (#{url}#{url_encoded_signature})" )
267
+
268
+ remaining_attempts = retries + 1
269
+ while remaining_attempts > 0
270
+ url_to_use = url + "?#{self.prepare_parameters_for_query( params )}&Signature="
271
+
272
+ url_encoded_signature = url_encode( self.create_signature( params ) )
273
+
274
+ begin
275
+ response = Net::HTTP.get( URI.parse( url_to_use + url_encoded_signature ) )
276
+ self.increment_counter
277
+ doc = REXML::Document.new( response )
278
+ rescue
279
+ raise $!
222
280
  end
281
+
282
+ remaining_attempts -= 1
283
+
284
+ break if remaining_attempts == 0 || !self.reasons_to_retry.include?( doc.error_code.to_s )
285
+
286
+ sleep( rand( 500 ) / 1000.0 ) #sleep for up to half a second
223
287
  end
288
+
289
+ raise self.get_exception(
290
+ :document => doc,
291
+ :url => ( url_to_use + url_encoded_signature ),
292
+ :attempts => ( retries + 1 - remaining_attempts )
293
+ ) unless doc.status == 'Success'
224
294
 
225
295
  doc
226
296
  rescue Exception => e
227
- raise e.is_a?( SocketError ) ? "Do you have internet access? (#{e.message})" : e
297
+ if e.is_a?( SocketError )
298
+ raise SocketError, "Do you have internet access? (#{e.message})"
299
+ else
300
+ raise e
301
+ end
228
302
  end
229
303
  end
230
304
 
@@ -262,6 +336,9 @@ module REXML
262
336
  def node_text( xpath )
263
337
  code = REXML::XPath.first( self, xpath )
264
338
  code.to_s.empty? ? '' : code.text
339
+ rescue
340
+ # puts "XPath #{xpath} on #{self.to_s} resulted in #{$!.class.name}"
341
+ raise $!
265
342
  end
266
343
 
267
344
  def nodes( xpath )
@@ -287,6 +364,9 @@ module REXML
287
364
  def node_text( xpath )
288
365
  code = REXML::XPath.first( self, xpath )
289
366
  code.to_s.empty? ? '' : code.text
367
+ rescue
368
+ # puts "XPath #{xpath} on #{self.to_s} resulted in #{$!.class.name}: #{$!.message}\n#{$!.backtrace.join("\n")}"
369
+ raise $!
290
370
  end
291
371
 
292
372
  def nodes( xpath )
data/lib/sqs/message.rb CHANGED
@@ -11,8 +11,8 @@ class SQS::Message
11
11
 
12
12
 
13
13
  def delete
14
- raise "This #{self.class.to_s} cannot be deleted, because there is no associated SQS::Queue" unless self.queue.is_a?( SQS::Queue )
15
- raise "Cannot delete a message with no id." if self.id.to_s.empty?
14
+ raise SQS::UnavailableQueue, "This #{self.class.to_s} cannot be deleted, because there is no associated SQS::Queue" unless self.queue.is_a?( SQS::Queue )
15
+ raise SQS::MissingId, "Cannot delete a message with no id." if self.id.to_s.empty?
16
16
 
17
17
  doc = SQS.call_web_service( :Action => 'DeleteMessage', :queue => self.queue, :MessageId => self.id )
18
18
  true
@@ -22,8 +22,8 @@ class SQS::Message
22
22
 
23
23
 
24
24
  def peek
25
- raise "This #{self.class.to_s} cannot be peeked, because there is no associated SQS::Queue" unless self.queue.is_a?( SQS::Queue )
26
- raise "Cannot peek a message with no id." if self.id.to_s.empty?
25
+ raise SQS::UnavailableQueue, "This #{self.class.to_s} cannot be peeked, because there is no associated SQS::Queue" unless self.queue.is_a?( SQS::Queue )
26
+ raise SQS::MissingId, "Cannot peek a message with no id." if self.id.to_s.empty?
27
27
 
28
28
  doc = SQS.call_web_service( :Action => 'PeekMessage', :queue => self.queue, :MessageId => self.id )
29
29
  self.body = doc.message_body
@@ -40,4 +40,7 @@ class SQS::Message
40
40
  self._body = b
41
41
  end
42
42
 
43
- end
43
+ end
44
+
45
+ class SQS::UnavailableQueue < TypeError ; end
46
+ class SQS::MissingId < TypeError ; end
data/lib/sqs/queue.rb CHANGED
@@ -19,7 +19,7 @@ class SQS::Queue
19
19
  rescue URI::InvalidURIError, NoMethodError
20
20
  bad_url = true
21
21
  end
22
- raise "'#{self.url}' does not seem to be a parseable URL. (Please provide all parts of the URL.)" if bad_url
22
+ raise URI::InvalidURIError, "'#{self.url}' does not seem to be a parseable URL. (Please provide all parts of the URL.)" if bad_url
23
23
  end
24
24
 
25
25
  def method_missing( symbol, *args )
@@ -164,7 +164,7 @@ class SQS::Queue
164
164
  elsif !options[:email].nil?
165
165
  params['Grantee.EmailAddress'.to_sym] = options[:email].respond_to?( :email ) ? options[:email].email : options[:email]
166
166
  else
167
- raise "You must specify either a grant id (:id) or a grantee email address (:email) when calling remove_grant."
167
+ raise ArgumentError, "You must specify either a grant id (:id) or a grantee email address (:email) when calling remove_grant."
168
168
  end
169
169
 
170
170
  doc = SQS.call_web_service( params )
@@ -173,8 +173,24 @@ class SQS::Queue
173
173
  raise e
174
174
  end
175
175
 
176
- def list_grants
177
- doc = SQS.call_web_service( :Action => 'ListGrants', :queue => self )
176
+ def list_grants( p=nil )
177
+ params = { :Action => 'ListGrants', :queue => self }
178
+
179
+ case p
180
+ when SQS::Grant
181
+ if p.email.to_s.empty?
182
+ params['Grantee.ID'.to_sym] = p.id
183
+ else
184
+ params['Grantee.EmailAddress'.to_sym] = p.email
185
+ end
186
+ when Hash
187
+ params['Grantee.EmailAddress'.to_sym] = p[:email] unless p[:email].to_s.empty?
188
+ params['Grantee.ID'.to_sym] = p[:id] unless p[:id].to_s.empty?
189
+ params[:Permission] = SQS.permissions[p[:permission]] unless p[:permission].to_s.empty?
190
+ end
191
+
192
+
193
+ doc = SQS.call_web_service( params )
178
194
  grants = Array.new
179
195
  doc.grant_lists.each do |list|
180
196
  list.grantees.each do |g|
@@ -5,6 +5,14 @@ require 'test/unit'
5
5
  require "#{File.expand_path( File.dirname( __FILE__ ) )}/test_setup"
6
6
 
7
7
 
8
+ class Test::Unit::TestCase
9
+ def multi_assert( o={}, &b )
10
+ echo "I'm in multi_assert"
11
+ return true
12
+ end
13
+ end
14
+
15
+
8
16
  class SQS_MessageTest < Test::Unit::TestCase
9
17
  def setup
10
18
  @queue_prefix = 'testMSG'
@@ -22,8 +30,22 @@ class SQS_MessageTest < Test::Unit::TestCase
22
30
  assert_equal @q, m.queue
23
31
  assert m.delete
24
32
  sleep 2
25
- assert_raises RuntimeError do
33
+ begin
26
34
  m.peek
35
+ rescue
36
+ assert_equal 'SQS::MessageNotFound', $!.class.name
37
+ else
38
+ flunk "Was supposed to raise an SQS::MessageNotFound"
39
+ end
40
+
41
+ m.id = nil
42
+ assert_raises SQS::MissingId do
43
+ m.delete
44
+ end
45
+
46
+ m.queue = nil
47
+ assert_raises SQS::UnavailableQueue do
48
+ m.delete
27
49
  end
28
50
  end
29
51
 
@@ -31,6 +53,17 @@ class SQS_MessageTest < Test::Unit::TestCase
31
53
  m = @q.send_message( 'This is something else special' )
32
54
  assert m.peek
33
55
  assert_equal 'This is something else special', m.body
56
+
57
+
58
+ m.id = nil
59
+ assert_raises SQS::MissingId do
60
+ m.delete
61
+ end
62
+
63
+ m.queue = nil
64
+ assert_raises SQS::UnavailableQueue do
65
+ m.delete
66
+ end
34
67
  end
35
68
 
36
69
  def test_body
@@ -44,13 +77,13 @@ class SQS_MessageTest < Test::Unit::TestCase
44
77
  end
45
78
 
46
79
  def test_new
47
- assert_nothing_raised RuntimeError do
80
+ assert_nothing_raised do
48
81
  SQS::Message.new
49
82
  end
50
- assert_nothing_raised RuntimeError do
83
+ assert_nothing_raised do
51
84
  SQS::Message.new :a => 'b'
52
85
  end
53
- assert_nothing_raised RuntimeError do
86
+ assert_nothing_raised do
54
87
  SQS::Message.new :a => 'b', :body => ''
55
88
  end
56
89
 
@@ -78,4 +111,12 @@ class SQS_MessageTest < Test::Unit::TestCase
78
111
  assert_equal 'Message 2', m2.id
79
112
  assert_equal 'Message 3', m3.id
80
113
  end
114
+
115
+
116
+ # def test_it_all
117
+ # puts methods.sort.join("\n")
118
+ # tenaciously_assert( :min => 1, :of => 10 ) do
119
+ #
120
+ # end
121
+ # end
81
122
  end
@@ -4,7 +4,8 @@ dir = File.expand_path( File.dirname( __FILE__ ) )
4
4
  require 'test/unit'
5
5
  require "#{File.expand_path( File.dirname( __FILE__ ) )}/test_setup"
6
6
 
7
-
7
+ require 'rubygems'
8
+ require 'assert_statistically'
8
9
 
9
10
 
10
11
  class SQS_QueueTest < Test::Unit::TestCase
@@ -15,9 +16,26 @@ class SQS_QueueTest < Test::Unit::TestCase
15
16
  def setup
16
17
  @queue_prefix = 'test_queue_'
17
18
  @q = SQStest.skip_live_tests? ? SQS::Queue.new( 'http://nowhere.com/nothing' ) : SQS.create_queue( @queue_prefix )
19
+
20
+ unless SQStest.skip_live_tests?
21
+ assert_statistically( :of => 3, :min => 1, :sleep => 0.25 ) do
22
+ begin
23
+ @q = SQS.get_queue( @queue_prefix )
24
+ rescue
25
+ false
26
+ else
27
+ true
28
+ end
29
+ end
30
+ end
18
31
  end
19
32
  def teardown
20
- SQS.list_queues( @queue_prefix ).each { |q| q.delete! } unless SQStest.skip_live_tests?
33
+ unless SQStest.skip_live_tests?
34
+ SQS.list_queues( @queue_prefix ).each do |q|
35
+ q.delete!
36
+ end
37
+ end
38
+
21
39
  print SQS.counter if SQStest.print_counter?
22
40
  end
23
41
 
@@ -30,19 +48,31 @@ class SQS_QueueTest < Test::Unit::TestCase
30
48
 
31
49
  assert @q.delete
32
50
 
33
- assert_raises RuntimeError do
51
+ begin
34
52
  q3 = SQS.get_queue( @queue_prefix )
53
+ rescue
54
+ assert_equal 'SQS::UnavailableQueue', $!.class.name
55
+ else
56
+ flunk 'Was supposed to raise an SQS::UnavailableQueue'
35
57
  end
36
58
 
37
- assert_raises RuntimeError do
59
+ begin
38
60
  q2.delete
61
+ rescue
62
+ assert_equal 'SQS::AWSSimpleQueueServiceNonExistentQueue', $!.class.name
63
+ else
64
+ flunk 'Was supposed to raise an SQS::AWSSimpleQueueServiceNonExistentQueue'
39
65
  end
40
66
 
41
67
  q = SQS.create_queue :name => "#{@queue_prefix}test_delete"
42
68
  q.send_message( 'A' )
43
69
  q.send_message( 'B' )
44
- assert_raises RuntimeError do
70
+ begin
45
71
  q.delete
72
+ rescue
73
+ assert_equal 'SQS::AWSSimpleQueueServiceNonEmptyQueue', $!.class.name
74
+ else
75
+ flunk 'Was supposed to raise an SQS::AWSSimpleQueueServiceNonEmptyQueue'
46
76
  end
47
77
  assert_nothing_raised do
48
78
  q.delete( :force => true )
@@ -52,15 +82,23 @@ class SQS_QueueTest < Test::Unit::TestCase
52
82
  def test_delete!
53
83
  @q.send_message( 'A' )
54
84
  @q.send_message( 'B' )
55
- assert_raises RuntimeError do
85
+ begin
56
86
  @q.delete
87
+ rescue
88
+ assert_equal 'SQS::AWSSimpleQueueServiceNonEmptyQueue', $!.class.name
89
+ else
90
+ asssert false, "Was supposed to raise an SQS::AWSSimpleQueueServiceNonEmptyQueue"
57
91
  end
58
92
  assert_nothing_raised do
59
93
  @q.delete!
60
94
  end
61
-
62
- assert_raises RuntimeError do
95
+
96
+ begin
63
97
  q = SQS.get_queue( @queue_prefix )
98
+ rescue
99
+ assert_equal 'SQS::UnavailableQueue', $!.class.name
100
+ else
101
+ flunk 'Was supposed to raise an SQS::UnavailableQueue'
64
102
  end
65
103
  end
66
104
 
@@ -71,8 +109,12 @@ class SQS_QueueTest < Test::Unit::TestCase
71
109
 
72
110
  sleep 5
73
111
 
74
- assert_raises RuntimeError do
112
+ begin
75
113
  @q.delete
114
+ rescue
115
+ assert_equal 'SQS::AWSSimpleQueueServiceNonEmptyQueue', $!.class.name
116
+ else
117
+ flunk 'Was supposed to raise an SQS::AWSSimpleQueueServiceNonEmptyQueue'
76
118
  end
77
119
 
78
120
  assert_nothing_raised do
@@ -81,8 +123,12 @@ class SQS_QueueTest < Test::Unit::TestCase
81
123
 
82
124
  sleep 5
83
125
 
84
- assert_raises RuntimeError do
126
+ begin
85
127
  q = SQS.get_queue( @queue_prefix )
128
+ rescue
129
+ assert_equal 'SQS::UnavailableQueue', $!.class.name
130
+ else
131
+ flunk 'Was supposed to raise an SQS::UnavailableQueue'
86
132
  end
87
133
  end
88
134
 
@@ -140,14 +186,19 @@ class SQS_QueueTest < Test::Unit::TestCase
140
186
  assert_nothing_raised do
141
187
  @q.get_queue_attributes( true )
142
188
  end
143
- assert_equal 400, @q.attributes[:VisibilityTimeout]
189
+ assert_statistically( :of => 10, :min => 1, :sleep => 1 ) do
190
+ @q.get_queue_attributes( true )
191
+ 400 == @q.attributes[:VisibilityTimeout]
192
+ end
144
193
  assert_equal 0, @q.attributes[:ApproximateNumberOfMessages]
145
194
 
146
195
 
147
- assert_nothing_raised do
148
- # This should ultimately raise an error, but does not as of 2007-06-12
149
- # See http://developer.amazonwebservices.com/connect/thread.jspa?threadID=15618&tstart=0
196
+ begin
150
197
  @q.set_queue_attributes( :SHOULDBEANERROR => 'crazy!' )
198
+ rescue
199
+ assert_equal 'SQS::InvalidAttributeName', $!.class.name
200
+ else
201
+ flunk 'Was supposed to raise an SQS::InvalidAttributeName'
151
202
  end
152
203
  end
153
204
 
@@ -185,26 +236,30 @@ class SQS_QueueTest < Test::Unit::TestCase
185
236
 
186
237
  # Update happens in situ
187
238
  assert_equal 500, @q.visibility_timeout
188
- assert_equal 500, @q.visibility_timeout( true )
239
+ assert_statistically( :of => 10, :min => 1, :sleep => 1 ) do
240
+ @q.visibility_timeout( true ) == 500
241
+ end
189
242
  end
190
243
 
191
244
  def test_empty?
192
245
  assert @q.empty?
193
246
 
194
247
  @q.send_message( 'no longer empty' )
195
- sleep 2
248
+ sleep 3
196
249
  assert !@q.empty?
197
250
 
198
251
  @q.send_message( 'no longer empty again' )
199
252
 
200
253
  assert !@q.empty?
201
-
202
- messages = @q.receive_messages
203
- messages.each do |m|
254
+
255
+ sleep 3
256
+ while m = @q.receive_message
204
257
  m.delete
205
258
  end
206
259
 
207
- assert @q.empty?
260
+ assert_statistically( :min => 1, :of => 3, :sleep => 1, :message => 'Attempt %d failed' ) do
261
+ @q.empty?
262
+ end
208
263
  end
209
264
 
210
265
 
@@ -304,13 +359,23 @@ class SQS_QueueTest < Test::Unit::TestCase
304
359
 
305
360
  def test_add_grant
306
361
  assert_respond_to @q, :add_grant
362
+
307
363
  assert_equal 1, @q.list_grants.size
364
+
308
365
  assert @q.add_grant( :email => SQStest.other_aws_account[:email], :permission => :full )
309
- assert_equal 2, @q.list_grants.size
366
+ assert_statistically( :of => 3, :min => 1, :sleep => 0.5 ) do
367
+ 2 == @q.list_grants.size
368
+ end
369
+
310
370
  assert @q.add_grant( :email => SQStest.other_aws_account[:email], :permission => :send )
311
- assert_equal 3, @q.list_grants.size
371
+ assert_statistically( :of => 3, :min => 1, :sleep => 0.5 ) do
372
+ 3 == @q.list_grants.size
373
+ end
374
+
312
375
  assert @q.add_grant( :email => SQStest.other_aws_account[:email], :permission => :receive )
313
- assert_equal 4, @q.list_grants.size
376
+ assert_statistically( :of => 3, :min => 1, :sleep => 0.5 ) do
377
+ 4 == @q.list_grants.size
378
+ end
314
379
 
315
380
  assert_nothing_raised do
316
381
  #DUMMY responds to :email (is not an address itself)
@@ -318,15 +383,25 @@ class SQS_QueueTest < Test::Unit::TestCase
318
383
  end
319
384
  assert_equal 4, @q.list_grants.size
320
385
 
321
-
322
- assert_raises RuntimeError do
323
- assert @q.add_grant( :email => 'invalid@email.address', :permission => :receive )
386
+ begin
387
+ @q.add_grant( :email => 'invalid@email.address', :permission => :receive )
388
+ rescue
389
+ assert_equal 'SQS::ServiceUnavailable', $!.class.name
390
+ else
391
+ flunk "Was supposed to raise an SQS::ServiceUnavailable"
324
392
  end
325
393
  end
326
394
 
327
395
  def test_remove_grant
328
396
  assert_respond_to @q, :remove_grant
329
397
 
398
+ [:full, :send, :receive].each do |perm|
399
+ assert_raises ArgumentError do
400
+ @q.remove_grant( :permission => perm )
401
+ end
402
+ end
403
+
404
+
330
405
 
331
406
  [:full, :send, :receive].each do |perm|
332
407
  assert @q.add_grant( :email => SQStest.other_aws_account[:email], :permission => perm )
@@ -377,8 +452,17 @@ class SQS_QueueTest < Test::Unit::TestCase
377
452
  assert_equal SQStest.my_aws_account[:display_name], grant.display_name
378
453
 
379
454
  @q.add_grant( :email => SQStest.other_aws_account[:email], :permission => :receive)
455
+
380
456
  grants = @q.list_grants
381
- assert_equal 2, grants.size
457
+ if grants.size != 2
458
+ assert_statistically( :of => 4, :min => 1, :sleep => 0.5 ) do
459
+ grants = @q.list_grants
460
+ 2 == grants.size
461
+ end
462
+ else
463
+ assert true
464
+ end
465
+
382
466
  grants.each do |grant|
383
467
  case grant.display_name
384
468
  when SQStest.my_aws_account[:display_name]
@@ -386,9 +470,24 @@ class SQS_QueueTest < Test::Unit::TestCase
386
470
  when SQStest.other_aws_account[:display_name]
387
471
  assert_equal SQS.permissions[:receive], grant.permission
388
472
  else
389
- assert false, "'#{grant.display_name}' is an unknown display name"
473
+ flunk "'#{grant.display_name}' is an unknown display name"
390
474
  end
391
475
  end
476
+
477
+
478
+ grants = @q.list_grants( :email => SQStest.other_aws_account[:email] )
479
+ assert_equal 1, grants.size
480
+ grants.each do |g|
481
+ assert_kind_of SQS::Grant, g
482
+ assert_equal SQStest.other_aws_account[:display_name], g.display_name
483
+ end
484
+
485
+ grants = @q.list_grants( :permission => :receive )
486
+ assert_equal 1, grants.size
487
+ grants.each do |g|
488
+ assert_kind_of SQS::Grant, g
489
+ assert_equal SQStest.other_aws_account[:display_name], g.display_name
490
+ end
392
491
  end
393
492
 
394
493
 
@@ -416,6 +515,7 @@ class SQS_QueueTest < Test::Unit::TestCase
416
515
  end
417
516
  end
418
517
 
518
+
419
519
  def test_get_visiblity_timeout
420
520
  assert_equal SQS::Queue.default_visibility_timeout, @q.visibility_timeout
421
521
  assert_kind_of Integer, @q.visibility_timeout
@@ -429,31 +529,52 @@ class SQS_QueueTest < Test::Unit::TestCase
429
529
  assert( @q.visibility_timeout = 456 )
430
530
  assert_equal 456, @q.visibility_timeout
431
531
 
432
- assert_raises RuntimeError do
532
+ begin
433
533
  @q.visibility_timeout = nil
534
+ rescue
535
+ assert_equal 'SQS::EmptyValue', $!.class.name
536
+ else
537
+ flunk 'Was supposed to raise an SQS::EmptyValue'
434
538
  end
435
539
 
436
540
  assert_nothing_raised do
437
541
  @q.visibility_timeout = 0
438
542
  end
439
543
 
440
- assert_raises RuntimeError do
544
+ begin
441
545
  @q.visibility_timeout = -1
546
+ rescue
547
+ assert_equal 'SQS::InvalidAttributeValue', $!.class.name
548
+ else
549
+ flunk 'Was supposed to raise an SQS::InvalidAttributeValue'
442
550
  end
443
- assert_raises RuntimeError do
551
+
552
+ begin
444
553
  @q.visibility_timeout = 86401
554
+ rescue
555
+ assert_equal 'SQS::InvalidAttributeValue', $!.class.name
556
+ else
557
+ flunk 'Was supposed to raise an SQS::InvalidAttributeValue'
445
558
  end
446
559
 
447
- assert_raises RuntimeError do
560
+ begin
448
561
  @q.visibility_timeout = Object
562
+ rescue
563
+ assert_equal 'SQS::InvalidAttributeValue', $!.class.name
564
+ else
565
+ flunk 'Was supposed to raise an SQS::InvalidAttributeValue'
449
566
  end
450
567
  end
451
568
 
452
569
 
453
570
  def test_legal_names
454
571
  assert !SQS.create_queue( '' )
455
- assert_raises RuntimeError do
572
+ begin
456
573
  SQS.create_queue( '81characterslongxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' )
574
+ rescue
575
+ assert_equal 'SQS::InvalidParameterValue', $!.class.name
576
+ else
577
+ flunk 'Was supposed to raise an SQS::InvalidParameterValue'
457
578
  end
458
579
  assert q = SQS.create_queue( '80characterslongxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' )
459
580
  q.delete
@@ -492,7 +613,7 @@ class SQS_QueueTest < Test::Unit::TestCase
492
613
  q.b
493
614
  end
494
615
 
495
- assert_raises RuntimeError do
616
+ assert_raises URI::InvalidURIError do
496
617
  q = SQS::Queue.new :url => 'http://www.slappy.com'
497
618
  q = SQS::Queue.new :url => 'LKJSDFLKJ@#$)()'
498
619
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'test/unit'
4
4
  require "#{File.expand_path( File.dirname( __FILE__ ) )}/test_setup"
5
- include REXML
6
5
 
7
6
  class DuckTypeParameter
8
7
  def initialize( st )
@@ -20,6 +19,10 @@ class SQSTest < Test::Unit::TestCase
20
19
  def setup
21
20
  @queue_prefix = 'testSQS'
22
21
  @q = SQS.create_queue( @queue_prefix ) unless SQStest.skip_live_tests?
22
+
23
+ SQS.add_reasons_to_retry 'ServiceUnavailable'
24
+ SQS.remove_reasons_to_retry( SQS.reasons_to_retry.reject { |r| r == 'ServiceUnavailable' } )
25
+ SQS.retry_attempts = 10
23
26
  end
24
27
  def teardown
25
28
  SQS.list_queues( @queue_prefix ).each { |q| q.delete! } unless SQStest.skip_live_tests?
@@ -62,13 +65,17 @@ class SQSTest < Test::Unit::TestCase
62
65
  assert q1.is_a?( SQS::Queue )
63
66
  assert q2.is_a?( SQS::Queue )
64
67
  assert_equal q1, q2
68
+
69
+ assert_raises SQS::UnavailableQueue do
70
+ SQS.get_queue( "SHOULD_NEVER_EXIST" )
71
+ end
65
72
  end
66
73
 
67
74
  def test_get_non_existent_queue
68
75
  assert_respond_to SQS, :get_queue
69
76
 
70
77
  queuename = "#{@queue_prefix}nonexist"
71
- assert_raises RuntimeError do
78
+ assert_raises SQS::UnavailableQueue do
72
79
  q2 = SQS.get_queue( queuename )
73
80
  end
74
81
  end
@@ -84,8 +91,12 @@ class SQSTest < Test::Unit::TestCase
84
91
  end
85
92
 
86
93
  def test_call_web_service
87
- assert_raises RuntimeError do
94
+ begin
88
95
  SQS.call_web_service( :Something => 'for nothing' )
96
+ rescue
97
+ assert_equal 'SQS::InvalidAction', $!.class.name
98
+ else
99
+ flunk "Was supposed to raise an SQS::InvalidAction"
89
100
  end
90
101
 
91
102
  x = nil
@@ -95,6 +106,61 @@ class SQSTest < Test::Unit::TestCase
95
106
  assert_equal REXML::Document, x.class
96
107
  end
97
108
  end
109
+
110
+
111
+ def test_get_exception_class
112
+ assert_raises ArgumentError do
113
+ SQS.get_exception_class
114
+ end
115
+ assert_raises ArgumentError do
116
+ SQS.get_exception_class( nil )
117
+ end
118
+
119
+ assert_nothing_raised do
120
+ SQS.get_exception_class( 'Crazy' )
121
+ end
122
+ assert_equal Class, SQS.get_exception_class( 'Crazy' ).class
123
+ assert_equal 'SQS::Crazy', SQS.get_exception_class( 'Crazy' ).name
124
+
125
+ assert_equal Class, SQS.get_exception_class( 'good For Nothing' ).class
126
+ assert_equal 'SQS::GoodForNothing', SQS.get_exception_class( 'good For Nothing' ).name
127
+
128
+ assert_equal Class, SQS.get_exception_class( 'good.For.Nothing' ).class
129
+ assert_equal 'SQS::GoodForNothing', SQS.get_exception_class( 'good.For.Nothing' ).name
130
+
131
+ assert_equal Class, SQS.get_exception_class( '&(#Sunday)99' ).class
132
+ assert_equal 'SQS::Sunday99', SQS.get_exception_class( '&(#Sunday)99' ).name
133
+ end
134
+ def test_get_exception
135
+ assert_raises ArgumentError do
136
+ SQS.get_exception
137
+ end
138
+ assert_raises ArgumentError do
139
+ SQS.get_exception( 9 )
140
+ end
141
+ assert_raises ArgumentError do
142
+ SQS.get_exception( 'Thursday' )
143
+ end
144
+ assert_raises ArgumentError do
145
+ SQS.get_exception( {} )
146
+ end
147
+
148
+ e = SQS.get_exception( :url => "I'm a URL!", :document => REXML::Document.new( "<?xml version='1.0'?><Response><Errors><Error><Code>ServiceUnavailable</Code><Message>Service Queue is currently unavailable. Please try again later</Message></Error></Errors><RequestID>6847ea9e-af25-4fc7-9974-75b6bef82581</RequestID></Response>" ) )
149
+ assert_equal 'SQS::ServiceUnavailable', e.class.name
150
+ assert_match /^Service Queue is currently unavailable\. Please try again later \(The XML/, e.message
151
+
152
+ e = SQS.get_exception( :attempts => 0, :url => "I'm a URL!", :document => REXML::Document.new( "<?xml version='1.0'?><Response><Errors><Error><Code>ServiceUnavailable</Code><Message>Service Queue is currently unavailable. Please try again later</Message></Error></Errors><RequestID>6847ea9e-af25-4fc7-9974-75b6bef82581</RequestID></Response>" ) )
153
+ assert_equal 'SQS::ServiceUnavailable', e.class.name
154
+ assert_match /^Service Queue is currently unavailable\. Please try again later \(The XML/, e.message
155
+
156
+ e = SQS.get_exception( :attempts => 1, :url => "I'm a URL!", :document => REXML::Document.new( "<?xml version='1.0'?><Response><Errors><Error><Code>ServiceUnavailable</Code><Message>Service Queue is currently unavailable. Please try again later</Message></Error></Errors><RequestID>6847ea9e-af25-4fc7-9974-75b6bef82581</RequestID></Response>" ) )
157
+ assert_equal 'SQS::ServiceUnavailable', e.class.name
158
+ assert_match /^Service Queue is currently unavailable\. Please try again later \(After 1 attempt\) \(The XML/, e.message
159
+
160
+ e = SQS.get_exception( :attempts => 2, :url => "I'm a URL!", :document => REXML::Document.new( "<?xml version='1.0'?><Response><Errors><Error><Code>ServiceUnavailable</Code><Message>Service Queue is currently unavailable. Please try again later</Message></Error></Errors><RequestID>6847ea9e-af25-4fc7-9974-75b6bef82581</RequestID></Response>" ) )
161
+ assert_equal 'SQS::ServiceUnavailable', e.class.name
162
+ assert_match /^Service Queue is currently unavailable\. Please try again later \(After 2 attempts\) \(The XML/, e.message
163
+ end
98
164
 
99
165
  def test_counter
100
166
  initial_counter = SQS.counter
@@ -212,6 +278,109 @@ class SQSTest < Test::Unit::TestCase
212
278
  assert 1 <= SQS.retry_attempts
213
279
  end
214
280
 
281
+ def test_change_retry_attempts
282
+ assert_respond_to SQS, :retry_attempts=
283
+
284
+ assert_raises ArgumentError do
285
+ SQS.retry_attempts = Object
286
+ end
287
+ assert_equal 10, SQS.retry_attempts
288
+
289
+ assert_nothing_raised ArgumentError do
290
+ SQS.retry_attempts = nil
291
+ end
292
+ assert_equal 0, SQS.retry_attempts
293
+
294
+ assert_nothing_raised do
295
+ SQS.retry_attempts = 2
296
+ end
297
+ assert_equal 2, SQS.retry_attempts
298
+ end
299
+
300
+
301
+ def test_reasons_to_retry
302
+ assert_respond_to SQS, :reasons_to_retry
303
+ assert_kind_of Array, SQS.reasons_to_retry
304
+ assert_equal ['ServiceUnavailable'], SQS.reasons_to_retry
305
+ end
306
+
307
+ def test_add_reasons_to_retry
308
+ assert_respond_to SQS, :add_reasons_to_retry
309
+ assert_respond_to SQS, :add_reasons_to_retry
310
+
311
+ assert_raises ArgumentError do
312
+ SQS.add_reasons_to_retry
313
+ end
314
+
315
+ assert_raises ArgumentError do
316
+ SQS.add_reasons_to_retry( nil )
317
+ end
318
+ assert_equal ['ServiceUnavailable'], SQS.reasons_to_retry
319
+
320
+ assert_nothing_raised do
321
+ SQS.add_reasons_to_retry( 'ServiceUnavailable' )
322
+ end
323
+ assert_equal ['ServiceUnavailable'], SQS.reasons_to_retry
324
+
325
+ assert_nothing_raised do
326
+ SQS.add_reasons_to_retry( 'a' )
327
+ end
328
+ assert_equal ['ServiceUnavailable', 'a'], SQS.reasons_to_retry
329
+
330
+
331
+ assert_nothing_raised do
332
+ SQS.add_reasons_to_retry( 'b', 'c' )
333
+ end
334
+ assert_equal ['ServiceUnavailable', 'a', 'b', 'c' ], SQS.reasons_to_retry
335
+
336
+ assert_nothing_raised do
337
+ SQS.add_reasons_to_retry( ['d', 'e'] )
338
+ end
339
+ assert_equal ['ServiceUnavailable', 'a', 'b', 'c', 'd', 'e' ], SQS.reasons_to_retry
340
+ end
341
+
342
+ def test_remove_reasons_to_retry
343
+ assert_respond_to SQS, :remove_reasons_to_retry
344
+ assert_respond_to SQS, :remove_reason_to_retry
345
+
346
+ assert_nothing_raised do
347
+ SQS.add_reasons_to_retry( 'a', 'b', 'c', 'd', 'e' )
348
+ end
349
+ assert_equal ['ServiceUnavailable', 'a', 'b', 'c', 'd', 'e' ], SQS.reasons_to_retry
350
+
351
+
352
+ assert_raises ArgumentError do
353
+ SQS.remove_reasons_to_retry
354
+ end
355
+
356
+ assert_raises ArgumentError do
357
+ SQS.remove_reasons_to_retry( nil )
358
+ end
359
+ assert_equal ['ServiceUnavailable', 'a', 'b', 'c', 'd', 'e' ], SQS.reasons_to_retry
360
+
361
+ assert_nothing_raised do
362
+ SQS.remove_reasons_to_retry( 'ServiceUnavailable' )
363
+ end
364
+ assert_equal ['a', 'b', 'c', 'd', 'e' ], SQS.reasons_to_retry
365
+
366
+ assert_nothing_raised do
367
+ SQS.remove_reasons_to_retry( 'a' )
368
+ end
369
+ assert_equal ['b', 'c', 'd', 'e' ], SQS.reasons_to_retry
370
+
371
+
372
+ assert_nothing_raised do
373
+ SQS.remove_reasons_to_retry( 'b', 'c' )
374
+ end
375
+ assert_equal ['d', 'e' ], SQS.reasons_to_retry
376
+
377
+ assert_nothing_raised do
378
+ SQS.remove_reasons_to_retry( ['d', 'e'] )
379
+ end
380
+ assert SQS.reasons_to_retry.empty?
381
+ end
382
+
383
+
215
384
  def test_iso8601
216
385
  t = Time.now
217
386
  assert_respond_to t, :to_iso8601
@@ -225,46 +394,46 @@ class SQSTest < Test::Unit::TestCase
225
394
  end
226
395
 
227
396
  def test_xpath
228
- d = Document.new( "<?xml version='1.0'?><CreateQueueResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>945de8b9-a820-4329-a56e-211053d89d0b</RequestId></ResponseStatus></CreateQueueResponse>" )
397
+ d = REXML::Document.new( "<?xml version='1.0'?><CreateQueueResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>945de8b9-a820-4329-a56e-211053d89d0b</RequestId></ResponseStatus></CreateQueueResponse>" )
229
398
  assert_equal 'Success', d.status
230
399
  assert_equal 'http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing', d.queue_url
231
400
 
232
401
 
233
- d = Document.new( "<?xml version='1.0'?><Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to authenticate the request: access credentials are missing</Message></Error></Errors><RequestID>8f6707de-db6e-4bf7-909c-8dd6486bd42f</RequestID></Response>" )
402
+ d = REXML::Document.new( "<?xml version='1.0'?><Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to authenticate the request: access credentials are missing</Message></Error></Errors><RequestID>8f6707de-db6e-4bf7-909c-8dd6486bd42f</RequestID></Response>" )
234
403
  assert_equal 'AuthFailure', d.error_code
235
404
  assert_equal 'AWS was not able to authenticate the request: access credentials are missing', d.error_message
236
405
 
237
406
 
238
- d = Document.new( "<?xml version='1.0'?><ListQueuesResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>c2d4fe0b-f6f1-4874-9e6d-d081a1155b54</RequestId></ResponseStatus></ListQueuesResponse>" )
407
+ d = REXML::Document.new( "<?xml version='1.0'?><ListQueuesResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>c2d4fe0b-f6f1-4874-9e6d-d081a1155b54</RequestId></ResponseStatus></ListQueuesResponse>" )
239
408
  assert_equal 'Success', d.status
240
409
 
241
410
 
242
- d = Document.new( "<?xml version='1.0'?><ListQueuesResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothingAgain</QueueUrl><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>e27b54da-ff38-413b-b52f-82a6342cd151</RequestId></ResponseStatus></ListQueuesResponse>" )
411
+ d = REXML::Document.new( "<?xml version='1.0'?><ListQueuesResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothingAgain</QueueUrl><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/nothing</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>e27b54da-ff38-413b-b52f-82a6342cd151</RequestId></ResponseStatus></ListQueuesResponse>" )
243
412
  assert_equal 'Success', d.status
244
413
  assert_equal 'e27b54da-ff38-413b-b52f-82a6342cd151', d.request_id
245
414
 
246
415
 
247
- d = Document.new( "<?xml version='1.0'?><SendMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><MessageId>171Q1105D8GTGS9FR4QB|9CBMKVD6TTQX44QJ1S30|PT6DRTB278S4MNY77NJ0</MessageId><ResponseStatus><StatusCode>Success</StatusCode><RequestId>ddbab3dc-3910-4c86-a139-27e37cabeac4</RequestId></ResponseStatus></SendMessageResponse>" )
416
+ d = REXML::Document.new( "<?xml version='1.0'?><SendMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><MessageId>171Q1105D8GTGS9FR4QB|9CBMKVD6TTQX44QJ1S30|PT6DRTB278S4MNY77NJ0</MessageId><ResponseStatus><StatusCode>Success</StatusCode><RequestId>ddbab3dc-3910-4c86-a139-27e37cabeac4</RequestId></ResponseStatus></SendMessageResponse>" )
248
417
  assert_equal '171Q1105D8GTGS9FR4QB|9CBMKVD6TTQX44QJ1S30|PT6DRTB278S4MNY77NJ0', d.message_id( :send )
249
418
  assert_equal 'Success', d.status
250
419
  assert_equal 'ddbab3dc-3910-4c86-a139-27e37cabeac4', d.request_id
251
420
 
252
421
 
253
- d = Document.new( "<?xml version='1.0'?><PeekMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><Message><MessageId>1WB69MM74V13FFJRTA65|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>what it is</MessageBody></Message><ResponseStatus><StatusCode>Success</StatusCode><RequestId>c23c96f4-6479-48d3-b1e4-158ebfe0cc17</RequestId></ResponseStatus></PeekMessageResponse>" )
422
+ d = REXML::Document.new( "<?xml version='1.0'?><PeekMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><Message><MessageId>1WB69MM74V13FFJRTA65|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>what it is</MessageBody></Message><ResponseStatus><StatusCode>Success</StatusCode><RequestId>c23c96f4-6479-48d3-b1e4-158ebfe0cc17</RequestId></ResponseStatus></PeekMessageResponse>" )
254
423
  assert_equal 'what it is', d.message_body
255
424
  assert_equal '1WB69MM74V13FFJRTA65|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30', d.message_id( :peek )
256
425
  assert_equal 'Success', d.status
257
426
  assert_equal 'c23c96f4-6479-48d3-b1e4-158ebfe0cc17', d.request_id
258
427
 
259
428
 
260
- d = Document.new( "<?xml version='1.0'?><ReceiveMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><Message><MessageId>0C2GG4PAQACB5REHPA7W|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>you are silly person</MessageBody></Message><ResponseStatus><StatusCode>Success</StatusCode><RequestId>a901d3ec-24b6-4125-9345-36f01cd82021</RequestId></ResponseStatus></ReceiveMessageResponse>" )
429
+ d = REXML::Document.new( "<?xml version='1.0'?><ReceiveMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><Message><MessageId>0C2GG4PAQACB5REHPA7W|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>you are silly person</MessageBody></Message><ResponseStatus><StatusCode>Success</StatusCode><RequestId>a901d3ec-24b6-4125-9345-36f01cd82021</RequestId></ResponseStatus></ReceiveMessageResponse>" )
261
430
  assert_equal 'you are silly person', d.message_body( :receive )
262
431
  assert_equal '0C2GG4PAQACB5REHPA7W|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30', d.message_id( :receive )
263
432
  assert_equal 'Success', d.status
264
433
  assert_equal 'a901d3ec-24b6-4125-9345-36f01cd82021', d.request_id
265
434
 
266
435
 
267
- d = Document.new( "<?xml version='1.0'?><ReceiveMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><Message><MessageId>0C2GG4PAQACB5REHPA7W|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>you are silly person</MessageBody></Message><Message><MessageId>12ZJQSDVXE728WJBXACC|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>whatever</MessageBody></Message><Message><MessageId>15YJSSXZ2R5XB0T1PXMY|3H4AA8J7EJKM0DQZR7E1|PT6DRTB278S4MNY77NJ0</MessageId><MessageBody>whatever</MessageBody></Message><Message><MessageId>0BRPBSW05BB9Z6HXWV4J|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>whatever</MessageBody></Message><ResponseStatus><StatusCode>Success</StatusCode><RequestId>ebf56590-665f-4077-8820-953c6663d220</RequestId></ResponseStatus></ReceiveMessageResponse>" )
436
+ d = REXML::Document.new( "<?xml version='1.0'?><ReceiveMessageResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><Message><MessageId>0C2GG4PAQACB5REHPA7W|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>you are silly person</MessageBody></Message><Message><MessageId>12ZJQSDVXE728WJBXACC|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>whatever</MessageBody></Message><Message><MessageId>15YJSSXZ2R5XB0T1PXMY|3H4AA8J7EJKM0DQZR7E1|PT6DRTB278S4MNY77NJ0</MessageId><MessageBody>whatever</MessageBody></Message><Message><MessageId>0BRPBSW05BB9Z6HXWV4J|3H4AA8J7EJKM0DQZR7E1|9CBMKVD6TTQX44QJ1S30</MessageId><MessageBody>whatever</MessageBody></Message><ResponseStatus><StatusCode>Success</StatusCode><RequestId>ebf56590-665f-4077-8820-953c6663d220</RequestId></ResponseStatus></ReceiveMessageResponse>" )
268
437
  assert d.messages.is_a?( Array )
269
438
  d.messages.each do |m|
270
439
  assert m.respond_to?( :message_id )
@@ -273,17 +442,17 @@ class SQSTest < Test::Unit::TestCase
273
442
  assert_equal 'Success', d.status
274
443
  assert_equal 'ebf56590-665f-4077-8820-953c6663d220', d.request_id
275
444
 
276
- d = Document.new( "<?xml version='1.0'?><GetVisibilityTimeoutResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><VisibilityTimeout>30</VisibilityTimeout><ResponseStatus><StatusCode>Success</StatusCode><RequestId>410fa43f-56f8-4e48-8c37-fa2f488f84aa</RequestId></ResponseStatus></GetVisibilityTimeoutResponse>" )
445
+ d = REXML::Document.new( "<?xml version='1.0'?><GetVisibilityTimeoutResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><VisibilityTimeout>30</VisibilityTimeout><ResponseStatus><StatusCode>Success</StatusCode><RequestId>410fa43f-56f8-4e48-8c37-fa2f488f84aa</RequestId></ResponseStatus></GetVisibilityTimeoutResponse>" )
277
446
  assert_equal 30, d.visibility_timeout
278
447
  assert_equal 'Success', d.status
279
448
  assert_equal '410fa43f-56f8-4e48-8c37-fa2f488f84aa', d.request_id
280
449
 
281
- d = Document.new( "<?xml version='1.0'?><SetVisibilityTimeoutResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><ResponseStatus><StatusCode>Success</StatusCode><RequestId>26d8f4b9-a95a-4ead-85e0-a3c6ee642d64</RequestId></ResponseStatus></SetVisibilityTimeoutResponse>" )
450
+ d = REXML::Document.new( "<?xml version='1.0'?><SetVisibilityTimeoutResponse xmlns='http://queue.amazonaws.com/doc/2006-04-01/'><ResponseStatus><StatusCode>Success</StatusCode><RequestId>26d8f4b9-a95a-4ead-85e0-a3c6ee642d64</RequestId></ResponseStatus></SetVisibilityTimeoutResponse>" )
282
451
  assert_equal 'Success', d.status
283
452
  assert_equal '26d8f4b9-a95a-4ead-85e0-a3c6ee642d64', d.request_id
284
453
 
285
454
 
286
- d = Document.new( "<?xml version='1.0'?><ListGrantsResponse xmlns='http://access.amazonaws.com/doc/2006-01-01/'><GrantList><Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='CanonicalUser'><ID>2a3fad33685601e436445b8d283589b9d5ccd89a50da8fa91c664f2531ea5c71</ID><DisplayName>wzph</DisplayName></Grantee><Permission>FULLCONTROL</Permission></GrantList><ResponseStatus><StatusCode>Success</StatusCode></ResponseStatus></ListGrantsResponse>" )
455
+ d = REXML::Document.new( "<?xml version='1.0'?><ListGrantsResponse xmlns='http://access.amazonaws.com/doc/2006-01-01/'><GrantList><Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='CanonicalUser'><ID>2a3fad33685601e436445b8d283589b9d5ccd89a50da8fa91c664f2531ea5c71</ID><DisplayName>wzph</DisplayName></Grantee><Permission>FULLCONTROL</Permission></GrantList><ResponseStatus><StatusCode>Success</StatusCode></ResponseStatus></ListGrantsResponse>" )
287
456
  assert d.grant_lists.is_a?( Array )
288
457
  assert_equal 1, d.grant_lists.size
289
458
  d.grant_lists.each do |list|
@@ -297,7 +466,7 @@ class SQSTest < Test::Unit::TestCase
297
466
  end
298
467
  assert_equal 'Success', d.status
299
468
 
300
- d = Document.new( "<?xml version='1.0'?><ListGrantsResponse xmlns='http://access.amazonaws.com/doc/2006-01-01/'><GrantList><Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='CanonicalUser'><ID>fde39a46472f20295511ed16510c2ff352e5d0cc0060e1aa3edfa77cbc6412bf</ID><DisplayName>lance3515</DisplayName></Grantee><Permission>RECEIVEMESSAGE</Permission></GrantList><GrantList><Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='CanonicalUser'><ID>2a3fad33685601e436445b8d283589b9d5ccd89a50da8fa91c664f2531ea5c71</ID><DisplayName>wzph</DisplayName></Grantee><Permission>FULLCONTROL</Permission></GrantList><ResponseStatus><StatusCode>Success</StatusCode></ResponseStatus></ListGrantsResponse>" )
469
+ d = REXML::Document.new( "<?xml version='1.0'?><ListGrantsResponse xmlns='http://access.amazonaws.com/doc/2006-01-01/'><GrantList><Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='CanonicalUser'><ID>fde39a46472f20295511ed16510c2ff352e5d0cc0060e1aa3edfa77cbc6412bf</ID><DisplayName>lance3515</DisplayName></Grantee><Permission>RECEIVEMESSAGE</Permission></GrantList><GrantList><Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='CanonicalUser'><ID>2a3fad33685601e436445b8d283589b9d5ccd89a50da8fa91c664f2531ea5c71</ID><DisplayName>wzph</DisplayName></Grantee><Permission>FULLCONTROL</Permission></GrantList><ResponseStatus><StatusCode>Success</StatusCode></ResponseStatus></ListGrantsResponse>" )
301
470
  assert d.grant_lists.is_a?( Array )
302
471
  assert_equal 2, d.grant_lists.size
303
472
  d.grant_lists.each do |list|
@@ -312,10 +481,10 @@ class SQSTest < Test::Unit::TestCase
312
481
  assert_equal 'Success', d.status
313
482
 
314
483
 
315
- d = Document.new( "<?xml version='1.0'?><AddGrantResponse xmlns='http://access.amazonaws.com/doc/2006-01-01/'><ResponseStatus><StatusCode>Success</StatusCode></ResponseStatus></AddGrantResponse>" )
484
+ d = REXML::Document.new( "<?xml version='1.0'?><AddGrantResponse xmlns='http://access.amazonaws.com/doc/2006-01-01/'><ResponseStatus><StatusCode>Success</StatusCode></ResponseStatus></AddGrantResponse>" )
316
485
  assert_equal 'Success', d.status
317
486
 
318
- d = Document.new( "<?xml version='1.0'?><GetQueueAttributesResponse xmlns='http://queue.amazonaws.com/doc/2007-05-01/'><AttributedValue><Attribute>VisibilityTimeout</Attribute><Value>30</Value></AttributedValue><AttributedValue><Attribute>ApproximateNumberOfMessages</Attribute><Value>0</Value></AttributedValue><ResponseStatus><StatusCode>Success</StatusCode><RequestId>00ae54e4-0dc9-4835-bc2e-36304ff40506</RequestId></ResponseStatus></GetQueueAttributesResponse>" )
487
+ d = REXML::Document.new( "<?xml version='1.0'?><GetQueueAttributesResponse xmlns='http://queue.amazonaws.com/doc/2007-05-01/'><AttributedValue><Attribute>VisibilityTimeout</Attribute><Value>30</Value></AttributedValue><AttributedValue><Attribute>ApproximateNumberOfMessages</Attribute><Value>0</Value></AttributedValue><ResponseStatus><StatusCode>Success</StatusCode><RequestId>00ae54e4-0dc9-4835-bc2e-36304ff40506</RequestId></ResponseStatus></GetQueueAttributesResponse>" )
319
488
  assert d.attributed_values.is_a?( Array )
320
489
  assert_equal 2, d.attributed_values.size
321
490
  # d.attributed_values.each do |att|
@@ -323,6 +492,15 @@ class SQSTest < Test::Unit::TestCase
323
492
  # end
324
493
  assert_equal 'Success', d.status
325
494
 
495
+
496
+
497
+ d = REXML::Document.new( "<?xml version='1.0'?><ListQueuesResponse xmlns='http://queue.amazonaws.com/doc/2007-05-01/'><QueueUrl>http://queue.amazonaws.com/A3ZVJ8HH1F466/testSQS</QueueUrl><ResponseStatus><StatusCode>Success</StatusCode><RequestId>fd2d47e4-2cac-4047-94f2-e220d995835b</RequestId></ResponseStatus></ListQueuesResponse>" )
498
+ assert_nothing_raised do
499
+ d.status
500
+ end
501
+ assert_equal 'Success', d.status
502
+ assert_equal '', d.error_code
503
+
326
504
  end
327
505
 
328
506
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: SQS
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.4
7
- date: 2007-06-12 00:00:00 -07:00
6
+ version: 0.1.5
7
+ date: 2007-07-18 00:00:00 -07:00
8
8
  summary: A Ruby interface to Amazon's Simple Queue Service
9
9
  require_paths:
10
10
  - lib