mongo 1.7.1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{LICENSE.txt → LICENSE} +0 -0
- data/README.md +124 -111
- data/Rakefile +9 -325
- data/VERSION +1 -0
- data/bin/mongo_console +4 -4
- data/examples/admin.rb +43 -0
- data/examples/capped.rb +22 -0
- data/examples/cursor.rb +48 -0
- data/examples/gridfs.rb +44 -0
- data/examples/index_test.rb +126 -0
- data/examples/info.rb +31 -0
- data/examples/queries.rb +74 -0
- data/examples/replica_set.rb +26 -0
- data/examples/simple.rb +25 -0
- data/examples/strict.rb +35 -0
- data/examples/types.rb +36 -0
- data/{test/load → examples/web}/thin/load.rb +3 -1
- data/{test/load → examples/web}/unicorn/load.rb +5 -3
- data/lib/mongo.rb +8 -10
- data/lib/mongo/collection.rb +134 -114
- data/lib/mongo/cursor.rb +21 -14
- data/lib/mongo/db.rb +30 -28
- data/lib/mongo/exceptions.rb +1 -1
- data/lib/mongo/gridfs/grid.rb +8 -7
- data/lib/mongo/gridfs/grid_ext.rb +1 -1
- data/lib/mongo/gridfs/grid_file_system.rb +6 -5
- data/lib/mongo/gridfs/grid_io.rb +22 -19
- data/lib/mongo/legacy.rb +82 -0
- data/lib/mongo/{connection.rb → mongo_client.rb} +82 -61
- data/lib/mongo/{repl_set_connection.rb → mongo_replica_set_client.rb} +54 -39
- data/lib/mongo/{sharded_connection.rb → mongo_sharded_client.rb} +9 -9
- data/lib/mongo/networking.rb +25 -20
- data/lib/mongo/util/conversions.rb +1 -1
- data/lib/mongo/util/core_ext.rb +1 -1
- data/lib/mongo/util/logging.rb +20 -4
- data/lib/mongo/util/node.rb +16 -16
- data/lib/mongo/util/pool.rb +56 -27
- data/lib/mongo/util/pool_manager.rb +28 -27
- data/lib/mongo/util/server_version.rb +1 -1
- data/lib/mongo/util/sharding_pool_manager.rb +8 -8
- data/lib/mongo/util/ssl_socket.rb +1 -5
- data/lib/mongo/util/support.rb +24 -8
- data/lib/mongo/util/tcp_socket.rb +0 -4
- data/lib/mongo/util/uri_parser.rb +54 -38
- data/lib/mongo/util/write_concern.rb +67 -0
- data/mongo.gemspec +21 -32
- data/test/auxillary/{1.4_features.rb → 1.4_feature_test.rb} +4 -5
- data/test/auxillary/authentication_test.rb +18 -20
- data/test/auxillary/autoreconnect_test.rb +3 -5
- data/test/auxillary/fork_test.rb +5 -7
- data/test/auxillary/repl_set_auth_test.rb +13 -15
- data/test/auxillary/slave_connection_test.rb +8 -7
- data/test/auxillary/threaded_authentication_test.rb +15 -17
- data/test/bson/binary_test.rb +1 -1
- data/test/bson/bson_test.rb +60 -36
- data/test/bson/byte_buffer_test.rb +1 -1
- data/test/bson/hash_with_indifferent_access_test.rb +2 -2
- data/test/bson/json_test.rb +1 -2
- data/test/bson/object_id_test.rb +1 -2
- data/test/bson/ordered_hash_test.rb +1 -1
- data/test/bson/timestamp_test.rb +1 -1
- data/test/{collection_test.rb → functional/collection_test.rb} +57 -57
- data/test/{connection_test.rb → functional/connection_test.rb} +75 -89
- data/test/{conversions_test.rb → functional/conversions_test.rb} +1 -1
- data/test/{cursor_fail_test.rb → functional/cursor_fail_test.rb} +3 -29
- data/test/{cursor_message_test.rb → functional/cursor_message_test.rb} +1 -1
- data/test/{cursor_test.rb → functional/cursor_test.rb} +5 -1
- data/test/{db_api_test.rb → functional/db_api_test.rb} +8 -9
- data/test/{db_connection_test.rb → functional/db_connection_test.rb} +3 -5
- data/test/{db_test.rb → functional/db_test.rb} +13 -13
- data/test/{grid_file_system_test.rb → functional/grid_file_system_test.rb} +2 -2
- data/test/{grid_io_test.rb → functional/grid_io_test.rb} +6 -6
- data/test/{grid_test.rb → functional/grid_test.rb} +4 -10
- data/test/{pool_test.rb → functional/pool_test.rb} +1 -1
- data/test/functional/safe_test.rb +84 -0
- data/test/{support_test.rb → functional/support_test.rb} +1 -1
- data/test/{threading_test.rb → functional/threading_test.rb} +9 -9
- data/test/{timeout_test.rb → functional/timeout_test.rb} +1 -1
- data/test/{uri_test.rb → functional/uri_test.rb} +1 -1
- data/test/functional/write_concern_test.rb +104 -0
- data/test/replica_set/basic_test.rb +139 -0
- data/test/replica_set/client_test.rb +255 -0
- data/test/replica_set/complex_connect_test.rb +62 -0
- data/test/replica_set/connection_test.rb +255 -0
- data/test/{replica_sets → replica_set}/count_test.rb +17 -14
- data/test/replica_set/cursor_test.rb +75 -0
- data/test/{replica_sets → replica_set}/insert_test.rb +19 -16
- data/test/replica_set/query_test.rb +64 -0
- data/test/replica_set/refresh_test.rb +153 -0
- data/test/{replica_sets → replica_set}/replication_ack_test.rb +21 -17
- data/test/sharded_cluster/basic_test.rb +31 -50
- data/test/support/hash_with_indifferent_access.rb +1 -1
- data/test/test_helper.rb +56 -9
- data/test/threading/threading_with_large_pool_test.rb +8 -8
- data/test/tools/mongo_config.rb +270 -58
- data/test/tools/mongo_config_test.rb +146 -0
- data/test/unit/client_test.rb +230 -0
- data/test/unit/collection_test.rb +45 -32
- data/test/unit/connection_test.rb +82 -74
- data/test/unit/cursor_test.rb +14 -6
- data/test/unit/db_test.rb +8 -8
- data/test/unit/grid_test.rb +11 -11
- data/test/unit/node_test.rb +24 -24
- data/test/unit/pool_manager_test.rb +13 -13
- data/test/unit/pool_test.rb +1 -1
- data/test/unit/read_test.rb +21 -26
- data/test/unit/safe_test.rb +52 -33
- data/test/unit/util_test.rb +55 -0
- data/test/unit/write_concern_test.rb +161 -0
- metadata +158 -171
- data/docs/CREDITS.md +0 -123
- data/docs/FAQ.md +0 -116
- data/docs/GRID_FS.md +0 -158
- data/docs/HISTORY.md +0 -392
- data/docs/READ_PREFERENCE.md +0 -99
- data/docs/RELEASES.md +0 -54
- data/docs/REPLICA_SETS.md +0 -113
- data/docs/TAILABLE_CURSORS.md +0 -51
- data/docs/TUTORIAL.md +0 -356
- data/docs/WRITE_CONCERN.md +0 -31
- data/lib/mongo/gridfs/grid_io_fix.rb +0 -38
- data/lib/mongo/version.rb +0 -3
- data/test/bson/test_helper.rb +0 -30
- data/test/replica_sets/basic_test.rb +0 -119
- data/test/replica_sets/complex_connect_test.rb +0 -57
- data/test/replica_sets/complex_read_preference_test.rb +0 -237
- data/test/replica_sets/connect_test.rb +0 -156
- data/test/replica_sets/cursor_test.rb +0 -70
- data/test/replica_sets/pooled_insert_test.rb +0 -57
- data/test/replica_sets/query_test.rb +0 -50
- data/test/replica_sets/read_preference_test.rb +0 -234
- data/test/replica_sets/refresh_test.rb +0 -156
- data/test/replica_sets/refresh_with_threads_test.rb +0 -60
- data/test/replica_sets/rs_test_helper.rb +0 -39
- data/test/safe_test.rb +0 -68
- data/test/sharded_cluster/mongo_config_test.rb +0 -126
- data/test/sharded_cluster/sc_test_helper.rb +0 -39
- data/test/tools/repl_set_manager.rb +0 -418
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MongoConfig < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def startup
|
6
|
+
@sys_proc = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def shutdown
|
10
|
+
@sys_proc.stop if @sys_proc && @sys_proc.running?
|
11
|
+
end
|
12
|
+
|
13
|
+
test "config defaults" do
|
14
|
+
[ Mongo::Config::DEFAULT_BASE_OPTS,
|
15
|
+
Mongo::Config::DEFAULT_REPLICA_SET,
|
16
|
+
Mongo::Config::DEFAULT_SHARDED_SIMPLE,
|
17
|
+
Mongo::Config::DEFAULT_SHARDED_REPLICA
|
18
|
+
].each do |params|
|
19
|
+
config = Mongo::Config.cluster(params)
|
20
|
+
assert(config.size > 0)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
test "get available port" do
|
25
|
+
assert_not_nil(Mongo::Config.get_available_port)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "SysProc start" do
|
29
|
+
cmd = "true"
|
30
|
+
@sys_proc = Mongo::Config::SysProc.new(cmd)
|
31
|
+
assert_equal(cmd, @sys_proc.cmd)
|
32
|
+
assert_nil(@sys_proc.pid)
|
33
|
+
start_and_assert_running?(@sys_proc)
|
34
|
+
end
|
35
|
+
|
36
|
+
test "SysProc wait" do
|
37
|
+
@sys_proc = Mongo::Config::SysProc.new("true")
|
38
|
+
start_and_assert_running?(@sys_proc)
|
39
|
+
assert(@sys_proc.running?)
|
40
|
+
@sys_proc.wait
|
41
|
+
assert(!@sys_proc.running?)
|
42
|
+
end
|
43
|
+
|
44
|
+
test "SysProc kill" do
|
45
|
+
@sys_proc = Mongo::Config::SysProc.new("true")
|
46
|
+
start_and_assert_running?(@sys_proc)
|
47
|
+
@sys_proc.kill
|
48
|
+
@sys_proc.wait
|
49
|
+
assert(!@sys_proc.running?)
|
50
|
+
end
|
51
|
+
|
52
|
+
test "SysProc stop" do
|
53
|
+
@sys_proc = Mongo::Config::SysProc.new("true")
|
54
|
+
start_and_assert_running?(@sys_proc)
|
55
|
+
@sys_proc.stop
|
56
|
+
assert(!@sys_proc.running?)
|
57
|
+
end
|
58
|
+
|
59
|
+
test "SysProc zombie respawn" do
|
60
|
+
@sys_proc = Mongo::Config::SysProc.new("true")
|
61
|
+
start_and_assert_running?(@sys_proc)
|
62
|
+
prev_pid = @sys_proc.pid
|
63
|
+
@sys_proc.kill
|
64
|
+
# don't wait, leaving a zombie
|
65
|
+
assert(@sys_proc.running?)
|
66
|
+
start_and_assert_running?(@sys_proc)
|
67
|
+
assert(prev_pid && @sys_proc.pid && prev_pid != @sys_proc.pid, 'SysProc#start should spawn a new process after a zombie')
|
68
|
+
@sys_proc.stop
|
69
|
+
assert(!@sys_proc.running?)
|
70
|
+
end
|
71
|
+
|
72
|
+
test "Server" do
|
73
|
+
server = Mongo::Config::Server.new('a cmd', 'host', 1234)
|
74
|
+
assert_equal('a cmd', server.cmd)
|
75
|
+
assert_equal('host', server.host)
|
76
|
+
assert_equal(1234, server.port)
|
77
|
+
end
|
78
|
+
|
79
|
+
test "DbServer" do
|
80
|
+
config = Mongo::Config::DEFAULT_BASE_OPTS
|
81
|
+
server = Mongo::Config::DbServer.new(config)
|
82
|
+
assert_equal(config, server.config)
|
83
|
+
assert_equal("mongod --dbpath data --logpath data/log", server.cmd)
|
84
|
+
assert_equal(config[:host], server.host)
|
85
|
+
assert_equal(config[:port], server.port)
|
86
|
+
end
|
87
|
+
|
88
|
+
def cluster_test(opts)
|
89
|
+
#debug 1, opts.inspect
|
90
|
+
config = Mongo::Config.cluster(opts)
|
91
|
+
#debug 1, config.inspect
|
92
|
+
manager = Mongo::Config::ClusterManager.new(config)
|
93
|
+
assert_equal(config, manager.config)
|
94
|
+
manager.start
|
95
|
+
yield manager
|
96
|
+
manager.stop
|
97
|
+
manager.servers.each{|s| assert(!s.running?)}
|
98
|
+
manager.clobber
|
99
|
+
end
|
100
|
+
|
101
|
+
test "cluster manager base" do
|
102
|
+
cluster_test(Mongo::Config::DEFAULT_BASE_OPTS) do |manager|
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
test "cluster manager replica set" do
|
108
|
+
cluster_test(Mongo::Config::DEFAULT_REPLICA_SET) do |manager|
|
109
|
+
servers = manager.servers
|
110
|
+
servers.each do |server|
|
111
|
+
assert_not_nil(Mongo::MongoClient.new(server.host, server.port))
|
112
|
+
assert_match(/oplogSize/, server.cmd, '--oplogSize option should be specified')
|
113
|
+
assert_match(/smallfiles/, server.cmd, '--smallfiles option should be specified')
|
114
|
+
assert_no_match(/nojournal/, server.cmd, '--nojournal option should not be specified')
|
115
|
+
assert_match(/noprealloc/, server.cmd, '--noprealloc option should be specified')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
test "cluster manager sharded simple" do
|
121
|
+
cluster_test(Mongo::Config::DEFAULT_SHARDED_SIMPLE) do |manager|
|
122
|
+
servers = manager.shards + manager.configs
|
123
|
+
servers.each do |server|
|
124
|
+
assert_not_nil(Mongo::MongoClient.new(server.host, server.port))
|
125
|
+
assert_match(/oplogSize/, server.cmd, '--oplogSize option should be specified')
|
126
|
+
assert_match(/smallfiles/, server.cmd, '--smallfiles option should be specified')
|
127
|
+
assert_no_match(/nojournal/, server.cmd, '--nojournal option should not be specified')
|
128
|
+
assert_match(/noprealloc/, server.cmd, '--noprealloc option should be specified')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
test "cluster manager sharded replica" do
|
134
|
+
#cluster_test(Mongo::Config::DEFAULT_SHARDED_REPLICA) # not yet supported by ClusterManager
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
def start_and_assert_running?(sys_proc)
|
140
|
+
assert_not_nil(sys_proc.start(0))
|
141
|
+
assert_not_nil(sys_proc.pid)
|
142
|
+
assert(sys_proc.running?)
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
include Mongo
|
3
|
+
|
4
|
+
class ClientTest < Test::Unit::TestCase
|
5
|
+
context "Mongo::MongoClient intialization " do
|
6
|
+
context "given a single node" do
|
7
|
+
setup do
|
8
|
+
@client = MongoClient.new('localhost', 27017, :connect => false)
|
9
|
+
TCPSocket.stubs(:new).returns(new_mock_socket)
|
10
|
+
|
11
|
+
admin_db = new_mock_db
|
12
|
+
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
13
|
+
@client.expects(:[]).with('admin').returns(admin_db)
|
14
|
+
@client.connect
|
15
|
+
end
|
16
|
+
|
17
|
+
should "gle writes by default" do
|
18
|
+
assert_equal 1, @client.write_concern[:w]
|
19
|
+
end
|
20
|
+
|
21
|
+
should "set localhost and port to master" do
|
22
|
+
assert_equal 'localhost', @client.primary_pool.host
|
23
|
+
assert_equal 27017, @client.primary_pool.port
|
24
|
+
end
|
25
|
+
|
26
|
+
should "set connection pool to 1" do
|
27
|
+
assert_equal 1, @client.primary_pool.size
|
28
|
+
end
|
29
|
+
|
30
|
+
should "default slave_ok to false" do
|
31
|
+
assert !@client.slave_ok?
|
32
|
+
end
|
33
|
+
|
34
|
+
should "raise exception for invalid host or port" do
|
35
|
+
assert_raise MongoArgumentError do
|
36
|
+
MongoClient.new(:w => 1)
|
37
|
+
end
|
38
|
+
assert_raise MongoArgumentError do
|
39
|
+
MongoClient.new('localhost', :w => 1)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
should "warn if invalid options are specified" do
|
44
|
+
client = MongoClient.allocate
|
45
|
+
opts = {:connect => false}
|
46
|
+
|
47
|
+
MongoReplicaSetClient::REPL_SET_OPTS.each do |opt|
|
48
|
+
client.expects(:warn).with("#{opt} is not a valid option for #{client.class}")
|
49
|
+
opts[opt] = true
|
50
|
+
end
|
51
|
+
|
52
|
+
args = ['localhost', 27017, opts]
|
53
|
+
client.send(:initialize, *args)
|
54
|
+
end
|
55
|
+
|
56
|
+
context "given a replica set" do
|
57
|
+
|
58
|
+
should "warn if invalid options are specified" do
|
59
|
+
client = MongoReplicaSetClient.allocate
|
60
|
+
opts = {:connect => false}
|
61
|
+
|
62
|
+
MongoClient::CLIENT_ONLY_OPTS.each do |opt|
|
63
|
+
client.expects(:warn).with("#{opt} is not a valid option for #{client.class}")
|
64
|
+
opts[opt] = true
|
65
|
+
end
|
66
|
+
|
67
|
+
args = [['localhost:27017'], opts]
|
68
|
+
client.send(:initialize, *args)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "initializing with a mongodb uri" do
|
74
|
+
should "parse a simple uri" do
|
75
|
+
@client = MongoClient.from_uri("mongodb://localhost", :connect => false)
|
76
|
+
assert_equal ['localhost', 27017], @client.host_to_try
|
77
|
+
end
|
78
|
+
|
79
|
+
should "allow a complex host names" do
|
80
|
+
host_name = "foo.bar-12345.org"
|
81
|
+
@client = MongoClient.from_uri("mongodb://#{host_name}", :connect => false)
|
82
|
+
assert_equal [host_name, 27017], @client.host_to_try
|
83
|
+
end
|
84
|
+
|
85
|
+
should "allow db without username and password" do
|
86
|
+
host_name = "foo.bar-12345.org"
|
87
|
+
@client = MongoClient.from_uri("mongodb://#{host_name}/foo", :connect => false)
|
88
|
+
assert_equal [host_name, 27017], @client.host_to_try
|
89
|
+
end
|
90
|
+
|
91
|
+
should "set write concern options on connection" do
|
92
|
+
host_name = "localhost"
|
93
|
+
opts = "w=2&wtimeoutMS=1000&fsync=true&journal=true"
|
94
|
+
@client = MongoClient.from_uri("mongodb://#{host_name}/foo?#{opts}", :connect => false)
|
95
|
+
assert_equal({:w => 2, :wtimeout => 1000, :fsync => true, :j => true}, @client.write_concern)
|
96
|
+
end
|
97
|
+
|
98
|
+
should "set timeout options on connection" do
|
99
|
+
host_name = "localhost"
|
100
|
+
opts = "connectTimeoutMS=1000&socketTimeoutMS=5000"
|
101
|
+
@client = MongoClient.from_uri("mongodb://#{host_name}/foo?#{opts}", :connect => false)
|
102
|
+
assert_equal 1, @client.connect_timeout
|
103
|
+
assert_equal 5, @client.op_timeout
|
104
|
+
end
|
105
|
+
|
106
|
+
should "parse a uri with a hyphen & underscore in the username or password" do
|
107
|
+
@client = MongoClient.from_uri("mongodb://hyphen-user_name:p-s_s@localhost:27017/db", :connect => false)
|
108
|
+
assert_equal ['localhost', 27017], @client.host_to_try
|
109
|
+
auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
|
110
|
+
assert_equal auth_hash, @client.auths[0]
|
111
|
+
end
|
112
|
+
|
113
|
+
should "attempt to connect" do
|
114
|
+
TCPSocket.stubs(:new).returns(new_mock_socket)
|
115
|
+
@client = MongoClient.from_uri("mongodb://localhost", :connect => false)
|
116
|
+
|
117
|
+
admin_db = new_mock_db
|
118
|
+
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
119
|
+
@client.expects(:[]).with('admin').returns(admin_db)
|
120
|
+
@client.connect
|
121
|
+
end
|
122
|
+
|
123
|
+
should "raise an error on invalid uris" do
|
124
|
+
assert_raise MongoArgumentError do
|
125
|
+
MongoClient.from_uri("mongo://localhost", :connect => false)
|
126
|
+
end
|
127
|
+
|
128
|
+
assert_raise MongoArgumentError do
|
129
|
+
MongoClient.from_uri("mongodb://localhost:abc", :connect => false)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
should "require all of username, if password and db are specified" do
|
134
|
+
assert MongoClient.from_uri("mongodb://kyle:jones@localhost/db", :connect => false)
|
135
|
+
|
136
|
+
assert_raise MongoArgumentError do
|
137
|
+
MongoClient.from_uri("mongodb://kyle:password@localhost", :connect => false)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context "initializing with ENV['MONGODB_URI']" do
|
143
|
+
setup do
|
144
|
+
@old_mongodb_uri = ENV['MONGODB_URI']
|
145
|
+
end
|
146
|
+
|
147
|
+
teardown do
|
148
|
+
ENV['MONGODB_URI'] = @old_mongodb_uri
|
149
|
+
end
|
150
|
+
|
151
|
+
should "parse a simple uri" do
|
152
|
+
ENV['MONGODB_URI'] = "mongodb://localhost?connect=false"
|
153
|
+
@client = MongoClient.new
|
154
|
+
assert_equal ['localhost', 27017], @client.host_to_try
|
155
|
+
end
|
156
|
+
|
157
|
+
should "allow a complex host names" do
|
158
|
+
host_name = "foo.bar-12345.org"
|
159
|
+
ENV['MONGODB_URI'] = "mongodb://#{host_name}?connect=false"
|
160
|
+
@client = MongoClient.new
|
161
|
+
assert_equal [host_name, 27017], @client.host_to_try
|
162
|
+
end
|
163
|
+
|
164
|
+
should "allow db without username and password" do
|
165
|
+
host_name = "foo.bar-12345.org"
|
166
|
+
ENV['MONGODB_URI'] = "mongodb://#{host_name}/foo?connect=false"
|
167
|
+
@client = MongoClient.new
|
168
|
+
assert_equal [host_name, 27017], @client.host_to_try
|
169
|
+
end
|
170
|
+
|
171
|
+
should "set write concern options on connection" do
|
172
|
+
host_name = "localhost"
|
173
|
+
opts = "w=2&wtimeoutMS=1000&fsync=true&journal=true&connect=false"
|
174
|
+
ENV['MONGODB_URI'] = "mongodb://#{host_name}/foo?#{opts}"
|
175
|
+
@client = MongoClient.new
|
176
|
+
assert_equal({:w => 2, :wtimeout => 1000, :fsync => true, :j => true}, @client.write_concern)
|
177
|
+
end
|
178
|
+
|
179
|
+
should "set timeout options on connection" do
|
180
|
+
host_name = "localhost"
|
181
|
+
opts = "connectTimeoutMS=1000&socketTimeoutMS=5000&connect=false"
|
182
|
+
ENV['MONGODB_URI'] = "mongodb://#{host_name}/foo?#{opts}"
|
183
|
+
@client = MongoClient.new
|
184
|
+
assert_equal 1, @client.connect_timeout
|
185
|
+
assert_equal 5, @client.op_timeout
|
186
|
+
end
|
187
|
+
|
188
|
+
should "parse a uri with a hyphen & underscore in the username or password" do
|
189
|
+
ENV['MONGODB_URI'] = "mongodb://hyphen-user_name:p-s_s@localhost:27017/db?connect=false"
|
190
|
+
@client = MongoClient.new
|
191
|
+
assert_equal ['localhost', 27017], @client.host_to_try
|
192
|
+
auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
|
193
|
+
assert_equal auth_hash, @client.auths[0]
|
194
|
+
end
|
195
|
+
|
196
|
+
should "attempt to connect" do
|
197
|
+
TCPSocket.stubs(:new).returns(new_mock_socket)
|
198
|
+
ENV['MONGODB_URI'] = "mongodb://localhost?connect=false" # connect=false ??
|
199
|
+
@client = MongoClient.new
|
200
|
+
|
201
|
+
admin_db = new_mock_db
|
202
|
+
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
203
|
+
@client.expects(:[]).with('admin').returns(admin_db)
|
204
|
+
@client.connect
|
205
|
+
end
|
206
|
+
|
207
|
+
should "raise an error on invalid uris" do
|
208
|
+
ENV['MONGODB_URI'] = "mongo://localhost"
|
209
|
+
assert_raise MongoArgumentError do
|
210
|
+
MongoClient.new
|
211
|
+
end
|
212
|
+
|
213
|
+
ENV['MONGODB_URI'] = "mongodb://localhost:abc"
|
214
|
+
assert_raise MongoArgumentError do
|
215
|
+
MongoClient.new
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
should "require all of username, if password and db are specified" do
|
220
|
+
ENV['MONGODB_URI'] = "mongodb://kyle:jones@localhost/db?connect=false"
|
221
|
+
assert MongoClient.new
|
222
|
+
|
223
|
+
ENV['MONGODB_URI'] = "mongodb://kyle:password@localhost"
|
224
|
+
assert_raise MongoArgumentError do
|
225
|
+
MongoClient.new
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
3
|
class CollectionTest < Test::Unit::TestCase
|
4
4
|
|
@@ -10,10 +10,10 @@ class CollectionTest < Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
should "send update message" do
|
13
|
-
@
|
14
|
-
@db = @
|
13
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
14
|
+
@db = @client['testing']
|
15
15
|
@coll = @db.collection('books')
|
16
|
-
@
|
16
|
+
@client.expects(:send_message_with_gle).with do |op, msg, log|
|
17
17
|
op == 2001
|
18
18
|
end
|
19
19
|
@coll.stubs(:log_operation)
|
@@ -21,10 +21,10 @@ class CollectionTest < Test::Unit::TestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
should "send insert message" do
|
24
|
-
@
|
25
|
-
@db = @
|
24
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
25
|
+
@db = @client['testing']
|
26
26
|
@coll = @db.collection('books')
|
27
|
-
@
|
27
|
+
@client.expects(:send_message_with_gle).with do |op, msg, log|
|
28
28
|
op == 2002
|
29
29
|
end
|
30
30
|
@coll.expects(:log_operation).with do |name, payload|
|
@@ -34,11 +34,11 @@ class CollectionTest < Test::Unit::TestCase
|
|
34
34
|
end
|
35
35
|
|
36
36
|
should "send sort data" do
|
37
|
-
@
|
38
|
-
@db = @
|
37
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
38
|
+
@db = @client['testing']
|
39
39
|
@coll = @db.collection('books')
|
40
|
-
@
|
41
|
-
@
|
40
|
+
@client.expects(:checkout_reader).returns(mock(:pool))
|
41
|
+
@client.expects(:receive_message).with do |op, msg, log, sock|
|
42
42
|
op == 2004
|
43
43
|
end.returns([[], 0, 0])
|
44
44
|
@logger.expects(:debug)
|
@@ -46,11 +46,11 @@ class CollectionTest < Test::Unit::TestCase
|
|
46
46
|
end
|
47
47
|
|
48
48
|
should "not log binary data" do
|
49
|
-
@
|
50
|
-
@db = @
|
49
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
50
|
+
@db = @client['testing']
|
51
51
|
@coll = @db.collection('books')
|
52
52
|
data = BSON::Binary.new(("BINARY " * 1000).unpack("c*"))
|
53
|
-
@
|
53
|
+
@client.expects(:send_message_with_gle).with do |op, msg, log|
|
54
54
|
op == 2002
|
55
55
|
end
|
56
56
|
@coll.expects(:log_operation).with do |name, payload|
|
@@ -60,32 +60,45 @@ class CollectionTest < Test::Unit::TestCase
|
|
60
60
|
end
|
61
61
|
|
62
62
|
should "send safe update message" do
|
63
|
-
@
|
64
|
-
@db = @
|
63
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
64
|
+
@db = @client['testing']
|
65
65
|
@coll = @db.collection('books')
|
66
|
-
@
|
66
|
+
@client.expects(:send_message_with_gle).with do |op, msg, db_name, log|
|
67
67
|
op == 2001
|
68
68
|
end
|
69
69
|
@coll.expects(:log_operation).with do |name, payload|
|
70
70
|
(name == :update) && payload[:document][:title].include?('Moby')
|
71
71
|
end
|
72
|
-
@coll.update({}, {:title => 'Moby Dick'}
|
72
|
+
@coll.update({}, {:title => 'Moby Dick'})
|
73
|
+
end
|
74
|
+
|
75
|
+
should "send safe update message with legacy" do
|
76
|
+
@connection = Connection.new('localhost', 27017, :logger => @logger, :safe => true, :connect => false)
|
77
|
+
@db = @connection['testing']
|
78
|
+
@coll = @db.collection('books')
|
79
|
+
@connection.expects(:send_message_with_gle).with do |op, msg, db_name, log|
|
80
|
+
op == 2001
|
81
|
+
end
|
82
|
+
@coll.expects(:log_operation).with do |name, payload|
|
83
|
+
(name == :update) && payload[:document][:title].include?('Moby')
|
84
|
+
end
|
85
|
+
@coll.update({}, {:title => 'Moby Dick'})
|
73
86
|
end
|
74
87
|
|
75
88
|
should "send safe insert message" do
|
76
|
-
@
|
77
|
-
@db = @
|
89
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
90
|
+
@db = @client['testing']
|
78
91
|
@coll = @db.collection('books')
|
79
|
-
@
|
92
|
+
@client.expects(:send_message_with_gle).with do |op, msg, db_name, log|
|
80
93
|
op == 2001
|
81
94
|
end
|
82
95
|
@coll.stubs(:log_operation)
|
83
|
-
@coll.update({}, {:title => 'Moby Dick'}
|
96
|
+
@coll.update({}, {:title => 'Moby Dick'})
|
84
97
|
end
|
85
98
|
|
86
99
|
should "not call insert for each ensure_index call" do
|
87
|
-
@
|
88
|
-
@db = @
|
100
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
101
|
+
@db = @client['testing']
|
89
102
|
@coll = @db.collection('books')
|
90
103
|
@coll.expects(:generate_indexes).once
|
91
104
|
|
@@ -94,8 +107,8 @@ class CollectionTest < Test::Unit::TestCase
|
|
94
107
|
end
|
95
108
|
|
96
109
|
should "call generate_indexes for a new direction on the same field for ensure_index" do
|
97
|
-
@
|
98
|
-
@db = @
|
110
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
111
|
+
@db = @client['testing']
|
99
112
|
@coll = @db.collection('books')
|
100
113
|
@coll.expects(:generate_indexes).twice
|
101
114
|
|
@@ -105,8 +118,8 @@ class CollectionTest < Test::Unit::TestCase
|
|
105
118
|
end
|
106
119
|
|
107
120
|
should "call generate_indexes twice because the cache time is 0 seconds" do
|
108
|
-
@
|
109
|
-
@db = @
|
121
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
122
|
+
@db = @client['testing']
|
110
123
|
@db.cache_time = 0
|
111
124
|
@coll = @db.collection('books')
|
112
125
|
@coll.expects(:generate_indexes).twice
|
@@ -116,8 +129,8 @@ class CollectionTest < Test::Unit::TestCase
|
|
116
129
|
end
|
117
130
|
|
118
131
|
should "call generate_indexes for each key when calling ensure_indexes" do
|
119
|
-
@
|
120
|
-
@db = @
|
132
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
133
|
+
@db = @client['testing']
|
121
134
|
@db.cache_time = 300
|
122
135
|
@coll = @db.collection('books')
|
123
136
|
@coll.expects(:generate_indexes).once.with do |a, b, c|
|
@@ -128,8 +141,8 @@ class CollectionTest < Test::Unit::TestCase
|
|
128
141
|
end
|
129
142
|
|
130
143
|
should "use the connection's logger" do
|
131
|
-
@
|
132
|
-
@db = @
|
144
|
+
@client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
|
145
|
+
@db = @client['testing']
|
133
146
|
@coll = @db.collection('books')
|
134
147
|
@logger.expects(:warn).with do |msg|
|
135
148
|
msg == "MONGODB [WARNING] test warning"
|