1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "modules/websockets/WebSocketChannel.h"
8 #include "core/dom/Document.h"
9 #include "core/fileapi/Blob.h"
10 #include "core/frame/ConsoleTypes.h"
11 #include "core/testing/DummyPageHolder.h"
12 #include "modules/websockets/NewWebSocketChannelImpl.h"
13 #include "modules/websockets/WebSocketChannelClient.h"
14 #include "platform/heap/Handle.h"
15 #include "platform/weborigin/KURL.h"
16 #include "public/platform/WebSerializedOrigin.h"
17 #include "public/platform/WebSocketHandle.h"
18 #include "public/platform/WebSocketHandleClient.h"
19 #include "public/platform/WebString.h"
20 #include "public/platform/WebURL.h"
21 #include "public/platform/WebVector.h"
22 #include "wtf/ArrayBuffer.h"
23 #include "wtf/OwnPtr.h"
24 #include "wtf/Vector.h"
25 #include "wtf/text/WTFString.h"
27 #include <gmock/gmock.h>
28 #include <gtest/gtest.h>
31 using testing::InSequence;
32 using testing::PrintToString;
33 using testing::AnyNumber;
40 typedef testing::StrictMock< testing::MockFunction<void(int)> > Checkpoint;
42 class MockWebSocketChannelClient : public GarbageCollectedFinalized<MockWebSocketChannelClient>, public WebSocketChannelClient {
43 USING_GARBAGE_COLLECTED_MIXIN(MockWebSocketChannelClient);
45 static MockWebSocketChannelClient* create()
47 return new testing::StrictMock<MockWebSocketChannelClient>();
50 MockWebSocketChannelClient() { }
52 virtual ~MockWebSocketChannelClient() { }
54 MOCK_METHOD2(didConnect, void(const String&, const String&));
55 MOCK_METHOD1(didReceiveMessage, void(const String&));
56 virtual void didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData) OVERRIDE
58 didReceiveBinaryDataMock(*binaryData);
60 MOCK_METHOD1(didReceiveBinaryDataMock, void(const Vector<char>&));
61 MOCK_METHOD0(didReceiveMessageError, void());
62 MOCK_METHOD1(didConsumeBufferedAmount, void(unsigned long));
63 MOCK_METHOD0(didStartClosingHandshake, void());
64 MOCK_METHOD3(didClose, void(ClosingHandshakeCompletionStatus, unsigned short, const String&));
66 virtual void trace(Visitor* visitor) OVERRIDE
68 WebSocketChannelClient::trace(visitor);
73 class MockWebSocketHandle : public WebSocketHandle {
75 static MockWebSocketHandle* create()
77 return new testing::StrictMock<MockWebSocketHandle>();
80 MockWebSocketHandle() { }
82 virtual ~MockWebSocketHandle() { }
84 MOCK_METHOD4(connect, void(const WebURL&, const WebVector<WebString>&, const WebSerializedOrigin&, WebSocketHandleClient*));
85 MOCK_METHOD4(send, void(bool, WebSocketHandle::MessageType, const char*, size_t));
86 MOCK_METHOD1(flowControl, void(int64_t));
87 MOCK_METHOD2(close, void(unsigned short, const WebString&));
90 class NewWebSocketChannelImplTest : public ::testing::Test {
92 NewWebSocketChannelImplTest()
93 : m_pageHolder(DummyPageHolder::create())
94 , m_channelClient(MockWebSocketChannelClient::create())
95 , m_handle(MockWebSocketHandle::create())
96 , m_channel(NewWebSocketChannelImpl::create(&m_pageHolder->document(), m_channelClient.get(), String(), 0, handle()))
97 , m_sumOfConsumedBufferedAmount(0)
99 ON_CALL(*channelClient(), didConsumeBufferedAmount(_)).WillByDefault(Invoke(this, &NewWebSocketChannelImplTest::didConsumeBufferedAmount));
102 ~NewWebSocketChannelImplTest()
104 channel()->disconnect();
105 m_channelClient.clear();
107 Heap::collectAllGarbage();
110 MockWebSocketChannelClient* channelClient()
112 return m_channelClient.get();
115 WebSocketChannel* channel()
117 return static_cast<WebSocketChannel*>(m_channel.get());
120 WebSocketHandleClient* handleClient()
122 return static_cast<WebSocketHandleClient*>(m_channel.get());
125 MockWebSocketHandle* handle()
130 void didConsumeBufferedAmount(unsigned long a)
132 m_sumOfConsumedBufferedAmount += a;
139 EXPECT_CALL(*handle(), connect(WebURL(KURL(KURL(), "ws://localhost/")), _, _, handleClient()));
140 EXPECT_CALL(*handle(), flowControl(65536));
141 EXPECT_CALL(*channelClient(), didConnect(String("a"), String("b")));
143 EXPECT_TRUE(channel()->connect(KURL(KURL(), "ws://localhost/"), "x"));
144 handleClient()->didConnect(handle(), false, WebString("a"), WebString("b"));
145 ::testing::Mock::VerifyAndClearExpectations(this);
148 OwnPtr<DummyPageHolder> m_pageHolder;
149 Persistent<MockWebSocketChannelClient> m_channelClient;
150 MockWebSocketHandle* m_handle;
151 Persistent<NewWebSocketChannelImpl> m_channel;
152 unsigned long m_sumOfConsumedBufferedAmount;
155 MATCHER_P2(MemEq, p, len,
156 std::string("pointing to memory")
157 + (negation ? " not" : "")
159 + std::string(p, len) + "\" (length=" + PrintToString(len) + ")"
162 return memcmp(arg, p, len) == 0;
165 TEST_F(NewWebSocketChannelImplTest, connectSuccess)
167 Checkpoint checkpoint;
170 EXPECT_CALL(*handle(), connect(WebURL(KURL(KURL(), "ws://localhost/")), _, _, handleClient()));
171 EXPECT_CALL(*handle(), flowControl(65536));
172 EXPECT_CALL(checkpoint, Call(1));
173 EXPECT_CALL(*channelClient(), didConnect(String("a"), String("b")));
176 EXPECT_TRUE(channel()->connect(KURL(KURL(), "ws://localhost/"), "x"));
178 handleClient()->didConnect(handle(), false, WebString("a"), WebString("b"));
181 TEST_F(NewWebSocketChannelImplTest, sendText)
186 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("foo", 3), 3));
187 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("bar", 3), 3));
188 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("baz", 3), 3));
191 handleClient()->didReceiveFlowControl(handle(), 16);
192 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
194 channel()->send("foo");
195 channel()->send("bar");
196 channel()->send("baz");
198 EXPECT_EQ(9ul, m_sumOfConsumedBufferedAmount);
201 TEST_F(NewWebSocketChannelImplTest, sendTextContinuation)
204 Checkpoint checkpoint;
207 EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeText, MemEq("0123456789abcdef", 16), 16));
208 EXPECT_CALL(checkpoint, Call(1));
209 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("g", 1), 1));
210 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("hijk", 4), 4));
211 EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeText, MemEq("lmnopqrstuv", 11), 11));
212 EXPECT_CALL(checkpoint, Call(2));
213 EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeContinuation, MemEq("wxyzABCDEFGHIJKL", 16), 16));
214 EXPECT_CALL(checkpoint, Call(3));
215 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("MNOPQRSTUVWXYZ", 14), 14));
218 handleClient()->didReceiveFlowControl(handle(), 16);
219 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
221 channel()->send("0123456789abcdefg");
222 channel()->send("hijk");
223 channel()->send("lmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
225 handleClient()->didReceiveFlowControl(handle(), 16);
227 handleClient()->didReceiveFlowControl(handle(), 16);
229 handleClient()->didReceiveFlowControl(handle(), 16);
231 EXPECT_EQ(62ul, m_sumOfConsumedBufferedAmount);
234 TEST_F(NewWebSocketChannelImplTest, sendTextNonLatin1)
239 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeText, MemEq("\xe7\x8b\x90\xe0\xa4\x94", 6), 6));
242 handleClient()->didReceiveFlowControl(handle(), 16);
243 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
245 UChar nonLatin1String[] = {
250 channel()->send(nonLatin1String);
252 EXPECT_EQ(6ul, m_sumOfConsumedBufferedAmount);
255 TEST_F(NewWebSocketChannelImplTest, sendTextNonLatin1Continuation)
258 Checkpoint checkpoint;
261 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));
262 EXPECT_CALL(checkpoint, Call(1));
263 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("\xa4\x94", 2), 2));
266 handleClient()->didReceiveFlowControl(handle(), 16);
267 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
269 UChar nonLatin1String[] = {
278 channel()->send(nonLatin1String);
280 handleClient()->didReceiveFlowControl(handle(), 16);
282 EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount);
285 TEST_F(NewWebSocketChannelImplTest, sendBinaryInVector)
290 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("foo", 3), 3));
293 handleClient()->didReceiveFlowControl(handle(), 16);
294 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
296 Vector<char> fooVector;
297 fooVector.append("foo", 3);
298 channel()->send(adoptPtr(new Vector<char>(fooVector)));
300 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
303 TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorWithNullBytes)
308 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0ar", 3), 3));
309 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("b\0z", 3), 3));
310 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("qu\0", 3), 3));
311 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0\0\0", 3), 3));
314 handleClient()->didReceiveFlowControl(handle(), 16);
315 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
320 channel()->send(adoptPtr(new Vector<char>(v)));
325 channel()->send(adoptPtr(new Vector<char>(v)));
330 channel()->send(adoptPtr(new Vector<char>(v)));
334 v.append("\0\0\0", 3);
335 channel()->send(adoptPtr(new Vector<char>(v)));
338 EXPECT_EQ(12ul, m_sumOfConsumedBufferedAmount);
341 TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorNonLatin1UTF8)
344 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\xe7\x8b\x90", 3), 3));
346 handleClient()->didReceiveFlowControl(handle(), 16);
347 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
350 v.append("\xe7\x8b\x90", 3);
351 channel()->send(adoptPtr(new Vector<char>(v)));
353 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
356 TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorNonUTF8)
359 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\x80\xff\xe7", 3), 3));
361 handleClient()->didReceiveFlowControl(handle(), 16);
362 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
365 v.append("\x80\xff\xe7", 3);
366 channel()->send(adoptPtr(new Vector<char>(v)));
368 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
371 TEST_F(NewWebSocketChannelImplTest, sendBinaryInVectorNonLatin1UTF8Continuation)
374 Checkpoint checkpoint;
377 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));
378 EXPECT_CALL(checkpoint, Call(1));
379 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("\x8b\x90", 2), 2));
382 handleClient()->didReceiveFlowControl(handle(), 16);
383 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
386 v.append("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90", 18);
387 channel()->send(adoptPtr(new Vector<char>(v)));
390 handleClient()->didReceiveFlowControl(handle(), 16);
392 EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount);
395 TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBuffer)
400 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("foo", 3), 3));
403 handleClient()->didReceiveFlowControl(handle(), 16);
404 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
406 RefPtr<ArrayBuffer> fooBuffer = ArrayBuffer::create("foo", 3);
407 channel()->send(*fooBuffer, 0, 3);
409 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
412 TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferPartial)
417 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("foo", 3), 3));
418 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("bar", 3), 3));
419 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("baz", 3), 3));
420 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("a", 1), 1));
423 handleClient()->didReceiveFlowControl(handle(), 16);
424 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
426 RefPtr<ArrayBuffer> foobarBuffer = ArrayBuffer::create("foobar", 6);
427 RefPtr<ArrayBuffer> qbazuxBuffer = ArrayBuffer::create("qbazux", 6);
428 channel()->send(*foobarBuffer, 0, 3);
429 channel()->send(*foobarBuffer, 3, 3);
430 channel()->send(*qbazuxBuffer, 1, 3);
431 channel()->send(*qbazuxBuffer, 2, 1);
433 EXPECT_EQ(10ul, m_sumOfConsumedBufferedAmount);
436 TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferWithNullBytes)
441 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0ar", 3), 3));
442 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("b\0z", 3), 3));
443 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("qu\0", 3), 3));
444 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\0\0\0", 3), 3));
447 handleClient()->didReceiveFlowControl(handle(), 16);
448 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
451 RefPtr<ArrayBuffer> b = ArrayBuffer::create("\0ar", 3);
452 channel()->send(*b, 0, 3);
455 RefPtr<ArrayBuffer> b = ArrayBuffer::create("b\0z", 3);
456 channel()->send(*b, 0, 3);
459 RefPtr<ArrayBuffer> b = ArrayBuffer::create("qu\0", 3);
460 channel()->send(*b, 0, 3);
463 RefPtr<ArrayBuffer> b = ArrayBuffer::create("\0\0\0", 3);
464 channel()->send(*b, 0, 3);
467 EXPECT_EQ(12ul, m_sumOfConsumedBufferedAmount);
470 TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferNonLatin1UTF8)
473 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\xe7\x8b\x90", 3), 3));
475 handleClient()->didReceiveFlowControl(handle(), 16);
476 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
478 RefPtr<ArrayBuffer> b = ArrayBuffer::create("\xe7\x8b\x90", 3);
479 channel()->send(*b, 0, 3);
481 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
484 TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferNonUTF8)
487 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq("\x80\xff\xe7", 3), 3));
489 handleClient()->didReceiveFlowControl(handle(), 16);
490 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
492 RefPtr<ArrayBuffer> b = ArrayBuffer::create("\x80\xff\xe7", 3);
493 channel()->send(*b, 0, 3);
495 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
498 TEST_F(NewWebSocketChannelImplTest, sendBinaryInArrayBufferNonLatin1UTF8Continuation)
501 Checkpoint checkpoint;
504 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));
505 EXPECT_CALL(checkpoint, Call(1));
506 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuation, MemEq("\x8b\x90", 2), 2));
509 handleClient()->didReceiveFlowControl(handle(), 16);
510 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber());
512 RefPtr<ArrayBuffer> b = ArrayBuffer::create("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90", 18);
513 channel()->send(*b, 0, 18);
516 handleClient()->didReceiveFlowControl(handle(), 16);
518 EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount);
521 // FIXME: Add tests for WebSocketChannel::send(PassRefPtr<BlobDataHandle>)
523 TEST_F(NewWebSocketChannelImplTest, receiveText)
528 EXPECT_CALL(*channelClient(), didReceiveMessage(String("FOO")));
529 EXPECT_CALL(*channelClient(), didReceiveMessage(String("BAR")));
532 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeText, "FOOX", 3);
533 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeText, "BARX", 3);
536 TEST_F(NewWebSocketChannelImplTest, receiveTextContinuation)
539 EXPECT_CALL(*channelClient(), didReceiveMessage(String("BAZ")));
541 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeText, "BX", 1);
542 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "AX", 1);
543 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "ZX", 1);
546 TEST_F(NewWebSocketChannelImplTest, receiveTextNonLatin1)
549 UChar nonLatin1String[] = {
554 EXPECT_CALL(*channelClient(), didReceiveMessage(String(nonLatin1String)));
556 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeText, "\xe7\x8b\x90\xe0\xa4\x94", 6);
559 TEST_F(NewWebSocketChannelImplTest, receiveTextNonLatin1Continuation)
562 UChar nonLatin1String[] = {
567 EXPECT_CALL(*channelClient(), didReceiveMessage(String(nonLatin1String)));
569 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeText, "\xe7\x8b", 2);
570 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\x90\xe0", 2);
571 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\xa4", 1);
572 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "\x94", 1);
575 TEST_F(NewWebSocketChannelImplTest, receiveBinary)
578 Vector<char> fooVector;
579 fooVector.append("FOO", 3);
580 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(fooVector));
582 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "FOOx", 3);
585 TEST_F(NewWebSocketChannelImplTest, receiveBinaryContinuation)
588 Vector<char> bazVector;
589 bazVector.append("BAZ", 3);
590 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(bazVector));
592 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeBinary, "Bx", 1);
593 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "Ax", 1);
594 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "Zx", 1);
597 TEST_F(NewWebSocketChannelImplTest, receiveBinaryWithNullBytes)
605 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
610 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
615 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
619 v.append("\0\0\0", 3);
620 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
624 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\0AR", 3);
625 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "B\0Z", 3);
626 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "QU\0", 3);
627 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\0\0\0", 3);
630 TEST_F(NewWebSocketChannelImplTest, receiveBinaryNonLatin1UTF8)
634 v.append("\xe7\x8b\x90\xe0\xa4\x94", 6);
635 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
637 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\xe7\x8b\x90\xe0\xa4\x94", 6);
640 TEST_F(NewWebSocketChannelImplTest, receiveBinaryNonLatin1UTF8Continuation)
644 v.append("\xe7\x8b\x90\xe0\xa4\x94", 6);
645 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
647 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeBinary, "\xe7\x8b", 2);
648 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\x90\xe0", 2);
649 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageTypeContinuation, "\xa4", 1);
650 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeContinuation, "\x94", 1);
653 TEST_F(NewWebSocketChannelImplTest, receiveBinaryNonUTF8)
657 v.append("\x80\xff", 2);
658 EXPECT_CALL(*channelClient(), didReceiveBinaryDataMock(v));
660 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeBinary, "\x80\xff", 2);
663 TEST_F(NewWebSocketChannelImplTest, closeFromBrowser)
666 Checkpoint checkpoint;
670 EXPECT_CALL(*channelClient(), didStartClosingHandshake());
671 EXPECT_CALL(checkpoint, Call(1));
673 EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, WebString("close reason")));
674 EXPECT_CALL(checkpoint, Call(2));
676 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeComplete, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")));
677 EXPECT_CALL(checkpoint, Call(3));
680 handleClient()->didStartClosingHandshake(handle());
683 channel()->close(WebSocketChannel::CloseEventCodeNormalClosure, String("close reason"));
686 handleClient()->didClose(handle(), true, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason"));
689 channel()->disconnect();
692 TEST_F(NewWebSocketChannelImplTest, closeFromWebSocket)
695 Checkpoint checkpoint;
699 EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, WebString("close reason")));
700 EXPECT_CALL(checkpoint, Call(1));
702 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeComplete, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")));
703 EXPECT_CALL(checkpoint, Call(2));
706 channel()->close(WebSocketChannel::CloseEventCodeNormalClosure, String("close reason"));
709 handleClient()->didClose(handle(), true, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason"));
712 channel()->disconnect();
715 TEST_F(NewWebSocketChannelImplTest, failFromBrowser)
721 EXPECT_CALL(*channelClient(), didReceiveMessageError());
722 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String()));
725 handleClient()->didFail(handle(), "fail message");
728 TEST_F(NewWebSocketChannelImplTest, failFromWebSocket)
734 EXPECT_CALL(*channelClient(), didReceiveMessageError());
735 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String()));
738 channel()->fail("fail message from WebSocket", ErrorMessageLevel, "sourceURL", 1234);