OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 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/websockets/websocket_extension_parser.h" | |
6 | |
7 #include <string> | |
8 | |
9 #include "net/websockets/websocket_extension.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 namespace net { | |
13 | |
14 namespace { | |
15 | |
16 bool Equals(const std::vector<WebSocketExtension>& x, | |
17 const std::vector<WebSocketExtension>& y) { | |
18 if (x.size() != y.size()) return false; | |
19 for (size_t i = 0; i < x.size(); ++i) { | |
20 if (!x[i].Equals(y[i])) return false; | |
21 } | |
22 return true; | |
23 } | |
24 | |
25 TEST(WebSocketExtensionParserTest, ParseEmpty) { | |
26 WebSocketExtensionParser parser; | |
27 parser.Parse("", 0); | |
28 | |
29 EXPECT_TRUE(parser.has_error()); | |
30 EXPECT_TRUE(parser.extensions().empty()); | |
31 } | |
32 | |
33 TEST(WebSocketExtensionParserTest, ParseSimple) { | |
34 WebSocketExtensionParser parser; | |
35 std::vector<WebSocketExtension> expected; | |
36 expected.push_back(WebSocketExtension("foo")); | |
37 | |
38 parser.Parse("foo"); | |
39 | |
40 ASSERT_FALSE(parser.has_error()); | |
41 EXPECT_TRUE(Equals(expected, parser.extensions())); | |
42 } | |
43 | |
44 TEST(WebSocketExtensionParserTest, ParseOneExtensionWithOneParamWithoutValue) { | |
45 WebSocketExtensionParser parser; | |
46 WebSocketExtension foo("foo"); | |
47 foo.Add(WebSocketExtension::Parameter("bar")); | |
48 std::vector<WebSocketExtension> expected; | |
49 expected.push_back(foo); | |
50 | |
51 parser.Parse("\tfoo ; bar"); | |
52 | |
53 ASSERT_FALSE(parser.has_error()); | |
54 EXPECT_TRUE(Equals(expected, parser.extensions())); | |
55 } | |
56 | |
57 TEST(WebSocketExtensionParserTest, ParseOneExtensionWithOneParamWithValue) { | |
58 WebSocketExtensionParser parser; | |
59 WebSocketExtension foo("foo"); | |
60 foo.Add(WebSocketExtension::Parameter("bar", "baz")); | |
61 std::vector<WebSocketExtension> expected; | |
62 expected.push_back(foo); | |
63 | |
64 parser.Parse("foo ; bar= baz"); | |
65 | |
66 ASSERT_FALSE(parser.has_error()); | |
67 EXPECT_TRUE(Equals(expected, parser.extensions())); | |
68 } | |
69 | |
70 TEST(WebSocketExtensionParserTest, ParseOneExtensionWithParams) { | |
71 WebSocketExtensionParser parser; | |
72 WebSocketExtension foo("foo"); | |
73 foo.Add(WebSocketExtension::Parameter("bar", "baz")); | |
74 foo.Add(WebSocketExtension::Parameter("hoge", "fuga")); | |
75 std::vector<WebSocketExtension> expected; | |
76 expected.push_back(foo); | |
77 | |
78 parser.Parse("foo ; bar= baz;\t \thoge\r\n\t=fuga"); | |
79 | |
80 ASSERT_FALSE(parser.has_error()); | |
81 EXPECT_TRUE(Equals(expected, parser.extensions())); | |
82 } | |
83 | |
84 TEST(WebSocketExtensionParserTest, ParseMultipleExtensions) { | |
85 WebSocketExtensionParser parser; | |
86 WebSocketExtension foo("foo"), baz("baz"), hoge("hoge"); | |
87 foo.Add(WebSocketExtension::Parameter("bar")); | |
88 hoge.Add(WebSocketExtension::Parameter("fuga", "piyo")); | |
89 std::vector<WebSocketExtension> expected; | |
90 expected.push_back(foo); | |
91 expected.push_back(baz); | |
92 expected.push_back(hoge); | |
93 | |
94 parser.Parse("foo ; bar baz\thoge\r\n ;fuga=piyo"); | |
Adam Rice
2013/09/17 07:45:58
This is not correct; the header would be formatted
yhirano
2013/09/17 09:17:39
Deleted
| |
95 | |
96 ASSERT_FALSE(parser.has_error()); | |
97 EXPECT_TRUE(Equals(expected, parser.extensions())); | |
98 } | |
99 | |
100 TEST(WebSocketExtensionParserTest, InvalidPatterns) { | |
101 const char* patterns[] = { | |
102 "foo ", // trailing space | |
103 "fo\ao", // control in extension name | |
104 "fo\x01o", // control in extension name | |
105 "fo<o", // separator in extension name | |
106 "foo/", // separator in extension name | |
107 ";bar", // empty extension name | |
108 "foo; b\ar", // control in parameter name | |
109 "foo; b\x7fr", // control in parameter name | |
110 "foo; b[r", // separator in parameter name | |
111 "foo; ba:", // separator in parameter name | |
112 "foo; =baz", // empty parameter name | |
113 "foo; bar=", // empty parameter value | |
114 "foo; =", // empty parameter name and value | |
115 "foo; bar=b\x02z", // control in parameter value | |
116 "foo; bar=b@z", // separator in parameter value | |
117 "foo; bar=b\\z", // separator in parameter value | |
118 "foo; bar=b?z", // separator in parameter value | |
119 "\"foo\"", // quoted extension name | |
120 "foo; \"bar\"", // quoted parameter name | |
121 "foo; bar=\"\a2\"", // control in quoted parameter value | |
122 "foo; bar=\"b@z\"", // separator in quoted parameter value | |
123 "foo; bar=\"b\\\\z\"", // separator in quoted parameter value | |
124 "foo; bar=\"\"", // quoted emptyparameter value | |
125 "foo\r\nbar", // CRNL not followed by a space | |
126 }; | |
127 | |
128 for (size_t i = 0; i < arraysize(patterns); ++i) { | |
129 WebSocketExtensionParser parser; | |
130 parser.Parse(patterns[i]); | |
131 EXPECT_TRUE(parser.has_error()); | |
132 EXPECT_TRUE(parser.extensions().empty()); | |
133 } | |
134 } | |
135 | |
136 TEST(WebSocketExtensionParserTest, QuotedParameterValue) { | |
137 WebSocketExtensionParser parser; | |
138 WebSocketExtension foo("foo"); | |
139 foo.Add(WebSocketExtension::Parameter("bar", "baz")); | |
140 std::vector<WebSocketExtension> expected; | |
141 expected.push_back(foo); | |
142 | |
143 parser.Parse("foo; bar=\"ba\\z\""); | |
144 | |
145 ASSERT_FALSE(parser.has_error()); | |
146 EXPECT_TRUE(Equals(expected, parser.extensions())); | |
147 } | |
148 | |
149 } // namespace | |
150 | |
151 } // namespace net | |
OLD | NEW |