test: Add a simple multi-server test

Check rotate option does something
pull/34/head
David Drysdale 9 years ago
parent d448d6604f
commit 9edf9411c7
  1. 119
      test/ares-test-mock.cc
  2. 2
      test/ares-test.cc

@ -883,6 +883,113 @@ TEST_P(MockChannelTest, HostAliasUnreadable) {
chmod(aliases.filename(), 0777);
}
class MockMultiServerChannelTest
: public MockChannelOptsTest,
public ::testing::WithParamInterface< std::pair<int, bool> > {
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(), &notimplrsp));
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(), &notimplrsp));
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(), &notimplrsp));
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(), &notimplrsp));
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(), &notimplrsp));
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(), &notimplrsp));
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<int, bool>(AF_INET, false),
std::make_pair<int, bool>(AF_INET, true),
@ -907,5 +1014,17 @@ INSTANTIATE_TEST_CASE_P(AddressFamilies, MockEDNSChannelTest,
std::make_pair<int, bool>(AF_INET6, false),
std::make_pair<int, bool>(AF_INET6, true)));
INSTANTIATE_TEST_CASE_P(TransportModes, RotateMultiMockTest,
::testing::Values(std::make_pair<int, bool>(AF_INET, false),
std::make_pair<int, bool>(AF_INET, true),
std::make_pair<int, bool>(AF_INET6, false),
std::make_pair<int, bool>(AF_INET6, true)));
INSTANTIATE_TEST_CASE_P(TransportModes, NoRotateMultiMockTest,
::testing::Values(std::make_pair<int, bool>(AF_INET, false),
std::make_pair<int, bool>(AF_INET, true),
std::make_pair<int, bool>(AF_INET6, false),
std::make_pair<int, bool>(AF_INET6, true)));
} // namespace test
} // namespace ares

@ -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_);

Loading…
Cancel
Save