diff options
Diffstat (limited to 'src/mongo/db/update/update_driver_test.cpp')
-rw-r--r-- | src/mongo/db/update/update_driver_test.cpp | 186 |
1 files changed, 142 insertions, 44 deletions
diff --git a/src/mongo/db/update/update_driver_test.cpp b/src/mongo/db/update/update_driver_test.cpp index 8f4bdfc25df..e7db2df426e 100644 --- a/src/mongo/db/update/update_driver_test.cpp +++ b/src/mongo/db/update/update_driver_test.cpp @@ -159,10 +159,21 @@ TEST(Collator, SetCollationUpdatesModifierInterfaces) { ASSERT_OK(driver.parse(updateDocument, arrayFilters)); ASSERT_EQUALS(driver.numMods(), 1U); + const BSONObj original; + const bool validateForStorage = true; + const FieldRefSet emptyImmutablePaths; bool modified = false; Document doc(fromjson("{a: 'cba'}")); driver.setCollator(&collator); - driver.update(StringData(), &doc, nullptr, nullptr, &modified).transitional_ignore(); + driver + .update(StringData(), + original, + &doc, + validateForStorage, + emptyImmutablePaths, + nullptr, + &modified) + .transitional_ignore(); ASSERT_TRUE(modified); } @@ -270,178 +281,265 @@ static void assertSameFields(const BSONObj& docA, const BSONObj& docB) { TEST_F(CreateFromQuery, BasicOp) { BSONObj query = fromjson("{a:1,b:2}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(query, doc().getObject()); } TEST_F(CreateFromQuery, BasicOpEq) { BSONObj query = fromjson("{a:{$eq:1}}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:1}"), doc().getObject()); } TEST_F(CreateFromQuery, BasicOpWithId) { BSONObj query = fromjson("{_id:1,a:1,b:2}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(query, doc().getObject()); } TEST_F(CreateFromQuery, BasicRepl) { BSONObj query = fromjson("{a:1,b:2}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{}"), doc().getObject()); } TEST_F(CreateFromQuery, BasicReplWithId) { BSONObj query = fromjson("{_id:1,a:1,b:2}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{_id:1}"), doc().getObject()); } TEST_F(CreateFromQuery, BasicReplWithIdEq) { BSONObj query = fromjson("{_id:{$eq:1},a:1,b:2}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{_id:1}"), doc().getObject()); } TEST_F(CreateFromQuery, NoRootIdOp) { BSONObj query = fromjson("{'_id.a':1,'_id.b':2}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{_id:{a:1,b:2}}"), doc().getObject()); } TEST_F(CreateFromQuery, NoRootIdRepl) { BSONObj query = fromjson("{'_id.a':1,'_id.b':2}"); - ASSERT_NOT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_NOT_OK( + driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } TEST_F(CreateFromQuery, NestedSharedRootOp) { BSONObj query = fromjson("{'a.c':1,'a.b':{$eq:2}}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:{c:1,b:2}}"), doc().getObject()); } TEST_F(CreateFromQuery, OrQueryOp) { BSONObj query = fromjson("{$or:[{a:1}]}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:1}"), doc().getObject()); } TEST_F(CreateFromQuery, OrQueryIdRepl) { BSONObj query = fromjson("{$or:[{_id:1}]}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{_id:1}"), doc().getObject()); } TEST_F(CreateFromQuery, OrQueryNoExtractOps) { BSONObj query = fromjson("{$or:[{a:1}, {b:2}]}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(BSONObj(), doc().getObject()); } TEST_F(CreateFromQuery, OrQueryNoExtractIdRepl) { BSONObj query = fromjson("{$or:[{_id:1}, {_id:2}]}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(BSONObj(), doc().getObject()); } TEST_F(CreateFromQuery, AndQueryOp) { BSONObj query = fromjson("{$and:[{'a.c':1},{'a.b':{$eq:2}}]}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:{c:1,b:2}}"), doc().getObject()); } TEST_F(CreateFromQuery, AndQueryIdRepl) { BSONObj query = fromjson("{$and:[{_id:1},{a:{$eq:2}}]}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{_id:1}"), doc().getObject()); } TEST_F(CreateFromQuery, AllArrayOp) { BSONObj query = fromjson("{a:{$all:[1]}}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:1}"), doc().getObject()); } TEST_F(CreateFromQuery, AllArrayIdRepl) { BSONObj query = fromjson("{_id:{$all:[1]}, b:2}"); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{_id:1}"), doc().getObject()); } TEST_F(CreateFromQuery, ConflictFieldsFailOp) { BSONObj query = fromjson("{a:1,'a.b':1}"); - ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_NOT_OK( + driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } TEST_F(CreateFromQuery, ConflictFieldsFailSameValueOp) { BSONObj query = fromjson("{a:{b:1},'a.b':1}"); - ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_NOT_OK( + driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } TEST_F(CreateFromQuery, ConflictWithIdRepl) { BSONObj query = fromjson("{_id:1,'_id.a':1}"); - ASSERT_NOT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_NOT_OK( + driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } TEST_F(CreateFromQuery, ConflictAndQueryOp) { BSONObj query = fromjson("{$and:[{a:{b:1}},{'a.b':{$eq:1}}]}"); - ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_NOT_OK( + driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } TEST_F(CreateFromQuery, ConflictAllMultipleValsOp) { BSONObj query = fromjson("{a:{$all:[1, 2]}}"); - ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_NOT_OK( + driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } TEST_F(CreateFromQuery, NoConflictOrQueryOp) { BSONObj query = fromjson("{$or:[{a:{b:1}},{'a.b':{$eq:1}}]}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(BSONObj(), doc().getObject()); } TEST_F(CreateFromQuery, ImmutableFieldsOp) { BSONObj query = fromjson("{$or:[{a:{b:1}},{'a.b':{$eq:1}}]}"); - ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, NULL, doc())); + FieldRef idFieldRef("_id"); + FieldRefSet immutablePaths; + immutablePaths.insert(&idFieldRef); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(BSONObj(), doc().getObject()); } TEST_F(CreateFromQuery, ShardKeyRepl) { BSONObj query = fromjson("{a:{$eq:1}}, b:2}"); - OwnedPointerVector<FieldRef> immutablePaths; - immutablePaths.push_back(new FieldRef("a")); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields( - opCtx(), query, &immutablePaths.vector(), doc())); + OwnedPointerVector<FieldRef> immutablePathsVector; + immutablePathsVector.push_back(new FieldRef("a")); + immutablePathsVector.push_back(new FieldRef("_id")); + FieldRefSet immutablePaths; + immutablePaths.fillFrom(immutablePathsVector.vector()); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:1}"), doc().getObject()); } TEST_F(CreateFromQuery, NestedShardKeyRepl) { BSONObj query = fromjson("{a:{$eq:1},'b.c':2},d:2}"); - OwnedPointerVector<FieldRef> immutablePaths; - immutablePaths.push_back(new FieldRef("a")); - immutablePaths.push_back(new FieldRef("b.c")); - ASSERT_OK(driverRepl().populateDocumentWithQueryFields( - opCtx(), query, &immutablePaths.vector(), doc())); + OwnedPointerVector<FieldRef> immutablePathsVector; + immutablePathsVector.push_back(new FieldRef("a")); + immutablePathsVector.push_back(new FieldRef("b.c")); + immutablePathsVector.push_back(new FieldRef("_id")); + FieldRefSet immutablePaths; + immutablePaths.fillFrom(immutablePathsVector.vector()); + ASSERT_OK(driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:1,b:{c:2}}"), doc().getObject()); } TEST_F(CreateFromQuery, NestedShardKeyOp) { BSONObj query = fromjson("{a:{$eq:1},'b.c':2,d:{$all:[3]}},e:2}"); - OwnedPointerVector<FieldRef> immutablePaths; - immutablePaths.push_back(new FieldRef("a")); - immutablePaths.push_back(new FieldRef("b.c")); - ASSERT_OK(driverOps().populateDocumentWithQueryFields( - opCtx(), query, &immutablePaths.vector(), doc())); + OwnedPointerVector<FieldRef> immutablePathsVector; + immutablePathsVector.push_back(new FieldRef("a")); + immutablePathsVector.push_back(new FieldRef("b.c")); + immutablePathsVector.push_back(new FieldRef("_id")); + FieldRefSet immutablePaths; + immutablePaths.fillFrom(immutablePathsVector.vector()); + ASSERT_OK(driverOps().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); assertSameFields(fromjson("{a:1,b:{c:2},d:3}"), doc().getObject()); } TEST_F(CreateFromQuery, NotFullShardKeyRepl) { BSONObj query = fromjson("{a:{$eq:1}, 'b.c':2}, d:2}"); - OwnedPointerVector<FieldRef> immutablePaths; - immutablePaths.push_back(new FieldRef("a")); - immutablePaths.push_back(new FieldRef("b")); - ASSERT_NOT_OK(driverRepl().populateDocumentWithQueryFields( - opCtx(), query, &immutablePaths.vector(), doc())); + OwnedPointerVector<FieldRef> immutablePathsVector; + immutablePathsVector.push_back(new FieldRef("a")); + immutablePathsVector.push_back(new FieldRef("b")); + immutablePathsVector.push_back(new FieldRef("_id")); + FieldRefSet immutablePaths; + immutablePaths.fillFrom(immutablePathsVector.vector()); + ASSERT_NOT_OK( + driverRepl().populateDocumentWithQueryFields(opCtx(), query, immutablePaths, doc())); } } // namespace |