mongo 1.7.1 → 1.8.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 (138) hide show
  1. data/{LICENSE.txt → LICENSE} +0 -0
  2. data/README.md +124 -111
  3. data/Rakefile +9 -325
  4. data/VERSION +1 -0
  5. data/bin/mongo_console +4 -4
  6. data/examples/admin.rb +43 -0
  7. data/examples/capped.rb +22 -0
  8. data/examples/cursor.rb +48 -0
  9. data/examples/gridfs.rb +44 -0
  10. data/examples/index_test.rb +126 -0
  11. data/examples/info.rb +31 -0
  12. data/examples/queries.rb +74 -0
  13. data/examples/replica_set.rb +26 -0
  14. data/examples/simple.rb +25 -0
  15. data/examples/strict.rb +35 -0
  16. data/examples/types.rb +36 -0
  17. data/{test/load → examples/web}/thin/load.rb +3 -1
  18. data/{test/load → examples/web}/unicorn/load.rb +5 -3
  19. data/lib/mongo.rb +8 -10
  20. data/lib/mongo/collection.rb +134 -114
  21. data/lib/mongo/cursor.rb +21 -14
  22. data/lib/mongo/db.rb +30 -28
  23. data/lib/mongo/exceptions.rb +1 -1
  24. data/lib/mongo/gridfs/grid.rb +8 -7
  25. data/lib/mongo/gridfs/grid_ext.rb +1 -1
  26. data/lib/mongo/gridfs/grid_file_system.rb +6 -5
  27. data/lib/mongo/gridfs/grid_io.rb +22 -19
  28. data/lib/mongo/legacy.rb +82 -0
  29. data/lib/mongo/{connection.rb → mongo_client.rb} +82 -61
  30. data/lib/mongo/{repl_set_connection.rb → mongo_replica_set_client.rb} +54 -39
  31. data/lib/mongo/{sharded_connection.rb → mongo_sharded_client.rb} +9 -9
  32. data/lib/mongo/networking.rb +25 -20
  33. data/lib/mongo/util/conversions.rb +1 -1
  34. data/lib/mongo/util/core_ext.rb +1 -1
  35. data/lib/mongo/util/logging.rb +20 -4
  36. data/lib/mongo/util/node.rb +16 -16
  37. data/lib/mongo/util/pool.rb +56 -27
  38. data/lib/mongo/util/pool_manager.rb +28 -27
  39. data/lib/mongo/util/server_version.rb +1 -1
  40. data/lib/mongo/util/sharding_pool_manager.rb +8 -8
  41. data/lib/mongo/util/ssl_socket.rb +1 -5
  42. data/lib/mongo/util/support.rb +24 -8
  43. data/lib/mongo/util/tcp_socket.rb +0 -4
  44. data/lib/mongo/util/uri_parser.rb +54 -38
  45. data/lib/mongo/util/write_concern.rb +67 -0
  46. data/mongo.gemspec +21 -32
  47. data/test/auxillary/{1.4_features.rb → 1.4_feature_test.rb} +4 -5
  48. data/test/auxillary/authentication_test.rb +18 -20
  49. data/test/auxillary/autoreconnect_test.rb +3 -5
  50. data/test/auxillary/fork_test.rb +5 -7
  51. data/test/auxillary/repl_set_auth_test.rb +13 -15
  52. data/test/auxillary/slave_connection_test.rb +8 -7
  53. data/test/auxillary/threaded_authentication_test.rb +15 -17
  54. data/test/bson/binary_test.rb +1 -1
  55. data/test/bson/bson_test.rb +60 -36
  56. data/test/bson/byte_buffer_test.rb +1 -1
  57. data/test/bson/hash_with_indifferent_access_test.rb +2 -2
  58. data/test/bson/json_test.rb +1 -2
  59. data/test/bson/object_id_test.rb +1 -2
  60. data/test/bson/ordered_hash_test.rb +1 -1
  61. data/test/bson/timestamp_test.rb +1 -1
  62. data/test/{collection_test.rb → functional/collection_test.rb} +57 -57
  63. data/test/{connection_test.rb → functional/connection_test.rb} +75 -89
  64. data/test/{conversions_test.rb → functional/conversions_test.rb} +1 -1
  65. data/test/{cursor_fail_test.rb → functional/cursor_fail_test.rb} +3 -29
  66. data/test/{cursor_message_test.rb → functional/cursor_message_test.rb} +1 -1
  67. data/test/{cursor_test.rb → functional/cursor_test.rb} +5 -1
  68. data/test/{db_api_test.rb → functional/db_api_test.rb} +8 -9
  69. data/test/{db_connection_test.rb → functional/db_connection_test.rb} +3 -5
  70. data/test/{db_test.rb → functional/db_test.rb} +13 -13
  71. data/test/{grid_file_system_test.rb → functional/grid_file_system_test.rb} +2 -2
  72. data/test/{grid_io_test.rb → functional/grid_io_test.rb} +6 -6
  73. data/test/{grid_test.rb → functional/grid_test.rb} +4 -10
  74. data/test/{pool_test.rb → functional/pool_test.rb} +1 -1
  75. data/test/functional/safe_test.rb +84 -0
  76. data/test/{support_test.rb → functional/support_test.rb} +1 -1
  77. data/test/{threading_test.rb → functional/threading_test.rb} +9 -9
  78. data/test/{timeout_test.rb → functional/timeout_test.rb} +1 -1
  79. data/test/{uri_test.rb → functional/uri_test.rb} +1 -1
  80. data/test/functional/write_concern_test.rb +104 -0
  81. data/test/replica_set/basic_test.rb +139 -0
  82. data/test/replica_set/client_test.rb +255 -0
  83. data/test/replica_set/complex_connect_test.rb +62 -0
  84. data/test/replica_set/connection_test.rb +255 -0
  85. data/test/{replica_sets → replica_set}/count_test.rb +17 -14
  86. data/test/replica_set/cursor_test.rb +75 -0
  87. data/test/{replica_sets → replica_set}/insert_test.rb +19 -16
  88. data/test/replica_set/query_test.rb +64 -0
  89. data/test/replica_set/refresh_test.rb +153 -0
  90. data/test/{replica_sets → replica_set}/replication_ack_test.rb +21 -17
  91. data/test/sharded_cluster/basic_test.rb +31 -50
  92. data/test/support/hash_with_indifferent_access.rb +1 -1
  93. data/test/test_helper.rb +56 -9
  94. data/test/threading/threading_with_large_pool_test.rb +8 -8
  95. data/test/tools/mongo_config.rb +270 -58
  96. data/test/tools/mongo_config_test.rb +146 -0
  97. data/test/unit/client_test.rb +230 -0
  98. data/test/unit/collection_test.rb +45 -32
  99. data/test/unit/connection_test.rb +82 -74
  100. data/test/unit/cursor_test.rb +14 -6
  101. data/test/unit/db_test.rb +8 -8
  102. data/test/unit/grid_test.rb +11 -11
  103. data/test/unit/node_test.rb +24 -24
  104. data/test/unit/pool_manager_test.rb +13 -13
  105. data/test/unit/pool_test.rb +1 -1
  106. data/test/unit/read_test.rb +21 -26
  107. data/test/unit/safe_test.rb +52 -33
  108. data/test/unit/util_test.rb +55 -0
  109. data/test/unit/write_concern_test.rb +161 -0
  110. metadata +158 -171
  111. data/docs/CREDITS.md +0 -123
  112. data/docs/FAQ.md +0 -116
  113. data/docs/GRID_FS.md +0 -158
  114. data/docs/HISTORY.md +0 -392
  115. data/docs/READ_PREFERENCE.md +0 -99
  116. data/docs/RELEASES.md +0 -54
  117. data/docs/REPLICA_SETS.md +0 -113
  118. data/docs/TAILABLE_CURSORS.md +0 -51
  119. data/docs/TUTORIAL.md +0 -356
  120. data/docs/WRITE_CONCERN.md +0 -31
  121. data/lib/mongo/gridfs/grid_io_fix.rb +0 -38
  122. data/lib/mongo/version.rb +0 -3
  123. data/test/bson/test_helper.rb +0 -30
  124. data/test/replica_sets/basic_test.rb +0 -119
  125. data/test/replica_sets/complex_connect_test.rb +0 -57
  126. data/test/replica_sets/complex_read_preference_test.rb +0 -237
  127. data/test/replica_sets/connect_test.rb +0 -156
  128. data/test/replica_sets/cursor_test.rb +0 -70
  129. data/test/replica_sets/pooled_insert_test.rb +0 -57
  130. data/test/replica_sets/query_test.rb +0 -50
  131. data/test/replica_sets/read_preference_test.rb +0 -234
  132. data/test/replica_sets/refresh_test.rb +0 -156
  133. data/test/replica_sets/refresh_with_threads_test.rb +0 -60
  134. data/test/replica_sets/rs_test_helper.rb +0 -39
  135. data/test/safe_test.rb +0 -68
  136. data/test/sharded_cluster/mongo_config_test.rb +0 -126
  137. data/test/sharded_cluster/sc_test_helper.rb +0 -39
  138. data/test/tools/repl_set_manager.rb +0 -418
@@ -1,4 +1,4 @@
1
- require File.expand_path("../../test_helper", __FILE__)
1
+ require 'test_helper'
2
2
  include Mongo
3
3
 
4
4
  class PoolManagerTest < Test::Unit::TestCase
@@ -9,17 +9,17 @@ class PoolManagerTest < Test::Unit::TestCase
9
9
  TCPSocket.stubs(:new).returns(new_mock_socket)
10
10
  @db = new_mock_db
11
11
 
12
- @connection = stub("Connection")
13
- @connection.stubs(:connect_timeout).returns(5)
14
- @connection.stubs(:op_timeout).returns(5)
15
- @connection.stubs(:pool_size).returns(2)
16
- @connection.stubs(:pool_timeout).returns(100)
17
- @connection.stubs(:seeds).returns(['localhost:30000'])
18
- @connection.stubs(:socket_class).returns(TCPSocket)
19
- @connection.stubs(:[]).returns(@db)
20
-
21
- @connection.stubs(:replica_set_name).returns(nil)
22
- @connection.stubs(:log)
12
+ @client = stub("MongoClient")
13
+ @client.stubs(:connect_timeout).returns(5)
14
+ @client.stubs(:op_timeout).returns(5)
15
+ @client.stubs(:pool_size).returns(2)
16
+ @client.stubs(:pool_timeout).returns(100)
17
+ @client.stubs(:seeds).returns(['localhost:30000'])
18
+ @client.stubs(:socket_class).returns(TCPSocket)
19
+ @client.stubs(:[]).returns(@db)
20
+
21
+ @client.stubs(:replica_set_name).returns(nil)
22
+ @client.stubs(:log)
23
23
  @arbiters = ['localhost:27020']
24
24
  @hosts = ['localhost:27017', 'localhost:27018', 'localhost:27019',
25
25
  'localhost:27020']
@@ -35,7 +35,7 @@ class PoolManagerTest < Test::Unit::TestCase
35
35
  {'arbiterOnly' => true, 'hosts' => @hosts, 'arbiters' => @arbiters})
36
36
 
37
37
  seeds = [['localhost', 27017]]
38
- manager = Mongo::PoolManager.new(@connection, seeds)
38
+ manager = Mongo::PoolManager.new(@client, seeds)
39
39
  manager.connect
40
40
 
41
41
  assert_equal ['localhost', 27017], manager.primary
@@ -1,4 +1,4 @@
1
- require File.expand_path("../../test_helper", __FILE__)
1
+ require 'test_helper'
2
2
  include Mongo
3
3
 
4
4
  class PoolTest < Test::Unit::TestCase
@@ -1,11 +1,11 @@
1
- require File.expand_path("../../test_helper", __FILE__)
1
+ require 'test_helper'
2
2
 
3
3
  class ReadTest < Test::Unit::TestCase
4
4
 
5
5
  context "Read mode on standard connection: " do
6
6
  setup do
7
7
  @read_preference = :secondary
8
- @con = Mongo::Connection.new('localhost', 27017, :read => @read_preference, :connect => false)
8
+ @client = MongoClient.new('localhost', 27017, :read => @read_preference, :connect => false)
9
9
  end
10
10
 
11
11
  end
@@ -16,7 +16,7 @@ class ReadTest < Test::Unit::TestCase
16
16
  @acceptable_latency = 100
17
17
  @tags = {"dc" => "Tyler", "rack" => "Brock"}
18
18
  @bad_tags = {"wow" => "cool"}
19
- @con = Mongo::ReplSetConnection.new(
19
+ @client = MongoReplicaSetClient.new(
20
20
  ['localhost:27017'],
21
21
  :read => @read_preference,
22
22
  :tag_sets => @tags,
@@ -25,36 +25,36 @@ class ReadTest < Test::Unit::TestCase
25
25
  )
26
26
  end
27
27
 
28
- should "store read preference on Connection" do
29
- assert_equal @read_preference, @con.read_preference
30
- assert_equal @tags, @con.tag_sets
31
- assert_equal @acceptable_latency, @con.acceptable_latency
28
+ should "store read preference on MongoClient" do
29
+ assert_equal @read_preference, @client.read_preference
30
+ assert_equal @tags, @client.tag_sets
31
+ assert_equal @acceptable_latency, @client.acceptable_latency
32
32
  end
33
33
 
34
34
  should "propogate to DB" do
35
- db = @con['foo']
35
+ db = @client['foo']
36
36
  assert_equal @read_preference, db.read_preference
37
37
  assert_equal @tags, db.tag_sets
38
38
  assert_equal @acceptable_latency, db.acceptable_latency
39
39
 
40
- db = @con.db('foo')
40
+ db = @client.db('foo')
41
41
  assert_equal @read_preference, db.read_preference
42
42
  assert_equal @tags, db.tag_sets
43
43
  assert_equal @acceptable_latency, db.acceptable_latency
44
44
 
45
- db = DB.new('foo', @con)
45
+ db = DB.new('foo', @client)
46
46
  assert_equal @read_preference, db.read_preference
47
47
  assert_equal @tags, db.tag_sets
48
48
  assert_equal @acceptable_latency, db.acceptable_latency
49
49
  end
50
50
 
51
51
  should "allow db override" do
52
- db = DB.new('foo', @con, :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
52
+ db = DB.new('foo', @client, :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
53
53
  assert_equal :primary, db.read_preference
54
54
  assert_equal @bad_tags, db.tag_sets
55
55
  assert_equal 25, db.acceptable_latency
56
56
 
57
- db = @con.db('foo', :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
57
+ db = @client.db('foo', :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
58
58
  assert_equal :primary, db.read_preference
59
59
  assert_equal @bad_tags, db.tag_sets
60
60
  assert_equal 25, db.acceptable_latency
@@ -62,7 +62,7 @@ class ReadTest < Test::Unit::TestCase
62
62
 
63
63
  context "on DB: " do
64
64
  setup do
65
- @db = @con['foo']
65
+ @db = @client['foo']
66
66
  end
67
67
 
68
68
  should "propogate to collection" do
@@ -97,7 +97,7 @@ class ReadTest < Test::Unit::TestCase
97
97
 
98
98
  context "on read mode ops" do
99
99
  setup do
100
- @col = @con['foo']['bar']
100
+ @col = @client['foo']['bar']
101
101
  @mock_socket = new_mock_socket
102
102
  end
103
103
 
@@ -105,12 +105,12 @@ class ReadTest < Test::Unit::TestCase
105
105
  @cursor = @col.find({:a => 1})
106
106
  sock = new_mock_socket
107
107
  read_pool = stub(:checkin => true)
108
- @con.stubs(:read_pool).returns(read_pool)
108
+ @client.stubs(:read_pool).returns(read_pool)
109
109
  primary_pool = stub(:checkin => true)
110
110
  sock.stubs(:pool).returns(primary_pool)
111
- @con.stubs(:primary_pool).returns(primary_pool)
112
- @con.expects(:checkout_reader).returns(sock)
113
- @con.expects(:receive_message).with do |o, m, l, s, c, r|
111
+ @client.stubs(:primary_pool).returns(primary_pool)
112
+ @client.expects(:checkout_reader).returns(sock)
113
+ @client.expects(:receive_message).with do |o, m, l, s, c, r|
114
114
  r == nil
115
115
  end.returns([[], 0, 0])
116
116
 
@@ -122,9 +122,9 @@ class ReadTest < Test::Unit::TestCase
122
122
  sock = new_mock_socket
123
123
  primary_pool = stub(:checkin => true)
124
124
  sock.stubs(:pool).returns(primary_pool)
125
- @con.stubs(:primary_pool).returns(primary_pool)
126
- @con.expects(:checkout_reader).returns(sock)
127
- @con.expects(:receive_message).with do |o, m, l, s, c, r|
125
+ @client.stubs(:primary_pool).returns(primary_pool)
126
+ @client.expects(:checkout_reader).returns(sock)
127
+ @client.expects(:receive_message).with do |o, m, l, s, c, r|
128
128
  r == nil
129
129
  end.returns([[], 0, 0])
130
130
 
@@ -132,11 +132,6 @@ class ReadTest < Test::Unit::TestCase
132
132
  end
133
133
 
134
134
  should "allow override alternate value on query" do
135
- # TODO: enable this test once we enable reading from tags.
136
- # @con.expects(:receive_message).with do |o, m, l, s, c, r|
137
- # tags = {:dc => "ny"}
138
- # end.returns([[], 0, 0])
139
-
140
135
  assert_raise MongoArgumentError do
141
136
  @col.find_one({:a => 1}, :read => {:dc => "ny"})
142
137
  end
@@ -1,65 +1,65 @@
1
- require File.expand_path("../../test_helper", __FILE__)
1
+ require 'test_helper'
2
2
 
3
3
  class SafeTest < Test::Unit::TestCase
4
4
 
5
- context "Safe mode on connection: " do
5
+ context "Write-Concern modes on Mongo::Connection " do
6
6
  setup do
7
- @safe_value = {:w => 7}
8
- @con = Mongo::Connection.new('localhost', 27017, :safe => @safe_value, :connect => false)
7
+ @safe_value = {:w => 7, :j => false, :fsync => false, :wtimeout => false}
8
+ @connection = Mongo::Connection.new('localhost', 27017, :safe => @safe_value, :connect => false)
9
9
  end
10
10
 
11
11
  should "propogate to DB" do
12
- db = @con['foo']
13
- assert_equal @safe_value, db.safe
12
+ db = @connection['foo']
13
+ assert_equal @safe_value[:w], db.write_concern[:w]
14
14
 
15
15
 
16
- db = @con.db('foo')
17
- assert_equal @safe_value, db.safe
16
+ db = @connection.db('foo')
17
+ assert_equal @safe_value[:w], db.write_concern[:w]
18
18
 
19
- db = DB.new('foo', @con)
20
- assert_equal @safe_value, db.safe
19
+ db = DB.new('foo', @connection)
20
+ assert_equal @safe_value[:w], db.write_concern[:w]
21
21
  end
22
22
 
23
23
  should "allow db override" do
24
- db = DB.new('foo', @con, :safe => false)
25
- assert_equal false, db.safe
24
+ db = DB.new('foo', @connection, :safe => false)
25
+ assert_equal 0, db.write_concern[:w]
26
26
 
27
- db = @con.db('foo', :safe => false)
28
- assert_equal false, db.safe
27
+ db = @connection.db('foo', :safe => false)
28
+ assert_equal 0, db.write_concern[:w]
29
29
  end
30
30
 
31
31
  context "on DB: " do
32
32
  setup do
33
- @db = @con['foo']
33
+ @db = @connection['foo']
34
34
  end
35
35
 
36
36
  should "propogate to collection" do
37
37
  col = @db.collection('bar')
38
- assert_equal @safe_value, col.safe
38
+ assert_equal @safe_value, col.write_concern
39
39
 
40
40
  col = @db['bar']
41
- assert_equal @safe_value, col.safe
41
+ assert_equal @safe_value, col.write_concern
42
42
 
43
43
  col = Collection.new('bar', @db)
44
- assert_equal @safe_value, col.safe
44
+ assert_equal @safe_value, col.write_concern
45
45
  end
46
46
 
47
47
  should "allow override on collection" do
48
48
  col = @db.collection('bar', :safe => false)
49
- assert_equal false, col.safe
49
+ assert_equal 0, col.write_concern[:w]
50
50
 
51
51
  col = Collection.new('bar', @db, :safe => false)
52
- assert_equal false, col.safe
52
+ assert_equal 0, col.write_concern[:w]
53
53
  end
54
54
  end
55
55
 
56
56
  context "on operations supporting safe mode" do
57
57
  setup do
58
- @col = @con['foo']['bar']
58
+ @col = @connection['foo']['bar']
59
59
  end
60
60
 
61
61
  should "use default value on insert" do
62
- @con.expects(:send_message_with_safe_check).with do |op, msg, log, n, safe|
62
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
63
63
  safe == @safe_value
64
64
  end
65
65
 
@@ -67,20 +67,20 @@ class SafeTest < Test::Unit::TestCase
67
67
  end
68
68
 
69
69
  should "allow override alternate value on insert" do
70
- @con.expects(:send_message_with_safe_check).with do |op, msg, log, n, safe|
71
- safe == {:w => 100}
70
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
71
+ safe == {:w => 100, :j => false, :fsync => false, :wtimeout => false}
72
72
  end
73
73
 
74
74
  @col.insert({:a => 1}, :safe => {:w => 100})
75
75
  end
76
76
 
77
77
  should "allow override to disable on insert" do
78
- @con.expects(:send_message)
78
+ @connection.expects(:send_message)
79
79
  @col.insert({:a => 1}, :safe => false)
80
80
  end
81
81
 
82
82
  should "use default value on update" do
83
- @con.expects(:send_message_with_safe_check).with do |op, msg, log, n, safe|
83
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
84
84
  safe == @safe_value
85
85
  end
86
86
 
@@ -88,20 +88,39 @@ class SafeTest < Test::Unit::TestCase
88
88
  end
89
89
 
90
90
  should "allow override alternate value on update" do
91
- @con.expects(:send_message_with_safe_check).with do |op, msg, log, n, safe|
92
- safe == {:w => 100}
91
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
92
+ safe == {:w => 100, :j => false, :fsync => false, :wtimeout => false}
93
93
  end
94
94
 
95
95
  @col.update({:a => 1}, {:a => 2}, :safe => {:w => 100})
96
96
  end
97
97
 
98
98
  should "allow override to disable on update" do
99
- @con.expects(:send_message)
99
+ @connection.expects(:send_message)
100
100
  @col.update({:a => 1}, {:a => 2}, :safe => false)
101
101
  end
102
102
 
103
+ should "use default value on save" do
104
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
105
+ safe == @safe_value
106
+ end
107
+ @col.save({:a => 1})
108
+ end
109
+
110
+ should "allow override alternate value on save" do
111
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
112
+ safe == @safe_value.merge(:w => 1)
113
+ end
114
+ @col.save({:a => 1}, :safe => true)
115
+ end
116
+
117
+ should "allow override to disable on save" do
118
+ @connection.expects(:send_message)
119
+ @col.save({:a => 1}, :safe => false)
120
+ end
121
+
103
122
  should "use default value on remove" do
104
- @con.expects(:send_message_with_safe_check).with do |op, msg, log, n, safe|
123
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
105
124
  safe == @safe_value
106
125
  end
107
126
 
@@ -109,15 +128,15 @@ class SafeTest < Test::Unit::TestCase
109
128
  end
110
129
 
111
130
  should "allow override alternate value on remove" do
112
- @con.expects(:send_message_with_safe_check).with do |op, msg, log, n, safe|
113
- safe == {:w => 100}
131
+ @connection.expects(:send_message_with_gle).with do |op, msg, log, n, safe|
132
+ safe == {:w => 100, :j => false, :fsync => false, :wtimeout => false}
114
133
  end
115
134
 
116
135
  @col.remove({}, :safe => {:w => 100})
117
136
  end
118
137
 
119
138
  should "allow override to disable on remove" do
120
- @con.expects(:send_message)
139
+ @connection.expects(:send_message)
121
140
  @col.remove({}, :safe => false)
122
141
  end
123
142
  end
@@ -0,0 +1,55 @@
1
+ require File.expand_path("../../test_helper", __FILE__)
2
+
3
+ class UtilTest < Test::Unit::TestCase
4
+ context "Support" do
5
+ context ".secondary_ok?" do
6
+ should "return false for mapreduces with a string for out" do
7
+ assert_equal false, Mongo::Support.secondary_ok?(BSON::OrderedHash[
8
+ 'mapreduce', 'test-collection',
9
+ 'out', 'new-test-collection'
10
+ ])
11
+ end
12
+
13
+ should "return false for mapreduces replacing a collection" do
14
+ assert_equal false, Mongo::Support.secondary_ok?(BSON::OrderedHash[
15
+ 'mapreduce', 'test-collection',
16
+ 'out', BSON::OrderedHash['replace', 'new-test-collection']
17
+ ])
18
+ end
19
+
20
+ should "return false for mapreduces replacing the inline collection" do
21
+ assert_equal false, Mongo::Support.secondary_ok?(BSON::OrderedHash[
22
+ 'mapreduce', 'test-collection',
23
+ 'out', 'inline'
24
+ ])
25
+ end
26
+
27
+ should "return true for inline output mapreduces when inline is a symbol" do
28
+ assert_equal true, Mongo::Support.secondary_ok?(BSON::OrderedHash[
29
+ 'mapreduce', 'test-collection',
30
+ 'out', BSON::OrderedHash[:inline, 'true']
31
+ ])
32
+ end
33
+
34
+ should "return true for inline output mapreduces when inline is a string" do
35
+ assert_equal true, Mongo::Support.secondary_ok?(BSON::OrderedHash[
36
+ 'mapreduce', 'test-collection',
37
+ 'out', BSON::OrderedHash['inline', 'true']
38
+ ])
39
+ end
40
+
41
+ should 'return true for count' do
42
+ assert_equal true, Mongo::Support.secondary_ok?(BSON::OrderedHash[
43
+ 'count', 'test-collection',
44
+ 'query', BSON::OrderedHash['a', 'b']
45
+ ])
46
+ end
47
+
48
+ should 'return false for serverStatus' do
49
+ assert_equal false, Mongo::Support.secondary_ok?(BSON::OrderedHash[
50
+ 'serverStatus', 1
51
+ ])
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,161 @@
1
+ require 'test_helper'
2
+
3
+ class WriteConcernTest < Test::Unit::TestCase
4
+
5
+ context "Write-Concern modes on Mongo::MongoClient " do
6
+ setup do
7
+ @write_concern = {
8
+ :w => 7,
9
+ :j => false,
10
+ :fsync => false,
11
+ :wtimeout => false
12
+ }
13
+
14
+ class Mongo::MongoClient
15
+ public :build_get_last_error_message, :build_command_message
16
+ end
17
+
18
+ @client =
19
+ MongoClient.new('localhost', 27017,
20
+ @write_concern.merge({:connect => false}))
21
+ end
22
+
23
+ should "propogate to DB" do
24
+ db = @client['foo']
25
+ assert_equal @write_concern, db.write_concern
26
+
27
+
28
+ db = @client.db('foo')
29
+ assert_equal @write_concern, db.write_concern
30
+
31
+ db = DB.new('foo', @client)
32
+ assert_equal @write_concern, db.write_concern
33
+ end
34
+
35
+ should "allow db override" do
36
+ db = DB.new('foo', @client, :w => 0)
37
+ assert_equal 0, db.write_concern[:w]
38
+
39
+ db = @client.db('foo', :w => 0)
40
+ assert_equal 0, db.write_concern[:w]
41
+ end
42
+
43
+ context "on DB: " do
44
+ setup do
45
+ @db = @client['foo']
46
+ end
47
+
48
+ should "propogate to collection" do
49
+ collection = @db.collection('bar')
50
+ assert_equal @write_concern, collection.write_concern
51
+
52
+ collection = @db['bar']
53
+ assert_equal @write_concern, collection.write_concern
54
+
55
+ collection = Collection.new('bar', @db)
56
+ assert_equal @write_concern, collection.write_concern
57
+ end
58
+
59
+ should "allow override on collection" do
60
+ collection = @db.collection('bar', :w => 0)
61
+ assert_equal 0, collection.write_concern[:w]
62
+
63
+ collection = Collection.new('bar', @db, :w => 0)
64
+ assert_equal 0, collection.write_concern[:w]
65
+ end
66
+ end
67
+
68
+ context "on operations supporting 'gle' mode" do
69
+ setup do
70
+ @collection = @client['foo']['bar']
71
+ end
72
+
73
+ should "not send w = 1 to the server" do
74
+ gle = @client.build_get_last_error_message("fake", {:w => 1})
75
+ assert_equal gle, @client.build_command_message("fake", {:getlasterror => 1})
76
+ end
77
+
78
+ should "use default value on insert" do
79
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
80
+ wc == @write_concern
81
+ end
82
+
83
+ @collection.insert({:a => 1})
84
+ end
85
+
86
+ should "allow override alternate value on insert" do
87
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
88
+ wc == {:w => 100, :j => false, :fsync => false, :wtimeout => false}
89
+ end
90
+
91
+ @collection.insert({:a => 1}, {:w => 100})
92
+ end
93
+
94
+ should "allow override to disable on insert" do
95
+ @client.expects(:send_message)
96
+ @collection.insert({:a => 1}, :w => 0)
97
+ end
98
+
99
+ should "use default value on update" do
100
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
101
+ wc == @write_concern
102
+ end
103
+
104
+ @collection.update({:a => 1}, {:a => 2})
105
+ end
106
+
107
+ should "allow override alternate value on update" do
108
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
109
+ wc == {:w => 100, :j => false, :fsync => false, :wtimeout => false}
110
+ end
111
+
112
+ @collection.update({:a => 1}, {:a => 2}, {:w => 100})
113
+ end
114
+
115
+ should "allow override to disable on update" do
116
+ @client.expects(:send_message)
117
+ @collection.update({:a => 1}, {:a => 2}, :w => 0)
118
+ end
119
+
120
+ should "use default value on save" do
121
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
122
+ wc == @write_concern
123
+ end
124
+ @collection.save({:a => 1})
125
+ end
126
+
127
+ should "allow override alternate value on save" do
128
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
129
+ wc == @write_concern.merge(:w => 1)
130
+ end
131
+ @collection.save({:a => 1}, :w => 1)
132
+ end
133
+
134
+ should "allow override to disable on save" do
135
+ @client.expects(:send_message)
136
+ @collection.save({:a => 1}, :w => 0)
137
+ end
138
+
139
+ should "use default value on remove" do
140
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
141
+ wc == @write_concern
142
+ end
143
+
144
+ @collection.remove
145
+ end
146
+
147
+ should "allow override alternate value on remove" do
148
+ @client.expects(:send_message_with_gle).with do |op, msg, log, n, wc|
149
+ wc == {:w => 100, :j => false, :fsync => false, :wtimeout => false}
150
+ end
151
+
152
+ @collection.remove({}, {:w => 100})
153
+ end
154
+
155
+ should "allow override to disable on remove" do
156
+ @client.expects(:send_message)
157
+ @collection.remove({}, :w => 0)
158
+ end
159
+ end
160
+ end
161
+ end