| Index: third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
|
| diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
|
| index f94491934e013e1218731b6381a380f1f652722f..cfb4b5502d6ac236b3ee7c3781c89895bc92f3ad 100644
|
| --- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
|
| +++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
|
| @@ -82,6 +82,7 @@ public:
|
|
|
| MOCK_METHOD4(connect, void(const WebURL&, const WebVector<WebString>&, const WebSecurityOrigin&, WebSocketHandleClient*));
|
| MOCK_METHOD4(send, void(bool, WebSocketHandle::MessageType, const char*, size_t));
|
| + MOCK_METHOD2(sendBlob, void(const blink::WebString&, uint64_t));
|
| MOCK_METHOD1(flowControl, void(int64_t));
|
| MOCK_METHOD2(close, void(unsigned short, const WebString&));
|
| };
|
| @@ -148,6 +149,13 @@ public:
|
| unsigned long m_sumOfConsumedBufferedAmount;
|
| };
|
|
|
| +// The WebSocket protocol and API ignores the type of the Blob, so put a
|
| +// default value in that field.
|
| +PassRefPtr<BlobDataHandle> createBlob(const String& uuid, long long size)
|
| +{
|
| + return BlobDataHandle::create(uuid, "unknown/unknown", size);
|
| +}
|
| +
|
| MATCHER_P2(MemEq, p, len,
|
| std::string("pointing to memory")
|
| + (negation ? " not" : "")
|
| @@ -463,7 +471,110 @@ TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonLatin1UTF8Continu
|
| EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount);
|
| }
|
|
|
| -// FIXME: Add tests for WebSocketChannel::send(PassRefPtr<BlobDataHandle>)
|
| +TEST_F(DocumentWebSocketChannelTest, sendSingleBlob)
|
| +{
|
| + connect();
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid"), 10));
|
| + handleClient()->didReceiveFlowControl(handle(), 16);
|
| + channel()->send(createBlob("uuid", 10));
|
| +}
|
| +
|
| +TEST_F(DocumentWebSocketChannelTest, sendTwoBlobs)
|
| +{
|
| + connect();
|
| + Checkpoint checkpoint;
|
| + {
|
| + InSequence s;
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid1"), 11));
|
| + EXPECT_CALL(checkpoint, Call(1));
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid2"), 12));
|
| + }
|
| + EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_))
|
| + .Times(AnyNumber());
|
| + handleClient()->didReceiveFlowControl(handle(), 32);
|
| + channel()->send(createBlob("uuid1", 11));
|
| + channel()->send(createBlob("uuid2", 12));
|
| + checkpoint.Call(1);
|
| + handleClient()->didCompleteSendingBlob(handle());
|
| +}
|
| +
|
| +TEST_F(DocumentWebSocketChannelTest, flowControlReflectedInBufferedAmount)
|
| +{
|
| + connect();
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid"), 256));
|
| + EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_))
|
| + .Times(AnyNumber());
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| + channel()->send(createBlob("uuid", 256));
|
| + EXPECT_EQ(0u, m_sumOfConsumedBufferedAmount);
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| + EXPECT_EQ(128u, m_sumOfConsumedBufferedAmount);
|
| + handleClient()->didCompleteSendingBlob(handle());
|
| + EXPECT_EQ(256u, m_sumOfConsumedBufferedAmount);
|
| +}
|
| +
|
| +// Verifies that Blobs respect queue ordering.
|
| +TEST_F(DocumentWebSocketChannelTest, sendTextThenBlob)
|
| +{
|
| + connect();
|
| + Checkpoint checkpoint;
|
| + {
|
| + InSequence s;
|
| + EXPECT_CALL(checkpoint, Call(1));
|
| + EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("foo", 3), 3));
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid"), 16));
|
| + }
|
| + EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_))
|
| + .Times(AnyNumber());
|
| + channel()->send("foo");
|
| + channel()->send(createBlob("uuid", 16));
|
| + checkpoint.Call(1);
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| +}
|
| +
|
| +// Verifies that "Blob sending mode" is exited correctly.
|
| +TEST_F(DocumentWebSocketChannelTest, sendBlobThenText)
|
| +{
|
| + connect();
|
| + Checkpoint checkpoint;
|
| + {
|
| + InSequence s;
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid"), 16));
|
| + EXPECT_CALL(checkpoint, Call(1));
|
| + EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("foo", 3), 3));
|
| + }
|
| + EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_))
|
| + .Times(AnyNumber());
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| + channel()->send(createBlob("uuid", 16));
|
| + channel()->send("foo");
|
| + checkpoint.Call(1);
|
| + // Exits "Blob sending mode" and allows text message "foo" to be sent.
|
| + handleClient()->didCompleteSendingBlob(handle());
|
| +}
|
| +
|
| +// Verifies that other messages are queued during "Blob sending mode", and that
|
| +// flow control messages do not cause them to be sent prematurely.
|
| +TEST_F(DocumentWebSocketChannelTest, sendLargeBlobThenText)
|
| +{
|
| + connect();
|
| + Checkpoint checkpoint;
|
| + {
|
| + InSequence s;
|
| + EXPECT_CALL(*handle(), sendBlob(WebString("uuid"), 256));
|
| + EXPECT_CALL(checkpoint, Call(1));
|
| + EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("foo", 3), 3));
|
| + }
|
| + EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_))
|
| + .Times(AnyNumber());
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| + channel()->send(createBlob("uuid", 256));
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| + handleClient()->didReceiveFlowControl(handle(), 128);
|
| + channel()->send("foo");
|
| + checkpoint.Call(1);
|
| + handleClient()->didCompleteSendingBlob(handle());
|
| +}
|
|
|
| TEST_F(DocumentWebSocketChannelTest, receiveText)
|
| {
|
|
|