mongo 1.7.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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