fix flaky ConnectTFOTimeout and ConnectTFOFallbackTimeout tests
[folly.git] / folly / io / async / test / AsyncSocketTest.cpp
index 473c87ecbb001eaf0a60a09e250073905e4ece8d..bd348bd9c446a28b7f6829d7da0b0e74b862c662 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <iostream>
 
 #include <folly/io/async/AsyncSocket.h>
+#include <folly/io/async/AsyncServerSocket.h>
 #include <folly/io/async/EventBase.h>
 
 #include <gtest/gtest.h>
 
+namespace folly {
+
 TEST(AsyncSocketTest, getSockOpt) {
-  folly::EventBase evb;
-  std::shared_ptr<folly::AsyncSocket> socket =
-    folly::AsyncSocket::newSocket(&evb, 0);
+  EventBase evb;
+  std::shared_ptr<AsyncSocket> socket =
+    AsyncSocket::newSocket(&evb, 0);
 
   int val;
   socklen_t len;
@@ -34,3 +37,56 @@ TEST(AsyncSocketTest, getSockOpt) {
 
   EXPECT_EQ(expectedRc, actualRc);
 }
+
+TEST(AsyncSocketTest, REUSEPORT) {
+  EventBase base;
+  auto serverSocket = AsyncServerSocket::newSocket(&base);
+  serverSocket->bind(0);
+  serverSocket->listen(0);
+  serverSocket->startAccepting();
+
+  try {
+    serverSocket->setReusePortEnabled(true);
+  } catch(...) {
+    LOG(INFO) << "Reuse port probably not supported";
+    return;
+  }
+
+  SocketAddress address;
+  serverSocket->getAddress(&address);
+  int port = address.getPort();
+
+  auto serverSocket2 = AsyncServerSocket::newSocket(&base);
+  serverSocket2->setReusePortEnabled(true);
+  serverSocket2->bind(port);
+  serverSocket2->listen(0);
+  serverSocket2->startAccepting();
+
+}
+
+TEST(AsyncSocketTest, v4v6samePort) {
+  EventBase base;
+  auto serverSocket = AsyncServerSocket::newSocket(&base);
+  serverSocket->bind(0);
+  auto addrs = serverSocket->getAddresses();
+  ASSERT_GT(addrs.size(), 0);
+  uint16_t port = addrs[0].getPort();
+  for (const auto& addr : addrs) {
+    EXPECT_EQ(port, addr.getPort());
+  }
+}
+
+TEST(AsyncSocketTest, duplicateBind) {
+  EventBase base;
+  auto server1 = AsyncServerSocket::newSocket(&base);
+  server1->bind(0);
+  server1->listen(10);
+
+  SocketAddress address;
+  server1->getAddress(std::addressof(address));
+
+  auto server2 = AsyncServerSocket::newSocket(&base);
+  EXPECT_THROW(server2->bind(address.getPort()), std::exception);
+}
+
+} // namespace