right_aws 1.10.0 → 2.0.0

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 (39) hide show
  1. data/History.txt +53 -15
  2. data/Manifest.txt +16 -0
  3. data/README.txt +10 -9
  4. data/Rakefile +13 -15
  5. data/lib/acf/right_acf_interface.rb +224 -118
  6. data/lib/acf/right_acf_origin_access_identities.rb +230 -0
  7. data/lib/acf/right_acf_streaming_interface.rb +236 -0
  8. data/lib/acw/right_acw_interface.rb +249 -0
  9. data/lib/as/right_as_interface.rb +699 -0
  10. data/lib/awsbase/right_awsbase.rb +232 -51
  11. data/lib/awsbase/support.rb +4 -0
  12. data/lib/ec2/right_ec2.rb +33 -1375
  13. data/lib/ec2/right_ec2_ebs.rb +452 -0
  14. data/lib/ec2/right_ec2_images.rb +373 -0
  15. data/lib/ec2/right_ec2_instances.rb +755 -0
  16. data/lib/ec2/right_ec2_monitoring.rb +70 -0
  17. data/lib/ec2/right_ec2_reserved_instances.rb +170 -0
  18. data/lib/ec2/right_ec2_security_groups.rb +280 -0
  19. data/lib/ec2/right_ec2_spot_instances.rb +399 -0
  20. data/lib/ec2/right_ec2_vpc.rb +571 -0
  21. data/lib/elb/right_elb_interface.rb +496 -0
  22. data/lib/rds/right_rds_interface.rb +998 -0
  23. data/lib/right_aws.rb +18 -4
  24. data/lib/s3/right_s3.rb +39 -7
  25. data/lib/s3/right_s3_interface.rb +77 -53
  26. data/lib/sdb/active_sdb.rb +203 -11
  27. data/lib/sdb/right_sdb_interface.rb +68 -45
  28. data/lib/sqs/right_sqs_gen2.rb +73 -16
  29. data/lib/sqs/right_sqs_gen2_interface.rb +131 -51
  30. data/lib/sqs/right_sqs_interface.rb +2 -4
  31. data/test/acf/test_right_acf.rb +10 -18
  32. data/test/rds/test_helper.rb +2 -0
  33. data/test/rds/test_right_rds.rb +120 -0
  34. data/test/s3/test_right_s3.rb +10 -8
  35. data/test/s3/test_right_s3_stubbed.rb +6 -4
  36. data/test/sdb/test_active_sdb.rb +70 -12
  37. data/test/sdb/test_right_sdb.rb +13 -7
  38. data/test/sqs/test_right_sqs_gen2.rb +104 -49
  39. metadata +103 -14
@@ -56,7 +56,7 @@ module RightAws
56
56
  # {:server => 'queue.amazonaws.com' # Amazon service host: 'queue.amazonaws.com'(default)
57
57
  # :port => 443 # Amazon service port: 80 or 443(default)
58
58
  # :multi_thread => true|false # Multi-threaded (connection per each thread): true or false(default)
59
- # :signature_version => '0' # The signature version : '0' or '1'(default)
59
+ # :signature_version => '0' # The signature version : '0', '1' or '2'(default)
60
60
  # :logger => Logger Object} # Logger instance: logs to STDOUT if omitted }
61
61
  #
62
62
  def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
@@ -128,9 +128,7 @@ module RightAws
128
128
  # Sends request to Amazon and parses the response
129
129
  # Raises AwsError if any banana happened
130
130
  def request_info(request, parser) # :nodoc:
131
- thread = @params[:multi_thread] ? Thread.current : Thread.main
132
- thread[:sqs_connection] ||= Rightscale::HttpConnection.new(:exception => AwsError, :logger => @logger)
133
- request_info_impl(thread[:sqs_connection], @@bench, request, parser)
131
+ request_info_impl(:sqs_connection, @@bench, request, parser)
134
132
  end
135
133
 
136
134
 
@@ -9,7 +9,7 @@ class TestAcf < Test::Unit::TestCase
9
9
  def setup
10
10
  @acf= Rightscale::AcfInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
11
11
  @s3 = Rightscale::S3.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
12
- @bucket_name = "right-acf-awesome-test-bucket-0001"
12
+ @bucket_name = "right-acf-awesome-test-bucket-xxx1"
13
13
  @bucket_domain = "#{@bucket_name}.s3.amazonaws.com"
14
14
  end
15
15
 
@@ -27,13 +27,18 @@ class TestAcf < Test::Unit::TestCase
27
27
  @acf.create_distribution("right-cloudfront-awesome-test-bucket-not-exist", "Mustn't to be born", true)
28
28
  end
29
29
  # a bucket is not a domain naming complied guy
30
- bucket_name = 'right_cloudfront_awesome_test_bucket_BAD'
30
+ bucket_name = 'right_cloudfront_awesome_test_bucket_BAD_XXX'
31
31
  @s3.bucket(bucket_name, :create)
32
32
  assert_raise(Rightscale::AwsError) do
33
33
  @acf.create_distribution(bucket_name, "Mustn't to be born", true)
34
34
  end
35
35
  end
36
36
 
37
+ def test_02_x_delete_bad_bucket
38
+ bucket_name = 'right_cloudfront_awesome_test_bucket_BAD_XXX'
39
+ @s3.bucket(bucket_name, false).delete
40
+ end
41
+
37
42
  def test_03_create
38
43
  comment = 'WooHoo!!!'
39
44
  # create a test bucket
@@ -69,8 +74,8 @@ class TestAcf < Test::Unit::TestCase
69
74
  end
70
75
  # change a config
71
76
  config[:enabled] = false
72
- config[:cnames] << 'x1.myawesomesite.com'
73
- config[:cnames] << 'x2.myawesomesite.com'
77
+ config[:cnames] << 'xxx1.myawesomesite.com'
78
+ config[:cnames] << 'xxx2.myawesomesite.com'
74
79
  # set config
75
80
  set_config_result = nil
76
81
  assert_nothing_raised do
@@ -83,7 +88,7 @@ class TestAcf < Test::Unit::TestCase
83
88
  new_config = @acf.get_distribution_config(old[:aws_id])
84
89
  end
85
90
  assert !new_config[:enabled]
86
- assert_equal new_config[:cnames].sort, ['x1.myawesomesite.com', 'x2.myawesomesite.com']
91
+ assert_equal new_config[:cnames].sort, ['xxx1.myawesomesite.com', 'xxx2.myawesomesite.com']
87
92
  assert_not_equal config[:e_tag], new_config[:e_tag]
88
93
 
89
94
  # try to update the old config again (must fail because ETAG has changed)
@@ -92,19 +97,6 @@ class TestAcf < Test::Unit::TestCase
92
97
  end
93
98
  end
94
99
 
95
- def test_07_caching
96
- # enable caching
97
- @acf.params[:cache] = true
98
- # list distributions
99
- @acf.list_distributions
100
- # list the distributions again - cache should hit
101
- assert_raise(Rightscale::AwsNoChange) do
102
- @acf.list_distributions
103
- end
104
- # disable caching
105
- @acf.params[:cache] = true
106
- end
107
-
108
100
  def test_08_delete_distribution
109
101
  # we need ETAG so use get_distribution
110
102
  distribution = @acf.get_distribution(get_test_distribution[:aws_id])
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../../lib/right_aws'
@@ -0,0 +1,120 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestRds < Test::Unit::TestCase
4
+
5
+ STDOUT.sync = true
6
+
7
+ TEST_SG_NAME = 'RightRdsSGTest0123456789'
8
+
9
+ def setup
10
+ @rds = Rightscale::RdsInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :logger => Logger.new('/dev/null'))
11
+ end
12
+
13
+ def test_00_instances
14
+ assert_nothing_raised do
15
+ items = @rds.describe_db_instances
16
+ assert items.is_a?(Array)
17
+ end
18
+ #
19
+ assert_nothing_raised do
20
+ @rds.describe_db_instances do |response|
21
+ assert response.is_a?(Hash)
22
+ assert response[:db_instances].is_a?(Array)
23
+ end
24
+ end
25
+ end
26
+
27
+ def test_10_security_groups
28
+ assert_nothing_raised do
29
+ items = @rds.describe_db_security_groups
30
+ assert items.is_a?(Array)
31
+ end
32
+ #
33
+ assert_nothing_raised do
34
+ @rds.describe_db_security_groups do |response|
35
+ assert response.is_a?(Hash)
36
+ assert response[:db_security_groups].is_a?(Array)
37
+ end
38
+ end
39
+ end
40
+
41
+ def test_11_remove_security_group
42
+ @rds.delete_db_security_group rescue nil
43
+ end
44
+
45
+ def test_12_create_security_group
46
+ sg = nil
47
+ assert_nothing_raised do
48
+ sg = @rds.create_db_security_group(TEST_SG_NAME, 'sg-description')
49
+ end
50
+ assert sg.is_a?(Hash)
51
+ end
52
+
53
+ def test_13_authorize
54
+ assert_nothing_raised do
55
+ sg = @rds.authorize_db_security_group_ingress(TEST_SG_NAME, :cidrip => '131.0.0.1/8')
56
+ assert sg.is_a?(Hash)
57
+ assert_equal 1, sg[:ip_ranges].size
58
+ end
59
+ assert_nothing_raised do
60
+ sg = @rds.authorize_db_security_group_ingress(TEST_SG_NAME, :ec2_security_group_owner => '826693181925',
61
+ :ec2_security_group_name => 'default' )
62
+ assert sg.is_a?(Hash)
63
+ assert_equal 1, sg[:ec2_security_groups].size
64
+ end
65
+ sleep 30
66
+ end
67
+
68
+ def test_14_revoke
69
+ assert_nothing_raised do
70
+ sg = @rds.revoke_db_security_group_ingress(TEST_SG_NAME, :cidrip => '131.0.0.1/8')
71
+ assert sg.is_a?(Hash)
72
+ end
73
+ assert_nothing_raised do
74
+ sg = @rds.revoke_db_security_group_ingress(TEST_SG_NAME, :ec2_security_group_owner => '826693181925',
75
+ :ec2_security_group_name => 'default' )
76
+ assert sg.is_a?(Hash)
77
+ end
78
+ sleep 30
79
+ #
80
+ sg = @rds.describe_db_security_groups(TEST_SG_NAME).first
81
+ assert_equal 0, sg[:ip_ranges].size
82
+ assert_equal 0, sg[:ec2_security_groups].size
83
+ end
84
+
85
+ def test_15_delete_security_group
86
+ assert_nothing_raised do
87
+ @rds.delete_db_security_group(TEST_SG_NAME)
88
+ end
89
+ end
90
+
91
+
92
+ def test_20_db_snapshots
93
+ assert_nothing_raised do
94
+ items = @rds.describe_db_snapshots
95
+ assert items.is_a?(Array)
96
+ end
97
+ #
98
+ assert_nothing_raised do
99
+ @rds.describe_db_snapshots do |response|
100
+ assert response.is_a?(Hash)
101
+ assert response[:db_snapshots].is_a?(Array)
102
+ end
103
+ end
104
+ end
105
+
106
+ def test_30_events
107
+ assert_nothing_raised do
108
+ items = @rds.describe_events
109
+ assert items.is_a?(Array)
110
+ end
111
+ #
112
+ assert_nothing_raised do
113
+ @rds.describe_events do |response|
114
+ assert response.is_a?(Hash)
115
+ assert response[:events].is_a?(Array)
116
+ end
117
+ end
118
+ end
119
+
120
+ end
@@ -6,8 +6,8 @@ class TestS3 < Test::Unit::TestCase
6
6
 
7
7
  def setup
8
8
  @s3 = Rightscale::S3Interface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
9
- @bucket = 'right_s3_awesome_test_bucket_000A1'
10
- @bucket2 = 'right_s3_awesome_test_bucket_000A2'
9
+ @bucket = 'right_s3_awesome_test_bucket_000B1'
10
+ @bucket2 = 'right_s3_awesome_test_bucket_000B2'
11
11
  @key1 = 'test/woohoo1/'
12
12
  @key2 = 'test1/key/woohoo2'
13
13
  @key3 = 'test2/A%B@C_D&E?F+G=H"I'
@@ -403,17 +403,19 @@ class TestS3 < Test::Unit::TestCase
403
403
  assert grantee.grant(['READ_ACP', 'WRITE'])
404
404
 
405
405
  assert bucket.enable_logging(:targetbucket => targetbucket, :targetprefix => "loggylogs/")
406
+ sleep 10
406
407
 
407
- assert_equal(bucket.logging_info, {:enabled => true, :targetbucket => @bucket2, :targetprefix => "loggylogs/"})
408
+ assert_equal({:enabled => true, :targetbucket => @bucket2, :targetprefix => "loggylogs/"}, bucket.logging_info)
408
409
 
409
410
  assert bucket.disable_logging
410
411
 
411
412
  # check 'Drop' method
412
- assert grantee.drop
413
-
414
- # Delete bucket
415
- bucket.delete(true)
416
- targetbucket.delete(true)
413
+ assert grantee.drop
414
+ end
415
+
416
+ def test_40_delete_buckets
417
+ Rightscale::S3::Bucket.create(@s, @bucket, false).delete(true)
418
+ Rightscale::S3::Bucket.create(@s, @bucket2, false).delete(true)
417
419
  end
418
420
 
419
421
  end
@@ -81,15 +81,17 @@ class TestS3Stubbed < Test::Unit::TestCase
81
81
  def test_116_move_key
82
82
  # move a key
83
83
  Rightscale::HttpConnection.push(413, 'not found')
84
- assert @s3.move(@bucket, @key1, @bucket, @key1_new_name)
85
-
84
+ assert_raise RightAws::AwsError do
85
+ @s3.move(@bucket, @key1, @bucket, @key1_new_name)
86
+ end
86
87
  end
87
88
 
88
89
  def test_117_rename_key
89
90
  # rename a key
90
91
  Rightscale::HttpConnection.push(500, 'not found')
91
- assert @s3.rename(@bucket, @key2, @key2_new_name)
92
-
92
+ assert_raise RightAws::AwsError do
93
+ @s3.rename(@bucket, @key2, @key2_new_name)
94
+ end
93
95
  end
94
96
 
95
97
  end
@@ -1,11 +1,25 @@
1
1
  require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
  class TestSdb < Test::Unit::TestCase
4
-
5
- DOMAIN_NAME = 'right_sdb_awesome_test_domain'
6
-
4
+ DOMAIN_PREFIX = 'right_sdb_awesome_test'
5
+ CLIENT_DOMAIN = "#{DOMAIN_PREFIX}_client"
6
+ PERSON_DOMAIN = "#{DOMAIN_PREFIX}_person"
7
+
7
8
  class Client < RightAws::ActiveSdb::Base
8
- set_domain_name DOMAIN_NAME
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
9
23
  end
10
24
 
11
25
  def setup
@@ -17,6 +31,13 @@ class TestSdb < Test::Unit::TestCase
17
31
  { 'name' => 'Mary', 'country' => 'USA', 'gender' => 'female', 'hobby' => ['patchwork', 'bundle jumping'] },
18
32
  { 'name' => 'Sandy', 'country' => 'Russia', 'gender' => 'female', 'hobby' => ['flowers', 'cats', 'cooking'] },
19
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
+ ]
20
41
  RightAws::ActiveSdb.establish_connection(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
21
42
  end
22
43
 
@@ -37,18 +58,20 @@ class TestSdb < Test::Unit::TestCase
37
58
  #---------------------------
38
59
 
39
60
  def test_00_delete_domain
40
- assert RightAws::ActiveSdb.delete_domain(DOMAIN_NAME)
61
+ assert RightAws::ActiveSdb.delete_domain(CLIENT_DOMAIN)
62
+ assert RightAws::ActiveSdb.delete_domain(PERSON_DOMAIN)
41
63
  wait SDB_DELAY, 'test 00: after domain deletion'
42
64
  end
43
65
 
44
66
  def test_01_create_domain
45
67
  # check that domain does not exist
46
- assert !RightAws::ActiveSdb.domains.include?(DOMAIN_NAME)
68
+ assert !RightAws::ActiveSdb.domains.include?(CLIENT_DOMAIN)
47
69
  # create domain
48
70
  assert Client.create_domain
71
+ assert Person.create_domain
49
72
  wait SDB_DELAY, 'test 01: after domain creation'
50
73
  # check that we have received new domain from Amazin
51
- assert RightAws::ActiveSdb.domains.include?(DOMAIN_NAME)
74
+ assert RightAws::ActiveSdb.domains.include?(CLIENT_DOMAIN)
52
75
  end
53
76
 
54
77
  def test_02_create_items
@@ -287,12 +310,47 @@ class TestSdb < Test::Unit::TestCase
287
310
  wait SDB_DELAY, 'test 11: after delete item'
288
311
  assert_nil Client.find_by_name('Putin')
289
312
  end
290
-
291
- def test_14_delete_domain
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
292
349
  assert Client.delete_domain
293
- wait SDB_DELAY, 'test 12: after delete domain'
294
- assert_raise(Rightscale::AwsError) do
295
- Client.find :all
350
+ assert Person.delete_domain
351
+ wait SDB_DELAY, 'test 999: after delete domain'
352
+ assert_raise(Rightscale::AwsError) do
353
+ Client.find :all
296
354
  end
297
355
  end
298
356
 
@@ -11,7 +11,7 @@ class TestSdb < Test::Unit::TestCase
11
11
  @sdb = Rightscale::SdbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
12
12
  end
13
13
 
14
- SDB_DELAY = 2
14
+ SDB_DELAY = 7
15
15
 
16
16
  def wait(delay, msg='')
17
17
  print "waiting #{delay} seconds #{msg}"
@@ -51,7 +51,7 @@ class TestSdb < Test::Unit::TestCase
51
51
 
52
52
  def test_03_get_attributes
53
53
  # get attributes
54
- values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
54
+ values = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Jon']).sort
55
55
  # compare to original list
56
56
  assert_equal values, @attr['Jon'].sort
57
57
  end
@@ -62,7 +62,7 @@ class TestSdb < Test::Unit::TestCase
62
62
  @sdb.put_attributes @domain, @item, {'Jon' => new_value}
63
63
  wait SDB_DELAY, 'after putting attributes'
64
64
  # get attributes ('girls' must be added to already existent attributes)
65
- values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
65
+ values = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Jon']).sort
66
66
  assert_equal values, (@attr['Jon'] << new_value).sort
67
67
  end
68
68
 
@@ -80,7 +80,7 @@ class TestSdb < Test::Unit::TestCase
80
80
  @sdb.put_attributes @domain, @item, {'Jon' => ['girls','vodka']}
81
81
  wait SDB_DELAY, 'after adding attributes'
82
82
  # get attributes ('girls' and 'vodka' must be added 'pub')
83
- values = @sdb.get_attributes(@domain, @item)[:attributes]['Jon'].to_a.sort
83
+ values = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Jon']).sort
84
84
  assert_equal values, ['girls', 'pub', 'vodka']
85
85
  # delete a single value 'girls' from attribute 'Jon'
86
86
  @sdb.delete_attributes @domain, @item, 'Jon' => ['girls']
@@ -100,10 +100,11 @@ class TestSdb < Test::Unit::TestCase
100
100
  @sdb.put_attributes @domain, @item, {'Volodya' => ['girls','vodka']}
101
101
  wait SDB_DELAY, 'after adding attributes'
102
102
  # get attributes ('girls' and 'vodka' must be there)
103
- values = @sdb.get_attributes(@domain, @item)[:attributes]['Volodya'].to_a.sort
103
+ values = Array(@sdb.get_attributes(@domain, @item)[:attributes]['Volodya']).sort
104
104
  assert_equal values, ['girls', 'vodka']
105
105
  # delete an item
106
106
  @sdb.delete_attributes @domain, @item
107
+ wait SDB_DELAY, 'after deleting attributes'
107
108
  # get attributes (values must be empty)
108
109
  values = @sdb.get_attributes(@domain, @item)[:attributes]['Volodya']
109
110
  assert_equal values, nil
@@ -128,7 +129,7 @@ class TestSdb < Test::Unit::TestCase
128
129
  assert sdb.put_attributes(@domain, item, attributes)
129
130
  wait SDB_DELAY, 'after putting attributes'
130
131
  # get attributes
131
- values = sdb.get_attributes(@domain, item)[:attributes]['Jurgen'].to_a.sort
132
+ values = Array(sdb.get_attributes(@domain, item)[:attributes]['Jurgen']).sort
132
133
  # compare to original list
133
134
  assert_equal values, attributes['Jurgen'].sort
134
135
  # check that the request has correct signature version
@@ -173,6 +174,7 @@ class TestSdb < Test::Unit::TestCase
173
174
  assert_nothing_thrown do
174
175
  @sdb.put_attributes(@domain, item, {:one=>nil, :two=>nil, :three=>'chunder'})
175
176
  end
177
+ wait SDB_DELAY, 'after putting attributes'
176
178
  assert_nothing_thrown do
177
179
  res = @sdb.get_attributes(@domain, item)
178
180
  end
@@ -186,6 +188,7 @@ class TestSdb < Test::Unit::TestCase
186
188
  content = {:a=>"one & two & three",
187
189
  :b=>"one ? two / three"}
188
190
  @sdb.put_attributes(@domain, item, content)
191
+ wait SDB_DELAY, 'after putting attributes'
189
192
 
190
193
  res = @sdb.get_attributes(@domain, item)
191
194
  assert_equal(content[:a], res[:attributes]['a'][0])
@@ -201,6 +204,7 @@ class TestSdb < Test::Unit::TestCase
201
204
  i += 1
202
205
  end
203
206
  @sdb.put_attributes(@domain, item, {:a => sa, :b => sa, :c => sa, :d => sa, :e => sa})
207
+ wait SDB_DELAY, 'after putting attributes'
204
208
  end
205
209
 
206
210
  def test_20_query_with_atributes
@@ -209,12 +213,13 @@ class TestSdb < Test::Unit::TestCase
209
213
  items = {};
210
214
  response[:items].each{ |item| items.merge!(item) }
211
215
  # check we have receied all 5 items each full of attributes
212
- assert_equal 5, items.keys.size
216
+ assert_equal 6, items.keys.size
213
217
  assert items['toys'].size > 0
214
218
  assert items['nils'].size > 0
215
219
  assert items['urlescapes'].size > 0
216
220
  assert items['multiples'].size > 0
217
221
  assert items['reqgirth'].size > 0
222
+ assert items['zeroes'].size > 0
218
223
  # fetch only Jon's attributes from all items
219
224
  response = @sdb.query_with_attributes(@domain,['Jon'])
220
225
  items = {};
@@ -227,6 +232,7 @@ class TestSdb < Test::Unit::TestCase
227
232
  assert_equal 0, items['urlescapes'].size
228
233
  assert_equal 0, items['multiples'].size
229
234
  assert_equal 0, items['reqgirth'].size
235
+ assert_equal 0, items['zeroes'].size
230
236
  # kust Jurgen's attriburs
231
237
  response = @sdb.query_with_attributes(@domain,['Jurgen'], "['Jurgen'='piglet']")
232
238
  items = {};