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 |