| David Pursell | 706955f | 2016-01-21 08:40:59 -0800 | [diff] [blame] | 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 |  | 
 | 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 |  | 
 | 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 |  | 
 | 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 |  | 
 | 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. | 
 | 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 | } |