Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: net/websockets/websocket_frame_parser_unittest.cc

Issue 9956013: Add WebSocketFrameParser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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_frame_parser.h"
6
7 #include <vector>
8
9 #include "base/basictypes.h"
10 #include "base/memory/scoped_vector.h"
11 #include "net/websockets/websocket_frame.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 const char kHello[] = "Hello, world!";
15 const uint64 kHelloLength = arraysize(kHello) - 1;
16 const char kHelloFrame[] = "\x81\x0dHello, world!";
17 const uint64 kHelloFrameLength = arraysize(kHelloFrame) - 1;
18 const char kMaskedHelloFrame[] =
19 "\x81\x8d\xde\xad\xbe\xef"
20 "\x96\xc8\xd2\x83\xb1\x81\x9e\x98\xb1\xdf\xd2\x8b\xff";
21 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1;
22
23 namespace net {
24
25 TEST(WebSocketFrameParserTest, DecodeNormalFrame) {
26 WebSocketFrameParser parser;
27
28 ScopedVector<WebSocketPartialFrame> frames;
29 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames));
30 EXPECT_FALSE(parser.failed());
31 ASSERT_EQ(1u, frames.size());
32 WebSocketPartialFrame* frame = frames[0];
33 ASSERT_TRUE(frame != NULL);
34 const WebSocketFrameHeader* header = frame->header.get();
35 EXPECT_TRUE(header != NULL);
36 if (header) {
37 EXPECT_TRUE(header->final);
38 EXPECT_FALSE(header->reserved1);
39 EXPECT_FALSE(header->reserved2);
40 EXPECT_FALSE(header->reserved3);
41 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
42 EXPECT_FALSE(header->masked);
43 EXPECT_EQ(kHelloLength, header->payload_length);
44 }
45 EXPECT_TRUE(frame->final_part);
46
47 std::vector<char> expected_data(kHello, kHello + kHelloLength);
48 EXPECT_EQ(expected_data, frame->data);
49 }
50
51 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) {
52 WebSocketFrameParser parser;
53
54 ScopedVector<WebSocketPartialFrame> frames;
55 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength,
56 &frames));
57 EXPECT_FALSE(parser.failed());
58 ASSERT_EQ(1u, frames.size());
59 WebSocketPartialFrame* frame = frames[0];
60 ASSERT_TRUE(frame != NULL);
61 const WebSocketFrameHeader* header = frame->header.get();
62 EXPECT_TRUE(header != NULL);
63 if (header) {
64 EXPECT_TRUE(header->final);
65 EXPECT_FALSE(header->reserved1);
66 EXPECT_FALSE(header->reserved2);
67 EXPECT_FALSE(header->reserved3);
68 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
69 EXPECT_TRUE(header->masked);
70 EXPECT_EQ(kHelloLength, header->payload_length);
71 }
72 EXPECT_TRUE(frame->final_part);
73
74 std::vector<char> expected_data(kHello, kHello + kHelloLength);
75 EXPECT_EQ(expected_data, frame->data);
76 }
77
78 TEST(WebSocketFrameParserTest, DecodeManyFrames) {
79 static const int kRepeat = 10;
80
81 std::vector<char> input;
82 for (int i = 0; i < kRepeat; ++i)
83 input.insert(input.end(), kHelloFrame, kHelloFrame + kHelloFrameLength);
84
85 WebSocketFrameParser parser;
86
87 ScopedVector<WebSocketPartialFrame> frames;
88 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames));
89 EXPECT_FALSE(parser.failed());
90 EXPECT_EQ(static_cast<size_t>(kRepeat), frames.size());
91
92 std::vector<char> expected_data(kHello, kHello + kHelloLength);
93
94 for (size_t i = 0; i < frames.size(); ++i) {
95 WebSocketPartialFrame* frame = frames[i];
96 EXPECT_TRUE(frame != NULL);
97 if (!frame)
98 continue;
99 EXPECT_TRUE(frame->final_part);
100 EXPECT_EQ(expected_data, frame->data);
101
102 const WebSocketFrameHeader* header = frame->header.get();
103 EXPECT_TRUE(header != NULL);
104 if (!header)
105 continue;
106 EXPECT_TRUE(header->final);
107 EXPECT_FALSE(header->reserved1);
108 EXPECT_FALSE(header->reserved2);
109 EXPECT_FALSE(header->reserved3);
110 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
111 EXPECT_FALSE(header->masked);
112 EXPECT_EQ(kHelloLength, header->payload_length);
113 }
114 }
115
116 TEST(WebSocketFrameParserTest, DecodePartialFrame) {
117 static const size_t kFrameHeaderSize = 2;
118
119 for (size_t cutting_pos = 0; cutting_pos < kHelloLength - 1; ++cutting_pos) {
120 std::vector<char> input1(kHelloFrame,
121 kHelloFrame + kFrameHeaderSize + cutting_pos);
122 std::vector<char> input2(kHelloFrame + input1.size(),
123 kHelloFrame + kHelloFrameLength);
124
125 std::vector<char> expected1(kHello, kHello + cutting_pos);
126 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength);
127
128 WebSocketFrameParser parser;
129
130 ScopedVector<WebSocketPartialFrame> frames1;
131 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1));
132 EXPECT_FALSE(parser.failed());
133 EXPECT_EQ(1u, frames1.size());
134 if (frames1.size() != 1u)
135 continue;
136 WebSocketPartialFrame* frame1 = frames1[0];
137 EXPECT_TRUE(frame1 != NULL);
138 if (!frame1)
139 continue;
140 EXPECT_FALSE(frame1->final_part);
141 EXPECT_EQ(expected1, frame1->data);
142 const WebSocketFrameHeader* header1 = frame1->header.get();
143 EXPECT_TRUE(header1 != NULL);
144 if (!header1)
145 continue;
146 EXPECT_TRUE(header1->final);
147 EXPECT_FALSE(header1->reserved1);
148 EXPECT_FALSE(header1->reserved2);
149 EXPECT_FALSE(header1->reserved3);
150 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode);
151 EXPECT_FALSE(header1->masked);
152 EXPECT_EQ(kHelloLength, header1->payload_length);
153
154 ScopedVector<WebSocketPartialFrame> frames2;
155 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2));
156 EXPECT_FALSE(parser.failed());
157 EXPECT_EQ(1u, frames2.size());
158 if (frames2.size() != 1u)
159 continue;
160 WebSocketPartialFrame* frame2 = frames2[0];
161 EXPECT_TRUE(frame2 != NULL);
162 if (!frame2)
163 continue;
164 EXPECT_TRUE(frame2->final_part);
165 EXPECT_EQ(expected2, frame2->data);
166 const WebSocketFrameHeader* header2 = frame2->header.get();
167 EXPECT_TRUE(header2 != NULL);
168 EXPECT_EQ(header1, header2);
169 if (!header2)
170 continue;
171 EXPECT_TRUE(header2->final);
172 EXPECT_FALSE(header2->reserved1);
173 EXPECT_FALSE(header2->reserved2);
174 EXPECT_FALSE(header2->reserved3);
175 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header2->opcode);
176 EXPECT_FALSE(header2->masked);
177 EXPECT_EQ(kHelloLength, header2->payload_length);
178 }
179 }
180
181 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) {
182 static const size_t kFrameHeaderSize = 6;
183
184 for (size_t cutting_pos = 0; cutting_pos < kHelloLength - 1; ++cutting_pos) {
185 std::vector<char> input1(
186 kMaskedHelloFrame,
187 kMaskedHelloFrame + kFrameHeaderSize + cutting_pos);
188 std::vector<char> input2(kMaskedHelloFrame + input1.size(),
189 kMaskedHelloFrame + kMaskedHelloFrameLength);
190
191 std::vector<char> expected1(kHello, kHello + cutting_pos);
192 std::vector<char> expected2(kHello + cutting_pos, kHello + kHelloLength);
193
194 WebSocketFrameParser parser;
195
196 ScopedVector<WebSocketPartialFrame> frames1;
197 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1));
198 EXPECT_FALSE(parser.failed());
199 EXPECT_EQ(1u, frames1.size());
200 if (frames1.size() != 1u)
201 continue;
202 WebSocketPartialFrame* frame1 = frames1[0];
203 EXPECT_TRUE(frame1 != NULL);
204 if (!frame1)
205 continue;
206 EXPECT_FALSE(frame1->final_part);
207 EXPECT_EQ(expected1, frame1->data);
208 const WebSocketFrameHeader* header1 = frame1->header.get();
209 EXPECT_TRUE(header1 != NULL);
210 if (!header1)
211 continue;
212 EXPECT_TRUE(header1->final);
213 EXPECT_FALSE(header1->reserved1);
214 EXPECT_FALSE(header1->reserved2);
215 EXPECT_FALSE(header1->reserved3);
216 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode);
217 EXPECT_TRUE(header1->masked);
218 EXPECT_EQ(kHelloLength, header1->payload_length);
219
220 ScopedVector<WebSocketPartialFrame> frames2;
221 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2));
222 EXPECT_FALSE(parser.failed());
223 EXPECT_EQ(1u, frames2.size());
224 if (frames2.size() != 1u)
225 continue;
226 WebSocketPartialFrame* frame2 = frames2[0];
227 EXPECT_TRUE(frame2 != NULL);
228 if (!frame2)
229 continue;
230 EXPECT_TRUE(frame2->final_part);
231 EXPECT_EQ(expected2, frame2->data);
232 const WebSocketFrameHeader* header2 = frame2->header.get();
233 EXPECT_TRUE(header2 != NULL);
234 EXPECT_EQ(header1, header2);
235 if (!header2)
236 continue;
237 EXPECT_TRUE(header2->final);
238 EXPECT_FALSE(header2->reserved1);
239 EXPECT_FALSE(header2->reserved2);
240 EXPECT_FALSE(header2->reserved3);
241 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header2->opcode);
242 EXPECT_TRUE(header2->masked);
243 EXPECT_EQ(kHelloLength, header2->payload_length);
244 }
245 }
246
247 } // namespace net
OLDNEW
« net/websockets/websocket_frame_parser.cc ('K') | « net/websockets/websocket_frame_parser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698