18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file. 48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/renderer_host/websocket_dispatcher_host.h" 68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <algorithm> 88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <vector> 98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/bind.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/bind_helpers.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/ref_counted.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/weak_ptr.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/renderer_host/websocket_host.h" 158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/common/websocket.h" 168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/common/websocket_messages.h" 178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ipc/ipc_message.h" 188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "url/gurl.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "url/origin.h" 218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace content { 238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace { 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// This number is unlikely to occur by chance. 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)static const int kMagicRenderProcessId = 506116062; 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class WebSocketDispatcherHostTest; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// A mock of WebsocketHost which records received messages. 318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class MockWebSocketHost : public WebSocketHost { 328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWebSocketHost(int routing_id, 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebSocketDispatcherHost* dispatcher, 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLRequestContext* url_request_context, 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebSocketDispatcherHostTest* owner); 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual ~MockWebSocketHost() {} 398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) received_messages_.push_back(message); 428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void GoAway() OVERRIDE; 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<IPC::Message> received_messages_; 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::WeakPtr<WebSocketDispatcherHostTest> owner_; 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}; 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class WebSocketDispatcherHostTest : public ::testing::Test { 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebSocketDispatcherHostTest() 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : weak_ptr_factory_(this) { 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dispatcher_host_ = new WebSocketDispatcherHost( 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kMagicRenderProcessId, 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&WebSocketDispatcherHostTest::OnGetRequestContext, 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Unretained(this)), 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&WebSocketDispatcherHostTest::CreateWebSocketHost, 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Unretained(this))); 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~WebSocketDispatcherHostTest() { 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // We need to invalidate the issued WeakPtrs at the beginning of the 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // destructor in order not to access destructed member variables. 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void GoAway(int routing_id) { 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gone_hosts_.push_back(routing_id); 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::WeakPtr<WebSocketDispatcherHostTest> GetWeakPtr() { 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return weak_ptr_factory_.GetWeakPtr(); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) protected: 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<WebSocketDispatcherHost> dispatcher_host_; 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Stores allocated MockWebSocketHost instances. Doesn't take ownership of 818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // them. 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<MockWebSocketHost*> mock_hosts_; 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<int> gone_hosts_; 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::WeakPtrFactory<WebSocketDispatcherHostTest> weak_ptr_factory_; 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) private: 888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) net::URLRequestContext* OnGetRequestContext() { 898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return NULL; 908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebSocketHost* CreateWebSocketHost(int routing_id) { 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWebSocketHost* host = 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new MockWebSocketHost(routing_id, dispatcher_host_.get(), NULL, this); 958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mock_hosts_.push_back(host); 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return host; 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}; 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MockWebSocketHost::MockWebSocketHost( 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int routing_id, 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebSocketDispatcherHost* dispatcher, 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLRequestContext* url_request_context, 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebSocketDispatcherHostTest* owner) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : WebSocketHost(routing_id, dispatcher, url_request_context), 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) owner_(owner->GetWeakPtr()) {} 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MockWebSocketHost::GoAway() { 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (owner_) 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) owner_->GoAway(routing_id()); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, Construct) { 1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Do nothing. 1158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, UnrelatedMessage) { 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IPC::Message message; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(dispatcher_host_->OnMessageReceived(message)); 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, RenderProcessIdGetter) { 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kMagicRenderProcessId, dispatcher_host_->render_process_id()); 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, AddChannelRequest) { 1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int routing_id = 123; 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL socket_url("ws://example.com/test"); 1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<std::string> requested_protocols; 1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) requested_protocols.push_back("hello"); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url::Origin origin("http://example.com/test"); 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int render_frame_id = -2; 1338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebSocketHostMsg_AddChannelRequest message( 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) routing_id, socket_url, requested_protocols, origin, render_frame_id); 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(dispatcher_host_->OnMessageReceived(message)); 1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1U, mock_hosts_.size()); 1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWebSocketHost* host = mock_hosts_[0]; 1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1U, host->received_messages_.size()); 1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const IPC::Message& forwarded_message = host->received_messages_[0]; 1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(WebSocketHostMsg_AddChannelRequest::ID, forwarded_message.type()); 1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(routing_id, forwarded_message.routing_id()); 1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, SendFrameButNoHostYet) { 1488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int routing_id = 123; 1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<char> data; 1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebSocketMsg_SendFrame message( 1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) routing_id, true, WEB_SOCKET_MESSAGE_TYPE_TEXT, data); 1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Expected to be ignored. 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(dispatcher_host_->OnMessageReceived(message)); 1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(0U, mock_hosts_.size()); 1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, SendFrame) { 1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int routing_id = 123; 1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL socket_url("ws://example.com/test"); 1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<std::string> requested_protocols; 1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) requested_protocols.push_back("hello"); 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url::Origin origin("http://example.com/test"); 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int render_frame_id = -2; 1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebSocketHostMsg_AddChannelRequest add_channel_message( 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) routing_id, socket_url, requested_protocols, origin, render_frame_id); 1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(dispatcher_host_->OnMessageReceived(add_channel_message)); 1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<char> data; 1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebSocketMsg_SendFrame send_frame_message( 1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) routing_id, true, WEB_SOCKET_MESSAGE_TYPE_TEXT, data); 1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(dispatcher_host_->OnMessageReceived(send_frame_message)); 1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1U, mock_hosts_.size()); 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockWebSocketHost* host = mock_hosts_[0]; 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(2U, host->received_messages_.size()); 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const IPC::Message& forwarded_message = host->received_messages_[0]; 1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(WebSocketHostMsg_AddChannelRequest::ID, forwarded_message.type()); 1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(routing_id, forwarded_message.routing_id()); 1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const IPC::Message& forwarded_message = host->received_messages_[1]; 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(WebSocketMsg_SendFrame::ID, forwarded_message.type()); 1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(routing_id, forwarded_message.routing_id()); 1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(WebSocketDispatcherHostTest, Destruct) { 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebSocketHostMsg_AddChannelRequest message1( 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 123, GURL("ws://example.com/test"), std::vector<std::string>(), 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url::Origin("http://example.com"), -1); 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebSocketHostMsg_AddChannelRequest message2( 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 456, GURL("ws://example.com/test2"), std::vector<std::string>(), 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url::Origin("http://example.com"), -1); 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(dispatcher_host_->OnMessageReceived(message1)); 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(dispatcher_host_->OnMessageReceived(message2)); 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2u, mock_hosts_.size()); 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mock_hosts_.clear(); 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dispatcher_host_ = NULL; 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2u, gone_hosts_.size()); 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The gone_hosts_ ordering is not predictable because it depends on the 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // hash_map ordering. 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::sort(gone_hosts_.begin(), gone_hosts_.end()); 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(123, gone_hosts_[0]); 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(456, gone_hosts_[1]); 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} // namespace 2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} // namespace content 220