diff options
author | Matt Kangas <matt.kangas@mongodb.com> | 2014-12-02 10:40:19 -0500 |
---|---|---|
committer | Matt Kangas <matt.kangas@mongodb.com> | 2015-01-08 15:53:20 -0500 |
commit | 2f816f16726fae730731a649971f256188acd2b0 (patch) | |
tree | 545f2e43aa2a0a11792a0becb4b5a48d2e829968 /src/mongo/dbtests/commandtests.cpp | |
parent | f52a4ad8e5813f25bf60357978f8b08e16864bbb (diff) | |
download | mongo-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.cpp | 153 |
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 >(); } }; |