// Insert a single record. Create a random iterator pointing to that single record. // Then check we'll retrieve the record. TEST(RecordStoreTestHarness, GetRandomIteratorSingleton) { unique_ptr<HarnessHelper> harnessHelper(newHarnessHelper()); unique_ptr<RecordStore> rs(harnessHelper->newNonCappedRecordStore()); { unique_ptr<OperationContext> opCtx(harnessHelper->newOperationContext()); ASSERT_EQ(0, rs->numRecords(opCtx.get())); } // Insert one record. RecordId idToRetrieve; { unique_ptr<OperationContext> opCtx(harnessHelper->newOperationContext()); WriteUnitOfWork uow(opCtx.get()); StatusWith<RecordId> res = rs->insertRecord(opCtx.get(), "some data", 10, false); ASSERT_OK(res.getStatus()); idToRetrieve = res.getValue(); uow.commit(); } // Double-check that the record store has one record in it now. { unique_ptr<OperationContext> opCtx(harnessHelper->newOperationContext()); ASSERT_EQ(1, rs->numRecords(opCtx.get())); } { unique_ptr<OperationContext> opCtx(harnessHelper->newOperationContext()); auto cursor = rs->getRandomCursor(opCtx.get()); // returns NULL if getRandomCursor is not supported if (!cursor) { return; } // We should be pointing at the only record in the store. // Check deattaching / reattaching cursor->save(); cursor->detachFromOperationContext(); opCtx = harnessHelper->newOperationContext(); cursor->reattachToOperationContext(opCtx.get()); ASSERT_TRUE(cursor->restore()); auto record = cursor->next(); ASSERT_EQUALS(record->id, idToRetrieve); // Iterator should either be EOF now, or keep returning the single existing document for (int i = 0; i < 10; i++) { record = cursor->next(); ASSERT(!record || record->id == idToRetrieve); } } }
~RandomCursor() { detachFromOperationContext(); }