OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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/server/web_socket_encoder.h" |
| 6 #include "testing/gtest/include/gtest/gtest.h" |
| 7 |
| 8 namespace net { |
| 9 |
| 10 class WebSocketEncoderTest : public testing::Test { |
| 11 public: |
| 12 WebSocketEncoderTest() {} |
| 13 |
| 14 void SetUp() override { |
| 15 std::string response_extensions; |
| 16 server_.reset(WebSocketEncoder::CreateServer("", &response_extensions)); |
| 17 EXPECT_EQ(std::string(), response_extensions); |
| 18 client_.reset(WebSocketEncoder::CreateClient("")); |
| 19 } |
| 20 |
| 21 protected: |
| 22 scoped_ptr<WebSocketEncoder> server_; |
| 23 scoped_ptr<WebSocketEncoder> client_; |
| 24 }; |
| 25 |
| 26 class WebSocketEncoderCompressionTest : public WebSocketEncoderTest { |
| 27 public: |
| 28 WebSocketEncoderCompressionTest() : WebSocketEncoderTest() {} |
| 29 |
| 30 void SetUp() override { |
| 31 std::string response_extensions; |
| 32 server_.reset(WebSocketEncoder::CreateServer( |
| 33 "permessage-deflate; client_max_window_bits", &response_extensions)); |
| 34 client_.reset(WebSocketEncoder::CreateClient(response_extensions)); |
| 35 } |
| 36 }; |
| 37 |
| 38 TEST_F(WebSocketEncoderTest, ClientToServer) { |
| 39 std::string frame("ClientToServer"); |
| 40 int mask = 123456; |
| 41 std::string encoded; |
| 42 int bytes_consumed; |
| 43 std::string decoded; |
| 44 |
| 45 client_->EncodeFrame(frame, mask, &encoded); |
| 46 EXPECT_EQ(WebSocket::FRAME_OK, |
| 47 server_->DecodeFrame(encoded, &bytes_consumed, &decoded)); |
| 48 EXPECT_EQ(frame, decoded); |
| 49 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 50 |
| 51 std::string partial = encoded.substr(0, encoded.length() - 2); |
| 52 EXPECT_EQ(WebSocket::FRAME_INCOMPLETE, |
| 53 server_->DecodeFrame(partial, &bytes_consumed, &decoded)); |
| 54 |
| 55 std::string extra = encoded + "more stuff"; |
| 56 EXPECT_EQ(WebSocket::FRAME_OK, |
| 57 server_->DecodeFrame(extra, &bytes_consumed, &decoded)); |
| 58 EXPECT_EQ(frame, decoded); |
| 59 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 60 |
| 61 EXPECT_EQ( |
| 62 WebSocket::FRAME_ERROR, |
| 63 server_->DecodeFrame(std::string("abcde"), &bytes_consumed, &decoded)); |
| 64 } |
| 65 |
| 66 TEST_F(WebSocketEncoderTest, ServerToClient) { |
| 67 std::string frame("ServerToClient"); |
| 68 int mask = 0; |
| 69 std::string encoded; |
| 70 int bytes_consumed; |
| 71 std::string decoded; |
| 72 |
| 73 server_->EncodeFrame(frame, mask, &encoded); |
| 74 EXPECT_EQ(WebSocket::FRAME_OK, |
| 75 client_->DecodeFrame(encoded, &bytes_consumed, &decoded)); |
| 76 EXPECT_EQ(frame, decoded); |
| 77 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 78 |
| 79 std::string partial = encoded.substr(0, encoded.length() - 2); |
| 80 EXPECT_EQ(WebSocket::FRAME_INCOMPLETE, |
| 81 client_->DecodeFrame(partial, &bytes_consumed, &decoded)); |
| 82 |
| 83 std::string extra = encoded + "more stuff"; |
| 84 EXPECT_EQ(WebSocket::FRAME_OK, |
| 85 client_->DecodeFrame(extra, &bytes_consumed, &decoded)); |
| 86 EXPECT_EQ(frame, decoded); |
| 87 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 88 |
| 89 EXPECT_EQ( |
| 90 WebSocket::FRAME_ERROR, |
| 91 client_->DecodeFrame(std::string("abcde"), &bytes_consumed, &decoded)); |
| 92 } |
| 93 |
| 94 TEST_F(WebSocketEncoderCompressionTest, ClientToServer) { |
| 95 std::string frame("CompressionCompressionCompressionCompression"); |
| 96 int mask = 654321; |
| 97 std::string encoded; |
| 98 int bytes_consumed; |
| 99 std::string decoded; |
| 100 |
| 101 client_->EncodeFrame(frame, mask, &encoded); |
| 102 EXPECT_LT(encoded.length(), frame.length()); |
| 103 EXPECT_EQ(WebSocket::FRAME_OK, |
| 104 server_->DecodeFrame(encoded, &bytes_consumed, &decoded)); |
| 105 EXPECT_EQ(frame, decoded); |
| 106 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 107 } |
| 108 |
| 109 TEST_F(WebSocketEncoderCompressionTest, ServerToClient) { |
| 110 std::string frame("CompressionCompressionCompressionCompression"); |
| 111 int mask = 0; |
| 112 std::string encoded; |
| 113 int bytes_consumed; |
| 114 std::string decoded; |
| 115 |
| 116 server_->EncodeFrame(frame, mask, &encoded); |
| 117 EXPECT_LT(encoded.length(), frame.length()); |
| 118 EXPECT_EQ(WebSocket::FRAME_OK, |
| 119 client_->DecodeFrame(encoded, &bytes_consumed, &decoded)); |
| 120 EXPECT_EQ(frame, decoded); |
| 121 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 122 } |
| 123 |
| 124 TEST_F(WebSocketEncoderCompressionTest, LongFrame) { |
| 125 int length = 1000000; |
| 126 std::string temp; |
| 127 temp.reserve(length); |
| 128 for (int i = 0; i < length; ++i) |
| 129 temp += (char)('a' + (i % 26)); |
| 130 |
| 131 std::string frame; |
| 132 frame.reserve(length); |
| 133 for (int i = 0; i < length; ++i) { |
| 134 int64 j = i; |
| 135 frame += temp.data()[(j * j) % length]; |
| 136 } |
| 137 |
| 138 int mask = 0; |
| 139 std::string encoded; |
| 140 int bytes_consumed; |
| 141 std::string decoded; |
| 142 |
| 143 server_->EncodeFrame(frame, mask, &encoded); |
| 144 EXPECT_LT(encoded.length(), frame.length()); |
| 145 EXPECT_EQ(WebSocket::FRAME_OK, |
| 146 client_->DecodeFrame(encoded, &bytes_consumed, &decoded)); |
| 147 EXPECT_EQ(frame, decoded); |
| 148 EXPECT_EQ((int)encoded.length(), bytes_consumed); |
| 149 } |
| 150 |
| 151 } // namespace net |
OLD | NEW |