Chromium Code Reviews| Index: net/websockets/websocket_channel_test.cc |
| diff --git a/net/websockets/websocket_channel_test.cc b/net/websockets/websocket_channel_test.cc |
| index 32dae8a0acd9083d92592884c72150c328f6a94b..1ef0291253d79746ed4a201a67bafec5f439d56a 100644 |
| --- a/net/websockets/websocket_channel_test.cc |
| +++ b/net/websockets/websocket_channel_test.cc |
| @@ -157,13 +157,22 @@ class MockWebSocketEventInterface : public WebSocketEventInterface { |
| public: |
| MockWebSocketEventInterface() {} |
| + ChannelState OnDataFrame(bool fin, |
| + WebSocketMessageType type, |
| + scoped_refptr<IOBuffer> buffer, |
| + size_t buffer_size) override { |
| + char* data = buffer ? buffer->data() : nullptr; |
|
yhirano
2016/10/04 01:35:09
|const char*| might be preferable.
darin (slow to review)
2016/10/04 16:17:48
Done.
|
| + return OnDataFrameVector(fin, type, |
| + std::vector<char>(data, data + buffer_size)); |
| + } |
| + |
| MOCK_METHOD2(OnAddChannelResponse, |
| ChannelState(const std::string&, |
| const std::string&)); // NOLINT |
| - MOCK_METHOD3(OnDataFrame, |
| + MOCK_METHOD3(OnDataFrameVector, |
| ChannelState(bool, |
| WebSocketMessageType, |
| - const std::vector<char>&)); // NOLINT |
| + const std::vector<char>&)); // NOLINT |
| MOCK_METHOD1(OnFlowControl, ChannelState(int64_t)); // NOLINT |
| MOCK_METHOD0(OnClosingHandshake, ChannelState(void)); // NOLINT |
| MOCK_METHOD1(OnFailChannel, ChannelState(const std::string&)); // NOLINT |
| @@ -207,7 +216,8 @@ class FakeWebSocketEventInterface : public WebSocketEventInterface { |
| } |
| ChannelState OnDataFrame(bool fin, |
| WebSocketMessageType type, |
| - const std::vector<char>& data) override { |
| + scoped_refptr<IOBuffer> data, |
| + size_t data_size) override { |
| return CHANNEL_ALIVE; |
| } |
| ChannelState OnFlowControl(int64_t quota) override { return CHANNEL_ALIVE; } |
| @@ -732,13 +742,19 @@ struct WebSocketStreamCreationCallbackArgumentSaver { |
| std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate; |
| }; |
| -// Converts a std::string to a std::vector<char>. For test purposes, it is |
| -// convenient to be able to specify data as a string, but the |
| -// WebSocketEventInterface requires the vector<char> type. |
| -std::vector<char> AsVector(const std::string& s) { |
| +std::vector<char> AsVector(const base::StringPiece& s) { |
| return std::vector<char>(s.begin(), s.end()); |
| } |
| +// Converts a base::StringPiece to a IOBuffer. For test purposes, it is |
| +// convenient to be able to specify data as a string, but the |
| +// WebSocketEventInterface requires the IOBuffer type. |
| +scoped_refptr<IOBuffer> AsIOBuffer(const base::StringPiece& s) { |
| + scoped_refptr<IOBuffer> buffer(new IOBuffer(s.size())); |
| + std::copy(s.begin(), s.end(), buffer->data()); |
| + return buffer; |
| +} |
| + |
| class FakeSSLErrorCallbacks |
| : public WebSocketEventInterface::SSLErrorCallbacks { |
| public: |
| @@ -881,7 +897,8 @@ class ChannelDeletingFakeWebSocketEventInterface |
| ChannelState OnDataFrame(bool fin, |
| WebSocketMessageType type, |
| - const std::vector<char>& data) override { |
| + scoped_refptr<IOBuffer> data, |
| + size_t data_size) override { |
| return fixture_->DeleteIfDeleting(EVENT_ON_DATA_FRAME); |
| } |
| @@ -1106,9 +1123,9 @@ TEST_F(WebSocketChannelDeletingTest, OnFlowControlAfterSend) { |
| CreateChannelAndConnectSuccessfully(); |
| ASSERT_TRUE(channel_); |
| deleting_ = EVENT_ON_FLOW_CONTROL; |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultInitialQuota, 'B')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultInitialQuota, 'B')), |
| + kDefaultInitialQuota); |
| EXPECT_EQ(nullptr, channel_.get()); |
| } |
| @@ -1145,8 +1162,8 @@ TEST_F(WebSocketChannelDeletingTest, OnDropChannelWriteError) { |
| deleting_ = EVENT_ON_DROP_CHANNEL; |
| CreateChannelAndConnectSuccessfully(); |
| ASSERT_TRUE(channel_); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("this will fail")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("this will fail"), 14U); |
| EXPECT_EQ(nullptr, channel_.get()); |
| } |
| @@ -1208,9 +1225,9 @@ TEST_F(WebSocketChannelDeletingTest, FailChannelInSendFrame) { |
| deleting_ = EVENT_ON_FAIL_CHANNEL; |
| CreateChannelAndConnectSuccessfully(); |
| ASSERT_TRUE(channel_); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultInitialQuota * 2, 'T')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultInitialQuota * 2, 'T')), |
| + kDefaultInitialQuota * 2); |
| EXPECT_EQ(nullptr, channel_.get()); |
| } |
| @@ -1395,10 +1412,9 @@ TEST_F(WebSocketChannelEventInterfaceTest, DataLeftFromHandshake) { |
| InSequence s; |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("HELLO"))); |
| } |
| CreateChannelAndConnectSuccessfully(); |
| @@ -1464,10 +1480,9 @@ TEST_F(WebSocketChannelEventInterfaceTest, NormalAsyncRead) { |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| EXPECT_CALL(checkpoint, Call(1)); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("HELLO"))); |
| EXPECT_CALL(checkpoint, Call(2)); |
| } |
| @@ -1493,14 +1508,12 @@ TEST_F(WebSocketChannelEventInterfaceTest, AsyncThenSyncRead) { |
| InSequence s; |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("HELLO"))); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("WORLD"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("HELLO"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("WORLD"))); |
| } |
| CreateChannelAndConnectSuccessfully(); |
| @@ -1535,26 +1548,25 @@ TEST_F(WebSocketChannelEventInterfaceTest, FragmentedMessage) { |
| InSequence s; |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("THREE"))); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("THREE"))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector(" "))); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeContinuation, AsVector(" "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("SMALL"))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("SMALL"))); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeContinuation, AsVector(" "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("FRAMES"))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector(" "))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("FRAMES"))); |
| } |
| CreateChannelAndConnectSuccessfully(); |
| @@ -1573,7 +1585,7 @@ TEST_F(WebSocketChannelEventInterfaceTest, NullMessage) { |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| CreateChannelAndConnectSuccessfully(); |
| } |
| @@ -1682,14 +1694,13 @@ TEST_F(WebSocketChannelEventInterfaceTest, ControlFrameInDataMessage) { |
| InSequence s; |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("SPLIT "))); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("SPLIT "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("MESSAGE"))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("MESSAGE"))); |
| } |
| CreateChannelAndConnectSuccessfully(); |
| @@ -1748,7 +1759,8 @@ TEST_F(WebSocketChannelEventInterfaceTest, SmallWriteDoesntUpdateQuota) { |
| } |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("B")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsIOBuffer("B"), |
| + 1U); |
| } |
| // If we send enough to go below |send_quota_low_water_mark_| we should get our |
| @@ -1769,9 +1781,9 @@ TEST_F(WebSocketChannelEventInterfaceTest, LargeWriteUpdatesQuota) { |
| CreateChannelAndConnectSuccessfully(); |
| checkpoint.Call(1); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultInitialQuota, 'B')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultInitialQuota, 'B')), |
| + kDefaultInitialQuota); |
| checkpoint.Call(2); |
| } |
| @@ -1794,14 +1806,14 @@ TEST_F(WebSocketChannelEventInterfaceTest, QuotaReallyIsRefreshed) { |
| CreateChannelAndConnectSuccessfully(); |
| checkpoint.Call(1); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultQuotaRefreshTrigger, 'D')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultQuotaRefreshTrigger, 'D')), |
| + kDefaultQuotaRefreshTrigger); |
| checkpoint.Call(2); |
| // We should have received more quota at this point. |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultQuotaRefreshTrigger, 'E')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultQuotaRefreshTrigger, 'E')), |
| + kDefaultQuotaRefreshTrigger); |
| checkpoint.Call(3); |
| } |
| @@ -1817,9 +1829,9 @@ TEST_F(WebSocketChannelEventInterfaceTest, WriteOverQuotaIsRejected) { |
| } |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultInitialQuota + 1, 'C')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultInitialQuota + 1, 'C')), |
| + kDefaultInitialQuota + 1); |
| } |
| // If a write fails, the channel is dropped. |
| @@ -1839,7 +1851,8 @@ TEST_F(WebSocketChannelEventInterfaceTest, FailedWrite) { |
| CreateChannelAndConnectSuccessfully(); |
| checkpoint.Call(1); |
| - channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("H")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsIOBuffer("H"), |
| + 1U); |
| checkpoint.Call(2); |
| } |
| @@ -1885,7 +1898,8 @@ TEST_F(WebSocketChannelEventInterfaceTest, OnDropChannelCalledOnce) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("yt?")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("yt?"), 3U); |
| base::RunLoop().RunUntilIdle(); |
| } |
| @@ -2334,17 +2348,17 @@ TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitSync) { |
| InSequence s; |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("FO"))); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U"))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("U"))); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R"))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("R"))); |
| } |
| CreateChannelAndConnectWithQuota(2); |
| @@ -2367,19 +2381,19 @@ TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitAsync) { |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| EXPECT_CALL(checkpoint, Call(1)); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("FO"))); |
| EXPECT_CALL(checkpoint, Call(2)); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U"))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("U"))); |
| EXPECT_CALL(checkpoint, Call(3)); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame( |
| - true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R"))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("R"))); |
| } |
| CreateChannelAndConnectWithQuota(2); |
| @@ -2413,25 +2427,24 @@ TEST_F(WebSocketChannelFlowControlTest, MultipleFrameSplit) { |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, |
| - WebSocketFrameHeader::kOpCodeText, |
| - AsVector("FIRST FRAME IS"))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector(" 25 BYTES. "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("SECOND FRAME IS 26 BYTES. "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("FINAL "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("FRAME IS 24 BYTES."))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("FIRST FRAME IS"))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector(" 25 BYTES. "))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("SECOND FRAME IS 26 BYTES. "))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("FINAL "))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("FRAME IS 24 BYTES."))); |
| } |
| CreateChannelAndConnectWithQuota(14); |
| ASSERT_EQ(CHANNEL_ALIVE, channel_->SendFlowControl(43)); |
| @@ -2456,21 +2469,18 @@ TEST_F(WebSocketChannelFlowControlTest, EmptyMessageNoQuota) { |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, |
| - WebSocketFrameHeader::kOpCodeText, |
| - AsVector("FIRST "))); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("MESSAGE"))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("FIRST "))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("MESSAGE"))); |
| EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - AsVector(""))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| + AsVector(""))); |
| EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - AsVector("THIRD MESSAGE"))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("THIRD MESSAGE"))); |
| } |
| CreateChannelAndConnectWithQuota(6); |
| @@ -2498,23 +2508,25 @@ TEST_F(WebSocketChannelFlowControlTest, CloseFrameShouldNotOvertakeDataFrames) { |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, |
| - AsVector("FIRST "))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("FIRST "))); |
| EXPECT_CALL(checkpoint, Call(1)); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("MESSAG"))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("MESSAG"))); |
| EXPECT_CALL(checkpoint, Call(2)); |
| EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("E"))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("E"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeText, |
| + AsVector("SECON"))); |
| + EXPECT_CALL(checkpoint, Call(3)); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("SECON"))); |
| - EXPECT_CALL(checkpoint, Call(3)); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(false, WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("D "))); |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsVector("D "))); |
| EXPECT_CALL(*event_interface_, OnClosingHandshake()); |
| EXPECT_CALL(checkpoint, Call(4)); |
| @@ -2542,8 +2554,8 @@ TEST_F(WebSocketChannelStreamTest, SentFramesAreMasked) { |
| .WillOnce(Return(OK)); |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("NEEDS MASKING")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("NEEDS MASKING"), 13U); |
| } |
| // RFC6455 5.5.1 "The application MUST NOT send any more data frames after |
| @@ -2560,8 +2572,8 @@ TEST_F(WebSocketChannelStreamTest, NothingIsSentAfterClose) { |
| CreateChannelAndConnectSuccessfully(); |
| ASSERT_EQ(CHANNEL_ALIVE, channel_->StartClosingHandshake(1000, "Success")); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("SHOULD BE IGNORED")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("SHOULD BE IGNORED"), 18U); |
| } |
| // RFC6455 5.5.1 "If an endpoint receives a Close frame and did not previously |
| @@ -2802,12 +2814,12 @@ TEST_F(WebSocketChannelStreamTest, PongInTheMiddleOfDataMessage) { |
| } |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("Hello ")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("Hello "), 6U); |
| *read_frames = CreateFrameVector(frames); |
| read_callback.Run(OK); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("World")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("World"), 5U); |
| } |
| // WriteFrames() may not be called until the previous write has completed. |
| @@ -2836,10 +2848,10 @@ TEST_F(WebSocketChannelStreamTest, WriteFramesOneAtATime) { |
| CreateChannelAndConnectSuccessfully(); |
| checkpoint.Call(1); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("Hello ")); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("World")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("Hello "), 6U); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("World"), 5U); |
| checkpoint.Call(2); |
| write_callback.Run(OK); |
| checkpoint.Call(3); |
| @@ -2872,9 +2884,8 @@ TEST_F(WebSocketChannelStreamTest, WaitingMessagesAreBatched) { |
| CreateChannelAndConnectSuccessfully(); |
| for (size_t i = 0; i < strlen(input_letters); ++i) { |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(1, input_letters[i])); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(1, input_letters[i])), 1U); |
| } |
| write_callback.Run(OK); |
| } |
| @@ -2893,9 +2904,9 @@ TEST_F(WebSocketChannelStreamTest, SendGoingAwayOnRendererQuotaExceeded) { |
| EXPECT_CALL(*mock_stream_, Close()); |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(kDefaultInitialQuota + 1, 'C')); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer(std::string(kDefaultInitialQuota + 1, 'C')), |
| + kDefaultInitialQuota + 1); |
| } |
| // For convenience, most of these tests use Text frames. However, the WebSocket |
| @@ -2912,9 +2923,9 @@ TEST_F(WebSocketChannelStreamTest, WrittenBinaryFramesAre8BitClean) { |
| CreateChannelAndConnectSuccessfully(); |
| channel_->SendFrame( |
| - true, |
| - WebSocketFrameHeader::kOpCodeBinary, |
| - std::vector<char>(kBinaryBlob, kBinaryBlob + kBinaryBlobSize)); |
| + true, WebSocketFrameHeader::kOpCodeBinary, |
| + AsIOBuffer(std::string(kBinaryBlob, kBinaryBlob + kBinaryBlobSize)), |
| + kBinaryBlobSize); |
| ASSERT_TRUE(frames != nullptr); |
| ASSERT_EQ(1U, frames->size()); |
| const WebSocketFrame* out_frame = (*frames)[0].get(); |
| @@ -2941,11 +2952,11 @@ TEST_F(WebSocketChannelEventInterfaceTest, ReadBinaryFramesAre8BitClean) { |
| set_stream(std::move(stream)); |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(_)); |
| - EXPECT_CALL(*event_interface_, |
| - OnDataFrame(true, |
| - WebSocketFrameHeader::kOpCodeBinary, |
| - std::vector<char>(kBinaryBlob, |
| - kBinaryBlob + kBinaryBlobSize))); |
| + EXPECT_CALL( |
| + *event_interface_, |
| + OnDataFrameVector( |
| + true, WebSocketFrameHeader::kOpCodeBinary, |
| + std::vector<char>(kBinaryBlob, kBinaryBlob + kBinaryBlobSize))); |
| CreateChannelAndConnectSuccessfully(); |
| } |
| @@ -2958,8 +2969,8 @@ TEST_F(WebSocketChannelSendUtf8Test, InvalidUtf8Rejected) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("\xff")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("\xff"), 1U); |
| } |
| // A Text message cannot end with a partial UTF-8 character. |
| @@ -2970,8 +2981,8 @@ TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInFinalFrame) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("\xc2")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("\xc2"), 1U); |
| } |
| // A non-final Text frame may end with a partial UTF-8 character (compare to |
| @@ -2979,19 +2990,18 @@ TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInFinalFrame) { |
| TEST_F(WebSocketChannelSendUtf8Test, IncompleteCharacterInNonFinalFrame) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("\xc2")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("\xc2"), 1U); |
| } |
| // UTF-8 parsing context must be retained between frames. |
| TEST_F(WebSocketChannelSendUtf8Test, ValidCharacterSplitBetweenFrames) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("\xf1")); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("\x80\xa0\xbf")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("\xf1"), 1U); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("\x80\xa0\xbf"), 3U); |
| } |
| // Similarly, an invalid character should be detected even if split. |
| @@ -3002,11 +3012,10 @@ TEST_F(WebSocketChannelSendUtf8Test, InvalidCharacterSplit) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("\xe1")); |
| - channel_->SendFrame(true, |
| - WebSocketFrameHeader::kOpCodeContinuation, |
| - AsVector("\x80\xa0\xbf")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("\xe1"), 1U); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("\x80\xa0\xbf"), 3U); |
| } |
| // An invalid character must be detected in continuation frames. |
| @@ -3017,12 +3026,12 @@ TEST_F(WebSocketChannelSendUtf8Test, InvalidByteInContinuation) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeText, AsVector("foo")); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("bar")); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("\xff")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("foo"), 3U); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("bar"), 3U); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("\xff"), 1U); |
| } |
| // However, continuation frames of a Binary frame will not be tested for UTF-8 |
| @@ -3030,12 +3039,12 @@ TEST_F(WebSocketChannelSendUtf8Test, InvalidByteInContinuation) { |
| TEST_F(WebSocketChannelSendUtf8Test, BinaryContinuationNotChecked) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeBinary, AsVector("foo")); |
| - channel_->SendFrame( |
| - false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("bar")); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("\xff")); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeBinary, |
| + AsIOBuffer("foo"), 3U); |
| + channel_->SendFrame(false, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("bar"), 3U); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeContinuation, |
| + AsIOBuffer("\xff"), 1U); |
| } |
| // Multiple text messages can be validated without the validation state getting |
| @@ -3043,8 +3052,10 @@ TEST_F(WebSocketChannelSendUtf8Test, BinaryContinuationNotChecked) { |
| TEST_F(WebSocketChannelSendUtf8Test, ValidateMultipleTextMessages) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("foo")); |
| - channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("bar")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("foo"), 3U); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("bar"), 3U); |
| } |
| // UTF-8 validation is enforced on received Text frames. |
| @@ -3080,8 +3091,8 @@ TEST_F(WebSocketChannelStreamTest, InvalidUtf8TextFrameNotSent) { |
| CreateChannelAndConnectSuccessfully(); |
| - channel_->SendFrame( |
| - true, WebSocketFrameHeader::kOpCodeText, AsVector("\xff")); |
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, |
| + AsIOBuffer("\xff"), 1U); |
| } |
| // The rest of the tests for receiving invalid UTF-8 test the communication with |
| @@ -3250,10 +3261,9 @@ TEST_F(WebSocketChannelEventInterfaceTest, BogusContinuation) { |
| EXPECT_CALL(*event_interface_, OnAddChannelResponse(_, _)); |
| EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| - EXPECT_CALL( |
| - *event_interface_, |
| - OnDataFrame( |
| - false, WebSocketFrameHeader::kOpCodeBinary, AsVector("frame1"))); |
| + EXPECT_CALL(*event_interface_, |
| + OnDataFrameVector(false, WebSocketFrameHeader::kOpCodeBinary, |
| + AsVector("frame1"))); |
| EXPECT_CALL( |
| *event_interface_, |
| OnFailChannel( |
| @@ -3297,7 +3307,7 @@ TEST_F(WebSocketChannelEventInterfaceTest, DataFramesNonEmptyOrFinal) { |
| EXPECT_CALL(*event_interface_, OnFlowControl(kDefaultInitialQuota)); |
| EXPECT_CALL( |
| *event_interface_, |
| - OnDataFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| + OnDataFrameVector(true, WebSocketFrameHeader::kOpCodeText, AsVector(""))); |
| CreateChannelAndConnectSuccessfully(); |
| } |
| @@ -3513,7 +3523,8 @@ TEST_F(WebSocketChannelTest, CurrentSendQuotaUpdated) { |
| channel_->SendFrame( |
| true, WebSocketFrameHeader::kOpCodeText, |
| - std::vector<char>(static_cast<size_t>(kMessageSize), 'a')); |
| + AsIOBuffer(std::string(static_cast<size_t>(kMessageSize), 'a')), |
| + static_cast<size_t>(kMessageSize)); |
| int new_send_quota = channel_->current_send_quota(); |
| EXPECT_EQ(kMessageSize, initial_send_quota - new_send_quota); |
| } |