xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/balsa/header_properties_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #include "quiche/balsa/header_properties.h"
2 
3 #include "quiche/common/platform/api/quiche_test.h"
4 
5 namespace quiche::header_properties::test {
6 namespace {
7 
TEST(HeaderPropertiesTest,IsMultivaluedHeaderIsCaseInsensitive)8 TEST(HeaderPropertiesTest, IsMultivaluedHeaderIsCaseInsensitive) {
9   EXPECT_TRUE(IsMultivaluedHeader("content-encoding"));
10   EXPECT_TRUE(IsMultivaluedHeader("Content-Encoding"));
11   EXPECT_TRUE(IsMultivaluedHeader("set-cookie"));
12   EXPECT_TRUE(IsMultivaluedHeader("sEt-cOOkie"));
13   EXPECT_TRUE(IsMultivaluedHeader("X-Goo" /**/ "gle-Cache-Control"));
14   EXPECT_TRUE(IsMultivaluedHeader("access-control-expose-HEADERS"));
15 
16   EXPECT_FALSE(IsMultivaluedHeader("set-cook"));
17   EXPECT_FALSE(IsMultivaluedHeader("content-length"));
18   EXPECT_FALSE(IsMultivaluedHeader("Content-Length"));
19 }
20 
TEST(HeaderPropertiesTest,IsInvalidHeaderKeyChar)21 TEST(HeaderPropertiesTest, IsInvalidHeaderKeyChar) {
22   EXPECT_TRUE(IsInvalidHeaderKeyChar(0x00));
23   EXPECT_TRUE(IsInvalidHeaderKeyChar(0x06));
24   EXPECT_TRUE(IsInvalidHeaderKeyChar(0x09));
25   EXPECT_TRUE(IsInvalidHeaderKeyChar(0x1F));
26   EXPECT_TRUE(IsInvalidHeaderKeyChar(0x7F));
27   EXPECT_TRUE(IsInvalidHeaderKeyChar(' '));
28   EXPECT_TRUE(IsInvalidHeaderKeyChar('"'));
29   EXPECT_TRUE(IsInvalidHeaderKeyChar('\t'));
30   EXPECT_TRUE(IsInvalidHeaderKeyChar('\r'));
31   EXPECT_TRUE(IsInvalidHeaderKeyChar('\n'));
32   EXPECT_TRUE(IsInvalidHeaderKeyChar('}'));
33 
34   EXPECT_FALSE(IsInvalidHeaderKeyChar('a'));
35   EXPECT_FALSE(IsInvalidHeaderKeyChar('B'));
36   EXPECT_FALSE(IsInvalidHeaderKeyChar('7'));
37   EXPECT_FALSE(IsInvalidHeaderKeyChar(0x42));
38   EXPECT_FALSE(IsInvalidHeaderKeyChar(0x7C));
39   EXPECT_FALSE(IsInvalidHeaderKeyChar(0x7E));
40 }
41 
TEST(HeaderPropertiesTest,IsInvalidHeaderKeyCharAllowDoubleQuote)42 TEST(HeaderPropertiesTest, IsInvalidHeaderKeyCharAllowDoubleQuote) {
43   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x00));
44   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x06));
45   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x09));
46   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x1F));
47   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x7F));
48   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote(' '));
49   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('\t'));
50   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('\r'));
51   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('\n'));
52   EXPECT_TRUE(IsInvalidHeaderKeyCharAllowDoubleQuote('}'));
53 
54   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('"'));
55   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('a'));
56   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('B'));
57   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote('7'));
58   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x42));
59   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x7C));
60   EXPECT_FALSE(IsInvalidHeaderKeyCharAllowDoubleQuote(0x7E));
61 }
62 
TEST(HeaderPropertiesTest,IsInvalidHeaderChar)63 TEST(HeaderPropertiesTest, IsInvalidHeaderChar) {
64   EXPECT_TRUE(IsInvalidHeaderChar(0x00));
65   EXPECT_TRUE(IsInvalidHeaderChar(0x06));
66   EXPECT_TRUE(IsInvalidHeaderChar(0x1F));
67   EXPECT_TRUE(IsInvalidHeaderChar(0x7F));
68 
69   EXPECT_FALSE(IsInvalidHeaderChar(0x09));
70   EXPECT_FALSE(IsInvalidHeaderChar(' '));
71   EXPECT_FALSE(IsInvalidHeaderChar('\t'));
72   EXPECT_FALSE(IsInvalidHeaderChar('\r'));
73   EXPECT_FALSE(IsInvalidHeaderChar('\n'));
74   EXPECT_FALSE(IsInvalidHeaderChar('a'));
75   EXPECT_FALSE(IsInvalidHeaderChar('B'));
76   EXPECT_FALSE(IsInvalidHeaderChar('7'));
77   EXPECT_FALSE(IsInvalidHeaderChar(0x42));
78   EXPECT_FALSE(IsInvalidHeaderChar(0x7D));
79 }
80 
TEST(HeaderPropertiesTest,KeyMoreRestrictiveThanValue)81 TEST(HeaderPropertiesTest, KeyMoreRestrictiveThanValue) {
82   for (int c = 0; c < 255; ++c) {
83     if (IsInvalidHeaderChar(c)) {
84       EXPECT_TRUE(IsInvalidHeaderKeyChar(c)) << c;
85     }
86   }
87 }
88 
TEST(HeaderPropertiesTest,HasInvalidHeaderChars)89 TEST(HeaderPropertiesTest, HasInvalidHeaderChars) {
90   const char with_null[] = "Here's l\x00king at you, kid";
91   EXPECT_TRUE(HasInvalidHeaderChars(std::string(with_null, sizeof(with_null))));
92   EXPECT_TRUE(HasInvalidHeaderChars("Why's \x06 afraid of \x07? \x07\x08\x09"));
93   EXPECT_TRUE(HasInvalidHeaderChars("\x1Flower power"));
94   EXPECT_TRUE(HasInvalidHeaderChars("\x7Flowers more powers"));
95 
96   EXPECT_FALSE(HasInvalidHeaderChars("Plenty of space"));
97   EXPECT_FALSE(HasInvalidHeaderChars("Keeping \tabs"));
98   EXPECT_FALSE(HasInvalidHeaderChars("Al\right"));
99   EXPECT_FALSE(HasInvalidHeaderChars("\new day"));
100   EXPECT_FALSE(HasInvalidHeaderChars("\x42 is a nice character"));
101 }
102 
103 }  // namespace
104 }  // namespace quiche::header_properties::test
105