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

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

Issue 10796107: WebSocketFrameChunk should use IOBuffer to hold data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix test expectation Created 8 years, 4 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/websockets/websocket_frame_parser.h" 5 #include "net/websockets/websocket_frame_parser.h"
6 6
7 #include <algorithm>
7 #include <vector> 8 #include <vector>
8 9
9 #include "base/basictypes.h" 10 #include "base/basictypes.h"
10 #include "base/memory/scoped_vector.h" 11 #include "base/memory/scoped_vector.h"
11 #include "base/port.h" 12 #include "base/port.h"
13 #include "net/base/io_buffer.h"
12 #include "net/websockets/websocket_frame.h" 14 #include "net/websockets/websocket_frame.h"
13 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
14 16
15 namespace { 17 namespace {
16 18
17 const char kHello[] = "Hello, world!"; 19 const char kHello[] = "Hello, world!";
18 const uint64 kHelloLength = arraysize(kHello) - 1; 20 const uint64 kHelloLength = arraysize(kHello) - 1;
19 const char kHelloFrame[] = "\x81\x0DHello, world!"; 21 const char kHelloFrame[] = "\x81\x0DHello, world!";
20 const uint64 kHelloFrameLength = arraysize(kHelloFrame) - 1; 22 const uint64 kHelloFrameLength = arraysize(kHelloFrame) - 1;
21 const char kMaskedHelloFrame[] = 23 const char kMaskedHelloFrame[] =
22 "\x81\x8D\xDE\xAD\xBE\xEF" 24 "\x81\x8D\xDE\xAD\xBE\xEF"
23 "\x96\xC8\xD2\x83\xB1\x81\x9E\x98\xB1\xDF\xD2\x8B\xFF"; 25 "\x96\xC8\xD2\x83\xB1\x81\x9E\x98\xB1\xDF\xD2\x8B\xFF";
24 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; 26 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1;
25 27
26 struct FrameHeaderTestCase { 28 struct FrameHeaderTestCase {
27 const char* frame_header; 29 const char* frame_header;
28 size_t frame_header_length; 30 size_t frame_header_length;
29 uint64 frame_length; 31 uint64 frame_length;
32 bool failed;
30 }; 33 };
31 34
35 // TODO(toyoshim): Provide error code and check if the reason is correct.
32 const FrameHeaderTestCase kFrameHeaderTests[] = { 36 const FrameHeaderTestCase kFrameHeaderTests[] = {
33 { "\x81\x00", 2, GG_UINT64_C(0) }, 37 { "\x81\x00", 2, GG_UINT64_C(0), false },
34 { "\x81\x7D", 2, GG_UINT64_C(125) }, 38 { "\x81\x7D", 2, GG_UINT64_C(125), false },
35 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126) }, 39 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), false },
36 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF) }, 40 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), false },
37 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000) }, 41 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000),
42 false },
43 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF),
44 false },
45 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000),
46 true },
38 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, 47 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10,
39 GG_UINT64_C(0x7FFFFFFFFFFFFFFF) } 48 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), true }
40 }; 49 };
41 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); 50 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests);
42 51
43 } // Unnamed namespace 52 } // Unnamed namespace
44 53
45 namespace net { 54 namespace net {
46 55
47 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { 56 TEST(WebSocketFrameParserTest, DecodeNormalFrame) {
48 WebSocketFrameParser parser; 57 WebSocketFrameParser parser;
49 58
50 ScopedVector<WebSocketFrameChunk> frames; 59 ScopedVector<WebSocketFrameChunk> frames;
51 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames)); 60 EXPECT_TRUE(parser.Decode(kHelloFrame, kHelloFrameLength, &frames));
52 EXPECT_FALSE(parser.failed()); 61 EXPECT_FALSE(parser.failed());
53 ASSERT_EQ(1u, frames.size()); 62 ASSERT_EQ(1u, frames.size());
54 WebSocketFrameChunk* frame = frames[0]; 63 WebSocketFrameChunk* frame = frames[0];
55 ASSERT_TRUE(frame != NULL); 64 ASSERT_TRUE(frame != NULL);
56 const WebSocketFrameHeader* header = frame->header.get(); 65 const WebSocketFrameHeader* header = frame->header.get();
57 EXPECT_TRUE(header != NULL); 66 EXPECT_TRUE(header != NULL);
58 if (header) { 67 if (header) {
59 EXPECT_TRUE(header->final); 68 EXPECT_TRUE(header->final);
60 EXPECT_FALSE(header->reserved1); 69 EXPECT_FALSE(header->reserved1);
61 EXPECT_FALSE(header->reserved2); 70 EXPECT_FALSE(header->reserved2);
62 EXPECT_FALSE(header->reserved3); 71 EXPECT_FALSE(header->reserved3);
63 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 72 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
64 EXPECT_FALSE(header->masked); 73 EXPECT_FALSE(header->masked);
65 EXPECT_EQ(kHelloLength, header->payload_length); 74 EXPECT_EQ(kHelloLength, header->payload_length);
66 } 75 }
67 EXPECT_TRUE(frame->final_chunk); 76 EXPECT_TRUE(frame->final_chunk);
68 77
69 std::vector<char> expected_data(kHello, kHello + kHelloLength); 78 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size());
70 EXPECT_EQ(expected_data, frame->data); 79 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data()));
71 } 80 }
72 81
73 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) { 82 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) {
74 WebSocketFrameParser parser; 83 WebSocketFrameParser parser;
75 84
76 ScopedVector<WebSocketFrameChunk> frames; 85 ScopedVector<WebSocketFrameChunk> frames;
77 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength, 86 EXPECT_TRUE(parser.Decode(kMaskedHelloFrame, kMaskedHelloFrameLength,
78 &frames)); 87 &frames));
79 EXPECT_FALSE(parser.failed()); 88 EXPECT_FALSE(parser.failed());
80 ASSERT_EQ(1u, frames.size()); 89 ASSERT_EQ(1u, frames.size());
81 WebSocketFrameChunk* frame = frames[0]; 90 WebSocketFrameChunk* frame = frames[0];
82 ASSERT_TRUE(frame != NULL); 91 ASSERT_TRUE(frame != NULL);
83 const WebSocketFrameHeader* header = frame->header.get(); 92 const WebSocketFrameHeader* header = frame->header.get();
84 EXPECT_TRUE(header != NULL); 93 EXPECT_TRUE(header != NULL);
85 if (header) { 94 if (header) {
86 EXPECT_TRUE(header->final); 95 EXPECT_TRUE(header->final);
87 EXPECT_FALSE(header->reserved1); 96 EXPECT_FALSE(header->reserved1);
88 EXPECT_FALSE(header->reserved2); 97 EXPECT_FALSE(header->reserved2);
89 EXPECT_FALSE(header->reserved3); 98 EXPECT_FALSE(header->reserved3);
90 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 99 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
91 EXPECT_TRUE(header->masked); 100 EXPECT_TRUE(header->masked);
92 EXPECT_EQ(kHelloLength, header->payload_length); 101 EXPECT_EQ(kHelloLength, header->payload_length);
93 } 102 }
94 EXPECT_TRUE(frame->final_chunk); 103 EXPECT_TRUE(frame->final_chunk);
95 104
96 std::vector<char> expected_data(kHello, kHello + kHelloLength); 105 ASSERT_EQ(static_cast<int>(kHelloLength), frame->data->size());
97 EXPECT_EQ(expected_data, frame->data); 106 EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data->data()));
98 } 107 }
99 108
100 TEST(WebSocketFrameParserTest, DecodeManyFrames) { 109 TEST(WebSocketFrameParserTest, DecodeManyFrames) {
101 struct Input { 110 struct Input {
102 const char* frame; 111 const char* frame;
103 size_t frame_length; 112 size_t frame_length;
104 const char* expected_payload; 113 const char* expected_payload;
105 size_t expected_payload_length; 114 size_t expected_payload_length;
106 }; 115 };
107 static const Input kInputs[] = { 116 static const Input kInputs[] = {
(...skipping 28 matching lines...) Expand all
136 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); 145 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames));
137 EXPECT_FALSE(parser.failed()); 146 EXPECT_FALSE(parser.failed());
138 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size()); 147 ASSERT_EQ(static_cast<size_t>(kNumInputs), frames.size());
139 148
140 for (int i = 0; i < kNumInputs; ++i) { 149 for (int i = 0; i < kNumInputs; ++i) {
141 WebSocketFrameChunk* frame = frames[i]; 150 WebSocketFrameChunk* frame = frames[i];
142 EXPECT_TRUE(frame != NULL); 151 EXPECT_TRUE(frame != NULL);
143 if (!frame) 152 if (!frame)
144 continue; 153 continue;
145 EXPECT_TRUE(frame->final_chunk); 154 EXPECT_TRUE(frame->final_chunk);
146 std::vector<char> expected_data( 155 ASSERT_EQ(kInputs[i].expected_payload_length,
156 static_cast<uint64>(frame->data->size()));
157 EXPECT_TRUE(std::equal(
147 kInputs[i].expected_payload, 158 kInputs[i].expected_payload,
148 kInputs[i].expected_payload + kInputs[i].expected_payload_length); 159 kInputs[i].expected_payload + kInputs[i].expected_payload_length,
149 EXPECT_EQ(expected_data, frame->data); 160 frame->data->data()));
150 161
151 const WebSocketFrameHeader* header = frame->header.get(); 162 const WebSocketFrameHeader* header = frame->header.get();
152 EXPECT_TRUE(header != NULL); 163 EXPECT_TRUE(header != NULL);
153 if (!header) 164 if (!header)
154 continue; 165 continue;
155 EXPECT_TRUE(header->final); 166 EXPECT_TRUE(header->final);
156 EXPECT_FALSE(header->reserved1); 167 EXPECT_FALSE(header->reserved1);
157 EXPECT_FALSE(header->reserved2); 168 EXPECT_FALSE(header->reserved2);
158 EXPECT_FALSE(header->reserved3); 169 EXPECT_FALSE(header->reserved3);
159 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 170 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
(...skipping 20 matching lines...) Expand all
180 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); 191 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1));
181 EXPECT_FALSE(parser.failed()); 192 EXPECT_FALSE(parser.failed());
182 EXPECT_EQ(1u, frames1.size()); 193 EXPECT_EQ(1u, frames1.size());
183 if (frames1.size() != 1u) 194 if (frames1.size() != 1u)
184 continue; 195 continue;
185 WebSocketFrameChunk* frame1 = frames1[0]; 196 WebSocketFrameChunk* frame1 = frames1[0];
186 EXPECT_TRUE(frame1 != NULL); 197 EXPECT_TRUE(frame1 != NULL);
187 if (!frame1) 198 if (!frame1)
188 continue; 199 continue;
189 EXPECT_FALSE(frame1->final_chunk); 200 EXPECT_FALSE(frame1->final_chunk);
190 EXPECT_EQ(expected1, frame1->data); 201 if (expected1.size() == 0) {
202 EXPECT_EQ(NULL, frame1->data.get());
203 } else {
204 ASSERT_EQ(cutting_pos, static_cast<size_t>(frame1->data->size()));
205 EXPECT_TRUE(std::equal(expected1.begin(),
206 expected1.end(),
207 frame1->data->data()));
208 }
191 const WebSocketFrameHeader* header1 = frame1->header.get(); 209 const WebSocketFrameHeader* header1 = frame1->header.get();
192 EXPECT_TRUE(header1 != NULL); 210 EXPECT_TRUE(header1 != NULL);
193 if (!header1) 211 if (!header1)
194 continue; 212 continue;
195 EXPECT_TRUE(header1->final); 213 EXPECT_TRUE(header1->final);
196 EXPECT_FALSE(header1->reserved1); 214 EXPECT_FALSE(header1->reserved1);
197 EXPECT_FALSE(header1->reserved2); 215 EXPECT_FALSE(header1->reserved2);
198 EXPECT_FALSE(header1->reserved3); 216 EXPECT_FALSE(header1->reserved3);
199 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); 217 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode);
200 EXPECT_FALSE(header1->masked); 218 EXPECT_FALSE(header1->masked);
201 EXPECT_EQ(kHelloLength, header1->payload_length); 219 EXPECT_EQ(kHelloLength, header1->payload_length);
202 220
203 ScopedVector<WebSocketFrameChunk> frames2; 221 ScopedVector<WebSocketFrameChunk> frames2;
204 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); 222 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2));
205 EXPECT_FALSE(parser.failed()); 223 EXPECT_FALSE(parser.failed());
206 EXPECT_EQ(1u, frames2.size()); 224 EXPECT_EQ(1u, frames2.size());
207 if (frames2.size() != 1u) 225 if (frames2.size() != 1u)
208 continue; 226 continue;
209 WebSocketFrameChunk* frame2 = frames2[0]; 227 WebSocketFrameChunk* frame2 = frames2[0];
210 EXPECT_TRUE(frame2 != NULL); 228 EXPECT_TRUE(frame2 != NULL);
211 if (!frame2) 229 if (!frame2)
212 continue; 230 continue;
213 EXPECT_TRUE(frame2->final_chunk); 231 EXPECT_TRUE(frame2->final_chunk);
214 EXPECT_EQ(expected2, frame2->data); 232 if (expected2.size() == 0) {
233 EXPECT_EQ(NULL, frame2->data.get());
234 } else {
235 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size()));
236 EXPECT_TRUE(std::equal(expected2.begin(),
237 expected2.end(),
238 frame2->data->data()));
239 }
215 const WebSocketFrameHeader* header2 = frame2->header.get(); 240 const WebSocketFrameHeader* header2 = frame2->header.get();
216 EXPECT_TRUE(header2 == NULL); 241 EXPECT_TRUE(header2 == NULL);
217 } 242 }
218 } 243 }
219 244
220 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) { 245 TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) {
221 static const size_t kFrameHeaderSize = 6; 246 static const size_t kFrameHeaderSize = 6;
222 247
223 for (size_t cutting_pos = 0; cutting_pos < kHelloLength; ++cutting_pos) { 248 for (size_t cutting_pos = 0; cutting_pos < kHelloLength; ++cutting_pos) {
224 std::vector<char> input1( 249 std::vector<char> input1(
(...skipping 11 matching lines...) Expand all
236 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1)); 261 EXPECT_TRUE(parser.Decode(&input1.front(), input1.size(), &frames1));
237 EXPECT_FALSE(parser.failed()); 262 EXPECT_FALSE(parser.failed());
238 EXPECT_EQ(1u, frames1.size()); 263 EXPECT_EQ(1u, frames1.size());
239 if (frames1.size() != 1u) 264 if (frames1.size() != 1u)
240 continue; 265 continue;
241 WebSocketFrameChunk* frame1 = frames1[0]; 266 WebSocketFrameChunk* frame1 = frames1[0];
242 EXPECT_TRUE(frame1 != NULL); 267 EXPECT_TRUE(frame1 != NULL);
243 if (!frame1) 268 if (!frame1)
244 continue; 269 continue;
245 EXPECT_FALSE(frame1->final_chunk); 270 EXPECT_FALSE(frame1->final_chunk);
246 EXPECT_EQ(expected1, frame1->data); 271 if (expected1.size() == 0) {
272 EXPECT_EQ(NULL, frame1->data.get());
273 } else {
274 ASSERT_EQ(expected1.size(), static_cast<uint64>(frame1->data->size()));
275 EXPECT_TRUE(std::equal(expected1.begin(),
276 expected1.end(),
277 frame1->data->data()));
278 }
247 const WebSocketFrameHeader* header1 = frame1->header.get(); 279 const WebSocketFrameHeader* header1 = frame1->header.get();
248 EXPECT_TRUE(header1 != NULL); 280 EXPECT_TRUE(header1 != NULL);
249 if (!header1) 281 if (!header1)
250 continue; 282 continue;
251 EXPECT_TRUE(header1->final); 283 EXPECT_TRUE(header1->final);
252 EXPECT_FALSE(header1->reserved1); 284 EXPECT_FALSE(header1->reserved1);
253 EXPECT_FALSE(header1->reserved2); 285 EXPECT_FALSE(header1->reserved2);
254 EXPECT_FALSE(header1->reserved3); 286 EXPECT_FALSE(header1->reserved3);
255 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode); 287 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header1->opcode);
256 EXPECT_TRUE(header1->masked); 288 EXPECT_TRUE(header1->masked);
257 EXPECT_EQ(kHelloLength, header1->payload_length); 289 EXPECT_EQ(kHelloLength, header1->payload_length);
258 290
259 ScopedVector<WebSocketFrameChunk> frames2; 291 ScopedVector<WebSocketFrameChunk> frames2;
260 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2)); 292 EXPECT_TRUE(parser.Decode(&input2.front(), input2.size(), &frames2));
261 EXPECT_FALSE(parser.failed()); 293 EXPECT_FALSE(parser.failed());
262 EXPECT_EQ(1u, frames2.size()); 294 EXPECT_EQ(1u, frames2.size());
263 if (frames2.size() != 1u) 295 if (frames2.size() != 1u)
264 continue; 296 continue;
265 WebSocketFrameChunk* frame2 = frames2[0]; 297 WebSocketFrameChunk* frame2 = frames2[0];
266 EXPECT_TRUE(frame2 != NULL); 298 EXPECT_TRUE(frame2 != NULL);
267 if (!frame2) 299 if (!frame2)
268 continue; 300 continue;
269 EXPECT_TRUE(frame2->final_chunk); 301 EXPECT_TRUE(frame2->final_chunk);
270 EXPECT_EQ(expected2, frame2->data); 302 if (expected2.size() == 0) {
303 EXPECT_EQ(NULL, frame2->data.get());
304 } else {
305 ASSERT_EQ(expected2.size(), static_cast<uint64>(frame2->data->size()));
306 EXPECT_TRUE(std::equal(expected2.begin(),
307 expected2.end(),
308 frame2->data->data()));
309 }
271 const WebSocketFrameHeader* header2 = frame2->header.get(); 310 const WebSocketFrameHeader* header2 = frame2->header.get();
272 EXPECT_TRUE(header2 == NULL); 311 EXPECT_TRUE(header2 == NULL);
273 } 312 }
274 } 313 }
275 314
276 TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) { 315 TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) {
277 for (int i = 0; i < kNumFrameHeaderTests; ++i) { 316 for (int i = 0; i < kNumFrameHeaderTests; ++i) {
278 const char* frame_header = kFrameHeaderTests[i].frame_header; 317 const char* frame_header = kFrameHeaderTests[i].frame_header;
279 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; 318 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length;
280 uint64 frame_length = kFrameHeaderTests[i].frame_length; 319 uint64 frame_length = kFrameHeaderTests[i].frame_length;
281 320
282 std::vector<char> input(frame_header, frame_header + frame_header_length); 321 std::vector<char> input(frame_header, frame_header + frame_header_length);
283 // Limit the payload size not to flood the console on failure. 322 // Limit the payload size not to flood the console on failure.
284 static const uint64 kMaxPayloadSize = 200; 323 static const uint64 kMaxPayloadSize = 200;
285 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); 324 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize);
286 input.insert(input.end(), input_payload_size, 'a'); 325 input.insert(input.end(), input_payload_size, 'a');
287 326
288 WebSocketFrameParser parser; 327 WebSocketFrameParser parser;
289 328
290 ScopedVector<WebSocketFrameChunk> frames; 329 ScopedVector<WebSocketFrameChunk> frames;
291 EXPECT_TRUE(parser.Decode(&input.front(), input.size(), &frames)); 330 EXPECT_EQ(!kFrameHeaderTests[i].failed,
292 EXPECT_FALSE(parser.failed()); 331 parser.Decode(&input.front(), input.size(), &frames));
293 EXPECT_EQ(1u, frames.size()); 332 EXPECT_EQ(kFrameHeaderTests[i].failed, parser.failed());
333 if (kFrameHeaderTests[i].failed)
334 EXPECT_EQ(0u, frames.size());
335 else
336 EXPECT_EQ(1u, frames.size());
mmenke 2012/07/31 17:03:49 Suggest you use braces around these code blocks.
Takashi Toyoshima 2012/08/01 07:06:33 Thank you for catching this. I agreed. I fixed thi
294 if (frames.size() != 1u) 337 if (frames.size() != 1u)
295 continue; 338 continue;
296 WebSocketFrameChunk* frame = frames[0]; 339 WebSocketFrameChunk* frame = frames[0];
297 EXPECT_TRUE(frame != NULL); 340 EXPECT_TRUE(frame != NULL);
298 if (!frame) 341 if (!frame)
299 continue; 342 continue;
300 if (frame_length == input_payload_size) 343 if (frame_length == input_payload_size)
301 EXPECT_TRUE(frame->final_chunk); 344 EXPECT_TRUE(frame->final_chunk);
302 else 345 else
303 EXPECT_FALSE(frame->final_chunk); 346 EXPECT_FALSE(frame->final_chunk);
304 std::vector<char> expected_payload(input_payload_size, 'a'); 347 std::vector<char> expected_payload(input_payload_size, 'a');
305 EXPECT_EQ(expected_payload, frame->data); 348 if (expected_payload.size() == 0) {
349 EXPECT_EQ(NULL, frame->data.get());
350 } else {
351 ASSERT_EQ(expected_payload.size(),
352 static_cast<uint64>(frame->data->size()));
353 EXPECT_TRUE(std::equal(
354 expected_payload.begin(),
355 expected_payload.end(),
356 frame->data->data()));
357 }
306 const WebSocketFrameHeader* header = frame->header.get(); 358 const WebSocketFrameHeader* header = frame->header.get();
307 EXPECT_TRUE(header != NULL); 359 EXPECT_TRUE(header != NULL);
308 if (!header) 360 if (!header)
309 continue; 361 continue;
310 EXPECT_TRUE(header->final); 362 EXPECT_TRUE(header->final);
311 EXPECT_FALSE(header->reserved1); 363 EXPECT_FALSE(header->reserved1);
312 EXPECT_FALSE(header->reserved2); 364 EXPECT_FALSE(header->reserved2);
313 EXPECT_FALSE(header->reserved3); 365 EXPECT_FALSE(header->reserved3);
314 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 366 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
315 EXPECT_FALSE(header->masked); 367 EXPECT_FALSE(header->masked);
316 EXPECT_EQ(frame_length, header->payload_length); 368 EXPECT_EQ(frame_length, header->payload_length);
317 } 369 }
318 } 370 }
319 371
320 TEST(WebSocketFrameParserTest, DecodePartialHeader) { 372 TEST(WebSocketFrameParserTest, DecodePartialHeader) {
321 for (int i = 0; i < kNumFrameHeaderTests; ++i) { 373 for (int i = 0; i < kNumFrameHeaderTests; ++i) {
322 const char* frame_header = kFrameHeaderTests[i].frame_header; 374 const char* frame_header = kFrameHeaderTests[i].frame_header;
323 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length; 375 size_t frame_header_length = kFrameHeaderTests[i].frame_header_length;
324 uint64 frame_length = kFrameHeaderTests[i].frame_length; 376 uint64 frame_length = kFrameHeaderTests[i].frame_length;
325 377
326 WebSocketFrameParser parser; 378 WebSocketFrameParser parser;
327 379
328 ScopedVector<WebSocketFrameChunk> frames; 380 ScopedVector<WebSocketFrameChunk> frames;
329 // Feed each byte to the parser to see if the parser behaves correctly 381 // Feed each byte to the parser to see if the parser behaves correctly
330 // when it receives partial frame header. 382 // when it receives partial frame header.
383 size_t last_byte_offset = frame_header_length - 1;
331 for (size_t j = 0; j < frame_header_length; ++j) { 384 for (size_t j = 0; j < frame_header_length; ++j) {
332 EXPECT_TRUE(parser.Decode(frame_header + j, 1, &frames)); 385 bool failed = kFrameHeaderTests[i].failed && j == last_byte_offset;
333 EXPECT_FALSE(parser.failed()); 386 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames));
334 if (j == frame_header_length - 1) 387 EXPECT_EQ(failed, parser.failed());
388 if (!kFrameHeaderTests[i].failed && j == last_byte_offset)
335 EXPECT_EQ(1u, frames.size()); 389 EXPECT_EQ(1u, frames.size());
336 else 390 else
337 EXPECT_EQ(0u, frames.size()); 391 EXPECT_EQ(0u, frames.size());
338 } 392 }
339 if (frames.size() != 1u) 393 if (frames.size() != 1u)
340 continue; 394 continue;
341 WebSocketFrameChunk* frame = frames[0]; 395 WebSocketFrameChunk* frame = frames[0];
342 EXPECT_TRUE(frame != NULL); 396 EXPECT_TRUE(frame != NULL);
343 if (!frame) 397 if (!frame)
344 continue; 398 continue;
345 if (frame_length == 0u) 399 if (frame_length == 0u)
346 EXPECT_TRUE(frame->final_chunk); 400 EXPECT_TRUE(frame->final_chunk);
347 else 401 else
348 EXPECT_FALSE(frame->final_chunk); 402 EXPECT_FALSE(frame->final_chunk);
349 EXPECT_EQ(std::vector<char>(), frame->data); 403 EXPECT_EQ(NULL, frame->data.get());
350 const WebSocketFrameHeader* header = frame->header.get(); 404 const WebSocketFrameHeader* header = frame->header.get();
351 EXPECT_TRUE(header != NULL); 405 EXPECT_TRUE(header != NULL);
352 if (!header) 406 if (!header)
353 continue; 407 continue;
354 EXPECT_TRUE(header->final); 408 EXPECT_TRUE(header->final);
355 EXPECT_FALSE(header->reserved1); 409 EXPECT_FALSE(header->reserved1);
356 EXPECT_FALSE(header->reserved2); 410 EXPECT_FALSE(header->reserved2);
357 EXPECT_FALSE(header->reserved3); 411 EXPECT_FALSE(header->reserved3);
358 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 412 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
359 EXPECT_FALSE(header->masked); 413 EXPECT_FALSE(header->masked);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); 491 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames));
438 EXPECT_FALSE(parser.failed()); 492 EXPECT_FALSE(parser.failed());
439 EXPECT_EQ(1u, frames.size()); 493 EXPECT_EQ(1u, frames.size());
440 if (frames.size() != 1u) 494 if (frames.size() != 1u)
441 continue; 495 continue;
442 WebSocketFrameChunk* frame = frames[0]; 496 WebSocketFrameChunk* frame = frames[0];
443 EXPECT_TRUE(frame != NULL); 497 EXPECT_TRUE(frame != NULL);
444 if (!frame) 498 if (!frame)
445 continue; 499 continue;
446 EXPECT_TRUE(frame->final_chunk); 500 EXPECT_TRUE(frame->final_chunk);
447 EXPECT_EQ(std::vector<char>(), frame->data); 501 EXPECT_EQ(NULL, frame->data.get());
448 const WebSocketFrameHeader* header = frame->header.get(); 502 const WebSocketFrameHeader* header = frame->header.get();
449 EXPECT_TRUE(header != NULL); 503 EXPECT_TRUE(header != NULL);
450 if (!header) 504 if (!header)
451 continue; 505 continue;
452 EXPECT_TRUE(header->final); 506 EXPECT_TRUE(header->final);
453 EXPECT_FALSE(header->reserved1); 507 EXPECT_FALSE(header->reserved1);
454 EXPECT_FALSE(header->reserved2); 508 EXPECT_FALSE(header->reserved2);
455 EXPECT_FALSE(header->reserved3); 509 EXPECT_FALSE(header->reserved3);
456 EXPECT_EQ(opcode, header->opcode); 510 EXPECT_EQ(opcode, header->opcode);
457 EXPECT_FALSE(header->masked); 511 EXPECT_FALSE(header->masked);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames)); 547 EXPECT_TRUE(parser.Decode(frame_header, frame_header_length, &frames));
494 EXPECT_FALSE(parser.failed()); 548 EXPECT_FALSE(parser.failed());
495 EXPECT_EQ(1u, frames.size()); 549 EXPECT_EQ(1u, frames.size());
496 if (frames.size() != 1u) 550 if (frames.size() != 1u)
497 continue; 551 continue;
498 WebSocketFrameChunk* frame = frames[0]; 552 WebSocketFrameChunk* frame = frames[0];
499 EXPECT_TRUE(frame != NULL); 553 EXPECT_TRUE(frame != NULL);
500 if (!frame) 554 if (!frame)
501 continue; 555 continue;
502 EXPECT_TRUE(frame->final_chunk); 556 EXPECT_TRUE(frame->final_chunk);
503 EXPECT_EQ(std::vector<char>(), frame->data); 557 EXPECT_EQ(NULL, frame->data.get());
504 const WebSocketFrameHeader* header = frame->header.get(); 558 const WebSocketFrameHeader* header = frame->header.get();
505 EXPECT_TRUE(header != NULL); 559 EXPECT_TRUE(header != NULL);
506 if (!header) 560 if (!header)
507 continue; 561 continue;
508 EXPECT_EQ(final, header->final); 562 EXPECT_EQ(final, header->final);
509 EXPECT_EQ(reserved1, header->reserved1); 563 EXPECT_EQ(reserved1, header->reserved1);
510 EXPECT_EQ(reserved2, header->reserved2); 564 EXPECT_EQ(reserved2, header->reserved2);
511 EXPECT_EQ(reserved3, header->reserved3); 565 EXPECT_EQ(reserved3, header->reserved3);
512 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); 566 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode);
513 EXPECT_FALSE(header->masked); 567 EXPECT_FALSE(header->masked);
514 EXPECT_EQ(0u, header->payload_length); 568 EXPECT_EQ(0u, header->payload_length);
515 } 569 }
516 } 570 }
517 571
518 } // namespace net 572 } // 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