diff options
author | Aaron <aaron@10gen.com> | 2009-02-05 11:51:51 -0500 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2009-02-05 11:51:51 -0500 |
commit | 6b88cdc56ccccf207437d67bb65e8db5946aea69 (patch) | |
tree | d6e0510913e4c8d1ba817b3b48bdf1ce4498f9c7 /dbtests | |
parent | 9b7f4d830d90459b918e78e9ca9e58c33b4919f0 (diff) | |
download | mongo-6b88cdc56ccccf207437d67bb65e8db5946aea69.tar.gz |
More validation for modifier updates
Diffstat (limited to 'dbtests')
-rw-r--r-- | dbtests/querytests.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/dbtests/querytests.cpp b/dbtests/querytests.cpp index e3ec60d4d5b..5e4bf417db9 100644 --- a/dbtests/querytests.cpp +++ b/dbtests/querytests.cpp @@ -20,7 +20,9 @@ #include "../db/query.h" #include "../db/db.h" +#include "../db/instance.h" #include "../db/json.h" +#include "../db/lasterror.h" #include "dbtests.h" @@ -170,6 +172,82 @@ namespace QueryTests { } }; + class ClientBase { + public: + // NOTE: Not bothering to backup the old error record. + ClientBase() { + mongo::lastError.reset( new LastError() ); + } + ~ClientBase() { + mongo::lastError.release(); + } + protected: + static void insert( const char *ns, BSONObj o ) { + client_.insert( ns, o ); + } + static void update( const char *ns, BSONObj q, BSONObj o, bool upsert = 0 ) { + client_.update( ns, Query( q ), o, upsert ); + } + static bool error() { + return !client_.getPrevError().getField( "err" ).isNull(); + } + private: + static DBDirectClient client_; + }; + DBDirectClient ClientBase::client_; + + class Fail : public ClientBase { + public: + void run() { + prep(); + ASSERT( !error() ); + doIt(); + ASSERT( error() ); + } + protected: + const char *ns() { return "QueryTests::Fail"; } + virtual void prep() { + insert( ns(), fromjson( "{a:1}" ) ); + } + virtual void doIt() = 0; + }; + + class ModId : public Fail { + void doIt() { + update( ns(), emptyObj, fromjson( "{$set:{'_id':4}}" ) ); + } + }; + + class ModNonmodMix : public Fail { + void doIt() { + update( ns(), emptyObj, fromjson( "{$set:{a:4},z:3}" ) ); + } + }; + + class InvalidMod : public Fail { + void doIt() { + update( ns(), emptyObj, fromjson( "{$awk:{a:4}}" ) ); + } + }; + + class ModNotFirst : public Fail { + void doIt() { + update( ns(), emptyObj, fromjson( "{z:3,$set:{a:4}}" ) ); + } + }; + + class ModDuplicateFieldSpec : public Fail { + void doIt() { + update( ns(), emptyObj, fromjson( "{$set:{a:4},$inc:{a:1}}" ) ); + } + }; + + class ModNonNumber : public Fail { + void doIt() { + update( ns(), emptyObj, fromjson( "{$set:{a:'d'}}" ) ); + } + }; + class All : public UnitTest::Suite { public: All() { @@ -182,6 +260,12 @@ namespace QueryTests { add< CountQuery >(); add< CountFields >(); add< CountQueryFields >(); + add< ModId >(); + add< ModNonmodMix >(); + add< InvalidMod >(); + add< ModNotFirst >(); + add< ModDuplicateFieldSpec >(); + add< ModNonNumber >(); } }; |