Add method to get the connect timeout used for an AsyncSocket
authorNeel Goyal <ngoyal@fb.com>
Wed, 13 Apr 2016 15:04:45 +0000 (08:04 -0700)
committerFacebook Github Bot 0 <facebook-github-bot-0-bot@fb.com>
Wed, 13 Apr 2016 15:05:22 +0000 (08:05 -0700)
Summary: Have the AsyncSocket keep track of the timeout used for connecting and add a getter to retrieve it.

Reviewed By: hiteshk

Differential Revision: D3170625

fb-gh-sync-id: 61d0ecd8d975c49978a1cf222671aa16a2160499
fbshipit-source-id: 61d0ecd8d975c49978a1cf222671aa16a2160499

folly/io/async/AsyncSocket.cpp
folly/io/async/AsyncSocket.h
folly/io/async/test/AsyncSocketTest2.cpp

index beabc5d8856e5bb8772d6cffa52f43bbfe2e9e17..6fd3c355918c326d586447ab571372d4e233ebae 100644 (file)
@@ -321,6 +321,7 @@ void AsyncSocket::connect(ConnectCallback* callback,
     return invalidState(callback);
   }
 
+  connectTimeout_ = std::chrono::milliseconds(timeout);
   connectStartTime_ = std::chrono::steady_clock::now();
   // Make connect end time at least >= connectStartTime.
   connectEndTime_ = connectStartTime_;
index 28f1c65d3449705dd17cd3b3ef0bfcca84ab0e83..ba706747c57a8a46e32950eebdb98aefbe7af20c 100644 (file)
@@ -257,15 +257,19 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
    *                  does not succeed within this period,
    *                  callback->connectError() will be invoked.
    */
-  virtual void connect(ConnectCallback* callback,
-               const folly::SocketAddress& address,
-               int timeout = 0,
-               const OptionMap &options = emptyOptionMap,
-               const folly::SocketAddress& bindAddr = anyAddress()
-               ) noexcept;
-  void connect(ConnectCallback* callback, const std::string& ip, uint16_t port,
-               int timeout = 00,
-               const OptionMap &options = emptyOptionMap) noexcept;
+  virtual void connect(
+      ConnectCallback* callback,
+      const folly::SocketAddress& address,
+      int timeout = 0,
+      const OptionMap& options = emptyOptionMap,
+      const folly::SocketAddress& bindAddr = anyAddress()) noexcept;
+
+  void connect(
+      ConnectCallback* callback,
+      const std::string& ip,
+      uint16_t port,
+      int timeout = 0,
+      const OptionMap& options = emptyOptionMap) noexcept;
 
   /**
    * If a connect request is in-flight, cancels it and closes the socket
@@ -406,6 +410,10 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
     return connectEndTime_ - connectStartTime_;
   }
 
+  std::chrono::milliseconds getConnectTimeout() const {
+    return connectTimeout_;
+  }
+
   // Methods controlling socket options
 
   /**
@@ -802,6 +810,8 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
   std::chrono::steady_clock::time_point connectStartTime_;
   std::chrono::steady_clock::time_point connectEndTime_;
 
+  std::chrono::milliseconds connectTimeout_{0};
+
   BufferCallback* bufferCallback_{nullptr};
 };
 #ifdef _MSC_VER
index 45adfa9ede7b158154ab85d7347156aa85767307..549dc294c82da62858027a58881246ec6721a10b 100644 (file)
@@ -98,6 +98,7 @@ TEST(AsyncSocketTest, Connect) {
 
   CHECK_EQ(cb.state, STATE_SUCCEEDED);
   EXPECT_LE(0, socket->getConnectTime().count());
+  EXPECT_EQ(socket->getConnectTimeout(), std::chrono::milliseconds(30));
 }
 
 /**
@@ -118,6 +119,7 @@ TEST(AsyncSocketTest, ConnectRefused) {
   CHECK_EQ(cb.state, STATE_FAILED);
   CHECK_EQ(cb.exception.getType(), AsyncSocketException::NOT_OPEN);
   EXPECT_LE(0, socket->getConnectTime().count());
+  EXPECT_EQ(socket->getConnectTimeout(), std::chrono::milliseconds(30));
 }
 
 /**
@@ -156,6 +158,7 @@ TEST(AsyncSocketTest, ConnectTimeout) {
   socket->getPeerAddress(&peer);
   CHECK_EQ(peer, addr);
   EXPECT_LE(0, socket->getConnectTime().count());
+  EXPECT_EQ(socket->getConnectTimeout(), std::chrono::milliseconds(1));
 }
 
 /**
@@ -190,6 +193,7 @@ TEST(AsyncSocketTest, ConnectAndWrite) {
 
   ASSERT_TRUE(socket->isClosedBySelf());
   ASSERT_FALSE(socket->isClosedByPeer());
+  EXPECT_EQ(socket->getConnectTimeout(), std::chrono::milliseconds(30));
 }
 
 /**