File: test_sqs.rb

package info (click to toggle)
ruby-aws 2.10.2-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, trixie
  • size: 748 kB
  • sloc: ruby: 7,748; makefile: 16
file content (231 lines) | stat: -rw-r--r-- 7,486 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
require File.dirname(__FILE__) + '/test_helper.rb'
require File.dirname(__FILE__) + '/../test_credentials.rb'


class TestSqs < Test::Unit::TestCase

  GRANTEE_EMAIL_ADDRESS = 'fester@example.com'
  RIGHT_MESSAGE_TEXT = 'Right test message'


  def setup
    TestCredentials.get_credentials
    @sqs = Aws::SqsInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
    @queue_name = 'right_sqs_test_gen2_queue'
    # for classes
    @s = Aws::Sqs.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
  end

  # Wait for the queue to appear in the queues list.
  # Amazon needs some time to after the queue creation to place
  # it to the accessible queues list. If we dont want to get
  # the additional faults then wait a bit...
  def wait_for_queue_url(queue_name)
    queue_url = nil
    until queue_url
      queue_url = @sqs.queue_url_by_name(queue_name)
      unless queue_url
        print '-'
        STDOUT.flush
        sleep 1
      end
    end
    queue_url
  end

  def test_on_exception_no_method_error
    assert_raise Aws::ResourceNotFoundError do
      Aws::Sqs::Queue.new(@s, "some_nonexistant_queue")
    end
  end


  #---------------------------
  # Rightscale::SqsInterface
  #---------------------------

  def test_01_create_queue
    queue_url = @sqs.create_queue @queue_name
    assert queue_url[/http.*#{@queue_name}/], 'New queue creation failed'
  end

  def test_02_list_queues
    wait_for_queue_url(@queue_name)
    queues = @sqs.list_queues('right_')
    assert queues.size>0, 'Must more that 0 queues in list'
  end

  def test_03_set_and_get_queue_attributes
    queue_url = @sqs.queue_url_by_name(@queue_name)
    assert queue_url[/http.*#{@queue_name}/], "#{@queue_name} must exist!"
    assert @sqs.set_queue_attributes(queue_url, 'VisibilityTimeout', 111), 'Set_queue_attributes fail'
    sleep 20 # Amazon needs some time to change attribute
    assert_equal '111', @sqs.get_queue_attributes(queue_url)['VisibilityTimeout'], 'New VisibilityTimeout must be equal to 111'
  end

  def test_06_send_message
    queue_url = @sqs.queue_url_by_name(@queue_name)
    # send 5 messages for the tests below
    assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
    assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
    assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
    assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
    assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
    sleep 2
  end

  def test_07_get_queue_length
    queue_url = @sqs.queue_url_by_name(@queue_name)
    assert_equal 5, @sqs.get_queue_length(queue_url), 'Queue must have 5 messages'
  end

  def test_08_receive_message
    queue_url = @sqs.queue_url_by_name(@queue_name)
    r_message = @sqs.receive_message(queue_url, 1)[0]
    assert r_message, "Receive returned no message(s), but this is not necessarily incorrect"
    assert_equal RIGHT_MESSAGE_TEXT, r_message['Body'], 'Receive message got wrong message text'
  end

  def test_09_delete_message
    queue_url = @sqs.queue_url_by_name(@queue_name)
    message = @sqs.receive_message(queue_url)[0]
    assert @sqs.delete_message(queue_url, message['ReceiptHandle']), 'Delete_message fail'
    assert @sqs.pop_message(queue_url), 'Pop_message fail'
  end

  def test_10_clear_and_delete_queue
    queue_url = @sqs.queue_url_by_name(@queue_name)
    assert @sqs.delete_queue(queue_url)
  end

  #---------------------------
  # Aws::Sqs classes
  #---------------------------

  def test_20_sqs_create_delete_queue
    assert @s, 'Aws::Sqs must exist'
    # get queues list
    queues_size = @s.queues.size
    # create new queue
    queue = @s.queue("#{@queue_name}_20", true)
    # check that it is created
    assert queue.is_a?(Aws::Sqs::Queue)
    wait_for_queue_url(@queue_name)
    # check that amount of queues has increased
    assert_equal queues_size + 1, @s.queues.size
    # delete queue
    assert queue.delete
  end

  def test_21_queue_create
    # create new queue
    queue = Aws::Sqs::Queue.create(@s, "#{@queue_name}_21", true)
    # check that it is created
    assert queue.is_a?(Aws::Sqs::Queue)
    wait_for_queue_url(@queue_name)
  end

  def test_22_queue_attributes
    queue = Aws::Sqs::Queue.create(@s, "#{@queue_name}_21", false)
    # get a list of attrinutes
    attributes = queue.get_attribute
    assert attributes.is_a?(Hash) && attributes.size>0
    # get attribute value and increase it by 10
    v = (queue.get_attribute('VisibilityTimeout').to_i + 10).to_s
    # set attribute
    assert queue.set_attribute('VisibilityTimeout', v)
    # wait a bit
    sleep 20
    # check that attribute has changed
    assert_equal v, queue.get_attribute('VisibilityTimeout')
    # get queue visibility timeout
    assert_equal v, queue.visibility
    # change it
    queue.visibility = queue.visibility.to_i + 10
    # make sure that it is changed
    assert v.to_i + 10, queue.visibility
  end

  def test_24_send_size
    queue = Aws::Sqs::Queue.create(@s, "#{@queue_name}_24", true)
    # send 5 messages
    assert queue.push('a1')
    assert queue.push('a2')
    assert queue.push('a3')
    assert queue.push('a4')
    assert queue.push('a5')
    sleep 10
    # check queue size
    assert_equal 5, queue.size
    # send one more
    assert queue.push('a6')
    sleep 10
    # check queue size again
    assert_equal 6, queue.size
  end

  def test_25_message_receive_pop_delete
    queue = Aws::Sqs::Queue.create(@s, "#{@queue_name}_24", false)
    # get queue size
    size = queue.size
    # get first message
    m1 = queue.receive(10)
    assert m1.is_a?(Aws::Sqs::Message)
    # pop second message
    m2 = queue.pop
    assert m2.is_a?(Aws::Sqs::Message)
    # make sure that queue size has decreased
    assert_equal size-1, queue.size
    # delete messsage
    assert m1.delete
    # make sure that queue size has decreased again
    assert_equal size-2, queue.size
  end

  def test_26
    queue = Aws::Sqs::Queue.create(@s, "#{@queue_name}_24", false)
    # lock message
    queue.receive(100)
    # clear queue
    assert queue.clear
    # queue size is greater than zero
    assert queue.size>0
  end

  def test_27_set_amazon_problems
    original_problems = Aws::SqsInterface.amazon_problems
    assert(original_problems.length > 0)
    Aws::SqsInterface.amazon_problems= original_problems << "A New Problem"
    new_problems = Aws::SqsInterface.amazon_problems
    assert_equal(new_problems, original_problems)

    Aws::SqsInterface.amazon_problems= nil
    assert_nil(Aws::SqsInterface.amazon_problems)
  end

  def test_28_check_threading_model
    assert(!@sqs.multi_thread)
    newsqs = Aws::SqsInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, {:multi_thread => true})
    assert(newsqs.multi_thread)
  end

  # Note that just like the other tests, this one does not clean up
  # after itself (queue does not get deleted)
  def test_29_change_message_visibility
    queue = Aws::Sqs::Queue.create(@s, "#{@queue_name}_29", true, 10)
    # Be sure the queue is empty. Useful when rerunning the tests.
    queue.clear
    queue.send_message(RIGHT_MESSAGE_TEXT)
    m = nil
    # Wait for the message to be delivered
    while m.nil?
      m = queue.receive
    end
    m.visibility = 60
    sleep(20)
    # Had the visibility timeout been not updated, the message would be available
    # at this point.
    assert queue.receive.nil?
  end

end