summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage/record_store_test_deleterecord.cpp
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2014-10-07 22:18:50 -0400
committerMax Hirschhorn <max.hirschhorn@mongodb.com>2014-10-07 22:18:50 -0400
commit6282f86e966b58cce4eab9403ff428118ae0ad0a (patch)
tree9371f8ba61bd574c2662b524c251d731cd6d2079 /src/mongo/db/storage/record_store_test_deleterecord.cpp
parent5e46ce21ff9f5b8034f6f7828c2b817cdaee9bad (diff)
downloadmongo-6282f86e966b58cce4eab9403ff428118ae0ad0a.tar.gz
SERVER-13635 Expand set of generic RecordStore API tests.
Diffstat (limited to 'src/mongo/db/storage/record_store_test_deleterecord.cpp')
-rw-r--r--src/mongo/db/storage/record_store_test_deleterecord.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/mongo/db/storage/record_store_test_deleterecord.cpp b/src/mongo/db/storage/record_store_test_deleterecord.cpp
new file mode 100644
index 00000000000..6d589b418fa
--- /dev/null
+++ b/src/mongo/db/storage/record_store_test_deleterecord.cpp
@@ -0,0 +1,139 @@
+// record_store_test_deleterecord.cpp
+
+/**
+ * Copyright (C) 2014 MongoDB 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/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#include "mongo/db/storage/record_store_test_harness.h"
+
+#include "mongo/db/diskloc.h"
+#include "mongo/db/storage/record_data.h"
+#include "mongo/db/storage/record_store.h"
+#include "mongo/unittest/unittest.h"
+
+using std::string;
+using std::stringstream;
+
+namespace mongo {
+
+ // Insert a record and try to delete it.
+ TEST( RecordStoreTestHarness, DeleteRecord ) {
+ scoped_ptr<HarnessHelper> harnessHelper( newHarnessHelper() );
+ scoped_ptr<RecordStore> rs( harnessHelper->newNonCappedRecordStore() );
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ ASSERT_EQUALS( 0, rs->numRecords( opCtx.get() ) );
+ }
+
+ string data = "my record";
+ DiskLoc loc;
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ {
+ WriteUnitOfWork uow( opCtx.get() );
+ StatusWith<DiskLoc> res = rs->insertRecord( opCtx.get(),
+ data.c_str(),
+ data.size() + 1,
+ false );
+ ASSERT_OK( res.getStatus() );
+ loc = res.getValue();
+ uow.commit();
+ }
+ }
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ ASSERT_EQUALS( 1, rs->numRecords( opCtx.get() ) );
+ }
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ {
+ WriteUnitOfWork uow( opCtx.get() );
+ rs->deleteRecord( opCtx.get(), loc );
+ uow.commit();
+ }
+ }
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ ASSERT_EQUALS( 0, rs->numRecords( opCtx.get() ) );
+ }
+ }
+
+ // Insert multiple records and try to delete them.
+ TEST( RecordStoreTestHarness, DeleteMultipleRecords ) {
+ scoped_ptr<HarnessHelper> harnessHelper( newHarnessHelper() );
+ scoped_ptr<RecordStore> rs( harnessHelper->newNonCappedRecordStore() );
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ ASSERT_EQUALS( 0, rs->numRecords( opCtx.get() ) );
+ }
+
+ const int nToInsert = 10;
+ DiskLoc locs[nToInsert];
+ for ( int i = 0; i < nToInsert; i++ ) {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ {
+ stringstream ss;
+ ss << "record " << i;
+ string data = ss.str();
+
+ WriteUnitOfWork uow( opCtx.get() );
+ StatusWith<DiskLoc> res = rs->insertRecord( opCtx.get(),
+ data.c_str(),
+ data.size() + 1,
+ false );
+ ASSERT_OK( res.getStatus() );
+ locs[i] = res.getValue();
+ uow.commit();
+ }
+ }
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ ASSERT_EQUALS( nToInsert, rs->numRecords( opCtx.get() ) );
+ }
+
+ for ( int i = 0; i < nToInsert; i++ ) {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ {
+ WriteUnitOfWork uow( opCtx.get() );
+ rs->deleteRecord( opCtx.get(), locs[i] );
+ uow.commit();
+ }
+ }
+
+ {
+ scoped_ptr<OperationContext> opCtx( harnessHelper->newOperationContext() );
+ ASSERT_EQUALS( 0, rs->numRecords( opCtx.get() ) );
+ }
+ }
+
+} // namespace mongo