summaryrefslogtreecommitdiff
path: root/src/mongo/dbtests/counttests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/dbtests/counttests.cpp')
-rw-r--r--src/mongo/dbtests/counttests.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/mongo/dbtests/counttests.cpp b/src/mongo/dbtests/counttests.cpp
new file mode 100644
index 00000000000..0d2575f14e3
--- /dev/null
+++ b/src/mongo/dbtests/counttests.cpp
@@ -0,0 +1,142 @@
+// counttests.cpp : count.{h,cpp} unit tests.
+
+/**
+ * Copyright (C) 2008 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/>.
+ */
+
+#include "../db/ops/count.h"
+
+#include "../db/cursor.h"
+#include "../db/pdfile.h"
+
+#include "dbtests.h"
+
+namespace CountTests {
+
+ class Base {
+ dblock lk;
+ Client::Context _context;
+ public:
+ Base() : _context( ns() ) {
+ addIndex( fromjson( "{\"a\":1}" ) );
+ }
+ ~Base() {
+ try {
+ boost::shared_ptr<Cursor> c = theDataFileMgr.findAll( ns() );
+ vector< DiskLoc > toDelete;
+ for(; c->ok(); c->advance() )
+ toDelete.push_back( c->currLoc() );
+ for( vector< DiskLoc >::iterator i = toDelete.begin(); i != toDelete.end(); ++i )
+ theDataFileMgr.deleteRecord( ns(), i->rec(), *i, false );
+ DBDirectClient cl;
+ cl.dropIndexes( ns() );
+ }
+ catch ( ... ) {
+ FAIL( "Exception while cleaning up collection" );
+ }
+ }
+ protected:
+ static const char *ns() {
+ return "unittests.counttests";
+ }
+ static void addIndex( const BSONObj &key ) {
+ BSONObjBuilder b;
+ b.append( "name", key.firstElementFieldName() );
+ b.append( "ns", ns() );
+ b.append( "key", key );
+ BSONObj o = b.done();
+ stringstream indexNs;
+ indexNs << "unittests.system.indexes";
+ theDataFileMgr.insert( indexNs.str().c_str(), o.objdata(), o.objsize() );
+ }
+ static void insert( const char *s ) {
+ insert( fromjson( s ) );
+ }
+ static void insert( const BSONObj &o ) {
+ theDataFileMgr.insert( ns(), o.objdata(), o.objsize() );
+ }
+ };
+
+ class CountBasic : public Base {
+ public:
+ void run() {
+ insert( "{\"a\":\"b\"}" );
+ BSONObj cmd = fromjson( "{\"query\":{}}" );
+ string err;
+ ASSERT_EQUALS( 1, runCount( ns(), cmd, err ) );
+ }
+ };
+
+ class CountQuery : public Base {
+ public:
+ void run() {
+ insert( "{\"a\":\"b\"}" );
+ insert( "{\"a\":\"b\",\"x\":\"y\"}" );
+ insert( "{\"a\":\"c\"}" );
+ BSONObj cmd = fromjson( "{\"query\":{\"a\":\"b\"}}" );
+ string err;
+ ASSERT_EQUALS( 2, runCount( ns(), cmd, err ) );
+ }
+ };
+
+ class CountFields : public Base {
+ public:
+ void run() {
+ insert( "{\"a\":\"b\"}" );
+ insert( "{\"c\":\"d\"}" );
+ BSONObj cmd = fromjson( "{\"query\":{},\"fields\":{\"a\":1}}" );
+ string err;
+ ASSERT_EQUALS( 2, runCount( ns(), cmd, err ) );
+ }
+ };
+
+ class CountQueryFields : public Base {
+ public:
+ void run() {
+ insert( "{\"a\":\"b\"}" );
+ insert( "{\"a\":\"c\"}" );
+ insert( "{\"d\":\"e\"}" );
+ BSONObj cmd = fromjson( "{\"query\":{\"a\":\"b\"},\"fields\":{\"a\":1}}" );
+ string err;
+ ASSERT_EQUALS( 1, runCount( ns(), cmd, err ) );
+ }
+ };
+
+ class CountIndexedRegex : public Base {
+ public:
+ void run() {
+ insert( "{\"a\":\"b\"}" );
+ insert( "{\"a\":\"c\"}" );
+ BSONObj cmd = fromjson( "{\"query\":{\"a\":/^b/}}" );
+ string err;
+ ASSERT_EQUALS( 1, runCount( ns(), cmd, err ) );
+ }
+ };
+
+ class All : public Suite {
+ public:
+ All() : Suite( "count" ) {
+ }
+
+ void setupTests() {
+ add< CountBasic >();
+ add< CountQuery >();
+ add< CountFields >();
+ add< CountQueryFields >();
+ add< CountIndexedRegex >();
+ }
+ } myall;
+
+} // namespace CountTests