1c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// found in the LICENSE file. 4c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 5c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "config.h" 6c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "modules/websockets/WebSocketChannel.h" 7c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/dom/Document.h" 9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/fileapi/Blob.h" 10c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/frame/ConsoleTypes.h" 11c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/testing/DummyPageHolder.h" 12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "modules/websockets/NewWebSocketChannelImpl.h" 13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "modules/websockets/WebSocketChannelClient.h" 14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/heap/Handle.h" 15c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/weborigin/KURL.h" 16c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebSerializedOrigin.h" 17c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebSocketHandle.h" 18c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebSocketHandleClient.h" 19c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebString.h" 20c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebURL.h" 21c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebVector.h" 22c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/ArrayBuffer.h" 23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/OwnPtr.h" 24c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/Vector.h" 25c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/text/WTFString.h" 26c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include <gmock/gmock.h> 28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include <gtest/gtest.h> 29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using testing::_; 31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using testing::InSequence; 32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using testing::PrintToString; 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using testing::AnyNumber; 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace { 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)typedef testing::StrictMock< testing::MockFunction<void(int)> > Checkpoint; 41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class MockWebSocketChannelClient : public GarbageCollectedFinalized<MockWebSocketChannelClient>, public WebSocketChannelClient { 43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) USING_GARBAGE_COLLECTED_MIXIN(MockWebSocketChannelClient); 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) static MockWebSocketChannelClient* create() 46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return new testing::StrictMock<MockWebSocketChannelClient>(); 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MockWebSocketChannelClient() { } 51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual ~MockWebSocketChannelClient() { } 53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD2(didConnect, void(const String&, const String&)); 55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD1(didReceiveMessage, void(const String&)); 56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual void didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData) OVERRIDE 57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) didReceiveBinaryDataMock(*binaryData); 59c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD1(didReceiveBinaryDataMock, void(const Vector<char>&)); 61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD0(didReceiveMessageError, void()); 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD1(didConsumeBufferedAmount, void(unsigned long)); 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD0(didStartClosingHandshake, void()); 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD3(didClose, void(ClosingHandshakeCompletionStatus, unsigned short, const String&)); 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual void trace(Visitor* visitor) OVERRIDE 67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) WebSocketChannelClient::trace(visitor); 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 72c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 73e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class MockWebSocketHandle : public WebSocketHandle { 74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) static MockWebSocketHandle* create() 76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return new testing::StrictMock<MockWebSocketHandle>(); 78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MockWebSocketHandle() { } 81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual ~MockWebSocketHandle() { } 83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 84e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) MOCK_METHOD4(connect, void(const WebURL&, const WebVector<WebString>&, const WebSerializedOrigin&, WebSocketHandleClient*)); 85e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) MOCK_METHOD4(send, void(bool, WebSocketHandle::MessageType, const char*, size_t)); 86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD1(flowControl, void(int64_t)); 87e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) MOCK_METHOD2(close, void(unsigned short, const WebString&)); 88c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 89c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 90c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class NewWebSocketChannelImplTest : public ::testing::Test { 91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) NewWebSocketChannelImplTest() 93c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) : m_pageHolder(DummyPageHolder::create()) 94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_channelClient(MockWebSocketChannelClient::create()) 95c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_handle(MockWebSocketHandle::create()) 96c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_channel(NewWebSocketChannelImpl::create(&m_pageHolder->document(), m_channelClient.get(), String(), 0, handle())) 97c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_sumOfConsumedBufferedAmount(0) 98c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ON_CALL(*channelClient(), didConsumeBufferedAmount(_)).WillByDefault(Invoke(this, &NewWebSocketChannelImplTest::didConsumeBufferedAmount)); 100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ~NewWebSocketChannelImplTest() 103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->disconnect(); 105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_channelClient.clear(); 106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_channel.clear(); 107c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Heap::collectAllGarbage(); 108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MockWebSocketChannelClient* channelClient() 111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return m_channelClient.get(); 113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) WebSocketChannel* channel() 116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return static_cast<WebSocketChannel*>(m_channel.get()); 118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 120e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebSocketHandleClient* handleClient() 121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 122e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return static_cast<WebSocketHandleClient*>(m_channel.get()); 123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 125c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MockWebSocketHandle* handle() 126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return m_handle; 128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) void didConsumeBufferedAmount(unsigned long a) 131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_sumOfConsumedBufferedAmount += a; 133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 135c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) void connect() 136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 139e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), connect(WebURL(KURL(KURL(), "ws://localhost/")), _, _, handleClient())); 140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*handle(), flowControl(65536)); 141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConnect(String("a"), String("b"))); 142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(channel()->connect(KURL(KURL(), "ws://localhost/"), "x")); 144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didConnect(handle(), false, WebString("a"), WebString("b")); 145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ::testing::Mock::VerifyAndClearExpectations(this); 146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) OwnPtr<DummyPageHolder> m_pageHolder; 149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Persistent<MockWebSocketChannelClient> m_channelClient; 150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MockWebSocketHandle* m_handle; 151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Persistent<NewWebSocketChannelImpl> m_channel; 152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) unsigned long m_sumOfConsumedBufferedAmount; 153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)MATCHER_P2(MemEq, p, len, 156c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) std::string("pointing to memory") 157c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) + (negation ? " not" : "") 158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) + " equal to \"" 159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) + std::string(p, len) + "\" (length=" + PrintToString(len) + ")" 160c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)) 161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return memcmp(arg, p, len) == 0; 163c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, connectSuccess) 166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 170e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), connect(WebURL(KURL(KURL(), "ws://localhost/")), _, _, handleClient())); 171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*handle(), flowControl(65536)); 172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConnect(String("a"), String("b"))); 174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(channel()->connect(KURL(KURL(), "ws://localhost/"), "x")); 177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 178e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didConnect(handle(), false, WebString("a"), WebString("b")); 179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 180c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 181c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendText) 182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 183c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 186e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("foo", 3), 3)); 187e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("bar", 3), 3)); 188e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("baz", 3), 3)); 189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 194c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send("foo"); 195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send("bar"); 196c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send("baz"); 197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(9ul, m_sumOfConsumedBufferedAmount); 199c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendTextContinuation) 202c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 204c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 206c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 207e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeText, MemEq("0123456789abcdef", 16), 16)); 208c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 209e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("g", 1), 1)); 210e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("hijk", 4), 4)); 211e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeText, MemEq("lmnopqrstuv", 11), 11)); 212c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(2)); 213e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeContinuation, MemEq("wxyzABCDEFGHIJKL", 16), 16)); 214c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(3)); 215e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("MNOPQRSTUVWXYZ", 14), 14)); 216c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 217c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 218c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 220c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 221c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send("0123456789abcdefg"); 222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send("hijk"); 223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send("lmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); 224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 225c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 226c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(2); 227c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 228c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(3); 229c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 230c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 231c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(62ul, m_sumOfConsumedBufferedAmount); 232c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 233c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendTextNonLatin1) 235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 236c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 238c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 239e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("\xe7\x8b\x90\xe0\xa4\x94", 6), 6)); 240c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 241c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 242c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 243c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 244c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) UChar nonLatin1String[] = { 246c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x72d0, 247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0914, 248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0000 249c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) }; 250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(nonLatin1String); 251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 252c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(6ul, m_sumOfConsumedBufferedAmount); 253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 254c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendTextNonLatin1Continuation) 256c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 257c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 258c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 259c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 260c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 261e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeText, MemEq("\xe7\x8b\x90\xe0\xa4\x94\xe7\x8b\x90\xe0\xa4\x94\xe7\x8b\x90\xe0", 16), 16)); 262c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 263e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("\xa4\x94", 2), 2)); 264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 265c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 266c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 267c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 268c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 269c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) UChar nonLatin1String[] = { 270c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x72d0, 271c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0914, 272c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x72d0, 273c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0914, 274c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x72d0, 275c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0914, 276c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0000 277c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) }; 278c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(nonLatin1String); 279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 281c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount); 283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 284c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInVector) 286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 288c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 290e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("foo", 3), 3)); 291c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 293c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 294c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> fooVector; 297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fooVector.append("foo", 3); 298c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(fooVector))); 299c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 301c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorWithNullBytes) 304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 306c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 308e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0ar", 3), 3)); 309e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("b\0z", 3), 3)); 310e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("qu\0", 3), 3)); 311e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0\0\0", 3), 3)); 312c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 313c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 314c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 315c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 316c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 317c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 318c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 319c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\0ar", 3); 320c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 321c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 323c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 324c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("b\0z", 3); 325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 326c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 327c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 328c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 329c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("qu\0", 3); 330c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 331c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 332c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 333c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 334c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\0\0\0", 3); 335c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 336c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 337c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 338c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(12ul, m_sumOfConsumedBufferedAmount); 339c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 340c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 341c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorNonLatin1UTF8) 342c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 343c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 344e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\xe7\x8b\x90", 3), 3)); 345c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 346c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 347c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 348c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 349c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 350c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\xe7\x8b\x90", 3); 351c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 352c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 353c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 354c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 355c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorNonUTF8) 357c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 358c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 359e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\x80\xff\xe7", 3), 3)); 360c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 361c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 362c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 363c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 364c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 365c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\x80\xff\xe7", 3); 366c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 367c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 368c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 369c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 370c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 371c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorNonLatin1UTF8Continuation) 372c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 373c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 374c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 375c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 376c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 377e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeBinary, MemEq("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7", 16), 16)); 378c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 379e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("\x8b\x90", 2), 2)); 380c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 381c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 382c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 383c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 384c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 385c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 386c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90", 18); 387c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(adoptPtr(new Vector<char>(v))); 388c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 389c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 390c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 391c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 392c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount); 393c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 394c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 395c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBuffer) 396c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 397c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 398c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 399c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 400e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("foo", 3), 3)); 401c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 403c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 404c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 405c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 406c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> fooBuffer = ArrayBuffer::create("foo", 3); 407c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*fooBuffer, 0, 3); 408c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 409c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 410c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 411c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 412c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferPartial) 413c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 414c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 415c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 416c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 417e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("foo", 3), 3)); 418e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("bar", 3), 3)); 419e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("baz", 3), 3)); 420e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("a", 1), 1)); 421c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 422c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 423c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 424c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 425c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 426c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> foobarBuffer = ArrayBuffer::create("foobar", 6); 427c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> qbazuxBuffer = ArrayBuffer::create("qbazux", 6); 428c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*foobarBuffer, 0, 3); 429c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*foobarBuffer, 3, 3); 430c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*qbazuxBuffer, 1, 3); 431c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*qbazuxBuffer, 2, 1); 432c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 433c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(10ul, m_sumOfConsumedBufferedAmount); 434c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 435c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 436c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferWithNullBytes) 437c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 438c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 439c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 440c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 441e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0ar", 3), 3)); 442e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("b\0z", 3), 3)); 443e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("qu\0", 3), 3)); 444e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0\0\0", 3), 3)); 445c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 446c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 447c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 448c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 449c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 450c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 451c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("\0ar", 3); 452c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 3); 453c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 454c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 455c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("b\0z", 3); 456c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 3); 457c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 458c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 459c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("qu\0", 3); 460c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 3); 461c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 462c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 463c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("\0\0\0", 3); 464c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 3); 465c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 466c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 467c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(12ul, m_sumOfConsumedBufferedAmount); 468c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 469c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 470c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferNonLatin1UTF8) 471c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 472c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 473e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\xe7\x8b\x90", 3), 3)); 474c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 475c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 476c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 477c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 478c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("\xe7\x8b\x90", 3); 479c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 3); 480c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 481c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 482c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 483c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 484c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferNonUTF8) 485c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 486c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 487e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\x80\xff\xe7", 3), 3)); 488c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 489c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 490c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 491c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 492c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("\x80\xff\xe7", 3); 493c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 3); 494c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 495c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 496c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 497c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 498c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferNonLatin1UTF8Continuation) 499c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 500c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 501c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 502c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 503c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 504e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeBinary, MemEq("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7", 16), 16)); 505c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 506e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("\x8b\x90", 2), 2)); 507c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 508c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 509c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 510c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber()); 511c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 512c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<ArrayBuffer> b = ArrayBuffer::create("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90", 18); 513c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->send(*b, 0, 18); 514c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 515c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 516c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didReceiveFlowControl(handle(), 16); 517c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 518c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount); 519c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 520c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 521c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// FIXME: Add tests for WebSocketChannel::send(PassRefPtr<BlobDataHandle>) 522c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 523c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveText) 524c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 525c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 526c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 527c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 528c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessage(String("FOO"))); 529c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessage(String("BAR"))); 530c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 531c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 532e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeText, "FOOX", 3); 533e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeText, "BARX", 3); 534c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 536c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveTextContinuation) 537c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 538c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 539c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessage(String("BAZ"))); 540c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 541e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeText, "BX", 1); 542e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "AX", 1); 543e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "ZX", 1); 544c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 545c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 546c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveTextNonLatin1) 547c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 548c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 549c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) UChar nonLatin1String[] = { 550c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x72d0, 551c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0914, 552c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0000 553c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) }; 554c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessage(String(nonLatin1String))); 555c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 556e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeText, "\xe7\x8b\x90\xe0\xa4\x94", 6); 557c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 558c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 559c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveTextNonLatin1Continuation) 560c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 561c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 562c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) UChar nonLatin1String[] = { 563c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x72d0, 564c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0914, 565c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 0x0000 566c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) }; 567c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessage(String(nonLatin1String))); 568c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 569e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeText, "\xe7\x8b", 2); 570e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\x90\xe0", 2); 571e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\xa4", 1); 572e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "\x94", 1); 573c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 574c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 575c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveBinary) 576c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 577c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 578c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> fooVector; 579c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fooVector.append("FOO", 3); 580c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(fooVector)); 581c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 582e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "FOOx", 3); 583c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 584c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 585c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveBinaryContinuation) 586c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 587c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 588c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> bazVector; 589c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bazVector.append("BAZ", 3); 590c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(bazVector)); 591c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 592e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeBinary, "Bx", 1); 593e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "Ax", 1); 594e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "Zx", 1); 595c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 596c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 597c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveBinaryWithNullBytes) 598c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 599c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 600c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 601c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 602c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 603c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 604c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\0AR", 3); 605c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 606c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 607c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 608c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 609c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("B\0Z", 3); 610c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 611c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 612c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 613c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 614c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("QU\0", 3); 615c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 616c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 617c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 618c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 619c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\0\0\0", 3); 620c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 621c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 622c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 623c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 624e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\0AR", 3); 625e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "B\0Z", 3); 626e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "QU\0", 3); 627e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\0\0\0", 3); 628c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 629c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 630c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveBinaryNonLatin1UTF8) 631c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 632c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 633c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 634c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\xe7\x8b\x90\xe0\xa4\x94", 6); 635c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 636c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 637e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\xe7\x8b\x90\xe0\xa4\x94", 6); 638c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 639c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 640c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveBinaryNonLatin1UTF8Continuation) 641c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 642c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 643c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 644c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\xe7\x8b\x90\xe0\xa4\x94", 6); 645c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 646c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 647e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeBinary, "\xe7\x8b", 2); 648e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\x90\xe0", 2); 649e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\xa4", 1); 650e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "\x94", 1); 651c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 652c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 653c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, receiveBinaryNonUTF8) 654c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 655c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 656c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Vector<char> v; 657c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v.append("\x80\xff", 2); 658c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v)); 659c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 660e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\x80\xff", 2); 661c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 662c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 663c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, closeFromBrowser) 664c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 665c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 666c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 667c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 668c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 669c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 670c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didStartClosingHandshake()); 671c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 672c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 673e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, WebString("close reason"))); 674c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(2)); 675c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 676c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeComplete, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason"))); 677c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(3)); 678c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 679c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 680c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didStartClosingHandshake(handle()); 681c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 682c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 683c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->close(WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")); 684c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(2); 685c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 686c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didClose(handle(), true, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")); 687c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(3); 688c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 689c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->disconnect(); 690c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 691c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 692c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, closeFromWebSocket) 693c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 694c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 695c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 696c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 697c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 698c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 699e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, WebString("close reason"))); 700c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 701c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 702c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeComplete, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason"))); 703c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(2)); 704c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 705c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 706c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->close(WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")); 707c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 708c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 709c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didClose(handle(), true, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")); 710c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(2); 711c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 712c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->disconnect(); 713c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 714c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 715c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, failFromBrowser) 716c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 717c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 718c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 719c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 720c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 721c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessageError()); 722c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String())); 723c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 724c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 725c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) handleClient()->didFail(handle(), "fail message"); 726c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 727c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 728c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(NewWebSocketChannelImplTest, failFromWebSocket) 729c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 730c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) connect(); 731c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 732c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 733c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 734c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didReceiveMessageError()); 735c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String())); 736c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 737c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 738c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) channel()->fail("fail message from WebSocket", ErrorMessageLevel, "sourceURL", 1234); 739c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 740c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 741c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace 742c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 743c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 744