2009-11-23 20:20:05 +00:00
|
|
|
require 'test/test_helper'
|
2010-02-20 00:17:38 +00:00
|
|
|
include Mongo
|
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
class ConnectionTest < Test::Unit::TestCase
|
|
|
|
context "Initialization: " do
|
2010-02-20 00:17:38 +00:00
|
|
|
setup do
|
2010-02-22 20:49:04 +00:00
|
|
|
def new_mock_socket
|
|
|
|
socket = Object.new
|
|
|
|
socket.stubs(:setsockopt).with(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
2010-06-14 22:56:44 +00:00
|
|
|
socket.expects(:close)
|
2010-02-22 20:49:04 +00:00
|
|
|
socket
|
|
|
|
end
|
2009-11-23 20:20:05 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
def new_mock_db
|
|
|
|
db = Object.new
|
|
|
|
end
|
2010-02-20 00:17:38 +00:00
|
|
|
end
|
2009-11-23 20:20:05 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
context "given a single node" do
|
|
|
|
setup do
|
|
|
|
@conn = Connection.new('localhost', 27017, :connect => false)
|
2010-07-19 16:07:46 +00:00
|
|
|
TCPSocket.stubs(:new).returns(new_mock_socket)
|
2009-11-23 20:20:05 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
admin_db = new_mock_db
|
|
|
|
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
|
|
|
@conn.expects(:[]).with('admin').returns(admin_db)
|
2010-07-19 16:07:46 +00:00
|
|
|
@conn.connect
|
2010-02-22 20:49:04 +00:00
|
|
|
end
|
2009-11-23 20:20:05 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "set localhost and port to master" do
|
|
|
|
assert_equal 'localhost', @conn.host
|
|
|
|
assert_equal 27017, @conn.port
|
|
|
|
end
|
2009-11-23 20:20:05 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "set connection pool to 1" do
|
|
|
|
assert_equal 1, @conn.size
|
2009-11-23 20:20:05 +00:00
|
|
|
end
|
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "default slave_ok to false" do
|
|
|
|
assert !@conn.slave_ok?
|
2009-11-23 20:20:05 +00:00
|
|
|
end
|
|
|
|
end
|
2010-02-17 20:15:07 +00:00
|
|
|
|
2010-07-19 16:07:46 +00:00
|
|
|
context "connecting to a replica set" do
|
|
|
|
setup do
|
|
|
|
TCPSocket.stubs(:new).returns(new_mock_socket)
|
|
|
|
@conn = Connection.new('localhost', 27017, :connect => false)
|
|
|
|
|
|
|
|
admin_db = new_mock_db
|
|
|
|
@hosts = ['localhost:27018', 'localhost:27019']
|
|
|
|
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1, 'hosts' => @hosts})
|
|
|
|
@conn.expects(:[]).with('admin').returns(admin_db)
|
|
|
|
@conn.connect
|
|
|
|
end
|
|
|
|
|
|
|
|
should "store the hosts returned from the ismaster command" do
|
|
|
|
@hosts.each do |host|
|
|
|
|
host, port = host.split(":")
|
|
|
|
port = port.to_i
|
|
|
|
assert @conn.nodes.include?([host, port]), "Connection doesn't include host #{host.inspect}."
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "connecting to a replica set and providing seed nodes" do
|
|
|
|
setup do
|
|
|
|
TCPSocket.stubs(:new).returns(new_mock_socket)
|
|
|
|
@conn = Connection.multi([['localhost', 27017], ['localhost', 27019]], :connect => false)
|
|
|
|
|
|
|
|
admin_db = new_mock_db
|
|
|
|
@hosts = ['localhost:27017', 'localhost:27018', 'localhost:27019']
|
|
|
|
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1, 'hosts' => @hosts})
|
|
|
|
@conn.expects(:[]).with('admin').returns(admin_db)
|
|
|
|
@conn.connect
|
|
|
|
end
|
|
|
|
|
|
|
|
should "not store any hosts redundantly" do
|
|
|
|
assert_equal 3, @conn.nodes.size
|
|
|
|
|
|
|
|
@hosts.each do |host|
|
|
|
|
host, port = host.split(":")
|
|
|
|
port = port.to_i
|
|
|
|
assert @conn.nodes.include?([host, port]), "Connection doesn't include host #{host.inspect}."
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
context "initializing a paired connection" do
|
|
|
|
should "require left and right nodes" do
|
|
|
|
assert_raise MongoArgumentError do
|
2010-07-19 16:07:46 +00:00
|
|
|
Connection.multi(['localhost', 27018], :connect => false)
|
2010-02-22 20:49:04 +00:00
|
|
|
end
|
2010-02-17 20:15:07 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
assert_raise MongoArgumentError do
|
2010-07-19 16:07:46 +00:00
|
|
|
Connection.multi(['localhost', 27018], :connect => false)
|
2010-02-22 20:49:04 +00:00
|
|
|
end
|
|
|
|
end
|
2010-02-17 20:15:07 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "store both nodes" do
|
2010-07-19 16:07:46 +00:00
|
|
|
@conn = Connection.multi([['localhost', 27017], ['localhost', 27018]], :connect => false)
|
2010-02-17 20:15:07 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
assert_equal ['localhost', 27017], @conn.nodes[0]
|
|
|
|
assert_equal ['localhost', 27018], @conn.nodes[1]
|
|
|
|
end
|
2010-02-20 00:17:38 +00:00
|
|
|
end
|
2010-02-17 20:15:07 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
context "initializing with a mongodb uri" do
|
|
|
|
should "parse a simple uri" do
|
|
|
|
@conn = Connection.from_uri("mongodb://localhost", :connect => false)
|
|
|
|
assert_equal ['localhost', 27017], @conn.nodes[0]
|
|
|
|
end
|
2010-02-17 20:15:07 +00:00
|
|
|
|
2010-06-15 02:06:55 +00:00
|
|
|
should "allow a complex host names" do
|
|
|
|
host_name = "foo.bar-12345.org"
|
|
|
|
@conn = Connection.from_uri("mongodb://#{host_name}", :connect => false)
|
|
|
|
assert_equal [host_name, 27017], @conn.nodes[0]
|
|
|
|
end
|
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "parse a uri specifying multiple nodes" do
|
|
|
|
@conn = Connection.from_uri("mongodb://localhost:27017,mydb.com:27018", :connect => false)
|
|
|
|
assert_equal ['localhost', 27017], @conn.nodes[0]
|
|
|
|
assert_equal ['mydb.com', 27018], @conn.nodes[1]
|
2010-02-17 20:15:07 +00:00
|
|
|
end
|
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "parse a uri specifying multiple nodes with auth" do
|
|
|
|
@conn = Connection.from_uri("mongodb://kyle:s3cr3t@localhost:27017/app,mickey:m0u5e@mydb.com:27018/dsny", :connect => false)
|
|
|
|
assert_equal ['localhost', 27017], @conn.nodes[0]
|
|
|
|
assert_equal ['mydb.com', 27018], @conn.nodes[1]
|
2010-02-25 19:58:32 +00:00
|
|
|
auth_hash = {'username' => 'kyle', 'password' => 's3cr3t', 'db_name' => 'app'}
|
|
|
|
assert_equal auth_hash, @conn.auths[0]
|
|
|
|
auth_hash = {'username' => 'mickey', 'password' => 'm0u5e', 'db_name' => 'dsny'}
|
|
|
|
assert_equal auth_hash, @conn.auths[1]
|
2010-02-17 20:15:07 +00:00
|
|
|
end
|
|
|
|
|
2010-06-19 19:15:19 +00:00
|
|
|
should "parse a uri with a hyphen & underscore in the username or password" do
|
|
|
|
@conn = Connection.from_uri("mongodb://hyphen-user_name:p-s_s@localhost:27017/db", :connect => false)
|
|
|
|
assert_equal ['localhost', 27017], @conn.nodes[0]
|
|
|
|
auth_hash = { 'db_name' => 'db', 'username' => 'hyphen-user_name', "password" => 'p-s_s' }
|
|
|
|
assert_equal auth_hash, @conn.auths[0]
|
|
|
|
end
|
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "attempt to connect" do
|
|
|
|
TCPSocket.stubs(:new).returns(new_mock_socket)
|
|
|
|
@conn = Connection.from_uri("mongodb://localhost", :connect => false)
|
|
|
|
|
|
|
|
admin_db = new_mock_db
|
|
|
|
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
|
|
|
@conn.expects(:[]).with('admin').returns(admin_db)
|
2010-02-25 19:58:32 +00:00
|
|
|
@conn.expects(:apply_saved_authentication)
|
2010-07-19 16:07:46 +00:00
|
|
|
@conn.connect
|
2010-02-17 20:15:07 +00:00
|
|
|
end
|
2009-11-23 20:20:05 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "raise an error on invalid uris" do
|
|
|
|
assert_raise MongoArgumentError do
|
|
|
|
Connection.from_uri("mongo://localhost", :connect => false)
|
|
|
|
end
|
|
|
|
|
|
|
|
assert_raise MongoArgumentError do
|
|
|
|
Connection.from_uri("mongodb://localhost:abc", :connect => false)
|
|
|
|
end
|
|
|
|
|
|
|
|
assert_raise MongoArgumentError do
|
|
|
|
Connection.from_uri("mongodb://localhost:27017, my.db.com:27018, ", :connect => false)
|
|
|
|
end
|
2010-02-20 00:17:38 +00:00
|
|
|
end
|
2009-12-02 21:43:30 +00:00
|
|
|
|
2010-02-22 20:49:04 +00:00
|
|
|
should "require all of username, password, and database if any one is specified" do
|
|
|
|
assert_raise MongoArgumentError do
|
|
|
|
Connection.from_uri("mongodb://localhost/db", :connect => false)
|
|
|
|
end
|
|
|
|
|
|
|
|
assert_raise MongoArgumentError do
|
|
|
|
Connection.from_uri("mongodb://kyle:password@localhost", :connect => false)
|
|
|
|
end
|
2010-02-20 00:17:38 +00:00
|
|
|
end
|
2009-12-02 21:43:30 +00:00
|
|
|
end
|
|
|
|
end
|
2009-11-25 15:25:28 +00:00
|
|
|
end
|