revans_right_aws 2.0.1

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.
Files changed (52) hide show
  1. data/.gemtest +0 -0
  2. data/History.txt +284 -0
  3. data/Manifest.txt +50 -0
  4. data/README.txt +167 -0
  5. data/Rakefile +110 -0
  6. data/lib/acf/right_acf_interface.rb +485 -0
  7. data/lib/acf/right_acf_origin_access_identities.rb +230 -0
  8. data/lib/acf/right_acf_streaming_interface.rb +236 -0
  9. data/lib/acw/right_acw_interface.rb +249 -0
  10. data/lib/as/right_as_interface.rb +699 -0
  11. data/lib/awsbase/benchmark_fix.rb +39 -0
  12. data/lib/awsbase/right_awsbase.rb +978 -0
  13. data/lib/awsbase/support.rb +115 -0
  14. data/lib/ec2/right_ec2.rb +395 -0
  15. data/lib/ec2/right_ec2_ebs.rb +452 -0
  16. data/lib/ec2/right_ec2_images.rb +373 -0
  17. data/lib/ec2/right_ec2_instances.rb +755 -0
  18. data/lib/ec2/right_ec2_monitoring.rb +70 -0
  19. data/lib/ec2/right_ec2_reserved_instances.rb +170 -0
  20. data/lib/ec2/right_ec2_security_groups.rb +277 -0
  21. data/lib/ec2/right_ec2_spot_instances.rb +399 -0
  22. data/lib/ec2/right_ec2_vpc.rb +571 -0
  23. data/lib/elb/right_elb_interface.rb +496 -0
  24. data/lib/rds/right_rds_interface.rb +998 -0
  25. data/lib/right_aws.rb +83 -0
  26. data/lib/s3/right_s3.rb +1126 -0
  27. data/lib/s3/right_s3_interface.rb +1199 -0
  28. data/lib/sdb/active_sdb.rb +1122 -0
  29. data/lib/sdb/right_sdb_interface.rb +721 -0
  30. data/lib/sqs/right_sqs.rb +388 -0
  31. data/lib/sqs/right_sqs_gen2.rb +343 -0
  32. data/lib/sqs/right_sqs_gen2_interface.rb +524 -0
  33. data/lib/sqs/right_sqs_interface.rb +594 -0
  34. data/test/acf/test_helper.rb +2 -0
  35. data/test/acf/test_right_acf.rb +138 -0
  36. data/test/ec2/test_helper.rb +2 -0
  37. data/test/ec2/test_right_ec2.rb +108 -0
  38. data/test/http_connection.rb +87 -0
  39. data/test/rds/test_helper.rb +2 -0
  40. data/test/rds/test_right_rds.rb +120 -0
  41. data/test/s3/test_helper.rb +2 -0
  42. data/test/s3/test_right_s3.rb +421 -0
  43. data/test/s3/test_right_s3_stubbed.rb +97 -0
  44. data/test/sdb/test_active_sdb.rb +357 -0
  45. data/test/sdb/test_helper.rb +3 -0
  46. data/test/sdb/test_right_sdb.rb +253 -0
  47. data/test/sqs/test_helper.rb +2 -0
  48. data/test/sqs/test_right_sqs.rb +291 -0
  49. data/test/sqs/test_right_sqs_gen2.rb +264 -0
  50. data/test/test_credentials.rb +37 -0
  51. data/test/ts_right_aws.rb +14 -0
  52. metadata +169 -0
@@ -0,0 +1,357 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSdb < Test::Unit::TestCase
4
+ DOMAIN_PREFIX = 'right_sdb_awesome_test'
5
+ CLIENT_DOMAIN = "#{DOMAIN_PREFIX}_client"
6
+ PERSON_DOMAIN = "#{DOMAIN_PREFIX}_person"
7
+
8
+ class Client < RightAws::ActiveSdb::Base
9
+ set_domain_name CLIENT_DOMAIN
10
+ end
11
+
12
+ class Person < RightAws::ActiveSdb::Base
13
+ set_domain_name PERSON_DOMAIN
14
+
15
+ columns do
16
+ name
17
+ email
18
+ score :Integer
19
+ is_active :Boolean
20
+ registered_at :DateTime
21
+ created_at :DateTime, :default => lambda{ Time.now }
22
+ end
23
+ end
24
+
25
+ def setup
26
+ STDOUT.sync = true
27
+ @clients = [
28
+ { 'name' => 'Bush', 'country' => 'USA', 'gender' => 'male', 'expiration' => '2009', 'post' => 'president' },
29
+ { 'name' => 'Putin', 'country' => 'Russia', 'gender' => 'male', 'expiration' => '2008', 'post' => 'president' },
30
+ { 'name' => 'Medvedev', 'country' => 'Russia', 'gender' => 'male', 'expiration' => '2012', 'post' => 'president' },
31
+ { 'name' => 'Mary', 'country' => 'USA', 'gender' => 'female', 'hobby' => ['patchwork', 'bundle jumping'] },
32
+ { 'name' => 'Sandy', 'country' => 'Russia', 'gender' => 'female', 'hobby' => ['flowers', 'cats', 'cooking'] },
33
+ { 'name' => 'Mary', 'country' => 'Russia', 'gender' => 'female', 'hobby' => ['flowers', 'cats', 'cooking'] } ]
34
+ @people = [
35
+ { :name => 'Yetta E. Andrews', :email => 'nulla.facilisis@metus.com', :score => 100, :is_active => true, :registered_at => Time.local(2000, 1, 1) },
36
+ { :name => 'Sybill O. Olson', :email => 'nisi.Aenean.eget@urna.com', :score => 87, :is_active => true, :registered_at => Time.local(2008, 7, 6) },
37
+ { :name => 'Isabelle K. Flynn', :email => 'velit@amet.com', :score => 98, :is_active => false, :registered_at => Time.local(2003, 5, 20) },
38
+ { :name => 'Juliet H. Witt', :email => 'egestas@pretiumaliquet.ca', :score => 72, :is_active => true, :registered_at => Time.local(2007, 2, 28) },
39
+ { :name => 'Lucy N. Christensen', :email => 'lacus.v12@stu.edu', :score => 94, :is_active => false, :registered_at => Time.local(2005, 10, 26) }
40
+ ]
41
+ RightAws::ActiveSdb.establish_connection(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
42
+ end
43
+
44
+ SDB_DELAY = 3
45
+
46
+ def wait(delay, msg='')
47
+ print " waiting #{delay} seconds: #{msg}"
48
+ while delay>0 do
49
+ delay -= 1
50
+ print '.'
51
+ sleep 1
52
+ end
53
+ puts
54
+ end
55
+
56
+ #---------------------------
57
+ # Rightscale::SdbInterface
58
+ #---------------------------
59
+
60
+ def test_00_delete_domain
61
+ assert RightAws::ActiveSdb.delete_domain(CLIENT_DOMAIN)
62
+ assert RightAws::ActiveSdb.delete_domain(PERSON_DOMAIN)
63
+ wait SDB_DELAY, 'test 00: after domain deletion'
64
+ end
65
+
66
+ def test_01_create_domain
67
+ # check that domain does not exist
68
+ assert !RightAws::ActiveSdb.domains.include?(CLIENT_DOMAIN)
69
+ # create domain
70
+ assert Client.create_domain
71
+ assert Person.create_domain
72
+ wait SDB_DELAY, 'test 01: after domain creation'
73
+ # check that we have received new domain from Amazin
74
+ assert RightAws::ActiveSdb.domains.include?(CLIENT_DOMAIN)
75
+ end
76
+
77
+ def test_02_create_items
78
+ # check that DB is empty
79
+ clients = Client.find(:all)
80
+ assert clients.blank?
81
+ # put some clients there
82
+ @clients.each do |client|
83
+ Client.create client
84
+ end
85
+ wait SDB_DELAY, 'test 02: after clients creation'
86
+ # check that DB has all the clients we just putted
87
+ clients = Client.find(:all)
88
+ assert_equal @clients.size, clients.size
89
+ end
90
+
91
+ def test_03_create_and_save_new_item
92
+ # get the db
93
+ old_clients = Client.find(:all)
94
+ # create new client
95
+ new_client = Client.new('country' => 'unknown', 'dummy' => 'yes')
96
+ wait SDB_DELAY, 'test 03: after in-memory client creation'
97
+ # get the db and ensure we created the client in-memory only
98
+ assert_equal old_clients.size, Client.find(:all).size
99
+ # put the client to DB
100
+ new_client.save
101
+ wait SDB_DELAY, 'test 03: after in-memory client saving'
102
+ # get all db again and compare to original list
103
+ assert_equal old_clients.size+1, Client.find(:all).size
104
+ end
105
+
106
+ def test_04_find_all
107
+ # retrieve all the DB, make sure all are in place
108
+ clients = Client.find(:all)
109
+ ids = clients.map{|client| client.id }[0..1]
110
+ assert_equal @clients.size + 1, clients.size
111
+ # retrieve all presidents (must find: Bush, Putin, Medvedev)
112
+ assert_equal 3, Client.find(:all, :conditions => ["[?=?]",'post','president']).size
113
+ # retrieve all russian presidents (must find: Putin, Medvedev)
114
+ assert_equal 2, Client.find(:all, :conditions => ["['post'=?] intersection ['country'=?]",'president', 'Russia']).size
115
+ # retrieve all russian presidents and all women (must find: Putin, Medvedev, 2 Maries and Sandy)
116
+ assert_equal 5, Client.find(:all, :conditions => ["['post'=?] intersection ['country'=?] union ['gender'=?]",'president', 'Russia','female']).size
117
+ # find all rissian presidents Bushes
118
+ assert_equal 0, Client.find(:all, :conditions => ["['post'=?] intersection ['country'=?] intersection ['name'=?]",'president', 'Russia','Bush']).size
119
+ # --- find by ids
120
+ # must find 1 rec (by rec id) and return it
121
+ assert_equal ids.first, Client.find(ids.first).id
122
+ # must find 1 rec (by one item array) and return an array
123
+ assert_equal ids.first, Client.find([ids.first]).first.id
124
+ # must find 2 recs (by a list of comma separated ids) and return an array
125
+ assert_equal ids.size, Client.find(*ids).size
126
+ # must find 2 recs (by an array of ids) and return an array
127
+ assert_equal ids.size, Client.find(ids).size
128
+ ids << 'dummy_id'
129
+ # must raise an error when getting unexistent record
130
+ assert_raise(RightAws::ActiveSdb::ActiveSdbError) do
131
+ Client.find(ids)
132
+ end
133
+ # find one record by unknown id
134
+ assert_raise(RightAws::ActiveSdb::ActiveSdbError) do
135
+ Client.find('dummy_id')
136
+ end
137
+ end
138
+
139
+ def test_05_find_first
140
+ # find any record
141
+ assert Client.find(:first)
142
+ # find any president
143
+ assert Client.find(:first, :conditions => ["[?=?]",'post','president'])
144
+ # find any rissian president
145
+ assert Client.find(:first, :conditions => ["['post'=?] intersection ['country'=?]",'president','Russia'])
146
+ # find any unexistent record
147
+ assert_nil Client.find(:first, :conditions => ["['post'=?] intersection ['country'=?]",'president','Rwanda'])
148
+ end
149
+
150
+ def test_06_find_all_by_helpers
151
+ # find all Bushes
152
+ assert_equal 1, Client.find_all_by_name('Bush').size
153
+ # find all russian presidents
154
+ assert_equal 2, Client.find_all_by_post_and_country('president','Russia').size
155
+ # find all women in USA that love flowers
156
+ assert_equal 2, Client.find_all_by_gender_and_country_and_hobby('female','Russia','flowers').size
157
+ # order and auto_load:
158
+ clients = Client.find_all_by_post('president', :order => 'name', :auto_load => true)
159
+ assert_equal [['Bush'], ['Medvedev'], ['Putin']], clients.map{|c| c['name']}
160
+ clients = Client.find_all_by_post('president', :order => 'name desc', :auto_load => true)
161
+ assert_equal [['Putin'], ['Medvedev'], ['Bush']], clients.map{|c| c['name']}
162
+ end
163
+
164
+ def test_07_find_by_helpers
165
+ # find mr Bush
166
+ assert Client.find_by_name('Bush')
167
+ # find any russian president
168
+ assert Client.find_by_post_and_country('president','Russia')
169
+ # find Mary in Russia that loves flowers
170
+ # order and auto_load:
171
+ assert_equal ['Bush'], Client.find_by_post('president', :order => 'name', :auto_load => true)['name']
172
+ assert_equal ['Putin'], Client.find_by_post('president', :order => 'name desc', :auto_load => true)['name']
173
+ end
174
+
175
+ def test_08_reload
176
+ putin = Client.find_by_name('Putin')
177
+ # attributes must be empty until reload (except 'id' field)
178
+ assert_nil putin['name']
179
+ assert_nil putin['country']
180
+ assert_nil putin['gender']
181
+ assert_nil putin['expiration']
182
+ assert_nil putin['post']
183
+ # reloaded attributes must have 5 items + id
184
+ putin.reload
185
+ assert_equal 6, putin.attributes.size
186
+ # check all attributes
187
+ assert_equal ['Putin'], putin['name']
188
+ assert_equal ['Russia'], putin['country']
189
+ assert_equal ['male'], putin['gender']
190
+ assert_equal ['2008'], putin['expiration']
191
+ assert_equal ['president'], putin['post']
192
+ end
193
+
194
+ def test_09_select
195
+ # select all records
196
+ assert_equal 7, Client.select(:all).size
197
+ # LIMIT
198
+ # 1 record
199
+ assert Client.select(:first).is_a?(Client)
200
+ # select 2 recs
201
+ assert_equal 2, Client.select(:all, :limit => 2).size
202
+ # ORDER
203
+ # select all recs ordered by 'expration' (must find only recs where 'expration' attribute presents)
204
+ result = Client.select(:all, :order => 'expiration')
205
+ assert_equal 3, result.size
206
+ assert_equal ['2008', '2009', '2012'], result.map{ |c| c['expiration'] }.flatten
207
+ # desc order
208
+ result = Client.select(:all, :order => 'expiration desc')
209
+ assert_equal ['2012', '2009', '2008'], result.map{ |c| c['expiration'] }.flatten
210
+ # CONDITIONS
211
+ result = Client.select(:all, :conditions => ["expiration >= ?", 2009], :order => 'name')
212
+ assert_equal ['Bush', 'Medvedev'], result.map{ |c| c['name'] }.flatten
213
+ result = Client.select(:all, :conditions => "hobby='flowers' AND gender='female'", :order => 'name')
214
+ assert_equal ['Mary', 'Sandy'], result.map{ |c| c['name'] }.flatten
215
+ # SELECT
216
+ result = Client.select(:all, :select => 'hobby', :conditions => "gender IS NOT NULL", :order => 'name')
217
+ hobbies = result.map{|c| c['hobby']}
218
+ # must return all recs
219
+ assert_equal 6, result.size
220
+ # but anly 3 of them have this field set
221
+ assert_equal 3, hobbies.compact.size
222
+ end
223
+
224
+ def test_10_select_by
225
+ assert_equal 2, Client.select_all_by_hobby('flowers').size
226
+ assert_equal 2, Client.select_all_by_hobby_and_country('flowers', 'Russia').size
227
+ assert_equal ['Putin'], Client.select_by_post_and_expiration('president','2008')['name']
228
+ end
229
+
230
+ def test_11_save_and_put
231
+ putin = Client.find_by_name('Putin')
232
+ putin.reload
233
+ putin['hobby'] = 'ski'
234
+ # SAVE method (replace values)
235
+ putin.save
236
+ wait SDB_DELAY, 'test 09: after saving'
237
+ # check that DB was updated with 'ski'
238
+ new_putin = Client.find_by_name('Putin')
239
+ new_putin.reload
240
+ assert ['ski'], new_putin['hobby']
241
+ # replace hobby
242
+ putin['hobby'] = 'dogs'
243
+ putin.save
244
+ wait SDB_DELAY, 'test 09: after saving'
245
+ # check that 'ski' in DB was replaced by 'dogs'
246
+ new_putin = Client.find_by_name('Putin')
247
+ new_putin.reload
248
+ assert ['dogs'], new_putin['hobby']
249
+ # PUT method (add values)
250
+ putin['hobby'] = 'ski'
251
+ putin.put
252
+ wait SDB_DELAY, 'test 09: after putting'
253
+ # check that 'ski' was added to 'dogs'
254
+ new_putin = Client.find_by_name('Putin')
255
+ new_putin.reload
256
+ assert ['dogs', 'ski'], new_putin['hobby'].sort
257
+ end
258
+
259
+ def test_12_save_and_put_attributes
260
+ putin = Client.find_by_name('Putin')
261
+ putin.reload
262
+ # SAVE method (replace values)
263
+ putin.save_attributes('language' => 'russian')
264
+ wait SDB_DELAY, 'test 10: after save_attributes'
265
+ # check that DB was updated with 'ski'
266
+ new_putin = Client.find_by_name('Putin')
267
+ new_putin.reload
268
+ assert ['russian'], new_putin['language']
269
+ # replace 'russian' by 'german'
270
+ putin.save_attributes('language' => 'german')
271
+ wait SDB_DELAY, 'test 10: after save_attributes'
272
+ # check that 'russian' in DB was replaced by 'german'
273
+ new_putin = Client.find_by_name('Putin')
274
+ new_putin.reload
275
+ assert ['german'], new_putin['language']
276
+ # PUT method (add values)
277
+ putin.put_attributes('language' => ['russian', 'english'])
278
+ wait SDB_DELAY, 'test 10: after put_attributes'
279
+ # now Putin must know all the languages
280
+ new_putin = Client.find_by_name('Putin')
281
+ new_putin.reload
282
+ assert ['english', 'german', 'russian'], new_putin['language'].sort
283
+ end
284
+
285
+ def test_13_delete
286
+ putin = Client.find_by_name('Putin')
287
+ putin.reload
288
+ # --- delete_values
289
+ # remove an unknown attribute
290
+ # should return an empty hash
291
+ assert_equal( {}, putin.delete_values('undefined_attribute' => 'ohoho'))
292
+ # remove 2 languages
293
+ lang_hash = {'language' => ['english', 'german']}
294
+ assert_equal lang_hash, putin.delete_values(lang_hash)
295
+ wait SDB_DELAY, 'test 11: after put_attributes'
296
+ # now Putin must know only russian lang
297
+ new_putin = Client.find_by_name('Putin')
298
+ new_putin.reload
299
+ assert ['russian'], new_putin['language'].sort
300
+ # --- delete_attributes
301
+ putin.delete_attributes('language', 'hobby')
302
+ wait SDB_DELAY, 'test 11: after delete_attributes'
303
+ # trash hoddy and langs
304
+ new_putin = Client.find_by_name('Putin')
305
+ new_putin.reload
306
+ assert_nil new_putin['language']
307
+ assert_nil new_putin['hobby']
308
+ # --- delete item
309
+ putin.delete
310
+ wait SDB_DELAY, 'test 11: after delete item'
311
+ assert_nil Client.find_by_name('Putin')
312
+ end
313
+
314
+ def test_14_dynamic_attribute_accessors
315
+ bush = Client.find_by_name('Bush')
316
+ bush.reload
317
+ assert_nothing_raised {
318
+ assert_equal ['male'], bush.gender
319
+ bush.name = 'George'
320
+ assert_equal ['George'], bush.name
321
+ }
322
+ assert_raise(NoMethodError) { bush.flarble }
323
+ end
324
+
325
+ def test_15_column_emulation
326
+ @people.each do |person|
327
+ Person.create person
328
+ end
329
+ wait SDB_DELAY, 'test 15: after people creation'
330
+ person = Person.find_by_email 'nulla.facilisis@metus.com'
331
+ person.reload
332
+
333
+ assert_equal 'Yetta E. Andrews', person.name
334
+ assert_equal DateTime, person.registered_at.class
335
+ assert person['registered_at'].is_a?(DateTime)
336
+ assert person[:registered_at].is_a?(DateTime)
337
+
338
+ assert ! person[:created_at].nil?
339
+ assert_equal DateTime, person.created_at.class
340
+ assert person['created_at'].is_a?(DateTime)
341
+ assert person[:created_at].is_a?(DateTime)
342
+
343
+ assert person.is_active
344
+
345
+ assert_equal 100, person.score
346
+ end
347
+
348
+ def test_999_delete_domain
349
+ assert Client.delete_domain
350
+ assert Person.delete_domain
351
+ wait SDB_DELAY, 'test 999: after delete domain'
352
+ assert_raise(Rightscale::AwsError) do
353
+ Client.find :all
354
+ end
355
+ end
356
+
357
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../../lib/right_aws'
3
+ require 'sdb/active_sdb'
@@ -0,0 +1,253 @@
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 = 7
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 = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Jon']).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 = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Jon']).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 = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Jon']).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, {'Volodya' => ['girls','vodka']}
101
+ wait SDB_DELAY, 'after adding attributes'
102
+ # get attributes ('girls' and 'vodka' must be there)
103
+ values = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Volodya']).sort
104
+ assert_equal values, ['girls', 'vodka']
105
+ # delete an item
106
+ @sdb.delete_attributes @domain, @item
107
+ wait SDB_DELAY, 'after deleting attributes'
108
+ # get attributes (values must be empty)
109
+ values = @sdb.get_attributes(@domain, @item)[:attributes]['Volodya']
110
+ assert_equal values, nil
111
+ end
112
+
113
+ def test_08_query
114
+ # add some values for query
115
+ @sdb.put_attributes @domain, @item, {'Jon' => ['girls','vodka']}
116
+ wait SDB_DELAY, 'after adding attributes'
117
+ items = @sdb.query(@domain, ['[?=?]', 'Jon','vodka'])[:items]
118
+ assert_equal items.size, 1
119
+ assert_equal items.first, @item
120
+ end
121
+
122
+ def test_09_signature_version_0
123
+ sdb = Rightscale::SdbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :signature_version => '0')
124
+ item = 'toys'
125
+ # TODO: need to change the below test. I think Juergen's intention was to include some umlauts in the values
126
+ # put attributes
127
+ # mhhh... Not sure how to translate this: hölzchehn klötzchen grÃŒnspan buße... Lets assume this is:
128
+ attributes = { 'Jurgen' => %w{kitten puppy chickabiddy piglet} }
129
+ assert sdb.put_attributes(@domain, item, attributes)
130
+ wait SDB_DELAY, 'after putting attributes'
131
+ # get attributes
132
+ values = Array(sdb.get_attributes(@domain, item)[:attributes]['Jurgen']).sort
133
+ # compare to original list
134
+ assert_equal values, attributes['Jurgen'].sort
135
+ # check that the request has correct signature version
136
+ assert sdb.last_request.path.include?('SignatureVersion=0')
137
+ end
138
+
139
+ def test_10_signature_version_1
140
+ sdb = Rightscale::SdbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :signature_version => '1')
141
+ domains = nil
142
+ assert_nothing_thrown "Failed to use signature V1" do
143
+ domains = sdb.list_domains
144
+ end
145
+ assert domains
146
+ end
147
+
148
+ def test_11_signature_version_1
149
+ sdb = Rightscale::SdbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :signature_version => '2')
150
+ domains = nil
151
+ assert_nothing_thrown "Failed to use signature V2" do
152
+ domains = sdb.list_domains
153
+ end
154
+ assert domains
155
+ end
156
+
157
+ def test_12_array_of_attrs
158
+ item = 'multiples'
159
+ assert_nothing_thrown "Failed to put multiple attrs" do
160
+ @sdb.put_attributes(@domain, item, {:one=>1, :two=>2, :three=>3})
161
+ end
162
+ end
163
+
164
+ def test_13_zero_len_attrs
165
+ item = 'zeroes'
166
+ assert_nothing_thrown "Failed to put zero-length attributes" do
167
+ @sdb.put_attributes(@domain, item, {:one=>"", :two=>"", :three=>""})
168
+ end
169
+ end
170
+
171
+ def test_14_nil_attrs
172
+ item = 'nils'
173
+ res = nil
174
+ assert_nothing_thrown do
175
+ @sdb.put_attributes(@domain, item, {:one=>nil, :two=>nil, :three=>'chunder'})
176
+ end
177
+ wait SDB_DELAY, 'after putting attributes'
178
+ assert_nothing_thrown do
179
+ res = @sdb.get_attributes(@domain, item)
180
+ end
181
+ assert_nil(res[:attributes]['one'][0])
182
+ assert_nil(res[:attributes]['two'][0])
183
+ assert_not_nil(res[:attributes]['three'][0])
184
+ end
185
+
186
+ def test_15_url_escape
187
+ item = 'urlescapes'
188
+ content = {:a=>"one & two & three",
189
+ :b=>"one ? two / three"}
190
+ @sdb.put_attributes(@domain, item, content)
191
+ wait SDB_DELAY, 'after putting attributes'
192
+
193
+ res = @sdb.get_attributes(@domain, item)
194
+ assert_equal(content[:a], res[:attributes]['a'][0])
195
+ assert_equal(content[:b], res[:attributes]['b'][0])
196
+ end
197
+
198
+ def test_16_put_attrs_by_post
199
+ item = 'reqgirth'
200
+ i = 0
201
+ sa = ""
202
+ while(i < 64) do
203
+ sa += "aaaaaaaa"
204
+ i += 1
205
+ end
206
+ @sdb.put_attributes(@domain, item, {:a => sa, :b => sa, :c => sa, :d => sa, :e => sa})
207
+ wait SDB_DELAY, 'after putting attributes'
208
+ end
209
+
210
+ def test_20_query_with_atributes
211
+ response = @sdb.query_with_attributes(@domain)
212
+ # convers response to a hash representation
213
+ items = {};
214
+ response[:items].each{ |item| items.merge!(item) }
215
+ # check we have receied all 5 items each full of attributes
216
+ assert_equal 6, items.keys.size
217
+ assert items['toys'].size > 0
218
+ assert items['nils'].size > 0
219
+ assert items['urlescapes'].size > 0
220
+ assert items['multiples'].size > 0
221
+ assert items['reqgirth'].size > 0
222
+ assert items['zeroes'].size > 0
223
+ # fetch only Jon's attributes from all items
224
+ response = @sdb.query_with_attributes(@domain,['Jon'])
225
+ items = {};
226
+ response[:items].each{ |item| items.merge!(item) }
227
+ # check we have receied all 5 items
228
+ # check we have receied all 5 items, but only 'toys' has attributes
229
+ puts items.inspect
230
+ assert_equal 2, items['toys']['Jon'].size
231
+ assert_equal 0, items['nils'].size
232
+ assert_equal 0, items['urlescapes'].size
233
+ assert_equal 0, items['multiples'].size
234
+ assert_equal 0, items['reqgirth'].size
235
+ assert_equal 0, items['zeroes'].size
236
+ # kust Jurgen's attriburs
237
+ response = @sdb.query_with_attributes(@domain,['Jurgen'], "['Jurgen'='piglet']")
238
+ items = {};
239
+ response[:items].each{ |item| items.merge!(item) }
240
+ # check we have receied an only item
241
+ assert_equal 1, items.keys.size
242
+ assert_equal ["chickabiddy", "kitten", "piglet", "puppy"], items['toys']['Jurgen'].sort
243
+ end
244
+
245
+ # Keep this test last, because it deletes the domain...
246
+ def test_21_delete_domain
247
+ assert @sdb.delete_domain(@domain), 'delete_domain fail'
248
+ wait SDB_DELAY, 'after domain deletion'
249
+ # check that domain does not exist
250
+ assert !@sdb.list_domains[:domains].include?(@domain)
251
+ end
252
+
253
+ end