diff options
Diffstat (limited to 'documentapi/src/tests')
-rw-r--r-- | documentapi/src/tests/messagebus/CMakeLists.txt | 1 | ||||
-rw-r--r-- | documentapi/src/tests/messagebus/messagebus_test.cpp | 70 | ||||
-rw-r--r-- | documentapi/src/tests/policies/CMakeLists.txt | 1 | ||||
-rw-r--r-- | documentapi/src/tests/policies/policies_test.cpp | 305 | ||||
-rw-r--r-- | documentapi/src/tests/replymerger/CMakeLists.txt | 1 | ||||
-rw-r--r-- | documentapi/src/tests/replymerger/replymerger_test.cpp | 121 |
6 files changed, 192 insertions, 307 deletions
diff --git a/documentapi/src/tests/messagebus/CMakeLists.txt b/documentapi/src/tests/messagebus/CMakeLists.txt index 22e213f29d8..ef597fbee10 100644 --- a/documentapi/src/tests/messagebus/CMakeLists.txt +++ b/documentapi/src/tests/messagebus/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(documentapi_messagebus_test_app TEST messagebus_test.cpp DEPENDS documentapi + GTest::gtest ) vespa_add_test(NAME documentapi_messagebus_test_app COMMAND documentapi_messagebus_test_app) diff --git a/documentapi/src/tests/messagebus/messagebus_test.cpp b/documentapi/src/tests/messagebus/messagebus_test.cpp index 6ce76fc753f..39f9cedb38f 100644 --- a/documentapi/src/tests/messagebus/messagebus_test.cpp +++ b/documentapi/src/tests/messagebus/messagebus_test.cpp @@ -6,7 +6,8 @@ #include <vespa/document/repo/documenttyperepo.h> #include <vespa/document/update/documentupdate.h> #include <vespa/documentapi/documentapi.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> +#include <vespa/vespalib/testkit/test_path.h> using document::DocumentTypeRepo; using document::readDocumenttypesConfig; @@ -15,44 +16,35 @@ using mbus::Blob; using mbus::Routable; using mbus::IRoutingPolicy; -class Test : public vespalib::TestApp { - std::shared_ptr<const DocumentTypeRepo> _repo; - -public: - Test(); - ~Test(); - int Main() override; - -private: - void testMessage(); - void testProtocol(); - void get_document_message_is_not_sequenced(); - void stat_bucket_message_is_not_sequenced(); - void get_bucket_list_message_is_not_sequenced(); +class MessageBusTest : public testing::Test { +protected: + static std::shared_ptr<const DocumentTypeRepo> _repo; + MessageBusTest(); + ~MessageBusTest() override; + static void SetUpTestSuite(); + static void TearDownTestSuite(); }; -TEST_APPHOOK(Test); - -int -Test::Main() -{ - TEST_INIT(_argv[0]); - _repo.reset(new DocumentTypeRepo(readDocumenttypesConfig( - TEST_PATH("../../../test/cfg/testdoctypes.cfg")))); +MessageBusTest::MessageBusTest() = default; +MessageBusTest::~MessageBusTest() = default; - testMessage(); TEST_FLUSH(); - testProtocol(); TEST_FLUSH(); - get_document_message_is_not_sequenced(); TEST_FLUSH(); - stat_bucket_message_is_not_sequenced(); TEST_FLUSH(); - get_bucket_list_message_is_not_sequenced(); TEST_FLUSH(); +std::shared_ptr<const DocumentTypeRepo> MessageBusTest::_repo; - TEST_DONE(); +void +MessageBusTest::SetUpTestSuite() +{ + auto path = TEST_PATH("../../../test/cfg/testdoctypes.cfg"); + _repo = std::make_shared<const DocumentTypeRepo>(readDocumenttypesConfig(path)); } -Test::Test() = default; -Test::~Test() = default; +void +MessageBusTest::TearDownTestSuite() +{ + _repo.reset(); +} -void Test::testMessage() { +TEST_F(MessageBusTest, test_message) +{ const document::DataType *testdoc_type = _repo->getDocumentType("testdoc"); // Test one update. @@ -85,7 +77,8 @@ void Test::testMessage() { EXPECT_TRUE(msg2.getType() == DocumentProtocol::MESSAGE_UPDATEDOCUMENT); } -void Test::testProtocol() { +TEST_F(MessageBusTest, test_protocol) +{ DocumentProtocol protocol(_repo); EXPECT_TRUE(protocol.getName() == "document"); @@ -99,17 +92,22 @@ void Test::testProtocol() { EXPECT_TRUE(policy.get() == NULL); } -void Test::get_document_message_is_not_sequenced() { +TEST_F(MessageBusTest, get_document_message_is_not_sequenced) +{ GetDocumentMessage message(document::DocumentId("id:foo:bar::baz")); EXPECT_FALSE(message.hasSequenceId()); } -void Test::stat_bucket_message_is_not_sequenced() { +TEST_F(MessageBusTest, stat_bucket_message_is_not_sequenced) +{ StatBucketMessage message(document::BucketId(16, 1), ""); EXPECT_FALSE(message.hasSequenceId()); } -void Test::get_bucket_list_message_is_not_sequenced() { +TEST_F(MessageBusTest, get_bucket_list_message_is_not_sequenced) +{ GetBucketListMessage message(document::BucketId(16, 1)); EXPECT_FALSE(message.hasSequenceId()); } + +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/documentapi/src/tests/policies/CMakeLists.txt b/documentapi/src/tests/policies/CMakeLists.txt index 2482342a08f..9c537c33db8 100644 --- a/documentapi/src/tests/policies/CMakeLists.txt +++ b/documentapi/src/tests/policies/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(documentapi_policies_test_app TEST policies_test.cpp DEPENDS documentapi + GTest::gtest ) vespa_add_test(NAME documentapi_policies_test_app COMMAND documentapi_policies_test_app) diff --git a/documentapi/src/tests/policies/policies_test.cpp b/documentapi/src/tests/policies/policies_test.cpp index 7091b63b6b3..c289bae0bcd 100644 --- a/documentapi/src/tests/policies/policies_test.cpp +++ b/documentapi/src/tests/policies/policies_test.cpp @@ -23,8 +23,11 @@ #include <vespa/document/repo/documenttyperepo.h> #include <vespa/document/update/documentupdate.h> #include <vespa/document/fieldvalue/document.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> +#include <vespa/vespalib/testkit/test_path.h> #include <vespa/vespalib/util/stringfmt.h> +#include <functional> +#include <optional> #include <thread> #include <vespa/log/log.h> @@ -44,16 +47,21 @@ using std::make_shared; using namespace std::chrono_literals; -class Test : public vespalib::TestApp { -private: - std::shared_ptr<const DocumentTypeRepo> _repo; - const DataType *_docType; +class PoliciesTest : public testing::Test { +protected: + static std::shared_ptr<const DocumentTypeRepo> _repo; + static const DataType* _docType; + PoliciesTest(); + ~PoliciesTest() override; + static void SetUpTestSuite(); + static void TearDownTestSuite(); + + using WrappedPolicy = std::optional<std::reference_wrapper<ContentPolicy>>; -private: static bool trySelect(TestFrame &frame, uint32_t numSelects, const std::vector<string> &expected); static void setupExternPolicy(TestFrame &frame, mbus::Slobrok &slobrok, const string &pattern, int32_t numEntries = -1); - static ContentPolicy &setupContentPolicy(TestFrame &frame, const string ¶m, - const string &pattern = "", int32_t numEntries = -1); + static void setupContentPolicy(TestFrame &frame, const string ¶m, + const string &pattern, int32_t numEntries, WrappedPolicy& wrapped_policy); bool isErrorPolicy(const string &name, const string ¶m); static void assertMirrorReady(const IMirrorAPI &mirror); static void assertMirrorContains(const IMirrorAPI &mirror, const string &pattern, uint32_t numEntries); @@ -61,86 +69,32 @@ private: std::shared_ptr<Document> make_doc(DocumentId docid) { return std::make_shared<Document>(*_repo, *_docType, docid); } - -public: - Test(); - ~Test() override; - int Main() override; - void testAND(); - void testDocumentRouteSelector(); - void testDocumentRouteSelectorIgnore(); - void remove_document_messages_are_sent_to_the_route_handling_the_given_document_type(); - void get_document_messages_are_sent_to_the_route_handling_the_given_document_type(); - void testExternSend(); - void testExternMultipleSlobroks(); - static void testLoadBalancer(); - void testLocalService(); - void testLocalServiceCache(); - void testProtocol(); - void testRoundRobin(); - void testRoundRobinCache(); - void multipleGetRepliesAreMergedToFoundDocument(); - void testSubsetService(); - void testSubsetServiceCache(); - - void requireThatExternPolicyWithIllegalParamIsAnErrorPolicy(); - void requireThatExternPolicyWithUnknownPatternSelectsNone(); - void requireThatExternPolicySelectsFromExternSlobrok(); - void requireThatExternPolicyMergesOneReplyAsProtocol(); - void requireThatContentPolicyWithIllegalParamIsAnErrorPolicy(); - void requireThatContentPolicyIsRandomWithoutState(); - void requireThatContentPolicyIsTargetedWithState(); - void requireThatContentPolicyCombinesSystemAndSlobrokState(); }; -TEST_APPHOOK(Test); - -Test::Test() = default; -Test::~Test() = default; - -const vespalib::duration TIMEOUT = 600s; +PoliciesTest::PoliciesTest() = default; +PoliciesTest::~PoliciesTest() = default; -int -Test::Main() { - TEST_INIT(_argv[0]); +std::shared_ptr<const DocumentTypeRepo> PoliciesTest::_repo; +const DataType* PoliciesTest::_docType = nullptr; - _repo = std::make_shared<DocumentTypeRepo>(readDocumenttypesConfig(TEST_PATH("../../../test/cfg/testdoctypes.cfg"))); +void +PoliciesTest::SetUpTestSuite() +{ + auto path = TEST_PATH("../../../test/cfg/testdoctypes.cfg"); + _repo = std::make_shared<DocumentTypeRepo>(readDocumenttypesConfig(path)); _docType = _repo->getDocumentType("testdoc"); - - testProtocol(); TEST_FLUSH(); - - testAND(); TEST_FLUSH(); - testDocumentRouteSelector(); TEST_FLUSH(); - testDocumentRouteSelectorIgnore(); TEST_FLUSH(); - remove_document_messages_are_sent_to_the_route_handling_the_given_document_type(); TEST_FLUSH(); - get_document_messages_are_sent_to_the_route_handling_the_given_document_type(); TEST_FLUSH(); - testExternSend(); TEST_FLUSH(); - testExternMultipleSlobroks(); TEST_FLUSH(); - testLoadBalancer(); TEST_FLUSH(); - testLocalService(); TEST_FLUSH(); - testLocalServiceCache(); TEST_FLUSH(); - testRoundRobin(); TEST_FLUSH(); - testRoundRobinCache(); TEST_FLUSH(); - testSubsetService(); TEST_FLUSH(); - testSubsetServiceCache(); TEST_FLUSH(); - - multipleGetRepliesAreMergedToFoundDocument(); TEST_FLUSH(); - - requireThatExternPolicyWithIllegalParamIsAnErrorPolicy(); TEST_FLUSH(); - requireThatExternPolicyWithUnknownPatternSelectsNone(); TEST_FLUSH(); - requireThatExternPolicySelectsFromExternSlobrok(); TEST_FLUSH(); - requireThatExternPolicyMergesOneReplyAsProtocol(); TEST_FLUSH(); - - requireThatContentPolicyWithIllegalParamIsAnErrorPolicy(); TEST_FLUSH(); - requireThatContentPolicyIsRandomWithoutState(); TEST_FLUSH(); - requireThatContentPolicyIsTargetedWithState(); TEST_FLUSH(); - requireThatContentPolicyCombinesSystemAndSlobrokState(); TEST_FLUSH(); - - TEST_DONE(); } void -Test::testProtocol() +PoliciesTest::TearDownTestSuite() +{ + _repo.reset(); + _docType = nullptr; +} + +const vespalib::duration TIMEOUT = 600s; + +TEST_F(PoliciesTest, test_protocol) { auto protocol = std::make_shared<DocumentProtocol>(_repo); @@ -168,8 +122,7 @@ Test::testProtocol() ASSERT_TRUE(dynamic_cast<SubsetServicePolicy*>(policy.get()) != nullptr); } -void -Test::testAND() +TEST_F(PoliciesTest, test_and) { TestFrame frame(_repo); frame.setMessage(make_unique<PutDocumentMessage>(make_doc(DocumentId("id:ns:testdoc::")))); @@ -189,8 +142,7 @@ Test::testAND() EXPECT_TRUE(frame.testMergeTwoReplies("foo", "bar")); } -void -Test::requireThatExternPolicyWithIllegalParamIsAnErrorPolicy() +TEST_F(PoliciesTest, require_that_extern_policy_with_illegal_param_is_an_error_policy) { mbus::Slobrok slobrok; string spec = vespalib::make_string("tcp/localhost:%d", slobrok.port()); @@ -201,19 +153,17 @@ Test::requireThatExternPolicyWithIllegalParamIsAnErrorPolicy() EXPECT_TRUE(isErrorPolicy("Extern", spec + ";bar")); } -void -Test::requireThatExternPolicyWithUnknownPatternSelectsNone() +TEST_F(PoliciesTest, require_that_extern_policy_with_unknown_pattern_selects_none) { TestFrame frame(_repo); frame.setMessage(newPutDocumentMessage("id:ns:testdoc::")); mbus::Slobrok slobrok; - setupExternPolicy(frame, slobrok, "foo/bar"); + ASSERT_NO_FATAL_FAILURE(setupExternPolicy(frame, slobrok, "foo/bar")); EXPECT_TRUE(frame.testSelect(StringList())); } -void -Test::requireThatExternPolicySelectsFromExternSlobrok() +TEST_F(PoliciesTest, require_that_extern_policy_selects_from_extern_slobrok) { TestFrame frame(_repo); frame.setMessage(newPutDocumentMessage("id:ns:testdoc::")); @@ -226,7 +176,7 @@ Test::requireThatExternPolicySelectsFromExternSlobrok() servers.push_back(server); server->net.registerSession("chain.default"); } - setupExternPolicy(frame, slobrok, "docproc/cluster.default/*/chain.default", 10); + ASSERT_NO_FATAL_FAILURE(setupExternPolicy(frame, slobrok, "docproc/cluster.default/*/chain.default", 10)); std::set<string> lst; for (uint32_t i = 0; i < servers.size(); ++i) { std::vector<mbus::RoutingNode*> leaf; @@ -236,14 +186,13 @@ Test::requireThatExternPolicySelectsFromExternSlobrok() leaf[0]->handleReply(std::make_unique<mbus::EmptyReply>()); ASSERT_TRUE(frame.getReceptor().getReply(TIMEOUT)); } - EXPECT_EQUAL(servers.size(), lst.size()); + EXPECT_EQ(servers.size(), lst.size()); for (auto & server : servers) { delete server; } } -void -Test::requireThatExternPolicyMergesOneReplyAsProtocol() +TEST_F(PoliciesTest, require_that_extern_policy_merges_one_reply_as_protocol) { TestFrame frame(_repo); frame.setMessage(newPutDocumentMessage("id:ns:testdoc::")); @@ -251,18 +200,18 @@ Test::requireThatExternPolicyMergesOneReplyAsProtocol() mbus::TestServer server(mbus::Identity("docproc/cluster.default/0"), mbus::RoutingSpec(), slobrok, std::make_shared<DocumentProtocol>(_repo)); server.net.registerSession("chain.default"); - setupExternPolicy(frame, slobrok, "docproc/cluster.default/0/chain.default", 1); + ASSERT_NO_FATAL_FAILURE(setupExternPolicy(frame, slobrok, "docproc/cluster.default/0/chain.default", 1)); EXPECT_TRUE(frame.testMergeOneReply(server.net.getConnectionSpec() + "/chain.default")); } mbus::Message::UP -Test::newPutDocumentMessage(const string &documentId) +PoliciesTest::newPutDocumentMessage(const string &documentId) { return make_unique<PutDocumentMessage>(make_doc(DocumentId(documentId))); } void -Test::setupExternPolicy(TestFrame &frame, mbus::Slobrok &slobrok, const string &pattern, int32_t numEntries) +PoliciesTest::setupExternPolicy(TestFrame &frame, mbus::Slobrok &slobrok, const string &pattern, int32_t numEntries) { string param = vespalib::make_string("tcp/localhost:%d;%s", slobrok.port(), pattern.c_str()); frame.setHop(mbus::HopSpec("test", vespalib::make_string("[Extern:%s]", param.c_str()))); @@ -270,14 +219,14 @@ Test::setupExternPolicy(TestFrame &frame, mbus::Slobrok &slobrok, const string & const mbus::HopBlueprint *hop = mbus.getRoutingTable(DocumentProtocol::NAME)->getHop("test"); const mbus::PolicyDirective &dir = dynamic_cast<const mbus::PolicyDirective&>(*hop->getDirective(0)); ExternPolicy &policy = dynamic_cast<ExternPolicy&>(*mbus.getRoutingPolicy(DocumentProtocol::NAME, dir.getName(), dir.getParam())); - assertMirrorReady(*policy.getMirror()); + ASSERT_NO_FATAL_FAILURE(assertMirrorReady(*policy.getMirror())); if (numEntries >= 0) { - assertMirrorContains(*policy.getMirror(), pattern, numEntries); + ASSERT_NO_FATAL_FAILURE(assertMirrorContains(*policy.getMirror(), pattern, numEntries)); } } void -Test::assertMirrorReady(const slobrok::api::IMirrorAPI &mirror) +PoliciesTest::assertMirrorReady(const slobrok::api::IMirrorAPI &mirror) { for (uint32_t i = 0; i < 6000; ++i) { if (mirror.ready()) { @@ -285,11 +234,11 @@ Test::assertMirrorReady(const slobrok::api::IMirrorAPI &mirror) } std::this_thread::sleep_for(10ms); } - ASSERT_TRUE(false); + FAIL() << "Mirror not ready"; } void -Test::assertMirrorContains(const slobrok::api::IMirrorAPI &mirror, const string &pattern, uint32_t numEntries) +PoliciesTest::assertMirrorContains(const slobrok::api::IMirrorAPI &mirror, const string &pattern, uint32_t numEntries) { for (uint32_t i = 0; i < 6000; ++i) { if (mirror.lookup(pattern).size() == numEntries) { @@ -297,11 +246,10 @@ Test::assertMirrorContains(const slobrok::api::IMirrorAPI &mirror, const string } std::this_thread::sleep_for(10ms); } - ASSERT_TRUE(false); + FAIL() << "Mirror does not contain pattern '" << pattern << "'"; } -void -Test::testExternSend() +TEST_F(PoliciesTest, test_extern_send) { // Setup local source node. mbus::Slobrok local; @@ -342,8 +290,7 @@ Test::testExternSend() fprintf(stderr, "%s", reply->getTrace().toString().c_str()); } -void -Test::testExternMultipleSlobroks() +TEST_F(PoliciesTest, test_extern_multiple_slobroks) { mbus::Slobrok local; mbus::TestServer src(mbus::Identity("src"), mbus::RoutingSpec(), local, @@ -387,8 +334,7 @@ Test::testExternMultipleSlobroks() } } -void -Test::testLocalService() +TEST_F(PoliciesTest, test_local_service) { // Prepare message. TestFrame frame(_repo, "docproc/cluster.default"); @@ -410,7 +356,7 @@ Test::testLocalService() leaf[0]->handleReply(std::make_unique<mbus::EmptyReply>()); ASSERT_TRUE(frame.getReceptor().getReply(TIMEOUT)); } - EXPECT_EQUAL(10u, lst.size()); + EXPECT_EQ(10u, lst.size()); // Test select with broken address. lst.clear(); @@ -423,16 +369,15 @@ Test::testLocalService() leaf[0]->handleReply(std::make_unique<mbus::EmptyReply>()); ASSERT_TRUE(frame.getReceptor().getReply(TIMEOUT)); } - EXPECT_EQUAL(1u, lst.size()); - EXPECT_EQUAL("docproc/cluster.default/*/chain.default", *lst.begin()); + EXPECT_EQ(1u, lst.size()); + EXPECT_EQ("docproc/cluster.default/*/chain.default", *lst.begin()); // Test merge behavior. frame.setHop(mbus::HopSpec("test", "[LocalService]")); EXPECT_TRUE(frame.testMergeOneReply("*")); } -void -Test::testLocalServiceCache() +TEST_F(PoliciesTest, test_local_service_cache) { TestFrame fooFrame(_repo, "docproc/cluster.default"); mbus::HopSpec fooHop("foo", "docproc/cluster.default/[LocalService]/chain.foo"); @@ -455,11 +400,11 @@ Test::testLocalServiceCache() std::vector<mbus::RoutingNode*> fooSelected; ASSERT_TRUE(fooFrame.select(fooSelected, 1)); - EXPECT_EQUAL("docproc/cluster.default/0/chain.foo", fooSelected[0]->getRoute().getHop(0).toString()); + EXPECT_EQ("docproc/cluster.default/0/chain.foo", fooSelected[0]->getRoute().getHop(0).toString()); std::vector<mbus::RoutingNode*> barSelected; ASSERT_TRUE(barFrame.select(barSelected, 1)); - EXPECT_EQUAL("docproc/cluster.default/0/chain.bar", barSelected[0]->getRoute().getHop(0).toString()); + EXPECT_EQ("docproc/cluster.default/0/chain.bar", barSelected[0]->getRoute().getHop(0).toString()); barSelected[0]->handleReply(std::make_unique<mbus::EmptyReply>()); fooSelected[0]->handleReply(std::make_unique<mbus::EmptyReply>()); @@ -468,8 +413,7 @@ Test::testLocalServiceCache() ASSERT_TRUE(fooFrame.getReceptor().getReply(TIMEOUT)); } -void -Test::testRoundRobin() +TEST_F(PoliciesTest, test_round_robin) { // Prepare message. TestFrame frame(_repo, "docproc/cluster.default"); @@ -506,8 +450,7 @@ Test::testRoundRobin() EXPECT_TRUE(frame.testMergeOneReply("docproc/cluster.default/0/chain.default")); } -void -Test::testRoundRobinCache() +TEST_F(PoliciesTest, test_round_robin_cache) { TestFrame fooFrame(_repo, "docproc/cluster.default"); mbus::HopSpec fooHop("foo", "[RoundRobin]"); @@ -532,11 +475,11 @@ Test::testRoundRobinCache() std::vector<mbus::RoutingNode*> fooSelected; ASSERT_TRUE(fooFrame.select(fooSelected, 1)); - EXPECT_EQUAL("docproc/cluster.default/0/chain.foo", fooSelected[0]->getRoute().getHop(0).toString()); + EXPECT_EQ("docproc/cluster.default/0/chain.foo", fooSelected[0]->getRoute().getHop(0).toString()); std::vector<mbus::RoutingNode*> barSelected; ASSERT_TRUE(barFrame.select(barSelected, 1)); - EXPECT_EQUAL("docproc/cluster.default/0/chain.bar", barSelected[0]->getRoute().getHop(0).toString()); + EXPECT_EQ("docproc/cluster.default/0/chain.bar", barSelected[0]->getRoute().getHop(0).toString()); barSelected[0]->handleReply(std::make_unique<mbus::EmptyReply>()); fooSelected[0]->handleReply(std::make_unique<mbus::EmptyReply>()); @@ -545,8 +488,7 @@ Test::testRoundRobinCache() ASSERT_TRUE(fooFrame.getReceptor().getReply(TIMEOUT)); } -void -Test::multipleGetRepliesAreMergedToFoundDocument() +TEST_F(PoliciesTest, multiple_get_replies_are_merged_to_found_document) { TestFrame frame(_repo); frame.setHop(mbus::HopSpec("test", "[DocumentRouteSelector:raw:" @@ -573,12 +515,11 @@ Test::multipleGetRepliesAreMergedToFoundDocument() } mbus::Reply::UP reply = frame.getReceptor().getReply(TIMEOUT); EXPECT_TRUE(reply); - EXPECT_EQUAL(static_cast<uint32_t>(DocumentProtocol::REPLY_GETDOCUMENT), reply->getType()); - EXPECT_EQUAL(123456ULL, dynamic_cast<GetDocumentReply&>(*reply).getLastModified()); + EXPECT_EQ(static_cast<uint32_t>(DocumentProtocol::REPLY_GETDOCUMENT), reply->getType()); + EXPECT_EQ(123456ULL, dynamic_cast<GetDocumentReply&>(*reply).getLastModified()); } -void -Test::testDocumentRouteSelector() +TEST_F(PoliciesTest, test_document_route_selector) { // Test policy with usage safeguard. string okConfig = "raw:route[0]\n"; @@ -630,8 +571,7 @@ Test::testDocumentRouteSelector() EXPECT_TRUE(frame.testMergeOneReply("foo")); } -void -Test::testDocumentRouteSelectorIgnore() +TEST_F(PoliciesTest, test_document_route_selector_ignore) { TestFrame frame(_repo); frame.setHop(mbus::HopSpec("test", "[DocumentRouteSelector:raw:" @@ -647,8 +587,8 @@ Test::testDocumentRouteSelectorIgnore() ASSERT_TRUE(frame.select(leaf, 0)); mbus::Reply::UP reply = frame.getReceptor().getReply(TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(uint32_t(DocumentProtocol::REPLY_DOCUMENTIGNORED), reply->getType()); - EXPECT_EQUAL(0u, reply->getNumErrors()); + EXPECT_EQ(uint32_t(DocumentProtocol::REPLY_DOCUMENTIGNORED), reply->getType()); + EXPECT_EQ(0u, reply->getNumErrors()); frame.setMessage(make_unique<UpdateDocumentMessage>( make_shared<DocumentUpdate>(*_repo, *_docType, DocumentId("id:ns:testdoc::")))); @@ -693,8 +633,7 @@ makeGet(vespalib::stringref docId) } -void -Test::remove_document_messages_are_sent_to_the_route_handling_the_given_document_type() +TEST_F(PoliciesTest, remove_document_messages_are_sent_to_the_route_handling_the_given_document_type) { auto frame = createFrameWithTwoRoutes(_repo); @@ -705,8 +644,7 @@ Test::remove_document_messages_are_sent_to_the_route_handling_the_given_document EXPECT_TRUE(frame->testSelect({"other-route"})); } -void -Test::get_document_messages_are_sent_to_the_route_handling_the_given_document_type() +TEST_F(PoliciesTest, get_document_messages_are_sent_to_the_route_handling_the_given_document_type) { auto frame = createFrameWithTwoRoutes(_repo); @@ -735,7 +673,8 @@ namespace { } } -void Test::testLoadBalancer() { +TEST_F(PoliciesTest, test_load_balancer) +{ LoadBalancer lb("foo", ""); IMirrorAPI::SpecList entries; @@ -745,7 +684,7 @@ void Test::testLoadBalancer() { for (int i = 0; i < 99; i++) { std::pair<string, int> recipient = lb.getRecipient(entries); - EXPECT_EQUAL((i % 3), recipient.second); + EXPECT_EQ((i % 3), recipient.second); } // Simulate that one node is overloaded. It returns busy twice as often as the others. @@ -761,31 +700,29 @@ void Test::testLoadBalancer() { lb.received(1, false); } - EXPECT_EQUAL(421, (int)(100 * lb.getWeight(0) / lb.getWeight(1))); - EXPECT_EQUAL(421, (int)(100 * lb.getWeight(2) / lb.getWeight(1))); - - EXPECT_EQUAL(0 , lb.getRecipient(entries).second); - EXPECT_EQUAL(0 , lb.getRecipient(entries).second); - EXPECT_EQUAL(1 , lb.getRecipient(entries).second); - EXPECT_EQUAL(2 , lb.getRecipient(entries).second); - EXPECT_EQUAL(2 , lb.getRecipient(entries).second); - EXPECT_EQUAL(2 , lb.getRecipient(entries).second); - EXPECT_EQUAL(2 , lb.getRecipient(entries).second); - EXPECT_EQUAL(0 , lb.getRecipient(entries).second); - EXPECT_EQUAL(0 , lb.getRecipient(entries).second); - EXPECT_EQUAL(0 , lb.getRecipient(entries).second); + EXPECT_EQ(421, (int)(100 * lb.getWeight(0) / lb.getWeight(1))); + EXPECT_EQ(421, (int)(100 * lb.getWeight(2) / lb.getWeight(1))); + + EXPECT_EQ(0 , lb.getRecipient(entries).second); + EXPECT_EQ(0 , lb.getRecipient(entries).second); + EXPECT_EQ(1 , lb.getRecipient(entries).second); + EXPECT_EQ(2 , lb.getRecipient(entries).second); + EXPECT_EQ(2 , lb.getRecipient(entries).second); + EXPECT_EQ(2 , lb.getRecipient(entries).second); + EXPECT_EQ(2 , lb.getRecipient(entries).second); + EXPECT_EQ(0 , lb.getRecipient(entries).second); + EXPECT_EQ(0 , lb.getRecipient(entries).second); + EXPECT_EQ(0 , lb.getRecipient(entries).second); } -void -Test::requireThatContentPolicyWithIllegalParamIsAnErrorPolicy() +TEST_F(PoliciesTest, require_that_content_policy_with_illegal_param_is_an_error_policy) { EXPECT_TRUE(isErrorPolicy("Content", "")); EXPECT_TRUE(isErrorPolicy("Content", "config=foo;slobroks=foo")); EXPECT_TRUE(isErrorPolicy("Content", "slobroks=foo")); } -void -Test::requireThatContentPolicyIsRandomWithoutState() +TEST_F(PoliciesTest, require_that_content_policy_is_random_without_state) { TestFrame frame(_repo); frame.setMessage(newPutDocumentMessage("id:ns:testdoc::")); @@ -803,9 +740,11 @@ Test::requireThatContentPolicyIsRandomWithoutState() string param = vespalib::make_string( "cluster=mycluster;slobroks=tcp/localhost:%d;clusterconfigid=%s;syncinit", slobrok.port(), getDefaultDistributionConfig(2, 5).c_str()); - ContentPolicy &policy = setupContentPolicy( + WrappedPolicy wrapped_policy; + ASSERT_NO_FATAL_FAILURE(setupContentPolicy( frame, param, - "storage/cluster.mycluster/distributor/*/default", 5); + "storage/cluster.mycluster/distributor/*/default", 5, wrapped_policy)); + auto& policy = wrapped_policy.value().get(); ASSERT_FALSE(policy.getSystemState()); std::set<string> lst; @@ -815,15 +754,16 @@ Test::requireThatContentPolicyIsRandomWithoutState() lst.insert(leaf[0]->getRoute().toString()); leaf[0]->handleReply(std::make_unique<mbus::EmptyReply>()); } - EXPECT_EQUAL(servers.size(), lst.size()); + EXPECT_EQ(servers.size(), lst.size()); for (auto & server : servers) { delete server; } } -ContentPolicy & -Test::setupContentPolicy(TestFrame &frame, const string ¶m, - const string &pattern, int32_t numEntries) +void +PoliciesTest::setupContentPolicy(TestFrame &frame, const string ¶m, + const string &pattern, int32_t numEntries, + WrappedPolicy& wrapped_policy) { frame.setHop(mbus::HopSpec("test", vespalib::make_string("[Content:%s]", param.c_str()))); mbus::MessageBus &mbus = frame.getMessageBus(); @@ -831,15 +771,14 @@ Test::setupContentPolicy(TestFrame &frame, const string ¶m, const mbus::PolicyDirective & dir = dynamic_cast<const mbus::PolicyDirective&>(*hop->getDirective(0)); ContentPolicy &policy = dynamic_cast<ContentPolicy&>(*mbus.getRoutingPolicy(DocumentProtocol::NAME, dir.getName(), dir.getParam())); policy.initSynchronous(); - assertMirrorReady(*policy.getMirror()); + ASSERT_NO_FATAL_FAILURE(assertMirrorReady(*policy.getMirror())); if (numEntries >= 0) { - assertMirrorContains(*policy.getMirror(), pattern, numEntries); + ASSERT_NO_FATAL_FAILURE(assertMirrorContains(*policy.getMirror(), pattern, numEntries)); } - return policy; + wrapped_policy = std::ref(policy); } -void -Test::requireThatContentPolicyIsTargetedWithState() +TEST_F(PoliciesTest, require_that_content_policy_is_targeted_with_state) { TestFrame frame(_repo); frame.setMessage(newPutDocumentMessage("id:ns:testdoc::")); @@ -857,14 +796,16 @@ Test::requireThatContentPolicyIsTargetedWithState() string param = vespalib::make_string( "cluster=mycluster;slobroks=tcp/localhost:%d;clusterconfigid=%s;syncinit", slobrok.port(), getDefaultDistributionConfig(2, 5).c_str()); - ContentPolicy &policy = setupContentPolicy(frame, param, "storage/cluster.mycluster/distributor/*/default", 5); + WrappedPolicy wrapped_policy; + ASSERT_NO_FATAL_FAILURE(setupContentPolicy(frame, param, "storage/cluster.mycluster/distributor/*/default", 5, wrapped_policy)); + auto& policy = wrapped_policy.value().get(); ASSERT_FALSE(policy.getSystemState()); { std::vector<mbus::RoutingNode*> leaf; ASSERT_TRUE(frame.select(leaf, 1)); leaf[0]->handleReply(std::make_unique<WrongDistributionReply>("distributor:5 storage:5")); ASSERT_TRUE(policy.getSystemState()); - EXPECT_EQUAL(policy.getSystemState()->toString(), "distributor:5 storage:5"); + EXPECT_EQ(policy.getSystemState()->toString(), "distributor:5 storage:5"); } std::set<string> lst; for (int i = 0; i < 666; i++) { @@ -873,14 +814,13 @@ Test::requireThatContentPolicyIsTargetedWithState() lst.insert(leaf[0]->getRoute().toString()); leaf[0]->handleReply(std::make_unique<mbus::EmptyReply>()); } - EXPECT_EQUAL(1u, lst.size()); + EXPECT_EQ(1u, lst.size()); for (auto & server : servers) { delete server; } } -void -Test::requireThatContentPolicyCombinesSystemAndSlobrokState() +TEST_F(PoliciesTest, require_that_content_policy_combines_system_and_slobrok_state) { TestFrame frame(_repo); frame.setMessage(newPutDocumentMessage("id:ns:testdoc::")); @@ -894,24 +834,25 @@ Test::requireThatContentPolicyCombinesSystemAndSlobrokState() string param = vespalib::make_string( "cluster=mycluster;slobroks=tcp/localhost:%d;clusterconfigid=%s;syncinit", slobrok.port(), getDefaultDistributionConfig(2, 5).c_str()); - ContentPolicy &policy = setupContentPolicy( + WrappedPolicy wrapped_policy; + ASSERT_NO_FATAL_FAILURE(setupContentPolicy( frame, param, - "storage/cluster.mycluster/distributor/*/default", 1); + "storage/cluster.mycluster/distributor/*/default", 1, wrapped_policy)); + auto& policy = wrapped_policy.value().get(); ASSERT_FALSE(policy.getSystemState()); { std::vector<mbus::RoutingNode*> leaf; ASSERT_TRUE(frame.select(leaf, 1)); leaf[0]->handleReply(std::make_unique<WrongDistributionReply>("distributor:99 storage:99")); ASSERT_TRUE(policy.getSystemState()); - EXPECT_EQUAL(policy.getSystemState()->toString(), "distributor:99 storage:99"); + EXPECT_EQ(policy.getSystemState()->toString(), "distributor:99 storage:99"); } for (int i = 0; i < 666; i++) { ASSERT_TRUE(frame.testSelect(StringList().add(server.net.getConnectionSpec() + "/default"))); } } -void -Test::testSubsetService() +TEST_F(PoliciesTest, test_subset_service) { // Prepare message. TestFrame frame(_repo, "docproc/cluster.default"); @@ -966,15 +907,14 @@ Test::testSubsetService() leaf[0]->handleReply(std::move(reply)); ASSERT_TRUE(frame.getReceptor().getReply(TIMEOUT)); } - EXPECT_EQUAL(10u, lst.size()); + EXPECT_EQ(10u, lst.size()); // Test merge behavior. frame.setHop(mbus::HopSpec("test", "[SubsetService]")); EXPECT_TRUE(frame.testMergeOneReply("*")); } -void -Test::testSubsetServiceCache() +TEST_F(PoliciesTest, test_subset_service_cache) { TestFrame fooFrame(_repo, "docproc/cluster.default"); mbus::HopSpec fooHop("foo", "docproc/cluster.default/[SubsetService:2]/chain.foo"); @@ -997,11 +937,11 @@ Test::testSubsetServiceCache() std::vector<mbus::RoutingNode*> fooSelected; ASSERT_TRUE(fooFrame.select(fooSelected, 1)); - EXPECT_EQUAL("docproc/cluster.default/0/chain.foo", fooSelected[0]->getRoute().getHop(0).toString()); + EXPECT_EQ("docproc/cluster.default/0/chain.foo", fooSelected[0]->getRoute().getHop(0).toString()); std::vector<mbus::RoutingNode*> barSelected; ASSERT_TRUE(barFrame.select(barSelected, 1)); - EXPECT_EQUAL("docproc/cluster.default/0/chain.bar", barSelected[0]->getRoute().getHop(0).toString()); + EXPECT_EQ("docproc/cluster.default/0/chain.bar", barSelected[0]->getRoute().getHop(0).toString()); barSelected[0]->handleReply(std::make_unique<mbus::EmptyReply>()); fooSelected[0]->handleReply(std::make_unique<mbus::EmptyReply>()); @@ -1011,7 +951,7 @@ Test::testSubsetServiceCache() } bool -Test::trySelect(TestFrame &frame, uint32_t numSelects, const std::vector<string> &expected) { +PoliciesTest::trySelect(TestFrame &frame, uint32_t numSelects, const std::vector<string> &expected) { std::set<string> lst; for (uint32_t i = 0; i < numSelects; ++i) { std::vector<mbus::RoutingNode*> leaf; @@ -1042,7 +982,7 @@ Test::trySelect(TestFrame &frame, uint32_t numSelects, const std::vector<string> } bool -Test::isErrorPolicy(const string &name, const string ¶m) +PoliciesTest::isErrorPolicy(const string &name, const string ¶m) { DocumentProtocol protocol(_repo); mbus::IRoutingPolicy::UP policy = protocol.createPolicy(name, param); @@ -1050,3 +990,4 @@ Test::isErrorPolicy(const string &name, const string ¶m) return policy && dynamic_cast<ErrorPolicy*>(policy.get()) != nullptr; } +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/documentapi/src/tests/replymerger/CMakeLists.txt b/documentapi/src/tests/replymerger/CMakeLists.txt index c0aa754d2d6..41eaae643c4 100644 --- a/documentapi/src/tests/replymerger/CMakeLists.txt +++ b/documentapi/src/tests/replymerger/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(documentapi_replymerger_test_app TEST replymerger_test.cpp DEPENDS documentapi + GTest::gtest ) vespa_add_test(NAME documentapi_replymerger_test_app COMMAND documentapi_replymerger_test_app) diff --git a/documentapi/src/tests/replymerger/replymerger_test.cpp b/documentapi/src/tests/replymerger/replymerger_test.cpp index bfcc4612ce1..bdc41b9f44d 100644 --- a/documentapi/src/tests/replymerger/replymerger_test.cpp +++ b/documentapi/src/tests/replymerger/replymerger_test.cpp @@ -1,7 +1,6 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <iostream> -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/documentapi/messagebus/replymerger.h> #include <vespa/documentapi/messagebus/documentprotocol.h> #include <vespa/documentapi/messagebus/messages/removedocumentreply.h> @@ -9,34 +8,26 @@ #include <vespa/documentapi/messagebus/messages/getdocumentreply.h> #include <vespa/messagebus/emptyreply.h> #include <vespa/messagebus/error.h> +#include <vespa/vespalib/gtest/gtest.h> using namespace documentapi; -class Test : public vespalib::TestApp -{ - static void assertReplyErrorsMatch(const mbus::Reply& r, - const std::vector<mbus::Error>& errors); -public: - int Main() override; +namespace { - void mergingGenericRepliesWithNoErrorsPicksFirstReply(); - void mergingSingleReplyWithOneErrorReturnsEmptyReplyWithError(); - void mergingSingleReplyWithMultipleErrorsReturnsEmptyReplyWithAllErrors(); - void mergingMultipleRepliesWithMultipleErrorsReturnsEmptyReplyWithAllErrors(); - void returnIgnoredReplyWhenAllRepliesHaveOnlyIgnoredErrors(); - void successfulReplyTakesPrecedenceOverIgnoredReplyWhenNoErrors(); - void nonIgnoredErrorTakesPrecedence(); - void returnRemoveDocumentReplyWhereDocWasFound(); - void returnFirstRemoveDocumentReplyIfNoDocsWereFound(); - void returnUpdateDocumentReplyWhereDocWasFound(); - void returnGetDocumentReplyWhereDocWasFound(); - void mergingZeroRepliesReturnsDefaultEmptyReply(); -}; +void +assertReplyErrorsMatch(const mbus::Reply& r, + const std::vector<mbus::Error>& errors) +{ + ASSERT_EQ(r.getNumErrors(), errors.size()); + for (size_t i = 0; i < errors.size(); ++i) { + ASSERT_EQ(errors[i].getCode(), r.getError(i).getCode()); + ASSERT_EQ(errors[i].getMessage(), r.getError(i).getMessage()); + } +} -TEST_APPHOOK(Test); +} -void -Test::mergingGenericRepliesWithNoErrorsPicksFirstReply() +TEST(ReplyMergerTest, merging_generic_replies_with_no_errors_picks_first_reply) { mbus::EmptyReply r1; mbus::EmptyReply r2; @@ -48,11 +39,10 @@ Test::mergingGenericRepliesWithNoErrorsPicksFirstReply() ReplyMerger::Result ret(merger.mergedReply()); ASSERT_TRUE(ret.isSuccessful()); ASSERT_FALSE(ret.hasGeneratedReply()); - EXPECT_EQUAL(0u, ret.getSuccessfulReplyIndex()); + EXPECT_EQ(0u, ret.getSuccessfulReplyIndex()); } -void -Test::mergingSingleReplyWithOneErrorReturnsEmptyReplyWithError() +TEST(ReplyMergerTest, merging_single_reply_with_one_error_returns_empty_reply_with_error) { mbus::EmptyReply r1; std::vector<mbus::Error> errors = { mbus::Error(1234, "oh no!") }; @@ -66,8 +56,7 @@ Test::mergingSingleReplyWithOneErrorReturnsEmptyReplyWithError() assertReplyErrorsMatch(*gen, errors); } -void -Test::mergingSingleReplyWithMultipleErrorsReturnsEmptyReplyWithAllErrors() +TEST(ReplyMergerTest, merging_single_reply_with_multiple_errors_returns_empty_reply_with_all_errors) { mbus::EmptyReply r1; std::vector<mbus::Error> errors = { @@ -85,8 +74,7 @@ Test::mergingSingleReplyWithMultipleErrorsReturnsEmptyReplyWithAllErrors() assertReplyErrorsMatch(*gen, errors); } -void -Test::mergingMultipleRepliesWithMultipleErrorsReturnsEmptyReplyWithAllErrors() +TEST(ReplyMergerTest, merging_multiple_replies_with_multiple_errors_returns_empty_reply_with_all_errors) { mbus::EmptyReply r1; mbus::EmptyReply r2; @@ -108,8 +96,7 @@ Test::mergingMultipleRepliesWithMultipleErrorsReturnsEmptyReplyWithAllErrors() assertReplyErrorsMatch(*gen, errors); } -void -Test::returnIgnoredReplyWhenAllRepliesHaveOnlyIgnoredErrors() +TEST(ReplyMergerTest, return_ignored_reply_when_all_replies_have_only_ignored_errors) { mbus::EmptyReply r1; mbus::EmptyReply r2; @@ -132,8 +119,7 @@ Test::returnIgnoredReplyWhenAllRepliesHaveOnlyIgnoredErrors() assertReplyErrorsMatch(*gen, { errors[0], errors[2] }); } -void -Test::successfulReplyTakesPrecedenceOverIgnoredReplyWhenNoErrors() +TEST(ReplyMergerTest, successful_reply_takes_precedence_over_ignored_reply_when_no_errors) { mbus::EmptyReply r1; mbus::EmptyReply r2; @@ -147,11 +133,10 @@ Test::successfulReplyTakesPrecedenceOverIgnoredReplyWhenNoErrors() ReplyMerger::Result ret(merger.mergedReply()); ASSERT_TRUE(ret.isSuccessful()); ASSERT_FALSE(ret.hasGeneratedReply()); - EXPECT_EQUAL(1u, ret.getSuccessfulReplyIndex()); + EXPECT_EQ(1u, ret.getSuccessfulReplyIndex()); } -void -Test::nonIgnoredErrorTakesPrecedence() +TEST(ReplyMergerTest, non_ignored_error_takes_precedence) { mbus::EmptyReply r1; mbus::EmptyReply r2; @@ -175,8 +160,7 @@ Test::nonIgnoredErrorTakesPrecedence() assertReplyErrorsMatch(*gen, { errors[0], errors[1] }); } -void -Test::returnRemoveDocumentReplyWhereDocWasFound() +TEST(ReplyMergerTest, return_remove_document_reply_where_doc_was_found) { RemoveDocumentReply r1; RemoveDocumentReply r2; @@ -192,11 +176,10 @@ Test::returnRemoveDocumentReplyWhereDocWasFound() ReplyMerger::Result ret(merger.mergedReply()); ASSERT_TRUE(ret.isSuccessful()); ASSERT_FALSE(ret.hasGeneratedReply()); - ASSERT_EQUAL(1u, ret.getSuccessfulReplyIndex()); + ASSERT_EQ(1u, ret.getSuccessfulReplyIndex()); } -void -Test::returnFirstRemoveDocumentReplyIfNoDocsWereFound() +TEST(ReplyMergerTest, return_first_remove_document_reply_if_no_docs_were_found) { RemoveDocumentReply r1; RemoveDocumentReply r2; @@ -209,11 +192,10 @@ Test::returnFirstRemoveDocumentReplyIfNoDocsWereFound() ReplyMerger::Result ret(merger.mergedReply()); ASSERT_TRUE(ret.isSuccessful()); ASSERT_FALSE(ret.hasGeneratedReply()); - ASSERT_EQUAL(0u, ret.getSuccessfulReplyIndex()); + ASSERT_EQ(0u, ret.getSuccessfulReplyIndex()); } -void -Test::returnUpdateDocumentReplyWhereDocWasFound() +TEST(ReplyMergerTest, return_update_document_reply_where_doc_was_found) { UpdateDocumentReply r1; UpdateDocumentReply r2; @@ -229,11 +211,10 @@ Test::returnUpdateDocumentReplyWhereDocWasFound() ReplyMerger::Result ret(merger.mergedReply()); ASSERT_TRUE(ret.isSuccessful()); ASSERT_FALSE(ret.hasGeneratedReply()); - ASSERT_EQUAL(1u, ret.getSuccessfulReplyIndex()); + ASSERT_EQ(1u, ret.getSuccessfulReplyIndex()); } -void -Test::returnGetDocumentReplyWhereDocWasFound() +TEST(ReplyMergerTest, return_get_document_reply_where_doc_was_found) { GetDocumentReply r1; GetDocumentReply r2; @@ -247,22 +228,10 @@ Test::returnGetDocumentReplyWhereDocWasFound() ReplyMerger::Result ret(merger.mergedReply()); ASSERT_TRUE(ret.isSuccessful()); ASSERT_FALSE(ret.hasGeneratedReply()); - ASSERT_EQUAL(1u, ret.getSuccessfulReplyIndex()); + ASSERT_EQ(1u, ret.getSuccessfulReplyIndex()); } -void -Test::assertReplyErrorsMatch(const mbus::Reply& r, - const std::vector<mbus::Error>& errors) -{ - ASSERT_EQUAL(r.getNumErrors(), errors.size()); - for (size_t i = 0; i < errors.size(); ++i) { - ASSERT_EQUAL(errors[i].getCode(), r.getError(i).getCode()); - ASSERT_EQUAL(errors[i].getMessage(), r.getError(i).getMessage()); - } -} - -void -Test::mergingZeroRepliesReturnsDefaultEmptyReply() +TEST(ReplyMergerTest, merging_zero_replies_returns_default_empty_reply) { ReplyMerger merger; ReplyMerger::Result ret(merger.mergedReply()); @@ -273,30 +242,4 @@ Test::mergingZeroRepliesReturnsDefaultEmptyReply() assertReplyErrorsMatch(*gen, {}); } -#ifdef RUN_TEST -# error Someone defined RUN_TEST already! Oh no! -#endif -#define RUN_TEST(f) \ - std::cerr << "running test case '" #f "'\n"; \ - f(); TEST_FLUSH(); - -int -Test::Main() -{ - TEST_INIT("replymerger_test"); - - RUN_TEST(mergingGenericRepliesWithNoErrorsPicksFirstReply); - RUN_TEST(mergingSingleReplyWithOneErrorReturnsEmptyReplyWithError); - RUN_TEST(mergingSingleReplyWithMultipleErrorsReturnsEmptyReplyWithAllErrors); - RUN_TEST(mergingMultipleRepliesWithMultipleErrorsReturnsEmptyReplyWithAllErrors); - RUN_TEST(returnIgnoredReplyWhenAllRepliesHaveOnlyIgnoredErrors); - RUN_TEST(successfulReplyTakesPrecedenceOverIgnoredReplyWhenNoErrors); - RUN_TEST(nonIgnoredErrorTakesPrecedence); - RUN_TEST(returnRemoveDocumentReplyWhereDocWasFound); - RUN_TEST(returnFirstRemoveDocumentReplyIfNoDocsWereFound); - RUN_TEST(returnUpdateDocumentReplyWhereDocWasFound); - RUN_TEST(returnGetDocumentReplyWhereDocWasFound); - RUN_TEST(mergingZeroRepliesReturnsDefaultEmptyReply); - - TEST_DONE(); -} +GTEST_MAIN_RUN_ALL_TESTS() |