diff options
Diffstat (limited to 'src/mongo/dbtests/mock_dbclient_conn_test.cpp')
-rw-r--r-- | src/mongo/dbtests/mock_dbclient_conn_test.cpp | 875 |
1 files changed, 447 insertions, 428 deletions
diff --git a/src/mongo/dbtests/mock_dbclient_conn_test.cpp b/src/mongo/dbtests/mock_dbclient_conn_test.cpp index c69fb80134a..86c794f4c22 100644 --- a/src/mongo/dbtests/mock_dbclient_conn_test.cpp +++ b/src/mongo/dbtests/mock_dbclient_conn_test.cpp @@ -50,554 +50,573 @@ using std::vector; namespace mongo_test { - TEST(MockDBClientConnTest, ServerAddress) { - MockRemoteDBServer server("test"); +TEST(MockDBClientConnTest, ServerAddress) { + MockRemoteDBServer server("test"); + MockDBClientConnection conn(&server); + + ASSERT_EQUALS("test", conn.getServerAddress()); + ASSERT_EQUALS("test", conn.toString()); +} + +TEST(MockDBClientConnTest, QueryCount) { + MockRemoteDBServer server("test"); + + { MockDBClientConnection conn(&server); - ASSERT_EQUALS("test", conn.getServerAddress()); - ASSERT_EQUALS("test", conn.toString()); + ASSERT_EQUALS(0U, server.getQueryCount()); + conn.query("foo.bar"); } - TEST(MockDBClientConnTest, QueryCount) { - MockRemoteDBServer server("test"); + ASSERT_EQUALS(1U, server.getQueryCount()); - { - MockDBClientConnection conn(&server); + { + MockDBClientConnection conn(&server); + conn.query("foo.bar"); + ASSERT_EQUALS(2U, server.getQueryCount()); + } +} - ASSERT_EQUALS(0U, server.getQueryCount()); - conn.query("foo.bar"); - } +TEST(MockDBClientConnTest, InsertAndQuery) { + MockRemoteDBServer server("test"); + const string ns("test.user"); - ASSERT_EQUALS(1U, server.getQueryCount()); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + ASSERT(!cursor->more()); - { - MockDBClientConnection conn(&server); - conn.query("foo.bar"); - ASSERT_EQUALS(2U, server.getQueryCount()); - } + server.insert(ns, BSON("x" << 1)); + server.insert(ns, BSON("y" << 2)); } - TEST(MockDBClientConnTest, InsertAndQuery) { - MockRemoteDBServer server("test"); - const string ns("test.user"); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - ASSERT(!cursor->more()); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(1, firstDoc["x"].numberInt()); - server.insert(ns, BSON("x" << 1)); - server.insert(ns, BSON("y" << 2)); - } + ASSERT(cursor->more()); + BSONObj secondDoc = cursor->next(); + ASSERT_EQUALS(2, secondDoc["y"].numberInt()); - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + ASSERT(!cursor->more()); + } - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(1, firstDoc["x"].numberInt()); + // Make sure that repeated calls will still give you the same result + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - ASSERT(cursor->more()); - BSONObj secondDoc = cursor->next(); - ASSERT_EQUALS(2, secondDoc["y"].numberInt()); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(1, firstDoc["x"].numberInt()); - ASSERT(!cursor->more()); - } + ASSERT(cursor->more()); + BSONObj secondDoc = cursor->next(); + ASSERT_EQUALS(2, secondDoc["y"].numberInt()); - // Make sure that repeated calls will still give you the same result - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + ASSERT(!cursor->more()); + } +} - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(1, firstDoc["x"].numberInt()); +TEST(MockDBClientConnTest, InsertAndQueryTwice) { + MockRemoteDBServer server("test"); + const string ns("test.user"); - ASSERT(cursor->more()); - BSONObj secondDoc = cursor->next(); - ASSERT_EQUALS(2, secondDoc["y"].numberInt()); + server.insert(ns, BSON("x" << 1)); - ASSERT(!cursor->more()); - } + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(1, firstDoc["x"].numberInt()); } - TEST(MockDBClientConnTest, InsertAndQueryTwice) { - MockRemoteDBServer server("test"); - const string ns("test.user"); + server.insert(ns, BSON("y" << 2)); - server.insert(ns, BSON("x" << 1)); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(1, firstDoc["x"].numberInt()); - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(1, firstDoc["x"].numberInt()); - } + ASSERT(cursor->more()); + BSONObj secondDoc = cursor->next(); + ASSERT_EQUALS(2, secondDoc["y"].numberInt()); - server.insert(ns, BSON("y" << 2)); + ASSERT(!cursor->more()); + } +} - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); +TEST(MockDBClientConnTest, QueryWithNoResults) { + MockRemoteDBServer server("test"); + const string ns("test.user"); - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(1, firstDoc["x"].numberInt()); + server.insert(ns, BSON("x" << 1)); + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query("other.ns"); - ASSERT(cursor->more()); - BSONObj secondDoc = cursor->next(); - ASSERT_EQUALS(2, secondDoc["y"].numberInt()); + ASSERT(!cursor->more()); +} - ASSERT(!cursor->more()); - } - } +TEST(MockDBClientConnTest, MultiNSInsertAndQuery) { + MockRemoteDBServer server("test"); + const string ns1("test.user"); + const string ns2("foo.bar"); + const string ns3("mongo.db"); - TEST(MockDBClientConnTest, QueryWithNoResults) { - MockRemoteDBServer server("test"); - const string ns("test.user"); + { + MockDBClientConnection conn(&server); + conn.insert(ns1, BSON("a" << 1)); + conn.insert(ns2, + BSON("ef" + << "gh")); + conn.insert(ns3, BSON("x" << 2)); + + conn.insert(ns1, BSON("b" << 3)); + conn.insert(ns2, + BSON("jk" + << "lm")); + + conn.insert(ns2, + BSON("x" + << "yz")); + } - server.insert(ns, BSON("x" << 1)); + { MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query("other.ns"); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns1); + + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(1, firstDoc["a"].numberInt()); + + ASSERT(cursor->more()); + BSONObj secondDoc = cursor->next(); + ASSERT_EQUALS(3, secondDoc["b"].numberInt()); ASSERT(!cursor->more()); } - TEST(MockDBClientConnTest, MultiNSInsertAndQuery) { - MockRemoteDBServer server("test"); - const string ns1("test.user"); - const string ns2("foo.bar"); - const string ns3("mongo.db"); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns2); - { - MockDBClientConnection conn(&server); - conn.insert(ns1, BSON("a" << 1)); - conn.insert(ns2, BSON("ef" << "gh")); - conn.insert(ns3, BSON("x" << 2)); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS("gh", firstDoc["ef"].String()); - conn.insert(ns1, BSON("b" << 3)); - conn.insert(ns2, BSON("jk" << "lm")); + ASSERT(cursor->more()); + BSONObj secondDoc = cursor->next(); + ASSERT_EQUALS("lm", secondDoc["jk"].String()); - conn.insert(ns2, BSON("x" << "yz")); - } + ASSERT(cursor->more()); + BSONObj thirdDoc = cursor->next(); + ASSERT_EQUALS("yz", thirdDoc["x"].String()); - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns1); + ASSERT(!cursor->more()); + } - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(1, firstDoc["a"].numberInt()); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns3); - ASSERT(cursor->more()); - BSONObj secondDoc = cursor->next(); - ASSERT_EQUALS(3, secondDoc["b"].numberInt()); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(2, firstDoc["x"].numberInt()); - ASSERT(!cursor->more()); - } + ASSERT(!cursor->more()); + } +} - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns2); +TEST(MockDBClientConnTest, SimpleRemove) { + MockRemoteDBServer server("test"); + const string ns("test.user"); - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS("gh", firstDoc["ef"].String()); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + ASSERT(!cursor->more()); - ASSERT(cursor->more()); - BSONObj secondDoc = cursor->next(); - ASSERT_EQUALS("lm", secondDoc["jk"].String()); + conn.insert(ns, BSON("x" << 1)); + conn.insert(ns, BSON("y" << 1)); + } - ASSERT(cursor->more()); - BSONObj thirdDoc = cursor->next(); - ASSERT_EQUALS("yz", thirdDoc["x"].String()); + { + MockDBClientConnection conn(&server); + conn.remove(ns, Query(), false); + } - ASSERT(!cursor->more()); - } + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns3); + ASSERT(!cursor->more()); + } - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(2, firstDoc["x"].numberInt()); + // Make sure that repeated calls will still give you the same result + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - ASSERT(!cursor->more()); - } + ASSERT(!cursor->more()); } +} - TEST(MockDBClientConnTest, SimpleRemove) { - MockRemoteDBServer server("test"); - const string ns("test.user"); +TEST(MockDBClientConnTest, MultiNSRemove) { + MockRemoteDBServer server("test"); + const string ns1("test.user"); + const string ns2("foo.bar"); + const string ns3("mongo.db"); - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - ASSERT(!cursor->more()); + { + MockDBClientConnection conn(&server); + conn.insert(ns1, BSON("a" << 1)); + conn.insert(ns2, + BSON("ef" + << "gh")); + conn.insert(ns3, BSON("x" << 2)); + + conn.insert(ns1, BSON("b" << 3)); + conn.insert(ns2, + BSON("jk" + << "lm")); + + conn.insert(ns2, + BSON("x" + << "yz")); + } - conn.insert(ns, BSON("x" << 1)); - conn.insert(ns, BSON("y" << 1)); - } + { + MockDBClientConnection conn(&server); + conn.remove(ns2, Query(), false); - { - MockDBClientConnection conn(&server); - conn.remove(ns, Query(), false); - } + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns2); + ASSERT(!cursor->more()); + } - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns1); - ASSERT(!cursor->more()); - } + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(1, firstDoc["a"].numberInt()); - // Make sure that repeated calls will still give you the same result - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); + ASSERT(cursor->more()); + BSONObj secondDoc = cursor->next(); + ASSERT_EQUALS(3, secondDoc["b"].numberInt()); - ASSERT(!cursor->more()); - } + ASSERT(!cursor->more()); } - TEST(MockDBClientConnTest, MultiNSRemove) { - MockRemoteDBServer server("test"); - const string ns1("test.user"); - const string ns2("foo.bar"); - const string ns3("mongo.db"); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns3); - { - MockDBClientConnection conn(&server); - conn.insert(ns1, BSON("a" << 1)); - conn.insert(ns2, BSON("ef" << "gh")); - conn.insert(ns3, BSON("x" << 2)); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(2, firstDoc["x"].numberInt()); - conn.insert(ns1, BSON("b" << 3)); - conn.insert(ns2, BSON("jk" << "lm")); + ASSERT(!cursor->more()); + } +} + +TEST(MockDBClientConnTest, InsertAfterRemove) { + MockRemoteDBServer server("test"); + const string ns("test.user"); - conn.insert(ns2, BSON("x" << "yz")); - } + { + MockDBClientConnection conn(&server); + conn.insert(ns, BSON("a" << 1)); + conn.insert(ns, BSON("b" << 3)); + conn.insert(ns, + BSON("x" + << "yz")); + } - { - MockDBClientConnection conn(&server); - conn.remove(ns2, Query(), false); + { + MockDBClientConnection conn(&server); + conn.remove(ns, Query(), false); + } - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns2); - ASSERT(!cursor->more()); - } + { + MockDBClientConnection conn(&server); + conn.insert(ns, BSON("x" << 100)); + } - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns1); + { + MockDBClientConnection conn(&server); + std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(1, firstDoc["a"].numberInt()); + ASSERT(cursor->more()); + BSONObj firstDoc = cursor->next(); + ASSERT_EQUALS(100, firstDoc["x"].numberInt()); - ASSERT(cursor->more()); - BSONObj secondDoc = cursor->next(); - ASSERT_EQUALS(3, secondDoc["b"].numberInt()); + ASSERT(!cursor->more()); + } +} - ASSERT(!cursor->more()); - } - - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns3); - - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(2, firstDoc["x"].numberInt()); - - ASSERT(!cursor->more()); - } - } - - TEST(MockDBClientConnTest, InsertAfterRemove) { - MockRemoteDBServer server("test"); - const string ns("test.user"); - - { - MockDBClientConnection conn(&server); - conn.insert(ns, BSON("a" << 1)); - conn.insert(ns, BSON("b" << 3)); - conn.insert(ns, BSON("x" << "yz")); - } - - { - MockDBClientConnection conn(&server); - conn.remove(ns, Query(), false); - } - - { - MockDBClientConnection conn(&server); - conn.insert(ns, BSON("x" << 100)); - } - - { - MockDBClientConnection conn(&server); - std::unique_ptr<mongo::DBClientCursor> cursor = conn.query(ns); - - ASSERT(cursor->more()); - BSONObj firstDoc = cursor->next(); - ASSERT_EQUALS(100, firstDoc["x"].numberInt()); - - ASSERT(!cursor->more()); - } - } - - TEST(MockDBClientConnTest, SetCmdReply) { - MockRemoteDBServer server("test"); - server.setCommandReply("serverStatus", BSON("ok" << 1 << "host" << "local")); - - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); - ASSERT_EQUALS(1, response["ok"].numberInt()); - ASSERT_EQUALS("local", response["host"].str()); - - ASSERT_EQUALS(1U, server.getCmdCount()); - } - - // Make sure that repeated calls will still give you the same result - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); - ASSERT_EQUALS(1, response["ok"].numberInt()); - ASSERT_EQUALS("local", response["host"].str()); - - ASSERT_EQUALS(2U, server.getCmdCount()); - } - - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); - ASSERT_EQUALS(1, response["ok"].numberInt()); - ASSERT_EQUALS("local", response["host"].str()); - - ASSERT_EQUALS(3U, server.getCmdCount()); - } - } - - TEST(MockDBClientConnTest, CyclingCmd) { - MockRemoteDBServer server("test"); - - { - vector<BSONObj> isMasterSequence; - isMasterSequence.push_back(BSON("set" << "a" - << "isMaster" << true - << "ok" << 1)); - isMasterSequence.push_back(BSON("set" << "a" - << "isMaster" << false - << "ok" << 1)); - server.setCommandReply("isMaster", isMasterSequence); - } - - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << 1), response)); - ASSERT_EQUALS(1, response["ok"].numberInt()); - ASSERT_EQUALS("a", response["set"].str()); - ASSERT(response["isMaster"].trueValue()); - - ASSERT_EQUALS(1U, server.getCmdCount()); - } - - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << 1), response)); - ASSERT_EQUALS(1, response["ok"].numberInt()); - ASSERT_EQUALS("a", response["set"].str()); - ASSERT(!response["isMaster"].trueValue()); - - ASSERT_EQUALS(2U, server.getCmdCount()); - } - - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << 1), response)); - ASSERT_EQUALS(1, response["ok"].numberInt()); - ASSERT_EQUALS("a", response["set"].str()); - ASSERT(response["isMaster"].trueValue()); - - ASSERT_EQUALS(3U, server.getCmdCount()); - } - } - - TEST(MockDBClientConnTest, CmdWithMultiFields) { - MockRemoteDBServer server("test"); - server.setCommandReply("getLastError", BSON("ok" << 1 << "n" << 10)); +TEST(MockDBClientConnTest, SetCmdReply) { + MockRemoteDBServer server("test"); + server.setCommandReply("serverStatus", + BSON("ok" << 1 << "host" + << "local")); + { MockDBClientConnection conn(&server); BSONObj response; - ASSERT(conn.runCommand("foo.baz", BSON("getLastError" << 1 << "w" << 2 - << "journal" << true), response)); + ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); + ASSERT_EQUALS(1, response["ok"].numberInt()); + ASSERT_EQUALS("local", response["host"].str()); - ASSERT_EQUALS(10, response["n"].numberInt()); + ASSERT_EQUALS(1U, server.getCmdCount()); } - TEST(MockDBClientConnTest, BadCmd) { - MockRemoteDBServer server("test"); - server.setCommandReply("getLastError", BSON("ok" << 0)); + // Make sure that repeated calls will still give you the same result + { + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); + ASSERT_EQUALS(1, response["ok"].numberInt()); + ASSERT_EQUALS("local", response["host"].str()); + + ASSERT_EQUALS(2U, server.getCmdCount()); + } + { MockDBClientConnection conn(&server); BSONObj response; - ASSERT(!conn.runCommand("foo.baz", BSON("getLastError" << 1), response)); + ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); + ASSERT_EQUALS(1, response["ok"].numberInt()); + ASSERT_EQUALS("local", response["host"].str()); + + ASSERT_EQUALS(3U, server.getCmdCount()); } +} - TEST(MockDBClientConnTest, MultipleStoredResponse) { - MockRemoteDBServer server("test"); - server.setCommandReply("getLastError", BSON("ok" << 1 << "n" << 10)); - server.setCommandReply("isMaster", BSON("ok" << 1 << "secondary" << false)); +TEST(MockDBClientConnTest, CyclingCmd) { + MockRemoteDBServer server("test"); + + { + vector<BSONObj> isMasterSequence; + isMasterSequence.push_back(BSON("set" + << "a" + << "isMaster" << true << "ok" << 1)); + isMasterSequence.push_back(BSON("set" + << "a" + << "isMaster" << false << "ok" << 1)); + server.setCommandReply("isMaster", isMasterSequence); + } + { MockDBClientConnection conn(&server); - { - BSONObj response; - ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << "abc"), response)); - ASSERT(!response["secondary"].trueValue()); - } + BSONObj response; + ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << 1), response)); + ASSERT_EQUALS(1, response["ok"].numberInt()); + ASSERT_EQUALS("a", response["set"].str()); + ASSERT(response["isMaster"].trueValue()); - { - BSONObj response; - ASSERT(conn.runCommand("a.b", BSON("getLastError" << 1), response)); - ASSERT_EQUALS(10, response["n"].numberInt()); - } + ASSERT_EQUALS(1U, server.getCmdCount()); } - TEST(MockDBClientConnTest, CmdCount) { - MockRemoteDBServer server("test"); - ASSERT_EQUALS(0U, server.getCmdCount()); + { + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << 1), response)); + ASSERT_EQUALS(1, response["ok"].numberInt()); + ASSERT_EQUALS("a", response["set"].str()); + ASSERT(!response["isMaster"].trueValue()); - server.setCommandReply("serverStatus", BSON("ok" << 1)); + ASSERT_EQUALS(2U, server.getCmdCount()); + } - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); - ASSERT_EQUALS(1U, server.getCmdCount()); - } + { + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT(conn.runCommand("foo.baz", BSON("isMaster" << 1), response)); + ASSERT_EQUALS(1, response["ok"].numberInt()); + ASSERT_EQUALS("a", response["set"].str()); + ASSERT(response["isMaster"].trueValue()); - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT(conn.runCommand("baz.bar", BSON("serverStatus" << 1), response)); - ASSERT_EQUALS(2U, server.getCmdCount()); - } + ASSERT_EQUALS(3U, server.getCmdCount()); } +} - TEST(MockDBClientConnTest, Shutdown) { - MockRemoteDBServer server("test"); - server.setCommandReply("serverStatus", BSON("ok" << 1)); - ASSERT(server.isRunning()); +TEST(MockDBClientConnTest, CmdWithMultiFields) { + MockRemoteDBServer server("test"); + server.setCommandReply("getLastError", BSON("ok" << 1 << "n" << 10)); - { - MockDBClientConnection conn(&server); + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT(conn.runCommand( + "foo.baz", BSON("getLastError" << 1 << "w" << 2 << "journal" << true), response)); - server.shutdown(); - ASSERT(!server.isRunning()); + ASSERT_EQUALS(10, response["n"].numberInt()); +} + +TEST(MockDBClientConnTest, BadCmd) { + MockRemoteDBServer server("test"); + server.setCommandReply("getLastError", BSON("ok" << 0)); - ASSERT_THROWS(conn.query("test.user"), mongo::SocketException); - } + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT(!conn.runCommand("foo.baz", BSON("getLastError" << 1), response)); +} - { - MockDBClientConnection conn(&server); - BSONObj response; - ASSERT_THROWS(conn.runCommand("test.user", - BSON("serverStatus" << 1), response), mongo::SocketException); - } +TEST(MockDBClientConnTest, MultipleStoredResponse) { + MockRemoteDBServer server("test"); + server.setCommandReply("getLastError", BSON("ok" << 1 << "n" << 10)); + server.setCommandReply("isMaster", BSON("ok" << 1 << "secondary" << false)); - ASSERT_EQUALS(0U, server.getQueryCount()); - ASSERT_EQUALS(0U, server.getCmdCount()); + MockDBClientConnection conn(&server); + { + BSONObj response; + ASSERT(conn.runCommand("foo.baz", + BSON("isMaster" + << "abc"), + response)); + ASSERT(!response["secondary"].trueValue()); + } + + { + BSONObj response; + ASSERT(conn.runCommand("a.b", BSON("getLastError" << 1), response)); + ASSERT_EQUALS(10, response["n"].numberInt()); } +} - TEST(MockDBClientConnTest, Restart) { - MockRemoteDBServer server("test"); - server.setCommandReply("serverStatus", BSON("ok" << 1)); +TEST(MockDBClientConnTest, CmdCount) { + MockRemoteDBServer server("test"); + ASSERT_EQUALS(0U, server.getCmdCount()); - MockDBClientConnection conn1(&server); + server.setCommandReply("serverStatus", BSON("ok" << 1)); - // Do some queries and commands then check the counters later that - // new instance still has it - conn1.query("test.user"); + { + MockDBClientConnection conn(&server); BSONObj response; - conn1.runCommand("test.user", BSON("serverStatus" << 1), response); + ASSERT(conn.runCommand("foo.bar", BSON("serverStatus" << 1), response)); + ASSERT_EQUALS(1U, server.getCmdCount()); + } + + { + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT(conn.runCommand("baz.bar", BSON("serverStatus" << 1), response)); + ASSERT_EQUALS(2U, server.getCmdCount()); + } +} + +TEST(MockDBClientConnTest, Shutdown) { + MockRemoteDBServer server("test"); + server.setCommandReply("serverStatus", BSON("ok" << 1)); + ASSERT(server.isRunning()); + + { + MockDBClientConnection conn(&server); server.shutdown(); - ASSERT_THROWS(conn1.query("test.user"), mongo::SocketException); + ASSERT(!server.isRunning()); - // New connections shouldn't work either - MockDBClientConnection conn2(&server); - ASSERT_THROWS(conn2.query("test.user"), mongo::SocketException); + ASSERT_THROWS(conn.query("test.user"), mongo::SocketException); + } - ASSERT_EQUALS(1U, server.getQueryCount()); - ASSERT_EQUALS(1U, server.getCmdCount()); + { + MockDBClientConnection conn(&server); + BSONObj response; + ASSERT_THROWS(conn.runCommand("test.user", BSON("serverStatus" << 1), response), + mongo::SocketException); + } - server.reboot(); - ASSERT(server.isRunning()); + ASSERT_EQUALS(0U, server.getQueryCount()); + ASSERT_EQUALS(0U, server.getCmdCount()); +} - { - MockDBClientConnection conn(&server); - conn.query("test.user"); - } +TEST(MockDBClientConnTest, Restart) { + MockRemoteDBServer server("test"); + server.setCommandReply("serverStatus", BSON("ok" << 1)); - // Old connections still shouldn't work - ASSERT_THROWS(conn1.query("test.user"), mongo::SocketException); - ASSERT_THROWS(conn2.query("test.user"), mongo::SocketException); + MockDBClientConnection conn1(&server); - ASSERT_EQUALS(2U, server.getQueryCount()); - ASSERT_EQUALS(1U, server.getCmdCount()); - } + // Do some queries and commands then check the counters later that + // new instance still has it + conn1.query("test.user"); + BSONObj response; + conn1.runCommand("test.user", BSON("serverStatus" << 1), response); + + server.shutdown(); + ASSERT_THROWS(conn1.query("test.user"), mongo::SocketException); + + // New connections shouldn't work either + MockDBClientConnection conn2(&server); + ASSERT_THROWS(conn2.query("test.user"), mongo::SocketException); - TEST(MockDBClientConnTest, ClearCounter) { - MockRemoteDBServer server("test"); - server.setCommandReply("serverStatus", BSON("ok" << 1)); + ASSERT_EQUALS(1U, server.getQueryCount()); + ASSERT_EQUALS(1U, server.getCmdCount()); + server.reboot(); + ASSERT(server.isRunning()); + + { MockDBClientConnection conn(&server); conn.query("test.user"); - BSONObj response; - conn.runCommand("test.user", BSON("serverStatus" << 1), response); - - server.clearCounters(); - ASSERT_EQUALS(0U, server.getQueryCount()); - ASSERT_EQUALS(0U, server.getCmdCount()); } - TEST(MockDBClientConnTest, Delay) { - MockRemoteDBServer server("test"); - server.setCommandReply("serverStatus", BSON("ok" << 1)); - server.setDelay(150); + // Old connections still shouldn't work + ASSERT_THROWS(conn1.query("test.user"), mongo::SocketException); + ASSERT_THROWS(conn2.query("test.user"), mongo::SocketException); - MockDBClientConnection conn(&server); + ASSERT_EQUALS(2U, server.getQueryCount()); + ASSERT_EQUALS(1U, server.getCmdCount()); +} - { - mongo::Timer timer; - conn.query("x.x"); - const int nowInMilliSec = timer.millis(); - // Use a more lenient lower bound since some platforms like Windows - // don't guarantee that sleeps will not wake up earlier (unlike - // nanosleep we use for Linux) - ASSERT_GREATER_THAN_OR_EQUALS(nowInMilliSec, 130); - } +TEST(MockDBClientConnTest, ClearCounter) { + MockRemoteDBServer server("test"); + server.setCommandReply("serverStatus", BSON("ok" << 1)); - { - mongo::Timer timer; - BSONObj response; - conn.runCommand("x.x", BSON("serverStatus" << 1), response); - const int nowInMilliSec = timer.millis(); - ASSERT_GREATER_THAN_OR_EQUALS(nowInMilliSec, 130); - } + MockDBClientConnection conn(&server); + conn.query("test.user"); + BSONObj response; + conn.runCommand("test.user", BSON("serverStatus" << 1), response); - ASSERT_EQUALS(1U, server.getQueryCount()); - ASSERT_EQUALS(1U, server.getCmdCount()); + server.clearCounters(); + ASSERT_EQUALS(0U, server.getQueryCount()); + ASSERT_EQUALS(0U, server.getCmdCount()); +} + +TEST(MockDBClientConnTest, Delay) { + MockRemoteDBServer server("test"); + server.setCommandReply("serverStatus", BSON("ok" << 1)); + server.setDelay(150); + + MockDBClientConnection conn(&server); + + { + mongo::Timer timer; + conn.query("x.x"); + const int nowInMilliSec = timer.millis(); + // Use a more lenient lower bound since some platforms like Windows + // don't guarantee that sleeps will not wake up earlier (unlike + // nanosleep we use for Linux) + ASSERT_GREATER_THAN_OR_EQUALS(nowInMilliSec, 130); + } + + { + mongo::Timer timer; + BSONObj response; + conn.runCommand("x.x", BSON("serverStatus" << 1), response); + const int nowInMilliSec = timer.millis(); + ASSERT_GREATER_THAN_OR_EQUALS(nowInMilliSec, 130); } + + ASSERT_EQUALS(1U, server.getQueryCount()); + ASSERT_EQUALS(1U, server.getCmdCount()); +} } |