Chromium Code Reviews| Index: chrome/browser/media/router/discovery/dial/dial_media_sink_service_unittest.cc |
| diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..3e0374cf210df12052cd583b77c5b16106215f77 |
| --- /dev/null |
| +++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_unittest.cc |
| @@ -0,0 +1,187 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/media/router/discovery/dial/dial_media_sink_service.h" |
| +#include "base/test/mock_callback.h" |
|
mark a. foltz
2017/04/25 21:06:26
Are these #includes in the right order?
zhaobin
2017/04/26 18:50:05
Done.
|
| +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" |
| +#include "chrome/browser/media/router/discovery/dial/dial_registry.h" |
| +#include "chrome/browser/media/router/discovery/dial/mock_device_description_service.h" |
| +#include "chrome/browser/media/router/test_helper.h" |
| +#include "chrome/common/media_router/discovery/media_sink_internal_unittest.h" |
| +#include "chrome/test/base/testing_profile.h" |
| +#include "content/public/test/test_browser_thread_bundle.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using ::testing::_; |
| +using ::testing::Return; |
| + |
| +namespace media_router { |
| + |
| +class TestDialRegistry : public DialRegistry { |
| + public: |
| + TestDialRegistry() {} |
| + ~TestDialRegistry() {} |
| + |
| + MOCK_METHOD1(RegisterObserver, void(DialRegistry::Observer* observer)); |
| + MOCK_METHOD1(UnregisterObserver, void(DialRegistry::Observer* observer)); |
| +}; |
| + |
| +class TestDialMediaSinkService : public DialMediaSinkService { |
| + public: |
| + TestDialMediaSinkService( |
| + const MediaSinkService::OnSinksDiscoveredCallback& callback, |
| + content::BrowserContext* browser_context, |
| + TestDialRegistry* test_dial_registry, |
| + MockDeviceDescriptionService* mock_description_service) |
| + : DialMediaSinkService(callback, browser_context), |
| + test_dial_registry_(test_dial_registry), |
| + mock_description_service_(mock_description_service) {} |
| + |
| + DialRegistry* dial_registry() override { return test_dial_registry_; } |
| + |
| + DeviceDescriptionService* GetDescriptionService() override { |
| + return mock_description_service_; |
| + } |
| + |
| + private: |
| + TestDialRegistry* test_dial_registry_; |
| + MockDeviceDescriptionService* mock_description_service_; |
| +}; |
| + |
| +class DialMediaSinkServiceTest : public ::testing::Test { |
| + public: |
| + DialMediaSinkServiceTest() |
| + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), |
| + mock_description_service_(mock_success_cb_.Get(), mock_error_cb_.Get()), |
| + media_sink_service_(mock_sink_discovered_cb_.Get(), |
| + &profile_, |
| + &test_dial_registry_, |
| + &mock_description_service_) {} |
| + |
| + DialMediaSinkService* media_sink_service() { return &media_sink_service_; } |
| + |
| + std::vector<MediaSinkInternal> CreateDialMediaSinks() { |
|
mark a. foltz
2017/04/25 21:06:26
Similar comment about moving test data factory cod
zhaobin
2017/04/26 18:50:05
Done.
|
| + MediaSink sink1("sink1", "sink_name_1", MediaSink::IconType::CAST); |
| + DialSinkExtraData extra_data1 = |
| + MediaSinkInternalTest::CreateDialSinkExtraData( |
| + "model_name1", "192.168.1.1", "https://example1.com"); |
| + |
| + MediaSink sink2("sink2", "sink_name_2", MediaSink::IconType::CAST); |
| + DialSinkExtraData extra_data2 = |
| + MediaSinkInternalTest::CreateDialSinkExtraData( |
| + "model_name2", "192.168.1.2", "https://example2.com"); |
| + |
| + std::vector<MediaSinkInternal> sinks; |
| + sinks.push_back(MediaSinkInternal(sink1, extra_data1)); |
| + sinks.push_back(MediaSinkInternal(sink2, extra_data2)); |
| + return sinks; |
| + } |
| + |
| + void TestFetchCompleted(const std::vector<MediaSinkInternal>& old_sinks, |
| + const std::vector<MediaSinkInternal>& new_sinks) { |
| + media_sink_service()->mrp_sinks_ = |
| + std::set<MediaSinkInternal>(old_sinks.begin(), old_sinks.end()); |
| + media_sink_service()->current_sinks_ = |
| + std::set<MediaSinkInternal>(new_sinks.begin(), new_sinks.end()); |
| + EXPECT_CALL(mock_sink_discovered_cb_, Run(new_sinks)); |
| + media_sink_service()->OnFetchCompleted(); |
| + } |
| + |
| + protected: |
| + const content::TestBrowserThreadBundle thread_bundle_; |
| + TestingProfile profile_; |
| + |
| + base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback> |
| + mock_sink_discovered_cb_; |
| + base::MockCallback< |
| + MockDeviceDescriptionService::DeviceDescriptionParseSuccessCallback> |
| + mock_success_cb_; |
| + base::MockCallback< |
| + MockDeviceDescriptionService::DeviceDescriptionParseErrorCallback> |
| + mock_error_cb_; |
| + |
| + TestDialRegistry test_dial_registry_; |
| + MockDeviceDescriptionService mock_description_service_; |
| + |
| + TestDialMediaSinkService media_sink_service_; |
| +}; |
| + |
| +TEST_F(DialMediaSinkServiceTest, TestStart) { |
| + EXPECT_CALL(test_dial_registry_, RegisterObserver(&media_sink_service_)); |
| + media_sink_service()->Start(); |
| + |
| + DialRegistry::DeviceList deviceList; |
| + DialDeviceData first_device("first", GURL("http://127.0.0.1/dd.xml"), |
| + base::Time::Now()); |
| + DialDeviceData second_device("second", GURL("http://127.0.0.2/dd.xml"), |
| + base::Time::Now()); |
| + DialDeviceData third_device("third", GURL("http://127.0.0.3/dd.xml"), |
| + base::Time::Now()); |
| + deviceList.push_back(first_device); |
| + deviceList.push_back(second_device); |
| + deviceList.push_back(third_device); |
| + |
| + EXPECT_CALL(mock_description_service_, GetDeviceDescriptions(deviceList, _)); |
| + |
| + media_sink_service()->OnDialDeviceEvent(deviceList); |
| + EXPECT_TRUE(media_sink_service_.finish_timer_->IsRunning()); |
| +} |
| + |
| +TEST_F(DialMediaSinkServiceTest, TestFetchCompleted) { |
| + std::vector<MediaSinkInternal> old_sinks; |
| + std::vector<MediaSinkInternal> new_sinks = CreateDialMediaSinks(); |
| + TestFetchCompleted(old_sinks, new_sinks); |
| + |
| + // Same sink |
| + EXPECT_CALL(mock_sink_discovered_cb_, Run(new_sinks)).Times(0); |
| + media_sink_service()->OnFetchCompleted(); |
| +} |
| + |
| +TEST_F(DialMediaSinkServiceTest, TestFetchCompleted_OneNewSink) { |
| + std::vector<MediaSinkInternal> old_sinks = CreateDialMediaSinks(); |
| + std::vector<MediaSinkInternal> new_sinks = CreateDialMediaSinks(); |
| + MediaSink sink3("sink3", "sink_name_3", MediaSink::IconType::CAST); |
| + DialSinkExtraData extra_data3 = |
| + MediaSinkInternalTest::CreateDialSinkExtraData( |
| + "model_name3", "192.168.1.3", "https://example3.com"); |
| + new_sinks.push_back(MediaSinkInternal(sink3, extra_data3)); |
| + TestFetchCompleted(old_sinks, new_sinks); |
| +} |
| + |
| +TEST_F(DialMediaSinkServiceTest, TestFetchCompleted_RemovedOneSink) { |
| + std::vector<MediaSinkInternal> old_sinks = CreateDialMediaSinks(); |
| + std::vector<MediaSinkInternal> new_sinks = CreateDialMediaSinks(); |
| + new_sinks.erase(new_sinks.begin()); |
| + TestFetchCompleted(old_sinks, new_sinks); |
| +} |
| + |
| +TEST_F(DialMediaSinkServiceTest, TestFetchCompleted_UpdatedOneSink) { |
| + std::vector<MediaSinkInternal> old_sinks = CreateDialMediaSinks(); |
| + std::vector<MediaSinkInternal> new_sinks = CreateDialMediaSinks(); |
| + new_sinks[0].set_name("sink_name_4"); |
| + TestFetchCompleted(old_sinks, new_sinks); |
| +} |
| + |
| +TEST_F(DialMediaSinkServiceTest, TestFetchCompleted_Mixed) { |
| + std::vector<MediaSinkInternal> old_sinks = CreateDialMediaSinks(); |
| + |
| + MediaSink sink1("sink1", "sink_name_1", MediaSink::IconType::CAST); |
| + DialSinkExtraData extra_data2 = |
| + MediaSinkInternalTest::CreateDialSinkExtraData( |
| + "model_name2", "192.168.1.2", "https://example2.com"); |
| + |
| + MediaSink sink3("sink3", "sink_name_3", MediaSink::IconType::CAST); |
| + DialSinkExtraData extra_data3 = |
| + MediaSinkInternalTest::CreateDialSinkExtraData( |
| + "model_name3", "192.168.1.3", "https://example3.com"); |
| + |
| + std::vector<MediaSinkInternal> new_sinks; |
| + new_sinks.push_back(MediaSinkInternal(sink1, extra_data2)); |
| + new_sinks.push_back(MediaSinkInternal(sink3, extra_data3)); |
| + |
| + TestFetchCompleted(old_sinks, new_sinks); |
| +} |
| + |
| +} // namespace media_router |