kerryb-right_aws 1.7.3
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/History.txt +172 -0
- data/Manifest.txt +32 -0
- data/README.txt +146 -0
- data/Rakefile +96 -0
- data/lib/awsbase/benchmark_fix.rb +39 -0
- data/lib/awsbase/file_fix.rb +33 -0
- data/lib/awsbase/right_awsbase.rb +660 -0
- data/lib/awsbase/support.rb +111 -0
- data/lib/ec2/right_ec2.rb +1223 -0
- data/lib/right_aws.rb +69 -0
- data/lib/s3/right_s3.rb +1056 -0
- data/lib/s3/right_s3_interface.rb +990 -0
- data/lib/sdb/active_sdb.rb +695 -0
- data/lib/sdb/right_sdb_interface.rb +475 -0
- data/lib/sqs/right_sqs.rb +380 -0
- data/lib/sqs/right_sqs_gen2.rb +278 -0
- data/lib/sqs/right_sqs_gen2_interface.rb +451 -0
- data/lib/sqs/right_sqs_interface.rb +604 -0
- data/test/ec2/test_helper.rb +2 -0
- data/test/ec2/test_right_ec2.rb +76 -0
- data/test/http_connection.rb +87 -0
- data/test/s3/test_helper.rb +2 -0
- data/test/s3/test_right_s3.rb +388 -0
- data/test/s3/test_right_s3_stubbed.rb +95 -0
- data/test/sdb/test_active_sdb.rb +249 -0
- data/test/sdb/test_helper.rb +2 -0
- data/test/sdb/test_right_sdb.rb +147 -0
- data/test/sqs/test_helper.rb +2 -0
- data/test/sqs/test_right_sqs.rb +291 -0
- data/test/sqs/test_right_sqs_gen2.rb +209 -0
- data/test/test_credentials.rb +37 -0
- data/test/ts_right_aws.rb +13 -0
- metadata +106 -0
@@ -0,0 +1,249 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestSdb < Test::Unit::TestCase
|
4
|
+
|
5
|
+
DOMAIN_NAME = 'right_sdb_awesome_test_domain'
|
6
|
+
|
7
|
+
class Client < RightAws::ActiveSdb::Base
|
8
|
+
set_domain_name DOMAIN_NAME
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
STDOUT.sync = true
|
13
|
+
@clients = [
|
14
|
+
{ 'name' => 'Bush', 'country' => 'USA', 'gender' => 'male', 'expiration' => '2009', 'post' => 'president' },
|
15
|
+
{ 'name' => 'Putin', 'country' => 'Russia', 'gender' => 'male', 'expiration' => '2008', 'post' => 'president' },
|
16
|
+
{ 'name' => 'Medvedev', 'country' => 'Russia', 'gender' => 'male', 'expiration' => '2012', 'post' => 'president' },
|
17
|
+
{ 'name' => 'Mary', 'country' => 'USA', 'gender' => 'female', 'hobby' => ['patchwork', 'bundle jumping'] },
|
18
|
+
{ 'name' => 'Sandy', 'country' => 'Russia', 'gender' => 'female', 'hobby' => ['flowers', 'cats', 'cooking'] },
|
19
|
+
{ 'name' => 'Mary', 'country' => 'Russia', 'gender' => 'female', 'hobby' => ['flowers', 'cats', 'cooking'] } ]
|
20
|
+
RightAws::ActiveSdb.establish_connection(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
|
21
|
+
end
|
22
|
+
|
23
|
+
SDB_DELAY = 3
|
24
|
+
|
25
|
+
def wait(delay, msg='')
|
26
|
+
print " waiting #{delay} seconds: #{msg}"
|
27
|
+
while delay>0 do
|
28
|
+
delay -= 1
|
29
|
+
print '.'
|
30
|
+
sleep 1
|
31
|
+
end
|
32
|
+
puts
|
33
|
+
end
|
34
|
+
|
35
|
+
#---------------------------
|
36
|
+
# Rightscale::SdbInterface
|
37
|
+
#---------------------------
|
38
|
+
|
39
|
+
def test_00_delete_domain
|
40
|
+
assert RightAws::ActiveSdb.delete_domain(DOMAIN_NAME)
|
41
|
+
wait SDB_DELAY, 'test 00: after domain deletion'
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_01_create_domain
|
45
|
+
# check that domain does not exist
|
46
|
+
assert !RightAws::ActiveSdb.domains.include?(DOMAIN_NAME)
|
47
|
+
# create domain
|
48
|
+
assert Client.create_domain
|
49
|
+
wait SDB_DELAY, 'test 01: after domain creation'
|
50
|
+
# check that we have received new domain from Amazin
|
51
|
+
assert RightAws::ActiveSdb.domains.include?(DOMAIN_NAME)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_02_create_items
|
55
|
+
# check that DB is empty
|
56
|
+
clients = Client.find(:all)
|
57
|
+
assert clients.blank?
|
58
|
+
# put some clients there
|
59
|
+
@clients.each do |client|
|
60
|
+
Client.create client
|
61
|
+
end
|
62
|
+
wait SDB_DELAY, 'test 02: after clients creation'
|
63
|
+
# check that DB has all the clients we just putted
|
64
|
+
clients = Client.find(:all)
|
65
|
+
assert_equal @clients.size, clients.size
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_03_create_and_save_new_item
|
69
|
+
# get the db
|
70
|
+
old_clients = Client.find(:all)
|
71
|
+
# create new client
|
72
|
+
new_client = Client.new('country' => 'unknown', 'dummy' => 'yes')
|
73
|
+
wait SDB_DELAY, 'test 03: after in-memory client creation'
|
74
|
+
# get the db and ensure we created the client in-memory only
|
75
|
+
assert_equal old_clients.size, Client.find(:all).size
|
76
|
+
# put the client to DB
|
77
|
+
new_client.save
|
78
|
+
wait SDB_DELAY, 'test 03: after in-memory client saving'
|
79
|
+
# get all db again and compare to original list
|
80
|
+
assert_equal old_clients.size+1, Client.find(:all).size
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_04_find_all
|
84
|
+
# retrieve all the DB, make sure all are in place
|
85
|
+
clients = Client.find(:all)
|
86
|
+
ids = clients.map{|client| client.id }[0..1]
|
87
|
+
assert_equal @clients.size + 1, clients.size
|
88
|
+
# retrieve all presidents (must find: Bush, Putin, Medvedev)
|
89
|
+
assert_equal 3, Client.find(:all, :conditions => ["[?=?]",'post','president']).size
|
90
|
+
# retrieve all russian presidents (must find: Putin, Medvedev)
|
91
|
+
assert_equal 2, Client.find(:all, :conditions => ["['post'=?] intersection ['country'=?]",'president', 'Russia']).size
|
92
|
+
# retrieve all russian presidents and all women (must find: Putin, Medvedev, 2 Maries and Sandy)
|
93
|
+
assert_equal 5, Client.find(:all, :conditions => ["['post'=?] intersection ['country'=?] union ['gender'=?]",'president', 'Russia','female']).size
|
94
|
+
# find all rissian presidents Bushes
|
95
|
+
assert_equal 0, Client.find(:all, :conditions => ["['post'=?] intersection ['country'=?] intersection ['name'=?]",'president', 'Russia','Bush']).size
|
96
|
+
# --- find by ids
|
97
|
+
# must find 1 rec (by rec id) and return it
|
98
|
+
assert_equal ids.first, Client.find(ids.first).id
|
99
|
+
# must find 1 rec (by one item array) and return an array
|
100
|
+
assert_equal ids.first, Client.find([ids.first]).first.id
|
101
|
+
# must find 2 recs (by a list of comma separated ids) and return an array
|
102
|
+
assert_equal ids.size, Client.find(*ids).size
|
103
|
+
# must find 2 recs (by an array of ids) and return an array
|
104
|
+
assert_equal ids.size, Client.find(ids).size
|
105
|
+
ids << 'dummy_id'
|
106
|
+
# must raise an error when getting unexistent record
|
107
|
+
assert_raise(RightAws::ActiveSdb::ActiveSdbError) do
|
108
|
+
Client.find(ids)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_05_find_first
|
113
|
+
# find any record
|
114
|
+
assert Client.find(:first)
|
115
|
+
# find any president
|
116
|
+
assert Client.find(:first, :conditions => ["[?=?]",'post','president'])
|
117
|
+
# find any rissian president
|
118
|
+
assert Client.find(:first, :conditions => ["['post'=?] intersection ['country'=?]",'president','Russia'])
|
119
|
+
# find any unexistent record
|
120
|
+
assert_nil Client.find(:first, :conditions => ["['post'=?] intersection ['country'=?]",'president','Rwanda'])
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_06_find_all_by_helpers
|
124
|
+
# find all Bushes
|
125
|
+
assert_equal 1, Client.find_all_by_name('Bush').size
|
126
|
+
# find all russian presidents
|
127
|
+
assert_equal 2, Client.find_all_by_post_and_country('president','Russia').size
|
128
|
+
# find all women in USA that love flowers
|
129
|
+
assert_equal 2, Client.find_all_by_gender_and_country_and_hobby('female','Russia','flowers').size
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_07_find_by_helpers
|
133
|
+
# find mr Bush
|
134
|
+
assert Client.find_by_name('Bush')
|
135
|
+
# find any russian president
|
136
|
+
assert Client.find_by_post_and_country('president','Russia')
|
137
|
+
# find Mary in Russia that loves flowers
|
138
|
+
assert Client.find_by_gender_and_country_and_hobby('female','Russia','flowers')
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_08_reload
|
142
|
+
putin = Client.find_by_name('Putin')
|
143
|
+
# attributes must be empty until reload (except 'id' field)
|
144
|
+
assert_nil putin['name']
|
145
|
+
assert_nil putin['country']
|
146
|
+
assert_nil putin['gender']
|
147
|
+
assert_nil putin['expiration']
|
148
|
+
assert_nil putin['post']
|
149
|
+
# reloaded attributes must have 5 items + id
|
150
|
+
putin.reload
|
151
|
+
assert_equal 6, putin.attributes.size
|
152
|
+
# check all attributes
|
153
|
+
assert_equal ['Putin'], putin['name']
|
154
|
+
assert_equal ['Russia'], putin['country']
|
155
|
+
assert_equal ['male'], putin['gender']
|
156
|
+
assert_equal ['2008'], putin['expiration']
|
157
|
+
assert_equal ['president'], putin['post']
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
def test_09_save_and_put
|
162
|
+
putin = Client.find_by_name('Putin')
|
163
|
+
putin.reload
|
164
|
+
putin['hobby'] = 'ski'
|
165
|
+
# SAVE method (replace values)
|
166
|
+
putin.save
|
167
|
+
wait SDB_DELAY, 'test 09: after saving'
|
168
|
+
# check that DB was updated with 'ski'
|
169
|
+
new_putin = Client.find_by_name('Putin')
|
170
|
+
new_putin.reload
|
171
|
+
assert ['ski'], new_putin['hobby']
|
172
|
+
# replace hobby
|
173
|
+
putin['hobby'] = 'dogs'
|
174
|
+
putin.save
|
175
|
+
wait SDB_DELAY, 'test 09: after saving'
|
176
|
+
# check that 'ski' in DB was replaced by 'dogs'
|
177
|
+
new_putin = Client.find_by_name('Putin')
|
178
|
+
new_putin.reload
|
179
|
+
assert ['dogs'], new_putin['hobby']
|
180
|
+
# PUT method (add values)
|
181
|
+
putin['hobby'] = 'ski'
|
182
|
+
putin.put
|
183
|
+
wait SDB_DELAY, 'test 09: after putting'
|
184
|
+
# check that 'ski' was added to 'dogs'
|
185
|
+
new_putin = Client.find_by_name('Putin')
|
186
|
+
new_putin.reload
|
187
|
+
assert ['dogs', 'ski'], new_putin['hobby'].sort
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_10_save_and_put_attributes
|
191
|
+
putin = Client.find_by_name('Putin')
|
192
|
+
putin.reload
|
193
|
+
# SAVE method (replace values)
|
194
|
+
putin.save_attributes('language' => 'russian')
|
195
|
+
wait SDB_DELAY, 'test 10: after save_attributes'
|
196
|
+
# check that DB was updated with 'ski'
|
197
|
+
new_putin = Client.find_by_name('Putin')
|
198
|
+
new_putin.reload
|
199
|
+
assert ['russian'], new_putin['language']
|
200
|
+
# replace 'russian' by 'german'
|
201
|
+
putin.save_attributes('language' => 'german')
|
202
|
+
wait SDB_DELAY, 'test 10: after save_attributes'
|
203
|
+
# check that 'russian' in DB was replaced by 'german'
|
204
|
+
new_putin = Client.find_by_name('Putin')
|
205
|
+
new_putin.reload
|
206
|
+
assert ['german'], new_putin['language']
|
207
|
+
# PUT method (add values)
|
208
|
+
putin.put_attributes('language' => ['russian', 'english'])
|
209
|
+
wait SDB_DELAY, 'test 10: after put_attributes'
|
210
|
+
# now Putin must know all the languages
|
211
|
+
new_putin = Client.find_by_name('Putin')
|
212
|
+
new_putin.reload
|
213
|
+
assert ['english', 'german', 'russian'], new_putin['language'].sort
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_11_delete
|
217
|
+
putin = Client.find_by_name('Putin')
|
218
|
+
putin.reload
|
219
|
+
# --- delete_values
|
220
|
+
# remove 2 languages
|
221
|
+
putin.delete_values('language' => ['english', 'german'])
|
222
|
+
wait SDB_DELAY, 'test 11: after put_attributes'
|
223
|
+
# now Putin must know only russian lang
|
224
|
+
new_putin = Client.find_by_name('Putin')
|
225
|
+
new_putin.reload
|
226
|
+
assert ['russian'], new_putin['language'].sort
|
227
|
+
# --- delete_attributes
|
228
|
+
putin.delete_attributes('language', 'hobby')
|
229
|
+
wait SDB_DELAY, 'test 11: after put_attributes'
|
230
|
+
# trash hoddy and langs
|
231
|
+
new_putin = Client.find_by_name('Putin')
|
232
|
+
new_putin.reload
|
233
|
+
assert_nil new_putin['language']
|
234
|
+
assert_nil new_putin['hobby']
|
235
|
+
# --- delete item
|
236
|
+
putin.delete
|
237
|
+
wait SDB_DELAY, 'test 11: after delete item'
|
238
|
+
assert_nil Client.find_by_name('Putin')
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_12_delete_domain
|
242
|
+
assert Client.delete_domain
|
243
|
+
wait SDB_DELAY, 'test 12: after delete domain'
|
244
|
+
assert_raise(Rightscale::AwsError) do
|
245
|
+
Client.find :all
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestSdb < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
STDOUT.sync = true
|
7
|
+
@domain = 'right_sdb_awesome_test_domain'
|
8
|
+
@item = 'toys'
|
9
|
+
@attr = { 'Jon' => %w{beer car} }
|
10
|
+
# Interface instance
|
11
|
+
@sdb = Rightscale::SdbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
|
12
|
+
end
|
13
|
+
|
14
|
+
SDB_DELAY = 2
|
15
|
+
|
16
|
+
def wait(delay, msg='')
|
17
|
+
print "waiting #{delay} seconds #{msg}"
|
18
|
+
while delay>0 do
|
19
|
+
delay -= 1
|
20
|
+
print '.'
|
21
|
+
sleep 1
|
22
|
+
end
|
23
|
+
puts
|
24
|
+
end
|
25
|
+
|
26
|
+
#---------------------------
|
27
|
+
# Rightscale::SdbInterface
|
28
|
+
#---------------------------
|
29
|
+
|
30
|
+
def test_00_delete_domain
|
31
|
+
# delete the domain to reset all the things
|
32
|
+
assert @sdb.delete_domain(@domain), 'delete_domain fail'
|
33
|
+
wait SDB_DELAY, 'after domain deletion'
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_01_create_domain
|
37
|
+
# check that domain does not exist
|
38
|
+
assert !@sdb.list_domains[:domains].include?(@domain)
|
39
|
+
# create domain
|
40
|
+
assert @sdb.create_domain(@domain), 'create_domain fail'
|
41
|
+
wait SDB_DELAY, 'after domain creation'
|
42
|
+
# check that we have received new domain from Amazin
|
43
|
+
assert @sdb.list_domains[:domains].include?(@domain)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_02_put_attributes
|
47
|
+
# put attributes
|
48
|
+
assert @sdb.put_attributes(@domain, @item, @attr)
|
49
|
+
wait SDB_DELAY, 'after putting attributes'
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_03_get_attributes
|
53
|
+
# get attributes
|
54
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
|
55
|
+
# compare to original list
|
56
|
+
assert_equal values, @attr['Jon'].sort
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_04_add_attributes
|
60
|
+
# add new attribute
|
61
|
+
new_value = 'girls'
|
62
|
+
@sdb.put_attributes @domain, @item, {'Jon' => new_value}
|
63
|
+
wait SDB_DELAY, 'after putting attributes'
|
64
|
+
# get attributes ('girls' must be added to already existent attributes)
|
65
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
|
66
|
+
assert_equal values, (@attr['Jon'] << new_value).sort
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_05_replace_attributes
|
70
|
+
# replace attributes
|
71
|
+
@sdb.put_attributes @domain, @item, {'Jon' => 'pub'}, :replace
|
72
|
+
wait SDB_DELAY, 'after replacing attributes'
|
73
|
+
# get attributes (all must be removed except of 'pub')
|
74
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon']
|
75
|
+
assert_equal values, ['pub']
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_06_delete_attribute
|
79
|
+
# add value 'girls' and 'vodka' to 'Jon'
|
80
|
+
@sdb.put_attributes @domain, @item, {'Jon' => ['girls','vodka']}
|
81
|
+
wait SDB_DELAY, 'after adding attributes'
|
82
|
+
# get attributes ('girls' and 'vodka' must be added 'pub')
|
83
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
|
84
|
+
assert_equal values, ['girls', 'pub', 'vodka']
|
85
|
+
# delete a single value 'girls' from attribute 'Jon'
|
86
|
+
@sdb.delete_attributes @domain, @item, 'Jon' => ['girls']
|
87
|
+
wait SDB_DELAY, 'after the deletion of attribute'
|
88
|
+
# get attributes ('girls' must be removed)
|
89
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon']
|
90
|
+
assert_equal values, ['pub', 'vodka']
|
91
|
+
# delete all values from attribute 'Jon'
|
92
|
+
@sdb.delete_attributes @domain, @item, ['Jon']
|
93
|
+
wait SDB_DELAY, 'after the deletion of attributes'
|
94
|
+
# get attributes (values must be empty)
|
95
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon']
|
96
|
+
assert_equal values, nil
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_07_delete_item
|
100
|
+
@sdb.put_attributes @domain, @item, {'Jon' => ['girls','vodka']}
|
101
|
+
wait SDB_DELAY, 'after adding attributes'
|
102
|
+
# get attributes ('girls' and 'vodka' must be there)
|
103
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
|
104
|
+
assert_equal values, ['girls', 'vodka']
|
105
|
+
# delete an item
|
106
|
+
@sdb.delete_attributes @domain, @item
|
107
|
+
# get attributes (values must be empty)
|
108
|
+
values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon']
|
109
|
+
assert_equal values, nil
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_08_query
|
113
|
+
# add some values for query
|
114
|
+
@sdb.put_attributes @domain, @item, {'Jon' => ['girls','vodka']}
|
115
|
+
wait SDB_DELAY, 'after adding attributes'
|
116
|
+
items = @sdb.query(@domain, ['[?=?]', 'Jon','vodka'])[:items]
|
117
|
+
assert_equal items.size, 1
|
118
|
+
assert_equal items.first, @item
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_09_signature_version_0
|
122
|
+
sdb = Rightscale::SdbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :signature_version => '0')
|
123
|
+
item = 'toys'
|
124
|
+
# put attributes
|
125
|
+
# mhhh... Not sure how to translate this: hölzchehn klötzchen grÃŒnspan buÃe... Lets assume this is:
|
126
|
+
attributes = { 'Jurgen' => %w{kitten puppy chickabiddy piglet} }
|
127
|
+
assert sdb.put_attributes(@domain, item, attributes)
|
128
|
+
wait SDB_DELAY, 'after putting attributes'
|
129
|
+
# get attributes
|
130
|
+
values = sdb.get_attributes(@domain, item)[:attributes]['Jurgen'].to_a.sort
|
131
|
+
# compare to original list
|
132
|
+
assert_equal values, attributes['Jurgen'].sort
|
133
|
+
# check that the request has correct signature version
|
134
|
+
assert sdb.last_request.path.include?('SignatureVersion=0')
|
135
|
+
end
|
136
|
+
|
137
|
+
# Keep this test last, because it deletes the domain...
|
138
|
+
def test_10_delete_domain
|
139
|
+
assert @sdb.delete_domain(@domain), 'delete_domain fail'
|
140
|
+
wait SDB_DELAY, 'after domain deletion'
|
141
|
+
# check that domain does not exist
|
142
|
+
assert !@sdb.list_domains[:domains].include?(@domain)
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
end
|
@@ -0,0 +1,291 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestSqs < Test::Unit::TestCase
|
4
|
+
|
5
|
+
GRANTEE_EMAIL_ADDRESS = 'madhur@amazon.com'
|
6
|
+
RIGHT_MESSAGE_TEXT = 'Right test message'
|
7
|
+
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@sqs = Rightscale::SqsInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
|
11
|
+
@queue_name = 'right_sqs_test_awesome_queue'
|
12
|
+
# for classes
|
13
|
+
@s = Rightscale::Sqs.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Wait for the queue to appears in the queues list.
|
17
|
+
# Amazon needs some time to after the queue creation to place
|
18
|
+
# it to the accessible queues list. If we dont want to get
|
19
|
+
# the additional faults then wait a bit...
|
20
|
+
def wait_for_queue_url(queue_name)
|
21
|
+
queue_url = nil
|
22
|
+
until queue_url
|
23
|
+
queue_url = @sqs.queue_url_by_name(queue_name)
|
24
|
+
unless queue_url
|
25
|
+
print '-'
|
26
|
+
STDOUT.flush
|
27
|
+
sleep 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
queue_url
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def assert_eventually_equal(value, timeout=30, failmsg="", &block)
|
37
|
+
start_time = Time.now.to_i
|
38
|
+
tries = 0
|
39
|
+
while(yield != value) do
|
40
|
+
tries += 1
|
41
|
+
print '-'
|
42
|
+
STDOUT.flush
|
43
|
+
s = Time.now.to_i - start_time
|
44
|
+
flunk("Timeout: #{failmsg}: did not equal \"#{value}\" after #{tries} tries in #{s}s.") if s > timeout
|
45
|
+
sleep(1)
|
46
|
+
setup if (tries % 10) == 0
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
#---------------------------
|
52
|
+
# Rightscale::SqsInterface
|
53
|
+
#---------------------------
|
54
|
+
|
55
|
+
def test_01_create_queue
|
56
|
+
queue_url = @sqs.create_queue @queue_name
|
57
|
+
assert queue_url[/http.*#{@queue_name}/], 'New queue creation fail'
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_02_list_queues
|
61
|
+
wait_for_queue_url(@queue_name)
|
62
|
+
queues = @sqs.list_queues('right_')
|
63
|
+
assert queues.size>0, 'Must more that 0 queues in list'
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_03_set_and_get_queue_attributes
|
67
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
68
|
+
assert queue_url[/http.*#{@queue_name}/], "#{@queue_name} must exist!"
|
69
|
+
assert @sqs.set_queue_attributes(queue_url, 'VisibilityTimeout', 111), 'Set_queue_attributes fail'
|
70
|
+
sleep 20 # Amazon needs some time to change attribute
|
71
|
+
assert_equal '111', @sqs.get_queue_attributes(queue_url)['VisibilityTimeout'], 'New VisibilityTimeout must be equal to 111'
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_04_set_and_get_visibility_timeout
|
75
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
76
|
+
assert @sqs.set_visibility_timeout(queue_url, 222), 'Set_visibility_timeout fail'
|
77
|
+
sleep 20 # Amazon needs some time to change attribute
|
78
|
+
#assert_equal 222, @sqs.get_visibility_timeout(queue_url), 'Get_visibility_timeout must return to 222'
|
79
|
+
assert_eventually_equal(222, 60, 'Get_visibility_timeout must return to 222') do
|
80
|
+
@sqs.get_visibility_timeout(queue_url)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_05_add_test_remove_grant
|
85
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
86
|
+
assert @sqs.add_grant(queue_url, GRANTEE_EMAIL_ADDRESS, 'FULLCONTROL'), 'Add grant fail'
|
87
|
+
grants_list = @sqs.list_grants(queue_url, GRANTEE_EMAIL_ADDRESS)
|
88
|
+
assert grants_list.size>0, 'List_grants must return at least 1 record for user #{GRANTEE_EMAIL_ADDRESS}'
|
89
|
+
assert @sqs.remove_grant(queue_url, GRANTEE_EMAIL_ADDRESS, 'FULLCONTROL'), 'Remove_grant fail'
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_06_send_message
|
93
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
94
|
+
# send 5 messages for the tests below
|
95
|
+
assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
|
96
|
+
assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
|
97
|
+
assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
|
98
|
+
assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
|
99
|
+
assert @sqs.send_message(queue_url, RIGHT_MESSAGE_TEXT)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_07_get_queue_length
|
103
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
104
|
+
assert_equal 5, @sqs.get_queue_length(queue_url), 'Queue must have 5 messages'
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_08_receive_message
|
108
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
109
|
+
r_message = @sqs.receive_message(queue_url, 1)
|
110
|
+
assert_equal RIGHT_MESSAGE_TEXT, r_message[:body], 'Receive message get wron message text'
|
111
|
+
p_message = @sqs.peek_message(queue_url, r_message[:id])
|
112
|
+
assert_equal r_message[:body], p_message[:body], 'Received and Peeked messages must be equal'
|
113
|
+
assert @sqs.change_message_visibility(queue_url, r_message[:id], 0), 'Change_message_visibility fail'
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_09_delete_message
|
117
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
118
|
+
message = @sqs.receive_message(queue_url)
|
119
|
+
assert @sqs.delete_message(queue_url, message[:id]), 'Delete_message fail'
|
120
|
+
assert @sqs.pop_message(queue_url), 'Pop_message fail'
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_10_clear_and_delete_queue
|
124
|
+
queue_url = @sqs.queue_url_by_name(@queue_name)
|
125
|
+
assert_raise(Rightscale::AwsError) { @sqs.delete_queue(queue_url) }
|
126
|
+
## oops, force_clear_queue does not work any more - amazon expects for 60 secs timeout between
|
127
|
+
## queue deletion and recreation...
|
128
|
+
## assert @sqs.force_clear_queue(queue_url), 'Force_clear_queue fail'
|
129
|
+
assert @sqs.clear_queue(queue_url), 'Clear_queue fail'
|
130
|
+
assert @sqs.delete_queue(queue_url), 'Delete_queue fail'
|
131
|
+
end
|
132
|
+
|
133
|
+
#---------------------------
|
134
|
+
# Rightscale::Sqs classes
|
135
|
+
#---------------------------
|
136
|
+
|
137
|
+
def test_20_sqs_create_delete_queue
|
138
|
+
assert @s, 'Rightscale::Sqs must exist'
|
139
|
+
# get queues list
|
140
|
+
queues_size = @s.queues.size
|
141
|
+
# create new queue
|
142
|
+
queue = @s.queue("#{@queue_name}_20", true)
|
143
|
+
# check that it is created
|
144
|
+
assert queue.is_a?(Rightscale::Sqs::Queue)
|
145
|
+
wait_for_queue_url(@queue_name)
|
146
|
+
# check that amount of queues has increased
|
147
|
+
assert_eventually_equal(queues_size + 1, 60, "The number of queues did not increase by one") do
|
148
|
+
@s.queues.size
|
149
|
+
end
|
150
|
+
# delete queue
|
151
|
+
assert queue.delete
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_21_queue_create
|
155
|
+
# create new queue
|
156
|
+
queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_21", true)
|
157
|
+
# check that it is created
|
158
|
+
assert queue.is_a?(Rightscale::Sqs::Queue)
|
159
|
+
wait_for_queue_url(@queue_name)
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_22_queue_attributes
|
163
|
+
queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_21", false)
|
164
|
+
# get a list of attrinutes
|
165
|
+
attributes = queue.get_attribute
|
166
|
+
assert attributes.is_a?(Hash) && attributes.size>0
|
167
|
+
# get attribute value and increase it by 10
|
168
|
+
v = (queue.get_attribute('VisibilityTimeout').to_i + 10).to_s
|
169
|
+
# set attribute
|
170
|
+
assert queue.set_attribute('VisibilityTimeout', v)
|
171
|
+
# wait a bit
|
172
|
+
sleep 20
|
173
|
+
# check that attribute has changed
|
174
|
+
assert_equal v, queue.get_attribute('VisibilityTimeout')
|
175
|
+
# get queue visibility timeout
|
176
|
+
assert v.to_i, queue.visibility
|
177
|
+
# change it
|
178
|
+
queue.visibility += 10
|
179
|
+
# make sure that it is changed
|
180
|
+
assert v.to_i + 10, queue.visibility
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_23_grantees
|
184
|
+
queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_21", false)
|
185
|
+
# get a list of grantees
|
186
|
+
grantees = queue.grantees
|
187
|
+
# well, queue must exist at least some seconds before we could add grantees to it....
|
188
|
+
# otherwise we get "Queue does not exists" message. Hence we use the queue
|
189
|
+
# has been created at previous step.
|
190
|
+
#
|
191
|
+
# create new grantee
|
192
|
+
grantee = Rightscale::Sqs::Grantee.new(queue, GRANTEE_EMAIL_ADDRESS)
|
193
|
+
assert grantee.perms.empty?
|
194
|
+
# grant perms
|
195
|
+
assert grantee.grant('FULLCONTROL')
|
196
|
+
assert grantee.grant('RECEIVEMESSAGE')
|
197
|
+
assert_equal 2, grantee.perms.size
|
198
|
+
# make sure that amount of grantees has increased
|
199
|
+
assert grantees.size < queue.grantees.size
|
200
|
+
# revoke perms
|
201
|
+
assert grantee.revoke('RECEIVEMESSAGE')
|
202
|
+
assert_equal 1, grantee.perms.size
|
203
|
+
# remove grantee
|
204
|
+
assert grantee.drop
|
205
|
+
# Don't test this - just for cleanup purposes
|
206
|
+
queue.delete
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_24_send_size
|
210
|
+
queue_url = @sqs.queue_url_by_name("#{@queue_name}_24")
|
211
|
+
@sqs.delete_queue(queue_url)
|
212
|
+
queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_24", true)
|
213
|
+
# send 5 messages
|
214
|
+
assert queue.push('a1')
|
215
|
+
assert queue.push('a2')
|
216
|
+
assert queue.push('a3')
|
217
|
+
assert queue.push('a4')
|
218
|
+
assert queue.push('a5')
|
219
|
+
# check queue size
|
220
|
+
assert_equal 5, queue.size
|
221
|
+
# send one more
|
222
|
+
assert queue.push('a6')
|
223
|
+
# check queue size again
|
224
|
+
assert_equal 6, queue.size
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_25_message_receive_pop_peek_delete
|
228
|
+
queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_24", false)
|
229
|
+
# get queue size
|
230
|
+
size = queue.size
|
231
|
+
# get first message
|
232
|
+
m1 = queue.receive(10)
|
233
|
+
assert m1.is_a?(Rightscale::Sqs::Message)
|
234
|
+
# pop second message
|
235
|
+
m2 = queue.pop
|
236
|
+
assert m2.is_a?(Rightscale::Sqs::Message)
|
237
|
+
# make sure that queue size has decreased
|
238
|
+
assert_equal size-1, queue.size
|
239
|
+
# peek message 1
|
240
|
+
m1p = queue.peek(m1.id)
|
241
|
+
assert m1p.is_a?(Rightscale::Sqs::Message)
|
242
|
+
assert_equal m1.id, m1p.id
|
243
|
+
assert_equal m1.body, m1p.body
|
244
|
+
# change message visibility
|
245
|
+
assert m1.visibility = 30
|
246
|
+
# delete messsage
|
247
|
+
assert m1.delete
|
248
|
+
# make sure that queue size has decreased again
|
249
|
+
assert_equal size-2, queue.size
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_26
|
253
|
+
queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_24", false)
|
254
|
+
# lock message
|
255
|
+
queue.receive(100)
|
256
|
+
# clear queue
|
257
|
+
assert queue.clear
|
258
|
+
# queue size is greater than zero
|
259
|
+
assert queue.size>0
|
260
|
+
queue.push('123456')
|
261
|
+
assert_raise(Rightscale::AwsError) { queue.delete }
|
262
|
+
assert queue.delete(true)
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_27_set_amazon_problems
|
266
|
+
original_problems = Rightscale::SqsInterface.amazon_problems
|
267
|
+
assert(original_problems.length > 0)
|
268
|
+
Rightscale::SqsInterface.amazon_problems= original_problems << "A New Problem"
|
269
|
+
new_problems = Rightscale::SqsInterface.amazon_problems
|
270
|
+
assert_equal(new_problems, original_problems)
|
271
|
+
|
272
|
+
Rightscale::SqsInterface.amazon_problems= nil
|
273
|
+
assert_nil(Rightscale::SqsInterface.amazon_problems)
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_28_check_threading_model
|
277
|
+
assert(!@sqs.multi_thread)
|
278
|
+
newsqs = Rightscale::SqsInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, {:multi_thread => true})
|
279
|
+
assert(newsqs.multi_thread)
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_29_signature_version_0
|
283
|
+
sqs = Rightscale::SqsInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :signature_version => '0')
|
284
|
+
assert_nothing_raised do
|
285
|
+
sqs.list_queues
|
286
|
+
end
|
287
|
+
# check that the request has correct signature version
|
288
|
+
assert sqs.last_request.path.include?('SignatureVersion=0')
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|