Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4528)

Unified Diff: chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc

Issue 2965843002: [Media Router] Support dual discovery (Closed)
Patch Set: resovle code review comments from Derek and Mark Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
index 7e12a97596500edeca3b1df9530c3a218431c756..82abf76e15ab1a54cb570442cfbee193238357df 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
@@ -17,51 +17,94 @@
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::_;
+using ::testing::Invoke;
using ::testing::Return;
using ::testing::SaveArg;
+using ::testing::WithArgs;
+
+using cast_channel::CastSocket;
+using cast_channel::ChannelError;
namespace {
-net::IPEndPoint CreateIPEndPoint(int num) {
+// Test parameter structure holding mock strings for media sink and mDNS
+// service.
+// TODO(crbug.com/741932): use TestSinkParams to construct test data.
+struct TestSinkParams {
+ std::string unique_id;
+ std::string model_name;
+ std::string friendly_name;
net::IPAddress ip_address;
- CHECK(ip_address.AssignFromIPLiteral(
- base::StringPrintf("192.168.0.10%d", num)));
- return net::IPEndPoint(ip_address, 8009 + num);
-}
+ net::IPEndPoint ip_endpoint;
+ int channel_id;
+ bool audio_only;
+
+ TestSinkParams() = default;
+
+ explicit TestSinkParams(int num) {
+ unique_id = base::StringPrintf("service %d", num);
+ friendly_name = base::StringPrintf("friendly name %d", num);
+ model_name = base::StringPrintf("model name %d", num);
+ CHECK(ip_address.AssignFromIPLiteral(
+ base::StringPrintf("192.168.0.10%d", num)));
+ ip_endpoint = net::IPEndPoint(
+ ip_address, media_router::CastMediaSinkService::kCastControlPort + num);
+ channel_id = num;
+ audio_only = false;
+ }
+};
-media_router::DnsSdService CreateDnsService(int num) {
- net::IPEndPoint ip_endpoint = CreateIPEndPoint(num);
+media_router::DnsSdService CreateDnsService(const TestSinkParams& params) {
media_router::DnsSdService service;
service.service_name =
"_myDevice." +
std::string(media_router::CastMediaSinkService::kCastServiceType);
- service.ip_address = ip_endpoint.address().ToString();
- service.service_host_port = ip_endpoint.ToString();
- service.service_data.push_back(base::StringPrintf("id=service %d", num));
- service.service_data.push_back(
- base::StringPrintf("fn=friendly name %d", num));
- service.service_data.push_back(base::StringPrintf("md=model name %d", num));
-
+ service.ip_address = params.ip_address.ToString();
+ service.service_host_port = params.ip_endpoint.ToString();
+ service.service_data.push_back("id=" + params.unique_id);
+ service.service_data.push_back("fn=" + params.friendly_name);
+ service.service_data.push_back("md=" + params.model_name);
return service;
}
+media_router::MediaSinkInternal CreateCastSink(const TestSinkParams& params) {
+ media_router::MediaSink sink(params.unique_id, params.friendly_name,
+ media_router::MediaSink::IconType::CAST);
+
+ media_router::CastSinkExtraData extra_data;
+ extra_data.ip_address = params.ip_address;
+ extra_data.port = params.ip_endpoint.port();
+ extra_data.model_name = params.model_name;
+ extra_data.cast_channel_id = params.channel_id;
+ extra_data.capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT |
+ cast_channel::CastDeviceCapability::VIDEO_OUT;
+ return media_router::MediaSinkInternal(sink, extra_data);
+}
+
+media_router::MediaSinkInternal CreateDialSink(const TestSinkParams& params) {
+ media_router::MediaSink sink(params.unique_id, params.friendly_name,
+ media_router::MediaSink::IconType::CAST);
+
+ media_router::DialSinkExtraData extra_data;
+ extra_data.ip_address = params.ip_address;
+ extra_data.model_name = params.model_name;
+ return media_router::MediaSinkInternal(sink, extra_data);
+}
+
void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink,
- const media_router::DnsSdService& service,
- int channel_id,
- bool audio_only) {
- std::string id = base::StringPrintf("service %d", channel_id);
- std::string name = base::StringPrintf("friendly name %d", channel_id);
- std::string model_name = base::StringPrintf("model name %d", channel_id);
- EXPECT_EQ(id, cast_sink.sink().id());
- EXPECT_EQ(name, cast_sink.sink().name());
- EXPECT_EQ(model_name, cast_sink.cast_data().model_name);
- EXPECT_EQ(service.ip_address, cast_sink.cast_data().ip_address.ToString());
+ const TestSinkParams& params) {
+ EXPECT_EQ(params.unique_id, cast_sink.sink().id());
+ EXPECT_EQ(params.friendly_name, cast_sink.sink().name());
+ EXPECT_EQ(params.model_name, cast_sink.cast_data().model_name);
+ EXPECT_EQ(params.ip_address, cast_sink.cast_data().ip_address);
+ EXPECT_TRUE(cast_channel::CastDeviceCapability::AUDIO_OUT &
+ cast_sink.cast_data().capabilities);
int capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT;
- if (!audio_only)
+ if (!params.audio_only)
capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT;
EXPECT_EQ(capabilities, cast_sink.cast_data().capabilities);
- EXPECT_EQ(channel_id, cast_sink.cast_data().cast_channel_id);
+ EXPECT_EQ(params.channel_id, cast_sink.cast_data().cast_channel_id);
}
} // namespace
@@ -88,7 +131,14 @@ class CastMediaSinkServiceTest : public ::testing::Test {
media_sink_service_(
new CastMediaSinkService(mock_sink_discovered_cb_.Get(),
mock_cast_socket_service_.get())),
- test_dns_sd_registry_(media_sink_service_.get()) {}
+ test_dns_sd_registry_(media_sink_service_.get()) {
+ for (int i = 1; i <= 3; i++) {
+ params_[i] = TestSinkParams(i);
+ services_[i] = CreateDnsService(params_[i]);
+ cast_sinks_[i] = CreateCastSink(params_[i]);
+ dial_sinks_[i] = CreateDialSink(params_[i]);
+ }
+ }
void SetUp() override {
auto mock_timer = base::MakeUnique<base::MockTimer>(
@@ -108,6 +158,12 @@ class CastMediaSinkServiceTest : public ::testing::Test {
MockDnsSdRegistry test_dns_sd_registry_;
base::MockTimer* mock_timer_;
+ TestSinkParams params_[4];
+ DnsSdService services_[4];
+ MediaSinkInternal cast_sinks_[4];
+ MediaSinkInternal dial_sinks_[4];
+ cast_channel::MockCastSocket mock_sockets_[4];
+
DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest);
};
@@ -124,9 +180,10 @@ TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) {
EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_));
media_sink_service_->Stop();
- mock_timer_ =
- new base::MockTimer(true /*retain_user_task*/, false /*is_repeating*/);
- media_sink_service_->SetTimerForTest(base::WrapUnique(mock_timer_));
+ auto mock_timer = base::MakeUnique<base::MockTimer>(true /*retain_user_task*/,
+ false /*is_repeating*/);
+ mock_timer_ = mock_timer.get();
+ media_sink_service_->SetTimerForTest(std::move(mock_timer));
media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
media_sink_service_->Start();
EXPECT_TRUE(mock_timer_->IsRunning());
@@ -147,163 +204,243 @@ TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) {
}
TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) {
- DnsSdService service = CreateDnsService(1);
- cast_channel::MockCastSocket socket;
EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
- .WillOnce(Return(&socket));
+ .WillOnce(Return(&mock_sockets_[1]));
- media_sink_service_->current_services_.push_back(service);
+ media_sink_service_->current_service_ip_endpoints_.insert(
+ params_[1].ip_endpoint);
media_sink_service_->OnChannelOpenedOnIOThread(
- service, 1, cast_channel::ChannelError::NONE);
- // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread.
- base::RunLoop().RunUntilIdle();
+ cast_sinks_[1], 1, cast_channel::ChannelError::NONE);
- // Verify sink content
- EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
- for (const auto& sink_it : media_sink_service_->current_sinks_)
- VerifyMediaSinkInternal(sink_it, service, 1, false);
+ // Verify sink content.
+ EXPECT_EQ(1u, media_sink_service_->current_sinks_by_mdns_.size());
+ for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_)
+ EXPECT_EQ(cast_sinks_[1], sink_it.second);
}
TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) {
- DnsSdService service1 = CreateDnsService(1);
- DnsSdService service2 = CreateDnsService(2);
- DnsSdService service3 = CreateDnsService(3);
-
- cast_channel::MockCastSocket socket2;
- cast_channel::MockCastSocket socket3;
// Fail to open channel 1.
EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
.WillOnce(Return(nullptr));
EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
- .WillOnce(Return(&socket2));
+ .WillOnce(Return(&mock_sockets_[2]));
EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3))
- .WillOnce(Return(&socket2));
+ .WillOnce(Return(&mock_sockets_[3]));
// Current round of Dns discovery finds service1 and service 2.
- media_sink_service_->current_services_.push_back(service1);
- media_sink_service_->current_services_.push_back(service2);
+ media_sink_service_->current_service_ip_endpoints_.insert(
+ params_[1].ip_endpoint);
+ media_sink_service_->current_service_ip_endpoints_.insert(
+ params_[2].ip_endpoint);
media_sink_service_->OnChannelOpenedOnIOThread(
- service1, 1, cast_channel::ChannelError::NONE);
+ cast_sinks_[1], 1, cast_channel::ChannelError::NONE);
media_sink_service_->OnChannelOpenedOnIOThread(
- service2, 2, cast_channel::ChannelError::NONE);
+ cast_sinks_[2], 2, cast_channel::ChannelError::NONE);
media_sink_service_->OnChannelOpenedOnIOThread(
- service3, 3, cast_channel::ChannelError::NONE);
- // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread.
- base::RunLoop().RunUntilIdle();
+ cast_sinks_[3], 3, cast_channel::ChannelError::NONE);
- // Verify sink content
- EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
- for (const auto& sink_it : media_sink_service_->current_sinks_)
- VerifyMediaSinkInternal(sink_it, service2, 2, false);
+ // Verify sink content.
+ EXPECT_EQ(1u, media_sink_service_->current_sinks_by_mdns_.size());
+ for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_)
+ EXPECT_EQ(cast_sinks_[2], sink_it.second);
}
TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) {
- DnsSdService service1 = CreateDnsService(1);
- DnsSdService service2 = CreateDnsService(2);
- net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
- net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
-
// Add dns services.
- DnsSdRegistry::DnsSdServiceList service_list{service1, service2};
+ DnsSdRegistry::DnsSdServiceList service_list{services_[1], services_[2]};
+
+ // Channel 1, 2 opened.
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[1].ip_endpoint, _, _, _))
+ .WillOnce(DoAll(
+ WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
+ std::move(callback).Run(1, ChannelError::NONE);
+ })),
+ Return(1)));
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[2].ip_endpoint, _, _, _))
+ .WillOnce(DoAll(
+ WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
+ std::move(callback).Run(2, ChannelError::NONE);
+ })),
+ Return(2)));
- cast_channel::CastSocket::OnOpenCallback callback1;
- cast_channel::CastSocket::OnOpenCallback callback2;
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _))
- .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1)));
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _))
- .WillOnce(DoAll(SaveArg<2>(&callback2), Return(2)));
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+ .WillOnce(Return(&mock_sockets_[1]));
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
+ .WillOnce(Return(&mock_sockets_[2]));
// Invoke CastSocketService::OpenSocket on the IO thread.
media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
service_list);
base::RunLoop().RunUntilIdle();
- cast_channel::MockCastSocket socket1;
- cast_channel::MockCastSocket socket2;
-
- EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
- .WillOnce(Return(&socket1));
- EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
- .WillOnce(Return(&socket2));
-
- callback1.Run(1, cast_channel::ChannelError::NONE);
- callback2.Run(2, cast_channel::ChannelError::NONE);
-
- // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread.
- base::RunLoop().RunUntilIdle();
- // Verify sink content
- EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_.size());
+ // Verify sink content.
+ EXPECT_EQ(2u, media_sink_service_->current_sinks_by_mdns_.size());
}
TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) {
- DnsSdService service1 = CreateDnsService(1);
- DnsSdService service2 = CreateDnsService(2);
- DnsSdService service3 = CreateDnsService(3);
- net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
- net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
- net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
-
// 1st round finds service 1 & 2.
- DnsSdRegistry::DnsSdServiceList service_list1{service1, service2};
+ DnsSdRegistry::DnsSdServiceList service_list1{services_[1], services_[2]};
media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
service_list1);
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _));
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
- base::RunLoop().RunUntilIdle();
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+ .WillOnce(Return(&mock_sockets_[1]));
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
+ .WillOnce(Return(&mock_sockets_[2]));
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3))
+ .WillOnce(Return(&mock_sockets_[3]));
// Channel 2 opened.
- media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false);
+ CastSocket::OnOpenCallback callback1;
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[1].ip_endpoint, _, _, _))
+ .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1)));
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[2].ip_endpoint, _, _, _))
+ .WillOnce(DoAll(
+ WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
+ std::move(callback).Run(2, ChannelError::NONE);
+ })),
+ Return(2)));
+ // Open cast channels on the IO thread.
+ base::RunLoop().RunUntilIdle();
// 2nd round finds service 2 & 3.
- DnsSdRegistry::DnsSdServiceList service_list2{service2, service3};
+ DnsSdRegistry::DnsSdServiceList service_list2{services_[2], services_[3]};
media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
service_list2);
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint3, _, _, _));
+ // Channel 3 opened.
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[2].ip_endpoint, _, _, _));
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[3].ip_endpoint, _, _, _))
+ .WillOnce(DoAll(
+ WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
+ std::move(callback).Run(3, ChannelError::NONE);
+ })),
+ Return(3)));
+ // Open cast channels on the IO thread.
base::RunLoop().RunUntilIdle();
- // Channel 1 and 3 opened.
- media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false);
- media_sink_service_->OnChannelOpenedOnUIThread(service3, 3, false);
+ // Channel 1 opened.
+ callback1.Run(1, ChannelError::NONE);
- EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
- for (const auto& sink_it : media_sink_service_->current_sinks_)
- VerifyMediaSinkInternal(sink_it, service3, 3, false);
+ // Verify sink content.
+ EXPECT_EQ(1u, media_sink_service_->current_sinks_by_mdns_.size());
+ for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_)
+ VerifyMediaSinkInternal(sink_it.second, params_[3]);
}
TEST_F(CastMediaSinkServiceTest, TestTimer) {
- DnsSdService service1 = CreateDnsService(1);
- DnsSdService service2 = CreateDnsService(2);
- net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
- net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
-
EXPECT_FALSE(mock_timer_->IsRunning());
+
// finds service 1 & 2.
- DnsSdRegistry::DnsSdServiceList service_list1{service1, service2};
+ DnsSdRegistry::DnsSdServiceList service_list1{services_[1], services_[2]};
media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
service_list1);
+ EXPECT_TRUE(mock_timer_->IsRunning());
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _));
- EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[1].ip_endpoint, _, _, _));
+ EXPECT_CALL(*mock_cast_socket_service_,
+ OpenSocket(params_[2].ip_endpoint, _, _, _));
+ // Open sockets on the IO thread.
base::RunLoop().RunUntilIdle();
// Channel 2 is opened.
- media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false);
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
+ .WillOnce(Return(&mock_sockets_[2]));
+
+ media_sink_service_->OnChannelOpenedOnIOThread(cast_sinks_[2], 2,
+ ChannelError::NONE);
+ base::RunLoop().RunUntilIdle();
std::vector<MediaSinkInternal> sinks;
EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks));
// Fire timer.
mock_timer_->Fire();
- EXPECT_EQ(size_t(1), sinks.size());
- VerifyMediaSinkInternal(sinks[0], service2, 2, false);
+ base::RunLoop().RunUntilIdle();
EXPECT_FALSE(mock_timer_->IsRunning());
+ EXPECT_EQ(1u, sinks.size());
+ VerifyMediaSinkInternal(sinks[0], params_[2]);
+
// Channel 1 is opened and timer is restarted.
- media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false);
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+ .WillOnce(Return(&mock_sockets_[1]));
+
+ media_sink_service_->OnChannelOpenedOnIOThread(cast_sinks_[1], 1,
+ ChannelError::NONE);
+ base::RunLoop().RunUntilIdle();
EXPECT_TRUE(mock_timer_->IsRunning());
}
+TEST_F(CastMediaSinkServiceTest, TestOnDialSinkAdded) {
+ net::IPEndPoint ip_endpoint1(params_[1].ip_address,
+ CastMediaSinkService::kCastControlPort);
+ net::IPEndPoint ip_endpoint2(params_[2].ip_address,
+ CastMediaSinkService::kCastControlPort);
+
+ // Channel 1, 2 opened.
+ EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _))
+ .WillOnce(DoAll(
+ WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
+ std::move(callback).Run(1, ChannelError::NONE);
+ })),
+ Return(1)));
+ EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _))
+ .WillOnce(DoAll(
+ WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
+ std::move(callback).Run(2, ChannelError::NONE);
+ })),
+ Return(2)));
+
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+ .WillOnce(Return(&mock_sockets_[1]));
+ EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
+ .WillOnce(Return(&mock_sockets_[2]));
+
+ // Invoke CastSocketService::OpenSocket on the IO thread.
+ media_sink_service_->OnDialSinkAdded(dial_sinks_[1]);
+ base::RunLoop().RunUntilIdle();
+
+ // Invoke CastSocketService::OpenSocket on the IO thread.
+ media_sink_service_->OnDialSinkAdded(dial_sinks_[2]);
+ base::RunLoop().RunUntilIdle();
+ // Verify sink content.
+ EXPECT_EQ(2u, media_sink_service_->current_sinks_by_dial_.size());
+}
+
+TEST_F(CastMediaSinkServiceTest, TestOnFetchCompleted) {
+ std::vector<MediaSinkInternal> sinks;
+ EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks));
+
+ // Cast sink 1, 2 from mDNS discovery
+ media_sink_service_->current_sinks_by_mdns_[params_[1].ip_endpoint] =
+ cast_sinks_[1];
+ media_sink_service_->current_sinks_by_mdns_[params_[2].ip_endpoint] =
+ cast_sinks_[2];
+ // Cast sink 2, 3 from dial discovery
+ auto extra_data = cast_sinks_[2].cast_data();
+ extra_data.discovered_by_dial = true;
+ extra_data.model_name += " dial";
+
+ media_sink_service_->current_sinks_by_dial_[params_[2].ip_endpoint] =
+ cast_sinks_[2];
+ media_sink_service_->current_sinks_by_dial_[params_[3].ip_endpoint] =
+ cast_sinks_[3];
+
+ // Callback returns Cast sink 1, 2, 3
+ media_sink_service_->OnFetchCompleted();
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[1]));
+ EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[2]));
+ EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[3]));
+}
+
} // namespace media_router

Powered by Google App Engine
This is Rietveld 408576698