test: ares_set_socket_callback failure behaviour

This commit is contained in:
David Drysdale 2016-02-09 16:14:37 +00:00
parent 2bae2d56d7
commit 87d641a907
1 changed files with 20 additions and 4 deletions

View File

@ -109,10 +109,11 @@ TEST_P(MockUDPChannelTest, TruncationRetry) {
}
static int sock_cb_count = 0;
static int SocketCallback(ares_socket_t fd, int type, void *data) {
if (verbose) std::cerr << "SocketCallback(" << fd << ") invoked" << std::endl;
static int SocketConnectCallback(ares_socket_t fd, int type, void *data) {
int rc = *(int*)data;
if (verbose) std::cerr << "SocketConnectCallback(" << fd << ") invoked" << std::endl;
sock_cb_count++;
return ARES_SUCCESS;
return rc;
}
TEST_P(MockChannelTest, SockCallback) {
@ -124,7 +125,8 @@ TEST_P(MockChannelTest, SockCallback) {
.WillOnce(SetReply(&server_, &rsp));
// Get notified of new sockets
ares_set_socket_callback(channel_, SocketCallback, nullptr);
int rc = ARES_SUCCESS;
ares_set_socket_callback(channel_, SocketConnectCallback, &rc);
HostResult result;
sock_cb_count = 0;
@ -137,6 +139,20 @@ TEST_P(MockChannelTest, SockCallback) {
EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
}
TEST_P(MockChannelTest, SockFailCallback) {
// Notification of new sockets gives an error.
int rc = -1;
ares_set_socket_callback(channel_, SocketConnectCallback, &rc);
HostResult result;
sock_cb_count = 0;
ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
Process();
EXPECT_LT(1, sock_cb_count);
EXPECT_TRUE(result.done_);
EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
}
// TCP only to prevent retries
TEST_P(MockTCPChannelTest, MalformedResponse) {
std::vector<byte> one = {0x01};