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