diff options
Diffstat (limited to 'src/mongo/db/pipeline/document_source_match_test.cpp')
| -rw-r--r-- | src/mongo/db/pipeline/document_source_match_test.cpp | 91 |
1 files changed, 75 insertions, 16 deletions
diff --git a/src/mongo/db/pipeline/document_source_match_test.cpp b/src/mongo/db/pipeline/document_source_match_test.cpp index f5b53a393e8..4017720e667 100644 --- a/src/mongo/db/pipeline/document_source_match_test.cpp +++ b/src/mongo/db/pipeline/document_source_match_test.cpp @@ -54,7 +54,6 @@ using std::string; // This provides access to getExpCtx(), but we'll use a different name for this test suite. using DocumentSourceMatchTest = AggregationContextFixture; -constexpr auto kExplain = ExplainOptions::Verbosity::kQueryPlanner; TEST_F(DocumentSourceMatchTest, RedactSafePortion) { auto expCtx = getExpCtx(); @@ -589,7 +588,7 @@ TEST_F(DocumentSourceMatchTest, RepeatedJoinWithShouldNotNestAnds) { DEATH_TEST_REGEX_F(DocumentSourceMatchTest, ShouldFailToDescendExpressionOnPathThatIsNotACommonPrefix, - "Invariant failure.*expression::isPathPrefixOf") { + "Tripwire assertion.*Expected 'a' to be a prefix of 'b.c', but it is not.") { const auto expCtx = getExpCtx(); const auto matchSpec = BSON("a.b" << 1 << "b.c" << 1); const auto matchExpression = @@ -597,25 +596,23 @@ DEATH_TEST_REGEX_F(DocumentSourceMatchTest, DocumentSourceMatch::descendMatchOnPath(matchExpression.get(), "a", expCtx); } -DEATH_TEST_REGEX_F(DocumentSourceMatchTest, - ShouldFailToDescendExpressionOnPathThatContainsElemMatchWithObject, - R"#(Invariant failure.*node->matchType\(\))#") { +DEATH_TEST_REGEX_F( + DocumentSourceMatchTest, + ShouldFailToDescendExpressionOnPathThatContainsElemMatchWithObject, + "Tripwire assertion.*The given match expression has a node that represents a partial path.") { const auto expCtx = getExpCtx(); const auto matchSpec = BSON("a" << BSON("$elemMatch" << BSON("a.b" << 1))); const auto matchExpression = unittest::assertGet(MatchExpressionParser::parse(matchSpec, expCtx)); - BSONObjBuilder out; - matchExpression->serialize(&out); DocumentSourceMatch::descendMatchOnPath(matchExpression.get(), "a", expCtx); } -// Due to the order of traversal of the MatchExpression tree, this test may actually trigger the -// invariant failure that the path being descended is not a prefix of the path of the -// MatchExpression node corresponding to the '$gt' expression, which will report an empty path. -DEATH_TEST_F(DocumentSourceMatchTest, - ShouldFailToDescendExpressionOnPathThatContainsElemMatchWithValue, - "Invariant failure") { +DEATH_TEST_REGEX_F(DocumentSourceMatchTest, + ShouldFailToDescendExpressionOnPathThatContainsElemMatchWithValue, + "Tripwire assertion.") { const auto expCtx = getExpCtx(); + // We will either hit the assertion that $elemMatch is not allowed to be descended on or the + // assertion that the path of the '$gt' expression (empty path) is not prefixed by 'a' const auto matchSpec = BSON("a" << BSON("$elemMatch" << BSON("$gt" << 0))); const auto matchExpression = unittest::assertGet(MatchExpressionParser::parse(matchSpec, expCtx)); @@ -698,9 +695,71 @@ TEST_F(DocumentSourceMatchTest, ShouldShowOptimizationsInExplainOutputWhenOptimi auto expectedMatch = fromjson("{$match: {a:{$eq: 1}}}"); - ASSERT_VALUE_EQ( - Value((static_cast<DocumentSourceMatch*>(optimizedMatch.get()))->serialize(kExplain)), - Value(expectedMatch)); + ASSERT_VALUE_EQ(Value((static_cast<DocumentSourceMatch*>(optimizedMatch.get())) + ->serialize(SerializationOptions{ + boost::make_optional(ExplainOptions::Verbosity::kQueryPlanner)})), + Value(expectedMatch)); +} + +TEST_F(DocumentSourceMatchTest, RedactionWithAnd) { + auto spec = fromjson(R"({ + $match: { + $and: [ + { + "a.c": "abc" + }, + { + "b": { + $gt: 10 + } + } + ] + }})"); + auto docSource = DocumentSourceMatch::createFromBson(spec.firstElement(), getExpCtx()); + ASSERT_BSONOBJ_EQ_AUTO( // NOLINT + R"({ + "$match": { + "$and": [ + { + "HASH<a>.HASH<c>": { + "$eq": "?string" + } + }, + { + "HASH<b>": { + "$gt": "?number" + } + } + ] + } + })", + redact(*docSource)); +} + +TEST_F(DocumentSourceMatchTest, RedactionWithExprPipeline) { + auto spec = fromjson(R"({ + $match: { + $expr: { + $eq: [ + '$foo', + '$bar' + ] + } + } + })"); + auto docSource = DocumentSourceMatch::createFromBson(spec.firstElement(), getExpCtx()); + ASSERT_BSONOBJ_EQ_AUTO( // NOLINT + R"({ + "$match": { + "$expr": { + "$eq": [ + "$HASH<foo>", + "$HASH<bar>" + ] + } + } + })", + redact(*docSource)); } } // namespace |
