1 // Copyright (c) 2016 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_tag.h"
6 
7 #include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
8 #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
9 #include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
10 
11 namespace quic {
12 namespace test {
13 namespace {
14 
15 class QuicTagTest : public QuicTest {};
16 
TEST_F(QuicTagTest,TagToString)17 TEST_F(QuicTagTest, TagToString) {
18   EXPECT_EQ("SCFG", QuicTagToString(kSCFG));
19   EXPECT_EQ("SNO ", QuicTagToString(kServerNonceTag));
20   EXPECT_EQ("CRT ", QuicTagToString(kCertificateTag));
21   EXPECT_EQ("CHLO", QuicTagToString(MakeQuicTag('C', 'H', 'L', 'O')));
22   // A tag that contains a non-printing character will be printed as hex.
23   EXPECT_EQ("43484c1f", QuicTagToString(MakeQuicTag('C', 'H', 'L', '\x1f')));
24 }
25 
TEST_F(QuicTagTest,MakeQuicTag)26 TEST_F(QuicTagTest, MakeQuicTag) {
27   QuicTag tag = MakeQuicTag('A', 'B', 'C', 'D');
28   char bytes[4];
29   memcpy(bytes, &tag, 4);
30   EXPECT_EQ('A', bytes[0]);
31   EXPECT_EQ('B', bytes[1]);
32   EXPECT_EQ('C', bytes[2]);
33   EXPECT_EQ('D', bytes[3]);
34 }
35 
TEST_F(QuicTagTest,ParseQuicTag)36 TEST_F(QuicTagTest, ParseQuicTag) {
37   QuicTag tag_abcd = MakeQuicTag('A', 'B', 'C', 'D');
38   EXPECT_EQ(ParseQuicTag("ABCD"), tag_abcd);
39   EXPECT_EQ(ParseQuicTag("ABCDE"), tag_abcd);
40   QuicTag tag_efgh = MakeQuicTag('E', 'F', 'G', 'H');
41   EXPECT_EQ(ParseQuicTag("EFGH"), tag_efgh);
42   QuicTag tag_ijk = MakeQuicTag('I', 'J', 'K', 0);
43   EXPECT_EQ(ParseQuicTag("IJK"), tag_ijk);
44   QuicTag tag_l = MakeQuicTag('L', 0, 0, 0);
45   EXPECT_EQ(ParseQuicTag("L"), tag_l);
46   QuicTag tag_hex = MakeQuicTag('M', 'N', 'O', static_cast<char>(255));
47   EXPECT_EQ(ParseQuicTag("4d4e4fff"), tag_hex);
48   EXPECT_EQ(ParseQuicTag("4D4E4FFF"), tag_hex);
49   QuicTag tag_with_numbers = MakeQuicTag('P', 'Q', '1', '2');
50   EXPECT_EQ(ParseQuicTag("PQ12"), tag_with_numbers);
51   QuicTag tag_with_custom_chars = MakeQuicTag('r', '$', '_', '7');
52   EXPECT_EQ(ParseQuicTag("r$_7"), tag_with_custom_chars);
53   QuicTag tag_zero = 0;
54   EXPECT_EQ(ParseQuicTag(""), tag_zero);
55   QuicTagVector tag_vector;
56   EXPECT_EQ(ParseQuicTagVector(""), tag_vector);
57   EXPECT_EQ(ParseQuicTagVector(" "), tag_vector);
58   tag_vector.push_back(tag_abcd);
59   EXPECT_EQ(ParseQuicTagVector("ABCD"), tag_vector);
60   tag_vector.push_back(tag_efgh);
61   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH"), tag_vector);
62   tag_vector.push_back(tag_ijk);
63   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH,IJK"), tag_vector);
64   tag_vector.push_back(tag_l);
65   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH,IJK,L"), tag_vector);
66   tag_vector.push_back(tag_hex);
67   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH,IJK,L,4d4e4fff"), tag_vector);
68   tag_vector.push_back(tag_with_numbers);
69   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH,IJK,L,4d4e4fff,PQ12"), tag_vector);
70   tag_vector.push_back(tag_with_custom_chars);
71   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH,IJK,L,4d4e4fff,PQ12,r$_7"),
72             tag_vector);
73   tag_vector.push_back(tag_zero);
74   EXPECT_EQ(ParseQuicTagVector("ABCD,EFGH,IJK,L,4d4e4fff,PQ12,r$_7,"),
75             tag_vector);
76 }
77 
78 }  // namespace
79 }  // namespace test
80 }  // namespace quic
81