X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fio%2Fasync%2Ftest%2FAsyncSocketTest.cpp;h=bd348bd9c446a28b7f6829d7da0b0e74b862c662;hb=a3bd593ad9374cd3a1db31066874b9bad1cf74b4;hp=473c87ecbb001eaf0a60a09e250073905e4ece8d;hpb=44e48457cd329fe0a467c5bf9a8b8d514c8e6e0d;p=folly.git diff --git a/folly/io/async/test/AsyncSocketTest.cpp b/folly/io/async/test/AsyncSocketTest.cpp index 473c87ec..bd348bd9 100644 --- a/folly/io/async/test/AsyncSocketTest.cpp +++ b/folly/io/async/test/AsyncSocketTest.cpp @@ -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. @@ -16,14 +16,17 @@ #include #include +#include #include #include +namespace folly { + TEST(AsyncSocketTest, getSockOpt) { - folly::EventBase evb; - std::shared_ptr socket = - folly::AsyncSocket::newSocket(&evb, 0); + EventBase evb; + std::shared_ptr 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