From 9edf9411c74ee1e6a47bc5ae3776093e48a04f5a Mon Sep 17 00:00:00 2001 From: David Drysdale Date: Mon, 28 Dec 2015 11:10:48 +0000 Subject: [PATCH] test: Add a simple multi-server test Check rotate option does something --- test/ares-test-mock.cc | 119 +++++++++++++++++++++++++++++++++++++++++ test/ares-test.cc | 2 - 2 files changed, 119 insertions(+), 2 deletions(-) diff --git a/test/ares-test-mock.cc b/test/ares-test-mock.cc index e0506d1f..c1da7859 100644 --- a/test/ares-test-mock.cc +++ b/test/ares-test-mock.cc @@ -883,6 +883,113 @@ TEST_P(MockChannelTest, HostAliasUnreadable) { chmod(aliases.filename(), 0777); } +class MockMultiServerChannelTest + : public MockChannelOptsTest, + public ::testing::WithParamInterface< std::pair > { + public: + MockMultiServerChannelTest(bool rotate) + : MockChannelOptsTest(3, GetParam().first, GetParam().second, nullptr, rotate ? ARES_OPT_ROTATE : 0) {} + void CheckExample() { + HostResult result; + ares_gethostbyname(channel_, "www.example.com.", AF_INET, HostCallback, &result); + Process(); + EXPECT_TRUE(result.done_); + std::stringstream ss; + ss << result.host_; + EXPECT_EQ("{'www.example.com' aliases=[] addrs=[2.3.4.5]}", ss.str()); + } +}; + +class RotateMultiMockTest : public MockMultiServerChannelTest { + public: + RotateMultiMockTest() : MockMultiServerChannelTest(true) {} +}; + +class NoRotateMultiMockTest : public MockMultiServerChannelTest { + public: + NoRotateMultiMockTest() : MockMultiServerChannelTest(false) {} +}; + + +TEST_P(RotateMultiMockTest, ThirdServer) { + DNSPacket servfailrsp; + servfailrsp.set_response().set_aa().set_rcode(ns_r_servfail) + .add_question(new DNSQuestion("www.example.com", ns_t_a)); + DNSPacket notimplrsp; + notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl) + .add_question(new DNSQuestion("www.example.com", ns_t_a)); + DNSPacket okrsp; + okrsp.set_response().set_aa() + .add_question(new DNSQuestion("www.example.com", ns_t_a)) + .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5})); + + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); + EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); + EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[2].get(), &okrsp)); + CheckExample(); + + // Second time around, starts from server [1]. + EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[1].get(), &servfailrsp)); + EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[2].get(), ¬implrsp)); + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[0].get(), &okrsp)); + CheckExample(); + + // Third time around, starts from server [2]. + EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[2].get(), &servfailrsp)); + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[0].get(), ¬implrsp)); + EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[1].get(), &okrsp)); + CheckExample(); +} + +TEST_P(NoRotateMultiMockTest, ThirdServer) { + DNSPacket servfailrsp; + servfailrsp.set_response().set_aa().set_rcode(ns_r_servfail) + .add_question(new DNSQuestion("www.example.com", ns_t_a)); + DNSPacket notimplrsp; + notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl) + .add_question(new DNSQuestion("www.example.com", ns_t_a)); + DNSPacket okrsp; + okrsp.set_response().set_aa() + .add_question(new DNSQuestion("www.example.com", ns_t_a)) + .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5})); + + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); + EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); + EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[2].get(), &okrsp)); + CheckExample(); + + // Second time around, still starts from server [0]. + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); + EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); + EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[2].get(), &okrsp)); + CheckExample(); + + // Third time around, still starts from server [0]. + EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[0].get(), &servfailrsp)); + EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[1].get(), ¬implrsp)); + EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a)) + .WillOnce(SetReply(servers_[2].get(), &okrsp)); + CheckExample(); +} + + INSTANTIATE_TEST_CASE_P(AddressFamilies, MockChannelTest, ::testing::Values(std::make_pair(AF_INET, false), std::make_pair(AF_INET, true), @@ -907,5 +1014,17 @@ INSTANTIATE_TEST_CASE_P(AddressFamilies, MockEDNSChannelTest, std::make_pair(AF_INET6, false), std::make_pair(AF_INET6, true))); +INSTANTIATE_TEST_CASE_P(TransportModes, RotateMultiMockTest, + ::testing::Values(std::make_pair(AF_INET, false), + std::make_pair(AF_INET, true), + std::make_pair(AF_INET6, false), + std::make_pair(AF_INET6, true))); + +INSTANTIATE_TEST_CASE_P(TransportModes, NoRotateMultiMockTest, + ::testing::Values(std::make_pair(AF_INET, false), + std::make_pair(AF_INET, true), + std::make_pair(AF_INET6, false), + std::make_pair(AF_INET6, true))); + } // namespace test } // namespace ares diff --git a/test/ares-test.cc b/test/ares-test.cc index 7969280e..a793d070 100644 --- a/test/ares-test.cc +++ b/test/ares-test.cc @@ -357,7 +357,6 @@ MockChannelOptsTest::MockChannelOptsTest(int count, if (givenopts) { memcpy(&opts, givenopts, sizeof(opts)); } else { - EXPECT_EQ(0, optmask); memset(&opts, 0, sizeof(opts)); } @@ -388,7 +387,6 @@ MockChannelOptsTest::MockChannelOptsTest(int count, opts.flags |= ARES_FLAG_USEVC; optmask |= ARES_OPT_FLAGS; } - optmask |= ARES_OPT_ROTATE; EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel_, &opts, optmask)); EXPECT_NE(nullptr, channel_);