summaryrefslogtreecommitdiff
path: root/src/mongo/db/ops/update_driver_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/ops/update_driver_test.cpp')
-rw-r--r--src/mongo/db/ops/update_driver_test.cpp695
1 files changed, 342 insertions, 353 deletions
diff --git a/src/mongo/db/ops/update_driver_test.cpp b/src/mongo/db/ops/update_driver_test.cpp
index 1fd93aa27c1..1a778b231a9 100644
--- a/src/mongo/db/ops/update_driver_test.cpp
+++ b/src/mongo/db/ops/update_driver_test.cpp
@@ -42,362 +42,351 @@
namespace {
- using mongo::BSONObj;
- using mongo::BSONElement;
- using mongo::BSONObjIterator;
- using mongo::FieldRef;
- using mongo::fromjson;
- using mongo::OwnedPointerVector;
- using mongo::UpdateIndexData;
- using mongo::mutablebson::Document;
- using mongo::StringData;
- using mongo::UpdateDriver;
- using mongoutils::str::stream;
-
- TEST(Parse, Normal) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_OK(driver.parse(fromjson("{$set:{a:1}}")));
- ASSERT_EQUALS(driver.numMods(), 1U);
- ASSERT_FALSE(driver.isDocReplacement());
- }
-
- TEST(Parse, MultiMods) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_OK(driver.parse(fromjson("{$set:{a:1, b:1}}")));
- ASSERT_EQUALS(driver.numMods(), 2U);
- ASSERT_FALSE(driver.isDocReplacement());
- }
-
- TEST(Parse, MixingMods) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_OK(driver.parse(fromjson("{$set:{a:1}, $unset:{b:1}}")));
- ASSERT_EQUALS(driver.numMods(), 2U);
- ASSERT_FALSE(driver.isDocReplacement());
- }
-
- TEST(Parse, ObjectReplacment) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_OK(driver.parse(fromjson("{obj: \"obj replacement\"}")));
- ASSERT_TRUE(driver.isDocReplacement());
- }
-
- TEST(Parse, EmptyMod) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_NOT_OK(driver.parse(fromjson("{$set:{}}")));
- }
-
- TEST(Parse, WrongMod) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_NOT_OK(driver.parse(fromjson("{$xyz:{a:1}}")));
- }
-
- TEST(Parse, WrongType) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_NOT_OK(driver.parse(fromjson("{$set:[{a:1}]}")));
- }
-
- TEST(Parse, ModsWithLaterObjReplacement) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_NOT_OK(driver.parse(fromjson("{$set:{a:1}, obj: \"obj replacement\"}")));
- }
-
- TEST(Parse, PushAll) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_OK(driver.parse(fromjson("{$pushAll:{a:[1,2,3]}}")));
- ASSERT_EQUALS(driver.numMods(), 1U);
- ASSERT_FALSE(driver.isDocReplacement());
- }
-
- TEST(Parse, SetOnInsert) {
- UpdateDriver::Options opts;
- UpdateDriver driver(opts);
- ASSERT_OK(driver.parse(fromjson("{$setOnInsert:{a:1}}")));
- ASSERT_EQUALS(driver.numMods(), 1U);
- ASSERT_FALSE(driver.isDocReplacement());
- }
-
- //
- // Tests of creating a base for an upsert from a query document
- // $or, $and, $all get special handling, as does the _id field
- //
- // NONGOAL: Testing all query parsing and nesting combinations
- //
-
- class CreateFromQueryFixture : public mongo::unittest::Test {
- public:
-
- CreateFromQueryFixture()
- : _driverOps(new UpdateDriver(UpdateDriver::Options())),
- _driverRepl(new UpdateDriver(UpdateDriver::Options())) {
- _driverOps->parse(fromjson("{$set:{'_':1}}"));
- _driverRepl->parse(fromjson("{}"));
- }
-
- Document& doc() {
- return _doc;
- }
-
- UpdateDriver& driverOps() {
- return *_driverOps;
- }
+using mongo::BSONObj;
+using mongo::BSONElement;
+using mongo::BSONObjIterator;
+using mongo::FieldRef;
+using mongo::fromjson;
+using mongo::OwnedPointerVector;
+using mongo::UpdateIndexData;
+using mongo::mutablebson::Document;
+using mongo::StringData;
+using mongo::UpdateDriver;
+using mongoutils::str::stream;
+
+TEST(Parse, Normal) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_OK(driver.parse(fromjson("{$set:{a:1}}")));
+ ASSERT_EQUALS(driver.numMods(), 1U);
+ ASSERT_FALSE(driver.isDocReplacement());
+}
+
+TEST(Parse, MultiMods) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_OK(driver.parse(fromjson("{$set:{a:1, b:1}}")));
+ ASSERT_EQUALS(driver.numMods(), 2U);
+ ASSERT_FALSE(driver.isDocReplacement());
+}
+
+TEST(Parse, MixingMods) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_OK(driver.parse(fromjson("{$set:{a:1}, $unset:{b:1}}")));
+ ASSERT_EQUALS(driver.numMods(), 2U);
+ ASSERT_FALSE(driver.isDocReplacement());
+}
+
+TEST(Parse, ObjectReplacment) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_OK(driver.parse(fromjson("{obj: \"obj replacement\"}")));
+ ASSERT_TRUE(driver.isDocReplacement());
+}
+
+TEST(Parse, EmptyMod) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_NOT_OK(driver.parse(fromjson("{$set:{}}")));
+}
+
+TEST(Parse, WrongMod) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_NOT_OK(driver.parse(fromjson("{$xyz:{a:1}}")));
+}
+
+TEST(Parse, WrongType) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_NOT_OK(driver.parse(fromjson("{$set:[{a:1}]}")));
+}
+
+TEST(Parse, ModsWithLaterObjReplacement) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_NOT_OK(driver.parse(fromjson("{$set:{a:1}, obj: \"obj replacement\"}")));
+}
+
+TEST(Parse, PushAll) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_OK(driver.parse(fromjson("{$pushAll:{a:[1,2,3]}}")));
+ ASSERT_EQUALS(driver.numMods(), 1U);
+ ASSERT_FALSE(driver.isDocReplacement());
+}
+
+TEST(Parse, SetOnInsert) {
+ UpdateDriver::Options opts;
+ UpdateDriver driver(opts);
+ ASSERT_OK(driver.parse(fromjson("{$setOnInsert:{a:1}}")));
+ ASSERT_EQUALS(driver.numMods(), 1U);
+ ASSERT_FALSE(driver.isDocReplacement());
+}
+
+//
+// Tests of creating a base for an upsert from a query document
+// $or, $and, $all get special handling, as does the _id field
+//
+// NONGOAL: Testing all query parsing and nesting combinations
+//
+
+class CreateFromQueryFixture : public mongo::unittest::Test {
+public:
+ CreateFromQueryFixture()
+ : _driverOps(new UpdateDriver(UpdateDriver::Options())),
+ _driverRepl(new UpdateDriver(UpdateDriver::Options())) {
+ _driverOps->parse(fromjson("{$set:{'_':1}}"));
+ _driverRepl->parse(fromjson("{}"));
+ }
+
+ Document& doc() {
+ return _doc;
+ }
+
+ UpdateDriver& driverOps() {
+ return *_driverOps;
+ }
+
+ UpdateDriver& driverRepl() {
+ return *_driverRepl;
+ }
+
+private:
+ std::unique_ptr<UpdateDriver> _driverOps;
+ std::unique_ptr<UpdateDriver> _driverRepl;
+ Document _doc;
+};
+
+// Make name nicer to report
+typedef CreateFromQueryFixture CreateFromQuery;
+
+static void assertSameFields(const BSONObj& docA, const BSONObj& docB);
- UpdateDriver& driverRepl() {
- return *_driverRepl;
- }
-
- private:
- std::unique_ptr<UpdateDriver> _driverOps;
- std::unique_ptr<UpdateDriver> _driverRepl;
- Document _doc;
- };
-
- // Make name nicer to report
- typedef CreateFromQueryFixture CreateFromQuery;
-
- static void assertSameFields(const BSONObj& docA, const BSONObj& docB);
-
- /**
- * Recursively asserts that two BSONElements contain the same data or sub-elements,
- * ignoring element order.
- */
- static void assertSameElements(const BSONElement& elA, const BSONElement& elB) {
- if (elA.type() != elB.type() || (!elA.isABSONObj() && !elA.valuesEqual(elB))) {
+/**
+ * Recursively asserts that two BSONElements contain the same data or sub-elements,
+ * ignoring element order.
+ */
+static void assertSameElements(const BSONElement& elA, const BSONElement& elB) {
+ if (elA.type() != elB.type() || (!elA.isABSONObj() && !elA.valuesEqual(elB))) {
+ FAIL(stream() << "element " << elA << " not equal to " << elB);
+ } else if (elA.type() == mongo::Array) {
+ std::vector<BSONElement> elsA = elA.Array();
+ std::vector<BSONElement> elsB = elB.Array();
+ if (elsA.size() != elsB.size())
FAIL(stream() << "element " << elA << " not equal to " << elB);
- }
- else if (elA.type() == mongo::Array) {
- std::vector<BSONElement> elsA = elA.Array();
- std::vector<BSONElement> elsB = elB.Array();
- if (elsA.size() != elsB.size())
- FAIL(stream() << "element " << elA << " not equal to " << elB);
-
- std::vector<BSONElement>::iterator arrItA = elsA.begin();
- std::vector<BSONElement>::iterator arrItB = elsB.begin();
- for (; arrItA != elsA.end(); ++arrItA, ++arrItB) {
- assertSameElements(*arrItA, *arrItB);
- }
- }
- else if (elA.type() == mongo::Object) {
- assertSameFields(elA.Obj(), elB.Obj());
- }
- }
-
- /**
- * Recursively asserts that two BSONObjects contain the same elements,
- * ignoring element order.
- */
- static void assertSameFields(const BSONObj& docA, const BSONObj& docB) {
-
- if (docA.nFields() != docB.nFields())
- FAIL(stream() << "document " << docA << " has different fields than " << docB);
- std::map<StringData, BSONElement> docAMap;
- BSONObjIterator itA(docA);
- while (itA.more()) {
- BSONElement elA = itA.next();
- docAMap.insert(std::make_pair(elA.fieldNameStringData(), elA));
+ std::vector<BSONElement>::iterator arrItA = elsA.begin();
+ std::vector<BSONElement>::iterator arrItB = elsB.begin();
+ for (; arrItA != elsA.end(); ++arrItA, ++arrItB) {
+ assertSameElements(*arrItA, *arrItB);
}
-
- BSONObjIterator itB(docB);
- while (itB.more()) {
- BSONElement elB = itB.next();
-
- std::map<StringData, BSONElement>::iterator seenIt = docAMap.find(elB
- .fieldNameStringData());
- if (seenIt == docAMap.end())
- FAIL(stream() << "element " << elB << " not found in " << docA);
-
- BSONElement elA = seenIt->second;
- assertSameElements(elA, elB);
- }
- }
-
- TEST_F(CreateFromQuery, BasicOp) {
- BSONObj query = fromjson("{a:1,b:2}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(query, doc().getObject());
- }
-
- TEST_F(CreateFromQuery, BasicOpEq) {
- BSONObj query = fromjson("{a:{$eq:1}}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{a:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, BasicOpWithId) {
- BSONObj query = fromjson("{_id:1,a:1,b:2}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(query, doc().getObject());
- }
-
- TEST_F(CreateFromQuery, BasicRepl) {
- BSONObj query = fromjson("{a:1,b:2}");
- ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{}"), doc().getObject());
+ } else if (elA.type() == mongo::Object) {
+ assertSameFields(elA.Obj(), elB.Obj());
}
+}
- TEST_F(CreateFromQuery, BasicReplWithId) {
- BSONObj query = fromjson("{_id:1,a:1,b:2}");
- ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, 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(query, NULL, doc()));
- assertSameFields(fromjson("{_id:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, NoRootIdOp) {
- BSONObj query = fromjson("{'_id.a':1,'_id.b':2}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, 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(query, NULL, doc()));
- }
-
- TEST_F(CreateFromQuery, NestedSharedRootOp) {
- BSONObj query = fromjson("{'a.c':1,'a.b':{$eq:2}}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{a:{c:1,b:2}}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, OrQueryOp) {
- BSONObj query = fromjson("{$or:[{a:1}]}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{a:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, OrQueryIdRepl) {
- BSONObj query = fromjson("{$or:[{_id:1}]}");
- ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{_id:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, OrQueryNoExtractOps) {
- BSONObj query = fromjson("{$or:[{a:1}, {b:2}]}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(BSONObj(), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, OrQueryNoExtractIdRepl) {
- BSONObj query = fromjson("{$or:[{_id:1}, {_id:2}]}");
- ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(BSONObj(), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, AndQueryOp) {
- BSONObj query = fromjson("{$and:[{'a.c':1},{'a.b':{$eq:2}}]}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, 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(query, NULL, doc()));
- assertSameFields(fromjson("{_id:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, AllArrayOp) {
- BSONObj query = fromjson("{a:{$all:[1]}}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{a:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, AllArrayIdRepl) {
- BSONObj query = fromjson("{_id:{$all:[1]}, b:2}");
- ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(fromjson("{_id:1}"), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, ConflictFieldsFailOp) {
- BSONObj query = fromjson("{a:1,'a.b':1}");
- ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- }
-
- TEST_F(CreateFromQuery, ConflictFieldsFailSameValueOp) {
- BSONObj query = fromjson("{a:{b:1},'a.b':1}");
- ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- }
-
- TEST_F(CreateFromQuery, ConflictWithIdRepl) {
- BSONObj query = fromjson("{_id:1,'_id.a':1}");
- ASSERT_NOT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
- }
-
- TEST_F(CreateFromQuery, ConflictAndQueryOp) {
- BSONObj query = fromjson("{$and:[{a:{b:1}},{'a.b':{$eq:1}}]}");
- ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- }
-
- TEST_F(CreateFromQuery, ConflictAllMultipleValsOp) {
- BSONObj query = fromjson("{a:{$all:[1, 2]}}");
- ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- }
-
- TEST_F(CreateFromQuery, NoConflictOrQueryOp) {
- BSONObj query = fromjson("{$or:[{a:{b:1}},{'a.b':{$eq:1}}]}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
- assertSameFields(BSONObj(), doc().getObject());
- }
-
- TEST_F(CreateFromQuery, ImmutableFieldsOp) {
- BSONObj query = fromjson("{$or:[{a:{b:1}},{'a.b':{$eq:1}}]}");
- ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, 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(query,
- &immutablePaths.vector(),
- 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(query,
- &immutablePaths.vector(),
- 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(query,
- &immutablePaths.vector(),
- 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(query,
- &immutablePaths.vector(),
- doc()));
- }
-
-} // unnamed namespace
+/**
+ * Recursively asserts that two BSONObjects contain the same elements,
+ * ignoring element order.
+ */
+static void assertSameFields(const BSONObj& docA, const BSONObj& docB) {
+ if (docA.nFields() != docB.nFields())
+ FAIL(stream() << "document " << docA << " has different fields than " << docB);
+
+ std::map<StringData, BSONElement> docAMap;
+ BSONObjIterator itA(docA);
+ while (itA.more()) {
+ BSONElement elA = itA.next();
+ docAMap.insert(std::make_pair(elA.fieldNameStringData(), elA));
+ }
+
+ BSONObjIterator itB(docB);
+ while (itB.more()) {
+ BSONElement elB = itB.next();
+
+ std::map<StringData, BSONElement>::iterator seenIt =
+ docAMap.find(elB.fieldNameStringData());
+ if (seenIt == docAMap.end())
+ FAIL(stream() << "element " << elB << " not found in " << docA);
+
+ BSONElement elA = seenIt->second;
+ assertSameElements(elA, elB);
+ }
+}
+
+TEST_F(CreateFromQuery, BasicOp) {
+ BSONObj query = fromjson("{a:1,b:2}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(query, doc().getObject());
+}
+
+TEST_F(CreateFromQuery, BasicOpEq) {
+ BSONObj query = fromjson("{a:{$eq:1}}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{a:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, BasicOpWithId) {
+ BSONObj query = fromjson("{_id:1,a:1,b:2}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(query, doc().getObject());
+}
+
+TEST_F(CreateFromQuery, BasicRepl) {
+ BSONObj query = fromjson("{a:1,b:2}");
+ ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, BasicReplWithId) {
+ BSONObj query = fromjson("{_id:1,a:1,b:2}");
+ ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, 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(query, NULL, doc()));
+ assertSameFields(fromjson("{_id:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, NoRootIdOp) {
+ BSONObj query = fromjson("{'_id.a':1,'_id.b':2}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, 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(query, NULL, doc()));
+}
+
+TEST_F(CreateFromQuery, NestedSharedRootOp) {
+ BSONObj query = fromjson("{'a.c':1,'a.b':{$eq:2}}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{a:{c:1,b:2}}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, OrQueryOp) {
+ BSONObj query = fromjson("{$or:[{a:1}]}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{a:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, OrQueryIdRepl) {
+ BSONObj query = fromjson("{$or:[{_id:1}]}");
+ ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{_id:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, OrQueryNoExtractOps) {
+ BSONObj query = fromjson("{$or:[{a:1}, {b:2}]}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(BSONObj(), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, OrQueryNoExtractIdRepl) {
+ BSONObj query = fromjson("{$or:[{_id:1}, {_id:2}]}");
+ ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(BSONObj(), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, AndQueryOp) {
+ BSONObj query = fromjson("{$and:[{'a.c':1},{'a.b':{$eq:2}}]}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, 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(query, NULL, doc()));
+ assertSameFields(fromjson("{_id:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, AllArrayOp) {
+ BSONObj query = fromjson("{a:{$all:[1]}}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{a:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, AllArrayIdRepl) {
+ BSONObj query = fromjson("{_id:{$all:[1]}, b:2}");
+ ASSERT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(fromjson("{_id:1}"), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, ConflictFieldsFailOp) {
+ BSONObj query = fromjson("{a:1,'a.b':1}");
+ ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+}
+
+TEST_F(CreateFromQuery, ConflictFieldsFailSameValueOp) {
+ BSONObj query = fromjson("{a:{b:1},'a.b':1}");
+ ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+}
+
+TEST_F(CreateFromQuery, ConflictWithIdRepl) {
+ BSONObj query = fromjson("{_id:1,'_id.a':1}");
+ ASSERT_NOT_OK(driverRepl().populateDocumentWithQueryFields(query, NULL, doc()));
+}
+
+TEST_F(CreateFromQuery, ConflictAndQueryOp) {
+ BSONObj query = fromjson("{$and:[{a:{b:1}},{'a.b':{$eq:1}}]}");
+ ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+}
+
+TEST_F(CreateFromQuery, ConflictAllMultipleValsOp) {
+ BSONObj query = fromjson("{a:{$all:[1, 2]}}");
+ ASSERT_NOT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+}
+
+TEST_F(CreateFromQuery, NoConflictOrQueryOp) {
+ BSONObj query = fromjson("{$or:[{a:{b:1}},{'a.b':{$eq:1}}]}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, doc()));
+ assertSameFields(BSONObj(), doc().getObject());
+}
+
+TEST_F(CreateFromQuery, ImmutableFieldsOp) {
+ BSONObj query = fromjson("{$or:[{a:{b:1}},{'a.b':{$eq:1}}]}");
+ ASSERT_OK(driverOps().populateDocumentWithQueryFields(query, NULL, 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(query, &immutablePaths.vector(), 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(query, &immutablePaths.vector(), 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(query, &immutablePaths.vector(), 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(query, &immutablePaths.vector(), doc()));
+}
+
+} // unnamed namespace