| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 // Tests for WebSocketBasicStream. Note that we do not attempt to verify that | 5 // Tests for WebSocketBasicStream. Note that we do not attempt to verify that |
| 6 // frame parsing itself functions correctly, as that is covered by the | 6 // frame parsing itself functions correctly, as that is covered by the |
| 7 // WebSocketFrameParser tests. | 7 // WebSocketFrameParser tests. |
| 8 | 8 |
| 9 #include "net/websockets/websocket_basic_stream.h" | 9 #include "net/websockets/websocket_basic_stream.h" |
| 10 | 10 |
| 11 #include <stddef.h> | 11 #include <stddef.h> |
| 12 #include <stdint.h> | 12 #include <stdint.h> |
| 13 #include <string.h> // for memcpy() and memset(). | 13 #include <string.h> // for memcpy() and memset(). |
| 14 | |
| 15 #include <string> | 14 #include <string> |
| 15 #include <utility> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "base/big_endian.h" | 18 #include "base/big_endian.h" |
| 19 #include "base/macros.h" | 19 #include "base/macros.h" |
| 20 #include "net/base/test_completion_callback.h" | 20 #include "net/base/test_completion_callback.h" |
| 21 #include "net/log/test_net_log.h" | 21 #include "net/log/test_net_log.h" |
| 22 #include "net/socket/socket_test_util.h" | 22 #include "net/socket/socket_test_util.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 24 |
| 25 namespace net { | 25 namespace net { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 factory_.AddSocketDataProvider(socket_data_.get()); | 127 factory_.AddSocketDataProvider(socket_data_.get()); |
| 128 | 128 |
| 129 scoped_ptr<ClientSocketHandle> transport_socket(new ClientSocketHandle); | 129 scoped_ptr<ClientSocketHandle> transport_socket(new ClientSocketHandle); |
| 130 scoped_refptr<MockTransportSocketParams> params; | 130 scoped_refptr<MockTransportSocketParams> params; |
| 131 transport_socket->Init("a", | 131 transport_socket->Init("a", |
| 132 params, | 132 params, |
| 133 MEDIUM, | 133 MEDIUM, |
| 134 CompletionCallback(), | 134 CompletionCallback(), |
| 135 &pool_, | 135 &pool_, |
| 136 bound_net_log_.bound()); | 136 bound_net_log_.bound()); |
| 137 return transport_socket.Pass(); | 137 return transport_socket; |
| 138 } | 138 } |
| 139 | 139 |
| 140 void SetHttpReadBuffer(const char* data, size_t size) { | 140 void SetHttpReadBuffer(const char* data, size_t size) { |
| 141 http_read_buffer_ = new GrowableIOBuffer; | 141 http_read_buffer_ = new GrowableIOBuffer; |
| 142 http_read_buffer_->SetCapacity(size); | 142 http_read_buffer_->SetCapacity(size); |
| 143 memcpy(http_read_buffer_->data(), data, size); | 143 memcpy(http_read_buffer_->data(), data, size); |
| 144 http_read_buffer_->set_offset(size); | 144 http_read_buffer_->set_offset(size); |
| 145 } | 145 } |
| 146 | 146 |
| 147 void CreateStream(MockRead reads[], | 147 void CreateStream(MockRead reads[], |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 kWriteFrameSize - (WebSocketFrameHeader::kBaseHeaderSize + | 248 kWriteFrameSize - (WebSocketFrameHeader::kBaseHeaderSize + |
| 249 WebSocketFrameHeader::kMaskingKeyLength); | 249 WebSocketFrameHeader::kMaskingKeyLength); |
| 250 frame->data = new IOBuffer(payload_size); | 250 frame->data = new IOBuffer(payload_size); |
| 251 memcpy(frame->data->data(), | 251 memcpy(frame->data->data(), |
| 252 kWriteFrame + kWriteFrameSize - payload_size, | 252 kWriteFrame + kWriteFrameSize - payload_size, |
| 253 payload_size); | 253 payload_size); |
| 254 WebSocketFrameHeader& header = frame->header; | 254 WebSocketFrameHeader& header = frame->header; |
| 255 header.final = true; | 255 header.final = true; |
| 256 header.masked = true; | 256 header.masked = true; |
| 257 header.payload_length = payload_size; | 257 header.payload_length = payload_size; |
| 258 frames_.push_back(frame.Pass()); | 258 frames_.push_back(std::move(frame)); |
| 259 } | 259 } |
| 260 | 260 |
| 261 // Creates a stream that expects the listed writes. | 261 // Creates a stream that expects the listed writes. |
| 262 template <size_t N> | 262 template <size_t N> |
| 263 void CreateWriteOnly(MockWrite (&writes)[N]) { | 263 void CreateWriteOnly(MockWrite (&writes)[N]) { |
| 264 CreateStream(NULL, 0, writes, N); | 264 CreateStream(NULL, 0, writes, N); |
| 265 } | 265 } |
| 266 }; | 266 }; |
| 267 | 267 |
| 268 TEST_F(WebSocketBasicStreamSocketTest, ConstructionWorks) { | 268 TEST_F(WebSocketBasicStreamSocketTest, ConstructionWorks) { |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 MockWrite(SYNCHRONOUS, kMaskedEmptyPong, kMaskedEmptyPongSize)}; | 891 MockWrite(SYNCHRONOUS, kMaskedEmptyPong, kMaskedEmptyPongSize)}; |
| 892 CreateWriteOnly(writes); | 892 CreateWriteOnly(writes); |
| 893 | 893 |
| 894 scoped_ptr<WebSocketFrame> frame( | 894 scoped_ptr<WebSocketFrame> frame( |
| 895 new WebSocketFrame(WebSocketFrameHeader::kOpCodePong)); | 895 new WebSocketFrame(WebSocketFrameHeader::kOpCodePong)); |
| 896 WebSocketFrameHeader& header = frame->header; | 896 WebSocketFrameHeader& header = frame->header; |
| 897 header.final = true; | 897 header.final = true; |
| 898 header.masked = true; | 898 header.masked = true; |
| 899 header.payload_length = 0; | 899 header.payload_length = 0; |
| 900 std::vector<scoped_ptr<WebSocketFrame>> frames; | 900 std::vector<scoped_ptr<WebSocketFrame>> frames; |
| 901 frames.push_back(frame.Pass()); | 901 frames.push_back(std::move(frame)); |
| 902 EXPECT_EQ(OK, stream_->WriteFrames(&frames, cb_.callback())); | 902 EXPECT_EQ(OK, stream_->WriteFrames(&frames, cb_.callback())); |
| 903 } | 903 } |
| 904 | 904 |
| 905 // Check that writing with a non-NULL mask works correctly. | 905 // Check that writing with a non-NULL mask works correctly. |
| 906 TEST_F(WebSocketBasicStreamSocketTest, WriteNonNulMask) { | 906 TEST_F(WebSocketBasicStreamSocketTest, WriteNonNulMask) { |
| 907 std::string masked_frame = std::string("\x81\x88"); | 907 std::string masked_frame = std::string("\x81\x88"); |
| 908 masked_frame += std::string(kNonNulMaskingKey.key, 4); | 908 masked_frame += std::string(kNonNulMaskingKey.key, 4); |
| 909 masked_frame += "jiggered"; | 909 masked_frame += "jiggered"; |
| 910 MockWrite writes[] = { | 910 MockWrite writes[] = { |
| 911 MockWrite(SYNCHRONOUS, masked_frame.data(), masked_frame.size())}; | 911 MockWrite(SYNCHRONOUS, masked_frame.data(), masked_frame.size())}; |
| 912 generator_ = &GenerateNonNulMaskingKey; | 912 generator_ = &GenerateNonNulMaskingKey; |
| 913 CreateStream(NULL, 0, writes, arraysize(writes)); | 913 CreateStream(NULL, 0, writes, arraysize(writes)); |
| 914 | 914 |
| 915 scoped_ptr<WebSocketFrame> frame( | 915 scoped_ptr<WebSocketFrame> frame( |
| 916 new WebSocketFrame(WebSocketFrameHeader::kOpCodeText)); | 916 new WebSocketFrame(WebSocketFrameHeader::kOpCodeText)); |
| 917 const std::string unmasked_payload = "graphics"; | 917 const std::string unmasked_payload = "graphics"; |
| 918 const size_t payload_size = unmasked_payload.size(); | 918 const size_t payload_size = unmasked_payload.size(); |
| 919 frame->data = new IOBuffer(payload_size); | 919 frame->data = new IOBuffer(payload_size); |
| 920 memcpy(frame->data->data(), unmasked_payload.data(), payload_size); | 920 memcpy(frame->data->data(), unmasked_payload.data(), payload_size); |
| 921 WebSocketFrameHeader& header = frame->header; | 921 WebSocketFrameHeader& header = frame->header; |
| 922 header.final = true; | 922 header.final = true; |
| 923 header.masked = true; | 923 header.masked = true; |
| 924 header.payload_length = payload_size; | 924 header.payload_length = payload_size; |
| 925 frames_.push_back(frame.Pass()); | 925 frames_.push_back(std::move(frame)); |
| 926 | 926 |
| 927 EXPECT_EQ(OK, stream_->WriteFrames(&frames_, cb_.callback())); | 927 EXPECT_EQ(OK, stream_->WriteFrames(&frames_, cb_.callback())); |
| 928 } | 928 } |
| 929 | 929 |
| 930 TEST_F(WebSocketBasicStreamSocketTest, GetExtensionsWorks) { | 930 TEST_F(WebSocketBasicStreamSocketTest, GetExtensionsWorks) { |
| 931 extensions_ = "inflate-uuencode"; | 931 extensions_ = "inflate-uuencode"; |
| 932 CreateNullStream(); | 932 CreateNullStream(); |
| 933 | 933 |
| 934 EXPECT_EQ("inflate-uuencode", stream_->GetExtensions()); | 934 EXPECT_EQ("inflate-uuencode", stream_->GetExtensions()); |
| 935 } | 935 } |
| 936 | 936 |
| 937 TEST_F(WebSocketBasicStreamSocketTest, GetSubProtocolWorks) { | 937 TEST_F(WebSocketBasicStreamSocketTest, GetSubProtocolWorks) { |
| 938 sub_protocol_ = "cyberchat"; | 938 sub_protocol_ = "cyberchat"; |
| 939 CreateNullStream(); | 939 CreateNullStream(); |
| 940 | 940 |
| 941 EXPECT_EQ("cyberchat", stream_->GetSubProtocol()); | 941 EXPECT_EQ("cyberchat", stream_->GetSubProtocol()); |
| 942 } | 942 } |
| 943 | 943 |
| 944 } // namespace | 944 } // namespace |
| 945 } // namespace net | 945 } // namespace net |
| OLD | NEW |