summaryrefslogtreecommitdiff
path: root/src/mongo/dbtests/clienttests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/dbtests/clienttests.cpp')
-rw-r--r--src/mongo/dbtests/clienttests.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/mongo/dbtests/clienttests.cpp b/src/mongo/dbtests/clienttests.cpp
new file mode 100644
index 00000000000..a64894b43c1
--- /dev/null
+++ b/src/mongo/dbtests/clienttests.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2010 10gen Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// client.cpp
+
+#include "pch.h"
+#include "../client/dbclient.h"
+#include "dbtests.h"
+#include "../db/concurrency.h"
+
+namespace ClientTests {
+
+ class Base {
+ public:
+
+ Base( string coll ) {
+ _ns = (string)"test." + coll;
+ }
+
+ virtual ~Base() {
+ db.dropCollection( _ns );
+ }
+
+ const char * ns() { return _ns.c_str(); }
+
+ string _ns;
+ DBDirectClient db;
+ };
+
+
+ class DropIndex : public Base {
+ public:
+ DropIndex() : Base( "dropindex" ) {}
+ void run() {
+ db.insert( ns() , BSON( "x" << 2 ) );
+ ASSERT_EQUALS( 1 , db.getIndexes( ns() )->itcount() );
+
+ db.ensureIndex( ns() , BSON( "x" << 1 ) );
+ ASSERT_EQUALS( 2 , db.getIndexes( ns() )->itcount() );
+
+ db.dropIndex( ns() , BSON( "x" << 1 ) );
+ ASSERT_EQUALS( 1 , db.getIndexes( ns() )->itcount() );
+
+ db.ensureIndex( ns() , BSON( "x" << 1 ) );
+ ASSERT_EQUALS( 2 , db.getIndexes( ns() )->itcount() );
+
+ db.dropIndexes( ns() );
+ ASSERT_EQUALS( 1 , db.getIndexes( ns() )->itcount() );
+ }
+ };
+
+ class ReIndex : public Base {
+ public:
+ ReIndex() : Base( "reindex" ) {}
+ void run() {
+
+ db.insert( ns() , BSON( "x" << 2 ) );
+ ASSERT_EQUALS( 1 , db.getIndexes( ns() )->itcount() );
+
+ db.ensureIndex( ns() , BSON( "x" << 1 ) );
+ ASSERT_EQUALS( 2 , db.getIndexes( ns() )->itcount() );
+
+ db.reIndex( ns() );
+ ASSERT_EQUALS( 2 , db.getIndexes( ns() )->itcount() );
+ }
+
+ };
+
+ class ReIndex2 : public Base {
+ public:
+ ReIndex2() : Base( "reindex2" ) {}
+ void run() {
+
+ db.insert( ns() , BSON( "x" << 2 ) );
+ ASSERT_EQUALS( 1 , db.getIndexes( ns() )->itcount() );
+
+ db.ensureIndex( ns() , BSON( "x" << 1 ) );
+ ASSERT_EQUALS( 2 , db.getIndexes( ns() )->itcount() );
+
+ BSONObj out;
+ ASSERT( db.runCommand( "test" , BSON( "reIndex" << "reindex2" ) , out ) );
+ ASSERT_EQUALS( 2 , out["nIndexes"].number() );
+ ASSERT_EQUALS( 2 , db.getIndexes( ns() )->itcount() );
+ }
+
+ };
+
+ class CS_10 : public Base {
+ public:
+ CS_10() : Base( "CS_10" ) {}
+ void run() {
+ string longs( 770, 'c' );
+ for( int i = 0; i < 1111; ++i )
+ db.insert( ns(), BSON( "a" << i << "b" << longs ) );
+ db.ensureIndex( ns(), BSON( "a" << 1 << "b" << 1 ) );
+
+ auto_ptr< DBClientCursor > c = db.query( ns(), Query().sort( BSON( "a" << 1 << "b" << 1 ) ) );
+ ASSERT_EQUALS( 1111, c->itcount() );
+ }
+ };
+
+ class PushBack : public Base {
+ public:
+ PushBack() : Base( "PushBack" ) {}
+ void run() {
+ for( int i = 0; i < 10; ++i )
+ db.insert( ns(), BSON( "i" << i ) );
+ auto_ptr< DBClientCursor > c = db.query( ns(), Query().sort( BSON( "i" << 1 ) ) );
+
+ BSONObj o = c->next();
+ ASSERT( c->more() );
+ ASSERT_EQUALS( 9 , c->objsLeftInBatch() );
+ ASSERT( c->moreInCurrentBatch() );
+
+ c->putBack( o );
+ ASSERT( c->more() );
+ ASSERT_EQUALS( 10, c->objsLeftInBatch() );
+ ASSERT( c->moreInCurrentBatch() );
+
+ o = c->next();
+ BSONObj o2 = c->next();
+ BSONObj o3 = c->next();
+ c->putBack( o3 );
+ c->putBack( o2 );
+ c->putBack( o );
+ for( int i = 0; i < 10; ++i ) {
+ o = c->next();
+ ASSERT_EQUALS( i, o[ "i" ].number() );
+ }
+ ASSERT( !c->more() );
+ ASSERT_EQUALS( 0, c->objsLeftInBatch() );
+ ASSERT( !c->moreInCurrentBatch() );
+
+ c->putBack( o );
+ ASSERT( c->more() );
+ ASSERT_EQUALS( 1, c->objsLeftInBatch() );
+ ASSERT( c->moreInCurrentBatch() );
+ ASSERT_EQUALS( 1, c->itcount() );
+ }
+ };
+
+ class Create : public Base {
+ public:
+ Create() : Base( "Create" ) {}
+ void run() {
+ db.createCollection( "unittests.clienttests.create", 4096, true );
+ BSONObj info;
+ ASSERT( db.runCommand( "unittests", BSON( "collstats" << "clienttests.create" ), info ) );
+ }
+ };
+
+ class ConnectionStringTests {
+ public:
+ void run() {
+ {
+ ConnectionString s( "a/b,c,d" , ConnectionString::SET );
+ ASSERT_EQUALS( ConnectionString::SET , s.type() );
+ ASSERT_EQUALS( "a" , s.getSetName() );
+ vector<HostAndPort> v = s.getServers();
+ ASSERT_EQUALS( 3U , v.size() );
+ ASSERT_EQUALS( "b" , v[0].host() );
+ ASSERT_EQUALS( "c" , v[1].host() );
+ ASSERT_EQUALS( "d" , v[2].host() );
+ }
+ }
+ };
+
+ class All : public Suite {
+ public:
+ All() : Suite( "client" ) {
+ }
+
+ void setupTests() {
+ add<DropIndex>();
+ add<ReIndex>();
+ add<ReIndex2>();
+ add<CS_10>();
+ add<PushBack>();
+ add<Create>();
+ add<ConnectionStringTests>();
+ }
+
+ } all;
+}