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 |