xref: /llvm-project/lldb/unittests/Host/SocketAddressTest.cpp (revision 808142876c10b52e7ee57cdc6dcf0acc5c97c1b7)
1*80814287SRaphael Isemann //===-- SocketAddressTest.cpp ---------------------------------------------===//
2719ec93aSZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6719ec93aSZachary Turner //
7719ec93aSZachary Turner //===----------------------------------------------------------------------===//
8719ec93aSZachary Turner 
9f8a74c18SAaron Smith #include "lldb/Host/SocketAddress.h"
105dca0596SRaphael Isemann #include "TestingSupport/SubsystemRAII.h"
11f8a74c18SAaron Smith #include "lldb/Host/Socket.h"
12f8a74c18SAaron Smith #include "llvm/Testing/Support/Error.h"
13f8a74c18SAaron Smith 
14719ec93aSZachary Turner #include "gtest/gtest.h"
15719ec93aSZachary Turner 
16f8a74c18SAaron Smith using namespace lldb_private;
17719ec93aSZachary Turner 
1827d15287SPavel Labath namespace {
1927d15287SPavel Labath class SocketAddressTest : public testing::Test {
2027d15287SPavel Labath public:
215dca0596SRaphael Isemann   SubsystemRAII<Socket> subsystems;
2227d15287SPavel Labath };
2327d15287SPavel Labath } // namespace
2427d15287SPavel Labath 
TEST_F(SocketAddressTest,Set)2527d15287SPavel Labath TEST_F(SocketAddressTest, Set) {
26719ec93aSZachary Turner   SocketAddress sa;
27719ec93aSZachary Turner   ASSERT_TRUE(sa.SetToLocalhost(AF_INET, 1138));
28719ec93aSZachary Turner   ASSERT_STREQ("127.0.0.1", sa.GetIPAddress().c_str());
29719ec93aSZachary Turner   ASSERT_EQ(1138, sa.GetPort());
30719ec93aSZachary Turner 
31719ec93aSZachary Turner   ASSERT_TRUE(sa.SetToAnyAddress(AF_INET, 0));
32719ec93aSZachary Turner   ASSERT_STREQ("0.0.0.0", sa.GetIPAddress().c_str());
33719ec93aSZachary Turner   ASSERT_EQ(0, sa.GetPort());
34719ec93aSZachary Turner 
35719ec93aSZachary Turner   ASSERT_TRUE(sa.SetToLocalhost(AF_INET6, 1139));
36b9c1b51eSKate Stone   ASSERT_TRUE(sa.GetIPAddress() == "::1" ||
37b9c1b51eSKate Stone               sa.GetIPAddress() == "0:0:0:0:0:0:0:1")
38b9c1b51eSKate Stone       << "Address was: " << sa.GetIPAddress();
39719ec93aSZachary Turner   ASSERT_EQ(1139, sa.GetPort());
40719ec93aSZachary Turner }
41719ec93aSZachary Turner 
TEST_F(SocketAddressTest,GetAddressInfo)4227d15287SPavel Labath TEST_F(SocketAddressTest, GetAddressInfo) {
43df0497c4SPavel Labath   auto addr = SocketAddress::GetAddressInfo("127.0.0.1", nullptr, AF_UNSPEC,
44df0497c4SPavel Labath                                             SOCK_STREAM, IPPROTO_TCP);
45df0497c4SPavel Labath   ASSERT_EQ(1u, addr.size());
46df0497c4SPavel Labath   EXPECT_EQ(AF_INET, addr[0].GetFamily());
47df0497c4SPavel Labath   EXPECT_EQ("127.0.0.1", addr[0].GetIPAddress());
48df0497c4SPavel Labath }
49df0497c4SPavel Labath 
50719ec93aSZachary Turner #ifdef _WIN32
51719ec93aSZachary Turner 
52719ec93aSZachary Turner // we need to test our inet_ntop implementation for Windows XP
53b9c1b51eSKate Stone const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
54719ec93aSZachary Turner 
TEST_F(SocketAddressTest,inet_ntop)5527d15287SPavel Labath TEST_F(SocketAddressTest, inet_ntop) {
56719ec93aSZachary Turner   const uint8_t address4[4] = {255, 0, 1, 100};
57b9c1b51eSKate Stone   const uint8_t address6[16] = {0, 1, 2,  3,  4,  5,  6,   7,
58b9c1b51eSKate Stone                                 8, 9, 10, 11, 12, 13, 255, 0};
59719ec93aSZachary Turner 
60719ec93aSZachary Turner   char buffer[INET6_ADDRSTRLEN];
61719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
62b9c1b51eSKate Stone   EXPECT_STREQ("1:203:405:607:809:a0b:c0d:ff00",
63b9c1b51eSKate Stone                inet_ntop(AF_INET6, address6, buffer, sizeof(buffer)));
64719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
65b9c1b51eSKate Stone   EXPECT_STREQ("1:203:405:607:809:a0b:c0d:ff00",
66b9c1b51eSKate Stone                inet_ntop(AF_INET6, address6, buffer, 31));
67719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
68719ec93aSZachary Turner   EXPECT_STREQ(nullptr, inet_ntop(AF_INET6, address6, buffer, 0));
69719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
70719ec93aSZachary Turner   EXPECT_STREQ(nullptr, inet_ntop(AF_INET6, address6, buffer, 30));
71719ec93aSZachary Turner 
72719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
73b9c1b51eSKate Stone   EXPECT_STREQ("255.0.1.100",
74b9c1b51eSKate Stone                inet_ntop(AF_INET, address4, buffer, sizeof(buffer)));
75719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
76719ec93aSZachary Turner   EXPECT_STREQ("255.0.1.100", inet_ntop(AF_INET, address4, buffer, 12));
77719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
78719ec93aSZachary Turner   EXPECT_STREQ(nullptr, inet_ntop(AF_INET, address4, buffer, 0));
79719ec93aSZachary Turner   memset(buffer, 'x', sizeof(buffer));
80719ec93aSZachary Turner   EXPECT_STREQ(nullptr, inet_ntop(AF_INET, address4, buffer, 11));
81719ec93aSZachary Turner }
82719ec93aSZachary Turner 
83719ec93aSZachary Turner #endif
84