summaryrefslogtreecommitdiff
path: root/dbtests
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2009-02-05 11:51:51 -0500
committerAaron <aaron@10gen.com>2009-02-05 11:51:51 -0500
commit6b88cdc56ccccf207437d67bb65e8db5946aea69 (patch)
treed6e0510913e4c8d1ba817b3b48bdf1ce4498f9c7 /dbtests
parent9b7f4d830d90459b918e78e9ca9e58c33b4919f0 (diff)
downloadmongo-6b88cdc56ccccf207437d67bb65e8db5946aea69.tar.gz
More validation for modifier updates
Diffstat (limited to 'dbtests')
-rw-r--r--dbtests/querytests.cpp84
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 >();
}
};