From: JINMEI Tatuya Date: Mon, 28 Oct 2013 07:16:01 +0000 (-0700) Subject: [mavericks] avoid using sleep(3) in a TCP test to make the test more reliable. X-Git-Tag: bind10-1.2.0beta1-release~102^2~15^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=887d1e728e9d7bacd5e9daffc28db83d76103549;p=thirdparty%2Fkea.git [mavericks] avoid using sleep(3) in a TCP test to make the test more reliable. on Mac OS X 10.9, the expected event on the server can be delivered after the sleep, which makes the TCP timeout test fail. --- diff --git a/src/lib/asiodns/tests/dns_server_unittest.cc b/src/lib/asiodns/tests/dns_server_unittest.cc index d59bf5ee0b..b2fff3ea5b 100644 --- a/src/lib/asiodns/tests/dns_server_unittest.cc +++ b/src/lib/asiodns/tests/dns_server_unittest.cc @@ -274,6 +274,7 @@ class TCPClient : public SimpleClient { server_ = server; socket_.reset(new ip::tcp::socket(service)); socket_->open(ip::tcp::v6()); + send_delay_timer_.reset(new deadline_timer(service)); } @@ -324,15 +325,32 @@ class TCPClient : public SimpleClient { size_t send_bytes) { if (!error && send_bytes == 2 && send_data_len_delay_ == 0) { - sleep(send_data_delay_); - socket_->async_send(buffer(data_to_send_.c_str(), - data_to_send_.size() + 1), - boost::bind(&TCPClient::finishSendHandler, this, _1, _2)); + // We cannot block here (such as by sleep(3)) since otherwise + // the ASIO events may not reliably handled in the server side + // as the test expects. So we use async_wait, and make sure the + // control will be given back to the IO service. + if (send_data_delay_ > 0) { + send_delay_timer_->expires_from_now(boost::posix_time:: + seconds(send_data_delay_)); + send_delay_timer_->async_wait( + boost::bind(&TCPClient::sendMessageData, this)); + return; + } + sendMessageData(); } } + void sendMessageData() { + socket_->async_send(buffer(data_to_send_.c_str(), + data_to_send_.size() + 1), + boost::bind(&TCPClient::finishSendHandler, this, + _1, _2)); + } + void finishSendHandler(const asio::error_code& error, size_t send_bytes) { - if (!error && send_bytes == data_to_send_.size() + 1) { + if (error) { + getResponseCallBack(error, 0); + } else if (send_bytes == data_to_send_.size() + 1) { socket_->async_receive(buffer(received_data_, MAX_DATA_LEN), boost::bind(&SimpleClient::getResponseCallBack, this, _1, _2)); @@ -343,6 +361,7 @@ class TCPClient : public SimpleClient { ip::tcp::endpoint server_; std::string data_to_send_; uint16_t data_to_send_len_; + boost::shared_ptr send_delay_timer_; size_t send_data_delay_; size_t send_data_len_delay_;