summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_match_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/document_source_match_test.cpp')
-rw-r--r--src/mongo/db/pipeline/document_source_match_test.cpp91
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