QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h" |
| 6 | |
vasilvv | 872e7a3 | 2019-03-12 16:42:44 -0700 | [diff] [blame] | 7 | #include <string> |
| 8 | |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 9 | #include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h" |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 10 | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" |
| 11 | |
| 12 | namespace quic { |
| 13 | namespace test { |
| 14 | |
| 15 | class QuicSocketAddressCoderTest : public QuicTest {}; |
| 16 | |
| 17 | TEST_F(QuicSocketAddressCoderTest, EncodeIPv4) { |
| 18 | QuicIpAddress ip; |
| 19 | ip.FromString("4.31.198.44"); |
| 20 | QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x1234)); |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 21 | std::string serialized = coder.Encode(); |
| 22 | std::string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 23 | EXPECT_EQ(expected, serialized); |
| 24 | } |
| 25 | |
| 26 | TEST_F(QuicSocketAddressCoderTest, EncodeIPv6) { |
| 27 | QuicIpAddress ip; |
| 28 | ip.FromString("2001:700:300:1800::f"); |
| 29 | QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x5678)); |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 30 | std::string serialized = coder.Encode(); |
| 31 | std::string expected( |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 32 | "\x0a\x00" |
| 33 | "\x20\x01\x07\x00\x03\x00\x18\x00" |
| 34 | "\x00\x00\x00\x00\x00\x00\x00\x0f" |
| 35 | "\x78\x56", |
| 36 | 20); |
| 37 | EXPECT_EQ(expected, serialized); |
| 38 | } |
| 39 | |
| 40 | TEST_F(QuicSocketAddressCoderTest, DecodeIPv4) { |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 41 | std::string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 42 | QuicSocketAddressCoder coder; |
| 43 | ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| 44 | EXPECT_EQ(IpAddressFamily::IP_V4, coder.ip().address_family()); |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 45 | std::string expected_addr("\x04\x1f\xc6\x2c"); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 46 | EXPECT_EQ(expected_addr, coder.ip().ToPackedString()); |
| 47 | EXPECT_EQ(0x1234, coder.port()); |
| 48 | } |
| 49 | |
| 50 | TEST_F(QuicSocketAddressCoderTest, DecodeIPv6) { |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 51 | std::string serialized( |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 52 | "\x0a\x00" |
| 53 | "\x20\x01\x07\x00\x03\x00\x18\x00" |
| 54 | "\x00\x00\x00\x00\x00\x00\x00\x0f" |
| 55 | "\x78\x56", |
| 56 | 20); |
| 57 | QuicSocketAddressCoder coder; |
| 58 | ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| 59 | EXPECT_EQ(IpAddressFamily::IP_V6, coder.ip().address_family()); |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 60 | std::string expected_addr( |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 61 | "\x20\x01\x07\x00\x03\x00\x18\x00" |
| 62 | "\x00\x00\x00\x00\x00\x00\x00\x0f", |
| 63 | 16); |
| 64 | EXPECT_EQ(expected_addr, coder.ip().ToPackedString()); |
| 65 | EXPECT_EQ(0x5678, coder.port()); |
| 66 | } |
| 67 | |
| 68 | TEST_F(QuicSocketAddressCoderTest, DecodeBad) { |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 69 | std::string serialized( |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 70 | "\x0a\x00" |
| 71 | "\x20\x01\x07\x00\x03\x00\x18\x00" |
| 72 | "\x00\x00\x00\x00\x00\x00\x00\x0f" |
| 73 | "\x78\x56", |
| 74 | 20); |
| 75 | QuicSocketAddressCoder coder; |
| 76 | EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| 77 | // Append junk. |
| 78 | serialized.push_back('\0'); |
| 79 | EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); |
| 80 | // Undo. |
| 81 | serialized.resize(20); |
| 82 | EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| 83 | |
| 84 | // Set an unknown address family. |
| 85 | serialized[0] = '\x03'; |
| 86 | EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); |
| 87 | // Undo. |
| 88 | serialized[0] = '\x0a'; |
| 89 | EXPECT_TRUE(coder.Decode(serialized.data(), serialized.length())); |
| 90 | |
| 91 | // Truncate. |
| 92 | size_t len = serialized.length(); |
| 93 | for (size_t i = 0; i < len; i++) { |
| 94 | ASSERT_FALSE(serialized.empty()); |
| 95 | serialized.erase(serialized.length() - 1); |
| 96 | EXPECT_FALSE(coder.Decode(serialized.data(), serialized.length())); |
| 97 | } |
| 98 | EXPECT_TRUE(serialized.empty()); |
| 99 | } |
| 100 | |
| 101 | TEST_F(QuicSocketAddressCoderTest, EncodeAndDecode) { |
| 102 | struct { |
| 103 | const char* ip_literal; |
| 104 | uint16_t port; |
| 105 | } test_case[] = { |
| 106 | {"93.184.216.119", 0x1234}, |
| 107 | {"199.204.44.194", 80}, |
| 108 | {"149.20.4.69", 443}, |
| 109 | {"127.0.0.1", 8080}, |
| 110 | {"2001:700:300:1800::", 0x5678}, |
| 111 | {"::1", 65534}, |
| 112 | }; |
| 113 | |
| 114 | for (size_t i = 0; i < QUIC_ARRAYSIZE(test_case); i++) { |
| 115 | QuicIpAddress ip; |
| 116 | ASSERT_TRUE(ip.FromString(test_case[i].ip_literal)); |
| 117 | QuicSocketAddressCoder encoder(QuicSocketAddress(ip, test_case[i].port)); |
vasilvv | c48c871 | 2019-03-11 13:38:16 -0700 | [diff] [blame] | 118 | std::string serialized = encoder.Encode(); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 119 | |
| 120 | QuicSocketAddressCoder decoder; |
| 121 | ASSERT_TRUE(decoder.Decode(serialized.data(), serialized.length())); |
| 122 | EXPECT_EQ(encoder.ip(), decoder.ip()); |
| 123 | EXPECT_EQ(encoder.port(), decoder.port()); |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | } // namespace test |
| 128 | } // namespace quic |