summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp
diff options
context:
space:
mode:
authorEddie Louie <eddie.louie@mongodb.com>2017-08-01 19:47:13 -0400
committerEddie Louie <eddie.louie@mongodb.com>2017-08-01 19:47:13 -0400
commit2a76bd75d75197d3604643ff2b11d0a8f23c14f9 (patch)
tree10a26d5aec28d9d912c2020a9e4c87064382cf09 /src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp
parent6fd97bdfa5f2d0d07993c538b0787ad788227ef2 (diff)
downloadmongo-2a76bd75d75197d3604643ff2b11d0a8f23c14f9.tar.gz
Revert "SERVER-29135 Add post-image lookup to $changeNotification"
This reverts commit ad30a49a33b8773cbc07388bb257d605cbd6aa12.
Diffstat (limited to 'src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp')
-rw-r--r--src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp266
1 files changed, 0 insertions, 266 deletions
diff --git a/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp b/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp
deleted file mode 100644
index 728db433c55..00000000000
--- a/src/mongo/db/pipeline/document_source_lookup_change_post_image_test.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/**
- * Copyright (C) 2017 MongoDB Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * As a special exception, the copyright holders give permission to link the
- * code of portions of this program with the OpenSSL library under certain
- * conditions as described in each individual source file and distribute
- * linked combinations including the program with the OpenSSL library. You
- * must comply with the GNU Affero General Public License in all respects
- * for all of the code used other than as permitted herein. If you modify
- * file(s) with this exception, you may extend this exception to your
- * version of the file(s), but you are not obligated to do so. If you do not
- * wish to do so, delete this exception statement from your version. If you
- * delete this exception statement from all source files in the program,
- * then also delete it in the license file.
- */
-
-#include "mongo/platform/basic.h"
-
-#include <boost/intrusive_ptr.hpp>
-#include <deque>
-#include <vector>
-
-#include "mongo/bson/bsonmisc.h"
-#include "mongo/bson/bsonobj.h"
-#include "mongo/bson/bsonobjbuilder.h"
-#include "mongo/db/pipeline/aggregation_context_fixture.h"
-#include "mongo/db/pipeline/document.h"
-#include "mongo/db/pipeline/document_source_change_notification.h"
-#include "mongo/db/pipeline/document_source_lookup_change_post_image.h"
-#include "mongo/db/pipeline/document_source_mock.h"
-#include "mongo/db/pipeline/document_value_test_util.h"
-#include "mongo/db/pipeline/field_path.h"
-#include "mongo/db/pipeline/stub_mongod_interface.h"
-#include "mongo/db/pipeline/value.h"
-
-namespace mongo {
-namespace {
-using boost::intrusive_ptr;
-using std::deque;
-using std::vector;
-
-// This provides access to getExpCtx(), but we'll use a different name for this test suite.
-using DocumentSourceLookupChangePostImageTest = AggregationContextFixture;
-
-/**
- * A mock MongodInterface which allows mocking a foreign pipeline.
- */
-class MockMongodInterface final : public StubMongodInterface {
-public:
- MockMongodInterface(deque<DocumentSource::GetNextResult> mockResults)
- : _mockResults(std::move(mockResults)) {}
-
- bool isSharded(const NamespaceString& ns) final {
- return false;
- }
-
- StatusWith<std::unique_ptr<Pipeline, Pipeline::Deleter>> makePipeline(
- const std::vector<BSONObj>& rawPipeline,
- const boost::intrusive_ptr<ExpressionContext>& expCtx) final {
- auto pipeline = Pipeline::parse(rawPipeline, expCtx);
- if (!pipeline.isOK()) {
- return pipeline.getStatus();
- }
-
- pipeline.getValue()->addInitialSource(DocumentSourceMock::create(_mockResults));
- pipeline.getValue()->optimizePipeline();
-
- return pipeline;
- }
-
-private:
- deque<DocumentSource::GetNextResult> _mockResults;
-};
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldErrorIfMissingDocumentKeyOnUpdate) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input with a document without a "documentKey" field.
- auto mockLocalSource = DocumentSourceMock::create(
- Document{{"operationType", "update"_sd},
- {"fullDocument", Document{{"_id", 0}}},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}});
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection.
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(deque<DocumentSource::GetNextResult>{}));
-
- ASSERT_THROWS_CODE(lookupChangeStage->getNext(), UserException, 40578);
-}
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldErrorIfMissingOperationType) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input with a document without a "ns" field.
- auto mockLocalSource = DocumentSourceMock::create(
- Document{{"documentKey", Document{{"_id", 0}}},
- {"fullDocument", Document{{"_id", 0}}},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}});
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection.
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(deque<DocumentSource::GetNextResult>{}));
-
- ASSERT_THROWS_CODE(lookupChangeStage->getNext(), UserException, 40578);
-}
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldErrorIfMissingNamespace) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input with a document without a "ns" field.
- auto mockLocalSource = DocumentSourceMock::create(Document{
- {"documentKey", Document{{"_id", 0}}}, {"operationType", "update"_sd},
- });
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection.
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(deque<DocumentSource::GetNextResult>{}));
-
- ASSERT_THROWS_CODE(lookupChangeStage->getNext(), UserException, 40578);
-}
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldErrorIfNsFieldHasWrongType) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input with a document without a "ns" field.
- auto mockLocalSource = DocumentSourceMock::create(
- Document{{"documentKey", Document{{"_id", 0}}}, {"operationType", "update"_sd}, {"ns", 4}});
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection.
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(deque<DocumentSource::GetNextResult>{}));
-
- ASSERT_THROWS_CODE(lookupChangeStage->getNext(), UserException, 40578);
-}
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldErrorIfNsFieldDoesNotMatchPipeline) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input with a document without a "ns" field.
- auto mockLocalSource = DocumentSourceMock::create(
- Document{{"documentKey", Document{{"_id", 0}}},
- {"operationType", "update"_sd},
- {"ns", Document{{"db", "DIFFERENT"_sd}, {"coll", expCtx->ns.coll()}}}});
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection.
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(deque<DocumentSource::GetNextResult>{}));
-
- ASSERT_THROWS_CODE(lookupChangeStage->getNext(), UserException, 40579);
-}
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldErrorIfDocumentKeyIsNotUnique) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input with an update document.
- auto mockLocalSource = DocumentSourceMock::create(
- Document{{"documentKey", Document{{"_id", 0}}},
- {"operationType", "update"_sd},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}});
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection to have two documents with the same document key.
- deque<DocumentSource::GetNextResult> foreignCollection = {Document{{"_id", 0}},
- Document{{"_id", 0}}};
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(std::move(foreignCollection)));
-
- ASSERT_THROWS_CODE(lookupChangeStage->getNext(), UserException, 40580);
-}
-
-TEST_F(DocumentSourceLookupChangePostImageTest, ShouldPropagatePauses) {
- auto expCtx = getExpCtx();
-
- // Set up the $lookup stage.
- auto lookupChangeStage = DocumentSourceLookupChangePostImage::create(expCtx);
-
- // Mock its input, pausing every other result.
- auto mockLocalSource = DocumentSourceMock::create(
- {Document{{"documentKey", Document{{"_id", 0}}},
- {"operationType", "insert"_sd},
- {"fullDocument", Document{{"_id", 0}}},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}},
- DocumentSource::GetNextResult::makePauseExecution(),
- Document{{"documentKey", Document{{"_id", 1}}},
- {"operationType", "update"_sd},
- {"fullDocument", BSONNULL},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}},
- DocumentSource::GetNextResult::makePauseExecution()});
-
- lookupChangeStage->setSource(mockLocalSource.get());
-
- // Mock out the foreign collection.
- deque<DocumentSource::GetNextResult> mockForeignContents{Document{{"_id", 0}},
- Document{{"_id", 1}}};
- lookupChangeStage->injectMongodInterface(
- std::make_shared<MockMongodInterface>(std::move(mockForeignContents)));
-
- auto next = lookupChangeStage->getNext();
- ASSERT_TRUE(next.isAdvanced());
- ASSERT_DOCUMENT_EQ(
- next.releaseDocument(),
- (Document{{"documentKey", Document{{"_id", 0}}},
- {"operationType", "insert"_sd},
- {"fullDocument", Document{{"_id", 0}}},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}}));
-
- ASSERT_TRUE(lookupChangeStage->getNext().isPaused());
-
- next = lookupChangeStage->getNext();
- ASSERT_TRUE(next.isAdvanced());
- ASSERT_DOCUMENT_EQ(
- next.releaseDocument(),
- (Document{{"documentKey", Document{{"_id", 1}}},
- {"operationType", "update"_sd},
- {"fullDocument", Document{{"_id", 1}}},
- {"ns", Document{{"db", expCtx->ns.db()}, {"coll", expCtx->ns.coll()}}}}));
-
- ASSERT_TRUE(lookupChangeStage->getNext().isPaused());
-
- ASSERT_TRUE(lookupChangeStage->getNext().isEOF());
- ASSERT_TRUE(lookupChangeStage->getNext().isEOF());
-}
-
-} // namespace
-} // namespace mongo