| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h" | 5 #include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h" |
| 6 #include "base/strings/stringprintf.h" | 6 #include "base/strings/stringprintf.h" |
| 7 #include "base/test/mock_callback.h" | 7 #include "base/test/mock_callback.h" |
| 8 #include "base/timer/mock_timer.h" | 8 #include "base/timer/mock_timer.h" |
| 9 #include "chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.h" | 9 #include "chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.h" |
| 10 #include "chrome/browser/media/router/test_helper.h" | 10 #include "chrome/browser/media/router/test_helper.h" |
| 11 #include "chrome/test/base/testing_profile.h" | 11 #include "chrome/test/base/testing_profile.h" |
| 12 #include "components/cast_channel/cast_socket.h" | 12 #include "components/cast_channel/cast_socket.h" |
| 13 #include "components/cast_channel/cast_socket_service.h" | 13 #include "components/cast_channel/cast_socket_service.h" |
| 14 #include "components/cast_channel/cast_test_util.h" | 14 #include "components/cast_channel/cast_test_util.h" |
| 15 #include "content/public/test/test_browser_thread_bundle.h" | 15 #include "content/public/test/test_browser_thread_bundle.h" |
| 16 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 18 |
| 19 using ::testing::_; | 19 using ::testing::_; |
| 20 using ::testing::Invoke; |
| 20 using ::testing::Return; | 21 using ::testing::Return; |
| 21 using ::testing::SaveArg; | 22 using ::testing::SaveArg; |
| 23 using ::testing::WithArgs; |
| 24 |
| 25 using cast_channel::CastSocket; |
| 26 using cast_channel::ChannelError; |
| 22 | 27 |
| 23 namespace { | 28 namespace { |
| 24 | 29 |
| 25 net::IPEndPoint CreateIPEndPoint(int num) { | 30 constexpr char SERVICE_TYPE[] = "_googlecast._tcp.local"; |
| 31 |
| 32 // Test parameter structure holding mock strings for media sink and mDNS |
| 33 // service. |
| 34 struct TestSinkParams { |
| 35 std::string unique_id; |
| 36 std::string model_name; |
| 37 std::string friendly_name; |
| 26 net::IPAddress ip_address; | 38 net::IPAddress ip_address; |
| 27 DCHECK(ip_address.AssignFromIPLiteral( | 39 net::IPEndPoint ip_endpoint; |
| 28 base::StringPrintf("192.168.0.10%d", num))); | 40 int channel_id; |
| 29 return net::IPEndPoint(ip_address, 8009 + num); | 41 bool audio_only; |
| 30 } | |
| 31 | 42 |
| 32 media_router::DnsSdService CreateDnsService(int num) { | 43 TestSinkParams() = default; |
| 33 net::IPEndPoint ip_endpoint = CreateIPEndPoint(num); | 44 |
| 45 explicit TestSinkParams(int num) { |
| 46 unique_id = base::StringPrintf("service %d", num); |
| 47 friendly_name = base::StringPrintf("friendly name %d", num); |
| 48 model_name = base::StringPrintf("model name %d", num); |
| 49 DCHECK(ip_address.AssignFromIPLiteral( |
| 50 base::StringPrintf("192.168.0.10%d", num))); |
| 51 ip_endpoint = net::IPEndPoint( |
| 52 ip_address, media_router::CastMediaSinkService::kCastControlPort + num); |
| 53 channel_id = num; |
| 54 audio_only = false; |
| 55 } |
| 56 }; |
| 57 |
| 58 media_router::DnsSdService CreateDnsService(const TestSinkParams& params) { |
| 34 media_router::DnsSdService service; | 59 media_router::DnsSdService service; |
| 35 service.service_name = | 60 service.service_name = "_myDevice." + std::string(SERVICE_TYPE); |
| 36 "_myDevice." + | 61 service.ip_address = params.ip_address.ToString(); |
| 37 std::string(media_router::CastMediaSinkService::kCastServiceType); | 62 service.service_host_port = params.ip_endpoint.ToString(); |
| 38 service.ip_address = ip_endpoint.address().ToString(); | 63 service.service_data.push_back("id=" + params.unique_id); |
| 39 service.service_host_port = ip_endpoint.ToString(); | 64 service.service_data.push_back("fn=" + params.friendly_name); |
| 40 service.service_data.push_back(base::StringPrintf("id=service %d", num)); | 65 service.service_data.push_back("md=" + params.model_name); |
| 41 service.service_data.push_back( | |
| 42 base::StringPrintf("fn=friendly name %d", num)); | |
| 43 service.service_data.push_back(base::StringPrintf("md=model name %d", num)); | |
| 44 | |
| 45 return service; | 66 return service; |
| 46 } | 67 } |
| 47 | 68 |
| 69 media_router::MediaSinkInternal CreateCastSink(const TestSinkParams& params) { |
| 70 media_router::MediaSink sink(params.unique_id, params.friendly_name, |
| 71 media_router::MediaSink::IconType::CAST); |
| 72 |
| 73 media_router::CastSinkExtraData extra_data; |
| 74 extra_data.ip_address = params.ip_address; |
| 75 extra_data.port = params.ip_endpoint.port(); |
| 76 extra_data.model_name = params.model_name; |
| 77 extra_data.cast_channel_id = params.channel_id; |
| 78 extra_data.capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT | |
| 79 cast_channel::CastDeviceCapability::VIDEO_OUT; |
| 80 return media_router::MediaSinkInternal(sink, extra_data); |
| 81 } |
| 82 |
| 83 media_router::MediaSinkInternal CreateDialSink(const TestSinkParams& params) { |
| 84 media_router::MediaSink sink(params.unique_id, params.friendly_name, |
| 85 media_router::MediaSink::IconType::CAST); |
| 86 |
| 87 media_router::DialSinkExtraData extra_data; |
| 88 extra_data.ip_address = params.ip_address; |
| 89 extra_data.model_name = params.model_name; |
| 90 return media_router::MediaSinkInternal(sink, extra_data); |
| 91 } |
| 92 |
| 48 void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink, | 93 void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink, |
| 49 const media_router::DnsSdService& service, | 94 const TestSinkParams& params) { |
| 50 int channel_id, | 95 EXPECT_EQ(params.unique_id, cast_sink.sink().id()); |
| 51 bool audio_only) { | 96 EXPECT_EQ(params.friendly_name, cast_sink.sink().name()); |
| 52 std::string id = base::StringPrintf("service %d", channel_id); | 97 EXPECT_EQ(params.model_name, cast_sink.cast_data().model_name); |
| 53 std::string name = base::StringPrintf("friendly name %d", channel_id); | 98 EXPECT_EQ(params.ip_address, cast_sink.cast_data().ip_address); |
| 54 std::string model_name = base::StringPrintf("model name %d", channel_id); | |
| 55 EXPECT_EQ(id, cast_sink.sink().id()); | |
| 56 EXPECT_EQ(name, cast_sink.sink().name()); | |
| 57 EXPECT_EQ(model_name, cast_sink.cast_data().model_name); | |
| 58 EXPECT_EQ(service.ip_address, cast_sink.cast_data().ip_address.ToString()); | |
| 59 EXPECT_TRUE(cast_channel::CastDeviceCapability::AUDIO_OUT & | 99 EXPECT_TRUE(cast_channel::CastDeviceCapability::AUDIO_OUT & |
| 60 cast_sink.cast_data().capabilities); | 100 cast_sink.cast_data().capabilities); |
| 61 EXPECT_EQ(!audio_only, cast_channel::CastDeviceCapability::VIDEO_OUT & | 101 EXPECT_EQ(!params.audio_only, cast_channel::CastDeviceCapability::VIDEO_OUT & |
| 62 cast_sink.cast_data().capabilities); | 102 cast_sink.cast_data().capabilities); |
| 63 EXPECT_EQ(channel_id, cast_sink.cast_data().cast_channel_id); | 103 EXPECT_EQ(params.channel_id, cast_sink.cast_data().cast_channel_id); |
| 64 } | 104 } |
| 65 | 105 |
| 66 } // namespace | 106 } // namespace |
| 67 | 107 |
| 68 namespace media_router { | 108 namespace media_router { |
| 69 | 109 |
| 70 class MockCastSocketService : public cast_channel::CastSocketService { | 110 class MockCastSocketService : public cast_channel::CastSocketService { |
| 71 public: | 111 public: |
| 72 MOCK_METHOD4(OpenSocket, | 112 MOCK_METHOD4(OpenSocket, |
| 73 int(const net::IPEndPoint& ip_endpoint, | 113 int(const net::IPEndPoint& ip_endpoint, |
| 74 net::NetLog* net_log, | 114 net::NetLog* net_log, |
| 75 const cast_channel::CastSocket::OnOpenCallback& open_cb, | 115 const cast_channel::CastSocket::OnOpenCallback& open_cb, |
| 76 cast_channel::CastSocket::Observer* observer)); | 116 cast_channel::CastSocket::Observer* observer)); |
| 77 MOCK_CONST_METHOD1(GetSocket, cast_channel::CastSocket*(int channel_id)); | 117 MOCK_CONST_METHOD1(GetSocket, cast_channel::CastSocket*(int channel_id)); |
| 78 | 118 |
| 79 private: | 119 private: |
| 80 ~MockCastSocketService() {} | 120 ~MockCastSocketService() {} |
| 81 }; | 121 }; |
| 82 | 122 |
| 83 class CastMediaSinkServiceTest : public ::testing::Test { | 123 class CastMediaSinkServiceTest : public ::testing::Test { |
| 84 public: | 124 public: |
| 85 CastMediaSinkServiceTest() | 125 CastMediaSinkServiceTest() |
| 86 : mock_cast_socket_service_(new MockCastSocketService()), | 126 : mock_cast_socket_service_(new MockCastSocketService()), |
| 87 media_sink_service_( | 127 media_sink_service_( |
| 88 new CastMediaSinkService(mock_sink_discovered_cb_.Get(), | 128 new CastMediaSinkService(mock_sink_discovered_cb_.Get(), |
| 89 mock_cast_socket_service_.get())), | 129 mock_cast_socket_service_.get())), |
| 90 test_dns_sd_registry_(media_sink_service_.get()) {} | 130 test_dns_sd_registry_(media_sink_service_.get()) { |
| 131 for (int i = 1; i <= 3; i++) { |
| 132 params_[i] = TestSinkParams(i); |
| 133 services_[i] = CreateDnsService(params_[i]); |
| 134 cast_sinks_[i] = CreateCastSink(params_[i]); |
| 135 dial_sinks_[i] = CreateDialSink(params_[i]); |
| 136 } |
| 137 } |
| 91 | 138 |
| 92 void SetUp() override { | 139 void SetUp() override { |
| 93 auto mock_timer = base::MakeUnique<base::MockTimer>( | 140 auto mock_timer = base::MakeUnique<base::MockTimer>( |
| 94 true /*retain_user_task*/, false /*is_repeating*/); | 141 true /*retain_user_task*/, false /*is_repeating*/); |
| 95 mock_timer_ = mock_timer.get(); | 142 mock_timer_ = mock_timer.get(); |
| 96 media_sink_service_->SetTimerForTest(std::move(mock_timer)); | 143 media_sink_service_->SetTimerForTest(std::move(mock_timer)); |
| 97 } | 144 } |
| 98 | 145 |
| 99 protected: | 146 protected: |
| 100 const content::TestBrowserThreadBundle thread_bundle_; | 147 const content::TestBrowserThreadBundle thread_bundle_; |
| 101 TestingProfile profile_; | 148 TestingProfile profile_; |
| 102 | 149 |
| 103 base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback> | 150 base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback> |
| 104 mock_sink_discovered_cb_; | 151 mock_sink_discovered_cb_; |
| 105 scoped_refptr<MockCastSocketService> mock_cast_socket_service_; | 152 scoped_refptr<MockCastSocketService> mock_cast_socket_service_; |
| 106 scoped_refptr<CastMediaSinkService> media_sink_service_; | 153 scoped_refptr<CastMediaSinkService> media_sink_service_; |
| 107 MockDnsSdRegistry test_dns_sd_registry_; | 154 MockDnsSdRegistry test_dns_sd_registry_; |
| 108 base::MockTimer* mock_timer_; | 155 base::MockTimer* mock_timer_; |
| 109 | 156 |
| 157 TestSinkParams params_[4]; |
| 158 DnsSdService services_[4]; |
| 159 MediaSinkInternal cast_sinks_[4]; |
| 160 MediaSinkInternal dial_sinks_[4]; |
| 161 cast_channel::MockCastSocket mock_sockets_[4]; |
| 162 |
| 110 DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest); | 163 DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest); |
| 111 }; | 164 }; |
| 112 | 165 |
| 113 TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) { | 166 TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) { |
| 114 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())) | 167 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())) |
| 115 .Times(2); | 168 .Times(2); |
| 116 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)).Times(2); | 169 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)).Times(2); |
| 117 EXPECT_FALSE(mock_timer_->IsRunning()); | 170 EXPECT_FALSE(mock_timer_->IsRunning()); |
| 118 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); | 171 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); |
| 119 media_sink_service_->Start(); | 172 media_sink_service_->Start(); |
| 120 EXPECT_TRUE(mock_timer_->IsRunning()); | 173 EXPECT_TRUE(mock_timer_->IsRunning()); |
| 121 | 174 |
| 122 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); | 175 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); |
| 123 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); | 176 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); |
| 124 media_sink_service_->Stop(); | 177 media_sink_service_->Stop(); |
| 125 | 178 |
| 126 mock_timer_ = | 179 auto mock_timer = base::MakeUnique<base::MockTimer>(true /*retain_user_task*/, |
| 127 new base::MockTimer(true /*retain_user_task*/, false /*is_repeating*/); | 180 false /*is_repeating*/); |
| 128 media_sink_service_->SetTimerForTest(base::WrapUnique(mock_timer_)); | 181 mock_timer_ = mock_timer.get(); |
| 182 media_sink_service_->SetTimerForTest(std::move(mock_timer)); |
| 129 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); | 183 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); |
| 130 media_sink_service_->Start(); | 184 media_sink_service_->Start(); |
| 131 EXPECT_TRUE(mock_timer_->IsRunning()); | 185 EXPECT_TRUE(mock_timer_->IsRunning()); |
| 132 } | 186 } |
| 133 | 187 |
| 134 TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) { | 188 TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) { |
| 135 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())); | 189 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())); |
| 136 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)); | 190 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)); |
| 137 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); | 191 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); |
| 138 media_sink_service_->Start(); | 192 media_sink_service_->Start(); |
| 139 media_sink_service_->Start(); | 193 media_sink_service_->Start(); |
| 140 EXPECT_TRUE(mock_timer_->IsRunning()); | 194 EXPECT_TRUE(mock_timer_->IsRunning()); |
| 141 | 195 |
| 142 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); | 196 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); |
| 143 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); | 197 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); |
| 144 media_sink_service_->Stop(); | 198 media_sink_service_->Stop(); |
| 145 media_sink_service_->Stop(); | 199 media_sink_service_->Stop(); |
| 146 } | 200 } |
| 147 | 201 |
| 148 TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) { | 202 TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) { |
| 149 DnsSdService service = CreateDnsService(1); | |
| 150 cast_channel::MockCastSocket socket; | |
| 151 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) | 203 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) |
| 152 .WillOnce(Return(&socket)); | 204 .WillOnce(Return(&mock_sockets_[1])); |
| 153 | 205 |
| 154 media_sink_service_->current_services_.push_back(service); | 206 media_sink_service_->current_service_ip_endpoints_.insert( |
| 207 params_[1].ip_endpoint); |
| 155 media_sink_service_->OnChannelOpenedOnIOThread( | 208 media_sink_service_->OnChannelOpenedOnIOThread( |
| 156 service, 1, cast_channel::ChannelError::NONE); | 209 cast_sinks_[1], 1, cast_channel::ChannelError::NONE); |
| 157 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. | 210 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. |
| 158 base::RunLoop().RunUntilIdle(); | 211 base::RunLoop().RunUntilIdle(); |
| 159 | 212 |
| 160 // Verify sink content | 213 // Verify sink content. |
| 161 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); | 214 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_by_mdns_map_.size()); |
| 162 for (const auto& sink_it : media_sink_service_->current_sinks_) | 215 for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_map_) |
| 163 VerifyMediaSinkInternal(sink_it, service, 1, false); | 216 EXPECT_EQ(cast_sinks_[1], sink_it.second); |
| 164 } | 217 } |
| 165 | 218 |
| 166 TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) { | 219 TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) { |
| 167 DnsSdService service1 = CreateDnsService(1); | |
| 168 DnsSdService service2 = CreateDnsService(2); | |
| 169 DnsSdService service3 = CreateDnsService(3); | |
| 170 | |
| 171 cast_channel::MockCastSocket socket2; | |
| 172 cast_channel::MockCastSocket socket3; | |
| 173 // Fail to open channel 1. | 220 // Fail to open channel 1. |
| 174 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) | 221 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) |
| 175 .WillOnce(Return(nullptr)); | 222 .WillOnce(Return(nullptr)); |
| 176 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) | 223 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) |
| 177 .WillOnce(Return(&socket2)); | 224 .WillOnce(Return(&mock_sockets_[2])); |
| 178 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3)) | 225 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3)) |
| 179 .WillOnce(Return(&socket2)); | 226 .WillOnce(Return(&mock_sockets_[3])); |
| 180 | 227 |
| 181 // Current round of Dns discovery finds service1 and service 2. | 228 // Current round of Dns discovery finds service1 and service 2. |
| 182 media_sink_service_->current_services_.push_back(service1); | 229 media_sink_service_->current_service_ip_endpoints_.insert( |
| 183 media_sink_service_->current_services_.push_back(service2); | 230 params_[1].ip_endpoint); |
| 231 media_sink_service_->current_service_ip_endpoints_.insert( |
| 232 params_[2].ip_endpoint); |
| 184 media_sink_service_->OnChannelOpenedOnIOThread( | 233 media_sink_service_->OnChannelOpenedOnIOThread( |
| 185 service1, 1, cast_channel::ChannelError::NONE); | 234 cast_sinks_[1], 1, cast_channel::ChannelError::NONE); |
| 186 media_sink_service_->OnChannelOpenedOnIOThread( | 235 media_sink_service_->OnChannelOpenedOnIOThread( |
| 187 service2, 2, cast_channel::ChannelError::NONE); | 236 cast_sinks_[2], 2, cast_channel::ChannelError::NONE); |
| 188 media_sink_service_->OnChannelOpenedOnIOThread( | 237 media_sink_service_->OnChannelOpenedOnIOThread( |
| 189 service3, 3, cast_channel::ChannelError::NONE); | 238 cast_sinks_[3], 3, cast_channel::ChannelError::NONE); |
| 190 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. | 239 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. |
| 191 base::RunLoop().RunUntilIdle(); | 240 base::RunLoop().RunUntilIdle(); |
| 192 | 241 |
| 193 // Verify sink content | 242 // Verify sink content. |
| 194 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); | 243 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_by_mdns_map_.size()); |
| 195 for (const auto& sink_it : media_sink_service_->current_sinks_) | 244 for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_map_) |
| 196 VerifyMediaSinkInternal(sink_it, service2, 2, false); | 245 EXPECT_EQ(cast_sinks_[2], sink_it.second); |
| 197 } | 246 } |
| 198 | 247 |
| 199 TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) { | 248 TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) { |
| 200 DnsSdService service1 = CreateDnsService(1); | 249 // Add dns services. |
| 201 DnsSdService service2 = CreateDnsService(2); | 250 DnsSdRegistry::DnsSdServiceList service_list{services_[1], services_[2]}; |
| 202 net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); | |
| 203 net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); | |
| 204 | 251 |
| 205 // Add dns services. | 252 // Channel 1, 2 opened. |
| 206 DnsSdRegistry::DnsSdServiceList service_list{service1, service2}; | 253 EXPECT_CALL(*mock_cast_socket_service_, |
| 254 OpenSocket(params_[1].ip_endpoint, _, _, _)) |
| 255 .WillOnce(DoAll( |
| 256 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) { |
| 257 callback.Run(1, ChannelError::NONE); |
| 258 })), |
| 259 Return(1))); |
| 260 EXPECT_CALL(*mock_cast_socket_service_, |
| 261 OpenSocket(params_[2].ip_endpoint, _, _, _)) |
| 262 .WillOnce(DoAll( |
| 263 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) { |
| 264 callback.Run(2, ChannelError::NONE); |
| 265 })), |
| 266 Return(2))); |
| 207 | 267 |
| 208 cast_channel::CastSocket::OnOpenCallback callback1; | 268 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) |
| 209 cast_channel::CastSocket::OnOpenCallback callback2; | 269 .WillOnce(Return(&mock_sockets_[1])); |
| 210 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)) | 270 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) |
| 211 .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1))); | 271 .WillOnce(Return(&mock_sockets_[2])); |
| 212 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)) | |
| 213 .WillOnce(DoAll(SaveArg<2>(&callback2), Return(2))); | |
| 214 | 272 |
| 215 // Invoke CastSocketService::OpenSocket on the IO thread. | 273 // Invoke CastSocketService::OpenSocket on the IO thread. |
| 216 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, | 274 media_sink_service_->OnDnsSdEvent(SERVICE_TYPE, service_list); |
| 217 service_list); | |
| 218 base::RunLoop().RunUntilIdle(); | 275 base::RunLoop().RunUntilIdle(); |
| 219 | 276 |
| 220 cast_channel::MockCastSocket socket1; | |
| 221 cast_channel::MockCastSocket socket2; | |
| 222 | |
| 223 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) | |
| 224 .WillOnce(Return(&socket1)); | |
| 225 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) | |
| 226 .WillOnce(Return(&socket2)); | |
| 227 | |
| 228 callback1.Run(1, cast_channel::ChannelError::NONE); | |
| 229 callback2.Run(2, cast_channel::ChannelError::NONE); | |
| 230 | |
| 231 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. | 277 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. |
| 232 base::RunLoop().RunUntilIdle(); | 278 base::RunLoop().RunUntilIdle(); |
| 233 // Verify sink content | 279 // Verify sink content. |
| 234 EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_.size()); | 280 EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_by_mdns_map_.size()); |
| 235 } | 281 } |
| 236 | 282 |
| 237 TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) { | 283 TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) { |
| 238 DnsSdService service1 = CreateDnsService(1); | 284 // 1st round finds service 1 & 2. |
| 239 DnsSdService service2 = CreateDnsService(2); | 285 DnsSdRegistry::DnsSdServiceList service_list1{services_[1], services_[2]}; |
| 240 DnsSdService service3 = CreateDnsService(3); | 286 media_sink_service_->OnDnsSdEvent(SERVICE_TYPE, service_list1); |
| 241 net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); | |
| 242 net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); | |
| 243 net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); | |
| 244 | 287 |
| 245 // 1st round finds service 1 & 2. | 288 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) |
| 246 DnsSdRegistry::DnsSdServiceList service_list1{service1, service2}; | 289 .WillOnce(Return(&mock_sockets_[1])); |
| 247 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, | 290 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) |
| 248 service_list1); | 291 .WillOnce(Return(&mock_sockets_[2])); |
| 292 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3)) |
| 293 .WillOnce(Return(&mock_sockets_[3])); |
| 249 | 294 |
| 250 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)); | 295 // Channel 2 opened. |
| 251 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); | 296 CastSocket::OnOpenCallback callback1; |
| 297 EXPECT_CALL(*mock_cast_socket_service_, |
| 298 OpenSocket(params_[1].ip_endpoint, _, _, _)) |
| 299 .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1))); |
| 300 EXPECT_CALL(*mock_cast_socket_service_, |
| 301 OpenSocket(params_[2].ip_endpoint, _, _, _)) |
| 302 .WillOnce(DoAll( |
| 303 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) { |
| 304 callback.Run(2, ChannelError::NONE); |
| 305 })), |
| 306 Return(2))); |
| 252 base::RunLoop().RunUntilIdle(); | 307 base::RunLoop().RunUntilIdle(); |
| 253 | 308 |
| 254 // Channel 2 opened. | 309 // 2nd round finds service 2 & 3. |
| 255 media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false); | 310 DnsSdRegistry::DnsSdServiceList service_list2{services_[2], services_[3]}; |
| 311 media_sink_service_->OnDnsSdEvent(SERVICE_TYPE, service_list2); |
| 256 | 312 |
| 257 // 2nd round finds service 2 & 3. | 313 // Channel 3 opened. |
| 258 DnsSdRegistry::DnsSdServiceList service_list2{service2, service3}; | 314 EXPECT_CALL(*mock_cast_socket_service_, |
| 259 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, | 315 OpenSocket(params_[2].ip_endpoint, _, _, _)); |
| 260 service_list2); | 316 EXPECT_CALL(*mock_cast_socket_service_, |
| 261 | 317 OpenSocket(params_[3].ip_endpoint, _, _, _)) |
| 262 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); | 318 .WillOnce(DoAll( |
| 263 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint3, _, _, _)); | 319 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) { |
| 320 callback.Run(3, ChannelError::NONE); |
| 321 })), |
| 322 Return(3))); |
| 264 base::RunLoop().RunUntilIdle(); | 323 base::RunLoop().RunUntilIdle(); |
| 265 | 324 |
| 266 // Channel 1 and 3 opened. | 325 // Channel 1 opened. |
| 267 media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false); | 326 callback1.Run(1, ChannelError::NONE); |
| 268 media_sink_service_->OnChannelOpenedOnUIThread(service3, 3, false); | |
| 269 | 327 |
| 270 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); | 328 // Verify sink content. |
| 271 for (const auto& sink_it : media_sink_service_->current_sinks_) | 329 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_by_mdns_map_.size()); |
| 272 VerifyMediaSinkInternal(sink_it, service3, 3, false); | 330 for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_map_) |
| 331 VerifyMediaSinkInternal(sink_it.second, params_[3]); |
| 273 } | 332 } |
| 274 | 333 |
| 275 TEST_F(CastMediaSinkServiceTest, TestTimer) { | 334 TEST_F(CastMediaSinkServiceTest, TestTimer) { |
| 276 DnsSdService service1 = CreateDnsService(1); | |
| 277 DnsSdService service2 = CreateDnsService(2); | |
| 278 net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); | |
| 279 net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); | |
| 280 | |
| 281 EXPECT_FALSE(mock_timer_->IsRunning()); | 335 EXPECT_FALSE(mock_timer_->IsRunning()); |
| 282 // finds service 1 & 2. | 336 // finds service 1 & 2. |
| 283 DnsSdRegistry::DnsSdServiceList service_list1{service1, service2}; | 337 DnsSdRegistry::DnsSdServiceList service_list1{services_[1], services_[2]}; |
| 284 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, | 338 media_sink_service_->OnDnsSdEvent(SERVICE_TYPE, service_list1); |
| 285 service_list1); | |
| 286 | 339 |
| 287 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)); | 340 EXPECT_CALL(*mock_cast_socket_service_, |
| 288 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); | 341 OpenSocket(params_[1].ip_endpoint, _, _, _)); |
| 342 EXPECT_CALL(*mock_cast_socket_service_, |
| 343 OpenSocket(params_[2].ip_endpoint, _, _, _)); |
| 289 base::RunLoop().RunUntilIdle(); | 344 base::RunLoop().RunUntilIdle(); |
| 290 | 345 |
| 291 // Channel 2 is opened. | 346 // Channel 2 is opened. |
| 292 media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false); | 347 media_sink_service_->OnChannelOpenedOnUIThread(cast_sinks_[2]); |
| 293 | 348 |
| 294 std::vector<MediaSinkInternal> sinks; | 349 std::vector<MediaSinkInternal> sinks; |
| 295 EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks)); | 350 EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks)); |
| 296 | 351 |
| 297 // Fire timer. | 352 // Fire timer. |
| 298 mock_timer_->Fire(); | 353 mock_timer_->Fire(); |
| 299 EXPECT_EQ(size_t(1), sinks.size()); | 354 EXPECT_EQ(size_t(1), sinks.size()); |
| 300 VerifyMediaSinkInternal(sinks[0], service2, 2, false); | 355 VerifyMediaSinkInternal(sinks[0], params_[2]); |
| 301 | 356 |
| 302 EXPECT_FALSE(mock_timer_->IsRunning()); | 357 EXPECT_FALSE(mock_timer_->IsRunning()); |
| 303 // Channel 1 is opened and timer is restarted. | 358 // Channel 1 is opened and timer is restarted. |
| 304 media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false); | 359 media_sink_service_->OnChannelOpenedOnUIThread(cast_sinks_[1]); |
| 305 EXPECT_TRUE(mock_timer_->IsRunning()); | 360 EXPECT_TRUE(mock_timer_->IsRunning()); |
| 306 } | 361 } |
| 307 | 362 |
| 363 TEST_F(CastMediaSinkServiceTest, TestOnDialSinkAdded) { |
| 364 net::IPEndPoint ip_endpoint1(params_[1].ip_address, |
| 365 CastMediaSinkService::kCastControlPort); |
| 366 net::IPEndPoint ip_endpoint2(params_[2].ip_address, |
| 367 CastMediaSinkService::kCastControlPort); |
| 368 |
| 369 // Channel 1, 2 opened. |
| 370 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)) |
| 371 .WillOnce(DoAll( |
| 372 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) { |
| 373 callback.Run(1, ChannelError::NONE); |
| 374 })), |
| 375 Return(1))); |
| 376 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)) |
| 377 .WillOnce(DoAll( |
| 378 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) { |
| 379 callback.Run(2, ChannelError::NONE); |
| 380 })), |
| 381 Return(2))); |
| 382 |
| 383 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) |
| 384 .WillOnce(Return(&mock_sockets_[1])); |
| 385 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) |
| 386 .WillOnce(Return(&mock_sockets_[2])); |
| 387 |
| 388 // Invoke CastSocketService::OpenSocket on the IO thread. |
| 389 media_sink_service_->OnMediaSinkAdded(dial_sinks_[1]); |
| 390 base::RunLoop().RunUntilIdle(); |
| 391 |
| 392 // Invoke CastSocketService::OpenSocket on the IO thread. |
| 393 media_sink_service_->OnMediaSinkAdded(dial_sinks_[2]); |
| 394 base::RunLoop().RunUntilIdle(); |
| 395 // Verify sink content. |
| 396 EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_by_dial_map_.size()); |
| 397 } |
| 398 |
| 399 TEST_F(CastMediaSinkServiceTest, TestOnFetchCompleted) { |
| 400 std::vector<MediaSinkInternal> sinks; |
| 401 EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks)); |
| 402 |
| 403 // Cast sink 1, 2 from mDNS discovery |
| 404 media_sink_service_->current_sinks_by_mdns_map_[params_[1].ip_endpoint] = |
| 405 cast_sinks_[1]; |
| 406 media_sink_service_->current_sinks_by_mdns_map_[params_[2].ip_endpoint] = |
| 407 cast_sinks_[2]; |
| 408 // Cast sink 2, 3 from dial discovery |
| 409 auto extra_data = cast_sinks_[2].cast_data(); |
| 410 extra_data.discovered_by_dial = true; |
| 411 extra_data.model_name += " dial"; |
| 412 |
| 413 media_sink_service_->current_sinks_by_dial_map_[params_[2].ip_endpoint] = |
| 414 cast_sinks_[2]; |
| 415 media_sink_service_->current_sinks_by_dial_map_[params_[3].ip_endpoint] = |
| 416 cast_sinks_[3]; |
| 417 |
| 418 // Callback returns Cast sink 1, 2, 3 |
| 419 media_sink_service_->OnFetchCompleted(); |
| 420 EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[1])); |
| 421 EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[2])); |
| 422 EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[3])); |
| 423 } |
| 424 |
| 308 } // namespace media_router | 425 } // namespace media_router |
| OLD | NEW |