summaryrefslogtreecommitdiff
path: root/src/mongo/dbtests/commandtests.cpp
diff options
context:
space:
mode:
authorMatt Kangas <matt.kangas@mongodb.com>2014-12-02 10:40:19 -0500
committerMatt Kangas <matt.kangas@mongodb.com>2015-01-08 15:53:20 -0500
commit2f816f16726fae730731a649971f256188acd2b0 (patch)
tree545f2e43aa2a0a11792a0becb4b5a48d2e829968 /src/mongo/dbtests/commandtests.cpp
parentf52a4ad8e5813f25bf60357978f8b08e16864bbb (diff)
downloadmongo-2f816f16726fae730731a649971f256188acd2b0.tar.gz
SERVER-16260 Accept Symbol BSON type arg for some commands
Followup to SERVER-16072 Add dbtest for commands that accept Symbol BSON type as collection name - Includes SConscript tweak to link missing "touch" command into dbtest
Diffstat (limited to 'src/mongo/dbtests/commandtests.cpp')
-rw-r--r--src/mongo/dbtests/commandtests.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/mongo/dbtests/commandtests.cpp b/src/mongo/dbtests/commandtests.cpp
index c653925664f..b90dd1ec399 100644
--- a/src/mongo/dbtests/commandtests.cpp
+++ b/src/mongo/dbtests/commandtests.cpp
@@ -99,6 +99,153 @@ namespace CommandTests {
};
}
+namespace SymbolArgument {
+ // SERVER-16260
+ // The Ruby driver expects server commands to accept the Symbol BSON type as a collection name.
+ // This is a historical quirk that we shall support until corrected versions of the Ruby driver
+ // can be distributed. Retain these tests until MongoDB 3.0
+
+ class Base {
+ public:
+ Base() : db(&_txn) {
+ db.dropCollection(ns());
+ }
+
+ const char* ns() { return "test.symbolarg"; }
+ const char* nsDb() { return "test"; }
+ const char* nsColl() { return "symbolarg"; }
+
+ OperationContextImpl _txn;
+ DBDirectClient db;
+ };
+
+ class Drop : Base {
+ public:
+ void run() {
+ ASSERT( db.createCollection(ns()) );
+ {
+ BSONObjBuilder cmd;
+ cmd.appendSymbol("drop", nsColl()); // Use Symbol for SERVER-16260
+
+ BSONObj result;
+ bool ok = db.runCommand(nsDb(), cmd.obj(), result);
+ log() << result.jsonString();
+ ASSERT(ok);
+ }
+ db.resetIndexCache();
+ }
+ };
+
+ class DropIndexes : Base {
+ public:
+ void run() {
+ ASSERT( db.createCollection(ns()) );
+
+ BSONObjBuilder cmd;
+ cmd.appendSymbol("dropIndexes", nsColl()); // Use Symbol for SERVER-16260
+ cmd.append("index", "*");
+
+ BSONObj result;
+ bool ok = db.runCommand(nsDb(), cmd.obj(), result);
+ log() << result.jsonString();
+ ASSERT(ok);
+ }
+ };
+
+ class FindAndModify : Base {
+ public:
+ void run() {
+ ASSERT( db.createCollection(ns()) );
+ {
+ BSONObjBuilder b;
+ b.genOID();
+ b.append("name", "Tom");
+ b.append("rating", 0);
+ db.insert(ns(), b.obj());
+ }
+
+ BSONObjBuilder cmd;
+ cmd.appendSymbol("findAndModify", nsColl()); // Use Symbol for SERVER-16260
+ cmd.append("update", BSON("$inc" << BSON("score" << 1)) );
+ cmd.append("new", true);
+
+ BSONObj result;
+ bool ok = db.runCommand(nsDb(), cmd.obj(), result);
+ log() << result.jsonString();
+ ASSERT(ok);
+ // TODO(kangas) test that Tom's score is 1
+ }
+ };
+
+ class GeoSearch : Base {
+ public:
+ void run() {
+ // Subset of geo_haystack1.js
+
+ int n = 0;
+ for (int x = 0; x < 20; x++) {
+ for (int y = 0; y < 20; y++) {
+ db.insert(ns(), BSON("_id" << n <<
+ "loc" << BSON_ARRAY(x << y) <<
+ "z" << n % 5));
+ n++;
+ }
+ }
+
+ // Build geoHaystack index. Can's use db.ensureIndex, no way to pass "bucketSize".
+ // So run createIndexes command instead.
+ //
+ // Shell example:
+ // t.ensureIndex( { loc : "geoHaystack" , z : 1 }, { bucketSize : .7 } );
+
+ {
+ BSONObjBuilder cmd;
+ cmd.append("createIndexes", nsColl());
+ cmd.append("indexes", BSON_ARRAY(
+ BSON("key" << BSON("loc" << "geoHaystack" << "z" << 1.0) <<
+ "name" << "loc_geoHaystack_z_1" <<
+ "bucketSize" << static_cast<double>(0.7))
+ ));
+
+ BSONObj result;
+ ASSERT( db.runCommand(nsDb(), cmd.obj(), result) );
+ }
+
+ {
+ BSONObjBuilder cmd;
+ cmd.appendSymbol("geoSearch", nsColl()); // Use Symbol for SERVER-16260
+ cmd.append("near", BSON_ARRAY(7 << 8));
+ cmd.append("maxDistance", 3);
+ cmd.append("search", BSON("z" << 3));
+
+ BSONObj result;
+ bool ok = db.runCommand(nsDb(), cmd.obj(), result);
+ log() << result.jsonString();
+ ASSERT(ok);
+ }
+ }
+ };
+
+ class Touch : Base {
+ public:
+ void run() {
+ ASSERT( db.createCollection(ns()) );
+ {
+ BSONObjBuilder cmd;
+ cmd.appendSymbol("touch", nsColl()); // Use Symbol for SERVER-16260
+ cmd.append("data", true);
+ cmd.append("index", true);
+
+ BSONObj result;
+ bool ok = db.runCommand(nsDb(), cmd.obj(), result);
+ log() << result.jsonString();
+ ASSERT(ok || result["code"].Int() == ErrorCodes::CommandNotSupported);
+ }
+ }
+ };
+
+} // SymbolArgument
+
class All : public Suite {
public:
All() : Suite( "commands" ) {
@@ -107,6 +254,12 @@ namespace CommandTests {
void setupTests() {
add< FileMD5::Type0 >();
add< FileMD5::Type2 >();
+ add< FileMD5::Type2 >();
+ add< SymbolArgument::DropIndexes >();
+ add< SymbolArgument::FindAndModify >();
+ add< SymbolArgument::Touch >();
+ add< SymbolArgument::Drop >();
+ add< SymbolArgument::GeoSearch >();
}
};