| Index: net/websockets/websocket_channel_test.cc
|
| diff --git a/net/websockets/websocket_channel_test.cc b/net/websockets/websocket_channel_test.cc
|
| index 5999bbcdba71f6189a2ecb3b4ef17676e33d390b..10ea232eef54701c5db8b0bd5f34b4ff30ba7f82 100644
|
| --- a/net/websockets/websocket_channel_test.cc
|
| +++ b/net/websockets/websocket_channel_test.cc
|
| @@ -158,13 +158,22 @@ class MockWebSocketEventInterface : public WebSocketEventInterface {
|
| public:
|
| MockWebSocketEventInterface() {}
|
|
|
| + ChannelState OnDataFrame(bool fin,
|
| + WebSocketMessageType type,
|
| + scoped_refptr<IOBuffer> buffer,
|
| + size_t buffer_size) override {
|
| + const char* data = buffer ? buffer->data() : nullptr;
|
| + 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
|
| @@ -208,7 +217,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; }
|
| @@ -733,13 +743,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:
|
| @@ -882,7 +898,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);
|
| }
|
|
|
| @@ -1107,9 +1124,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());
|
| }
|
|
|
| @@ -1146,8 +1163,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());
|
| }
|
|
|
| @@ -1209,9 +1226,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());
|
| }
|
|
|
| @@ -1396,10 +1413,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();
|
| @@ -1465,10 +1481,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));
|
| }
|
|
|
| @@ -1494,14 +1509,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();
|
| @@ -1536,26 +1549,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();
|
| @@ -1574,7 +1586,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();
|
| }
|
|
|
| @@ -1683,14 +1695,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();
|
| @@ -1749,7 +1760,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
|
| @@ -1770,9 +1782,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);
|
| }
|
|
|
| @@ -1795,14 +1807,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);
|
| }
|
|
|
| @@ -1818,9 +1830,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.
|
| @@ -1840,7 +1852,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);
|
| }
|
|
|
| @@ -1886,7 +1899,8 @@ TEST_F(WebSocketChannelEventInterfaceTest, OnDropChannelCalledOnce) {
|
|
|
| CreateChannelAndConnectSuccessfully();
|
|
|
| - channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText, AsVector("yt?"));
|
| + channel_->SendFrame(true, WebSocketFrameHeader::kOpCodeText,
|
| + AsIOBuffer("yt?"), 3U);
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -2335,17 +2349,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);
|
| @@ -2368,19 +2382,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);
|
| @@ -2414,25 +2428,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));
|
| @@ -2457,21 +2470,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);
|
| @@ -2499,23 +2509,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));
|
|
|
| @@ -2543,8 +2555,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
|
| @@ -2561,8 +2573,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
|
| @@ -2803,12 +2815,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.
|
| @@ -2837,10 +2849,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);
|
| @@ -2873,9 +2885,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);
|
| }
|
| @@ -2894,9 +2905,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
|
| @@ -2913,9 +2924,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();
|
| @@ -2942,11 +2953,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();
|
| }
|
| @@ -2959,8 +2970,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.
|
| @@ -2971,8 +2982,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
|
| @@ -2980,19 +2991,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.
|
| @@ -3003,11 +3013,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.
|
| @@ -3018,12 +3027,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
|
| @@ -3031,12 +3040,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
|
| @@ -3044,8 +3053,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.
|
| @@ -3081,8 +3092,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
|
| @@ -3251,10 +3262,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(
|
| @@ -3298,7 +3308,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();
|
| }
|
| @@ -3514,7 +3524,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);
|
| }
|
|
|