1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "android-base/parsenetaddress.h"
18 
19 #include <gtest/gtest.h>
20 
21 using android::base::ParseNetAddress;
22 
TEST(ParseNetAddressTest,TestUrl)23 TEST(ParseNetAddressTest, TestUrl) {
24   std::string canonical, host, error;
25   int port = 123;
26 
27   EXPECT_TRUE(
28       ParseNetAddress("www.google.com", &host, &port, &canonical, &error));
29   EXPECT_EQ("www.google.com:123", canonical);
30   EXPECT_EQ("www.google.com", host);
31   EXPECT_EQ(123, port);
32 
33   EXPECT_TRUE(
34       ParseNetAddress("www.google.com:666", &host, &port, &canonical, &error));
35   EXPECT_EQ("www.google.com:666", canonical);
36   EXPECT_EQ("www.google.com", host);
37   EXPECT_EQ(666, port);
38 }
39 
TEST(ParseNetAddressTest,TestIpv4)40 TEST(ParseNetAddressTest, TestIpv4) {
41   std::string canonical, host, error;
42   int port = 123;
43 
44   EXPECT_TRUE(ParseNetAddress("1.2.3.4", &host, &port, &canonical, &error));
45   EXPECT_EQ("1.2.3.4:123", canonical);
46   EXPECT_EQ("1.2.3.4", host);
47   EXPECT_EQ(123, port);
48 
49   EXPECT_TRUE(ParseNetAddress("1.2.3.4:666", &host, &port, &canonical, &error));
50   EXPECT_EQ("1.2.3.4:666", canonical);
51   EXPECT_EQ("1.2.3.4", host);
52   EXPECT_EQ(666, port);
53 }
54 
TEST(ParseNetAddressTest,TestIpv6)55 TEST(ParseNetAddressTest, TestIpv6) {
56   std::string canonical, host, error;
57   int port = 123;
58 
59   EXPECT_TRUE(ParseNetAddress("::1", &host, &port, &canonical, &error));
60   EXPECT_EQ("[::1]:123", canonical);
61   EXPECT_EQ("::1", host);
62   EXPECT_EQ(123, port);
63 
64   EXPECT_TRUE(ParseNetAddress("fe80::200:5aee:feaa:20a2", &host, &port,
65                               &canonical, &error));
66   EXPECT_EQ("[fe80::200:5aee:feaa:20a2]:123", canonical);
67   EXPECT_EQ("fe80::200:5aee:feaa:20a2", host);
68   EXPECT_EQ(123, port);
69 
70   EXPECT_TRUE(ParseNetAddress("[::1]:666", &host, &port, &canonical, &error));
71   EXPECT_EQ("[::1]:666", canonical);
72   EXPECT_EQ("::1", host);
73   EXPECT_EQ(666, port);
74 
75   EXPECT_TRUE(ParseNetAddress("[fe80::200:5aee:feaa:20a2]:666", &host, &port,
76                               &canonical, &error));
77   EXPECT_EQ("[fe80::200:5aee:feaa:20a2]:666", canonical);
78   EXPECT_EQ("fe80::200:5aee:feaa:20a2", host);
79   EXPECT_EQ(666, port);
80 }
81 
TEST(ParseNetAddressTest,TestInvalidAddress)82 TEST(ParseNetAddressTest, TestInvalidAddress) {
83   std::string canonical, host;
84   int port;
85 
86   std::string failure_cases[] = {
87       // Invalid IPv4.
88       "1.2.3.4:",
89       "1.2.3.4::",
90       ":123",
91 
92       // Invalid IPv6.
93       ":1",
94       "::::::::1",
95       "[::1",
96       "[::1]",
97       "[::1]:",
98       "[::1]::",
99 
100       // Invalid port.
101       "1.2.3.4:-1",
102       "1.2.3.4:0",
103       "1.2.3.4:65536"
104       "1.2.3.4:hello",
105       "[::1]:-1",
106       "[::1]:0",
107       "[::1]:65536",
108       "[::1]:hello",
109   };
110 
111   for (const auto& address : failure_cases) {
112     // Failure should give some non-empty error string.
113     std::string error;
114     EXPECT_FALSE(ParseNetAddress(address, &host, &port, &canonical, &error));
115     EXPECT_NE("", error);
116   }
117 }
118 
119 // Null canonical address argument.
TEST(ParseNetAddressTest,TestNullCanonicalAddress)120 TEST(ParseNetAddressTest, TestNullCanonicalAddress) {
121   std::string host, error;
122   int port = 42;
123 
124   EXPECT_TRUE(ParseNetAddress("www.google.com", &host, &port, nullptr, &error));
125   EXPECT_TRUE(ParseNetAddress("1.2.3.4", &host, &port, nullptr, &error));
126   EXPECT_TRUE(ParseNetAddress("::1", &host, &port, nullptr, &error));
127 }
128