summaryrefslogtreecommitdiffstats
path: root/net/websockets/websocket_frame_handler_unittest.cc
diff options
context:
space:
mode:
authorukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-01 03:11:16 +0000
committerukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-01 03:11:16 +0000
commit3985966ad82dc8ac7094698bc1e598a6d072c93e (patch)
treec5e22e38883a3d7ba8eb0708d959f5e64cffb70b /net/websockets/websocket_frame_handler_unittest.cc
parent1bdaa60c309250932259402cc8abe0a1bb3f5b2d (diff)
downloadchromium_src-3985966ad82dc8ac7094698bc1e598a6d072c93e.zip
chromium_src-3985966ad82dc8ac7094698bc1e598a6d072c93e.tar.gz
chromium_src-3985966ad82dc8ac7094698bc1e598a6d072c93e.tar.bz2
Factor out WebSocket frame handler out of WebSocketJob.
WebSocket frame handler might be used to count number of frames, variance of type or length of frame. It might be also used to compress/decompress message in websocket frame. BUG=none TEST=none Review URL: http://codereview.chromium.org/2078002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48615 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/websockets/websocket_frame_handler_unittest.cc')
-rw-r--r--net/websockets/websocket_frame_handler_unittest.cc125
1 files changed, 125 insertions, 0 deletions
diff --git a/net/websockets/websocket_frame_handler_unittest.cc b/net/websockets/websocket_frame_handler_unittest.cc
new file mode 100644
index 0000000..80f0e59
--- /dev/null
+++ b/net/websockets/websocket_frame_handler_unittest.cc
@@ -0,0 +1,125 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/scoped_ptr.h"
+#include "net/base/io_buffer.h"
+#include "net/websockets/websocket_frame_handler.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+
+namespace net {
+
+TEST(WebSocketFrameHandlerTest, Basic) {
+ const char kInputData[] = "\0hello, world\xff";
+ const int kInputDataLen = sizeof(kInputData) - 1; // no terminating NUL.
+
+ scoped_ptr<WebSocketFrameHandler> handler(new WebSocketFrameHandler);
+
+ // No data.
+ EXPECT_EQ(0, handler->UpdateCurrentBuffer());
+ EXPECT_TRUE(handler->GetCurrentBuffer() == NULL);
+ EXPECT_EQ(0, handler->GetCurrentBufferSize());
+
+ // WebKit sends data (WebSocketJob::SendData),
+ // or data is received from network (WebSocketJob::OnReceivedData)
+ handler->AppendData(kInputData, kInputDataLen);
+ EXPECT_TRUE(handler->GetCurrentBuffer() == NULL);
+ EXPECT_GT(handler->UpdateCurrentBuffer(), 0);
+ // Get data to send to the socket (send),
+ // or to send to WebKit (receive).
+ IOBuffer* buf = handler->GetCurrentBuffer();
+ ASSERT_TRUE(buf != NULL);
+ EXPECT_TRUE(memcmp(buf->data(), kInputData, kInputDataLen) == 0);
+ EXPECT_EQ(kInputDataLen, handler->GetCurrentBufferSize());
+ EXPECT_EQ(kInputDataLen, handler->GetOriginalBufferSize());
+ // Data was sent. (WebSocketJob::OnSentData)
+ buf = NULL;
+ handler->ReleaseCurrentBuffer();
+ EXPECT_TRUE(handler->GetCurrentBuffer() == NULL);
+ EXPECT_EQ(0, handler->GetCurrentBufferSize());
+ EXPECT_EQ(0, handler->UpdateCurrentBuffer());
+}
+
+TEST(WebSocketFrameHandlerTest, ParseFrame) {
+ std::vector<WebSocketFrameHandler::FrameInfo> frames;
+ const char kInputData[] = "\0hello, world\xff\xff\0";
+ const int kInputDataLen = sizeof(kInputData) - 1;
+ const int kHelloWorldFrameLen = 14;
+
+ EXPECT_EQ(kInputDataLen,
+ WebSocketFrameHandler::ParseWebSocketFrame(
+ kInputData, kInputDataLen, &frames));
+ EXPECT_EQ(2UL, frames.size());
+
+ EXPECT_EQ(kInputData, frames[0].frame_start);
+ EXPECT_EQ(kHelloWorldFrameLen, frames[0].frame_length);
+ EXPECT_EQ(kInputData + 1, frames[0].message_start);
+ EXPECT_EQ(kHelloWorldFrameLen - 2, frames[0].message_length);
+
+ EXPECT_EQ(kInputData + kHelloWorldFrameLen, frames[1].frame_start);
+ EXPECT_EQ(2, frames[1].frame_length);
+ EXPECT_EQ(0, frames[1].message_length);
+}
+
+TEST(WebSocketFrameHandlerTest, ParseFrameLength) {
+ std::vector<WebSocketFrameHandler::FrameInfo> frames;
+ const char kHelloWorldFrame[] = "\0hello, world\xff";
+ const int kHelloWorldFrameLen = sizeof(kHelloWorldFrame) - 1;
+ const char kLengthFrame[3 + 129] = "\x80\x81\x01\x01\0should be skipped\xff";
+ const int kLengthFrameLen = sizeof(kLengthFrame);
+ const int kInputDataLen = kHelloWorldFrameLen +
+ kLengthFrameLen +
+ kHelloWorldFrameLen;
+ char inputData[kInputDataLen];
+ memcpy(inputData, kHelloWorldFrame, kHelloWorldFrameLen);
+ memcpy(inputData + kHelloWorldFrameLen, kLengthFrame, kLengthFrameLen);
+ memcpy(inputData + kHelloWorldFrameLen + kLengthFrameLen,
+ kHelloWorldFrame, kHelloWorldFrameLen);
+
+ EXPECT_EQ(kInputDataLen,
+ WebSocketFrameHandler::ParseWebSocketFrame(
+ inputData, kInputDataLen, &frames));
+ ASSERT_EQ(3UL, frames.size());
+
+ EXPECT_EQ(inputData, frames[0].frame_start);
+ EXPECT_EQ(kHelloWorldFrameLen, frames[0].frame_length);
+ EXPECT_EQ(inputData + 1, frames[0].message_start);
+ EXPECT_EQ(kHelloWorldFrameLen - 2, frames[0].message_length);
+
+ EXPECT_EQ(inputData + kHelloWorldFrameLen, frames[1].frame_start);
+ EXPECT_EQ(kLengthFrameLen, frames[1].frame_length);
+ EXPECT_EQ(inputData + kHelloWorldFrameLen + 3, frames[1].message_start);
+ EXPECT_EQ(kLengthFrameLen - 3, frames[1].message_length);
+
+ EXPECT_EQ(inputData + kHelloWorldFrameLen + kLengthFrameLen,
+ frames[2].frame_start);
+ EXPECT_EQ(kHelloWorldFrameLen, frames[2].frame_length);
+ EXPECT_EQ(inputData + kHelloWorldFrameLen + kLengthFrameLen + 1,
+ frames[2].message_start);
+ EXPECT_EQ(kHelloWorldFrameLen - 2, frames[2].message_length);
+}
+
+TEST(WebSocketFrameHandlerTest, ParsePartialFrame) {
+ std::vector<WebSocketFrameHandler::FrameInfo> frames;
+ const char kInputData[] = "\0hello, world\xff"
+ "\x80\x81\x01" // skip 1*128+1 bytes.
+ "\x01\xff"
+ "\0should be skipped\xff";
+ const int kInputDataLen = sizeof(kInputData) - 1;
+ const int kHelloWorldFrameLen = 14;
+
+ EXPECT_EQ(kHelloWorldFrameLen,
+ WebSocketFrameHandler::ParseWebSocketFrame(
+ kInputData, kInputDataLen, &frames));
+ ASSERT_EQ(1UL, frames.size());
+
+ EXPECT_EQ(kInputData, frames[0].frame_start);
+ EXPECT_EQ(kHelloWorldFrameLen, frames[0].frame_length);
+ EXPECT_EQ(kInputData + 1, frames[0].message_start);
+ EXPECT_EQ(kHelloWorldFrameLen - 2, frames[0].message_length);
+}
+
+} // namespace net