// 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 #include "base/bind.h" #include "media/base/overlay_info.h" #include "media/base/renderer_factory_selector.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { class RendererFactorySelectorTest : public testing::Test { public: class FakeFactory : public RendererFactory { public: explicit FakeFactory(RendererType type) : type_(type) {} std::unique_ptr CreateRenderer( const scoped_refptr& media_task_runner, const scoped_refptr& worker_task_runner, AudioRendererSink* audio_renderer_sink, VideoRendererSink* video_renderer_sink, RequestOverlayInfoCB request_overlay_info_cb, const gfx::ColorSpace& target_color_space) override { return nullptr; } RendererType factory_type() { return type_; } private: RendererType type_; }; RendererFactorySelectorTest() = default; RendererFactorySelectorTest(const RendererFactorySelectorTest&) = delete; RendererFactorySelectorTest& operator=(const RendererFactorySelectorTest&) = delete; void AddBaseFactory(RendererType type) { selector_.AddBaseFactory(type, std::make_unique(type)); } void AddFactory(RendererType type) { selector_.AddFactory(type, std::make_unique(type)); } void AddConditionalFactory(RendererType type) { condition_met_map_[type] = false; selector_.AddConditionalFactory( type, std::make_unique(type), base::BindRepeating(&RendererFactorySelectorTest::IsConditionMet, base::Unretained(this), type)); } RendererType GetCurrentlySelectedRendererType() { return reinterpret_cast(selector_.GetCurrentFactory()) ->factory_type(); } bool IsConditionMet(RendererType type) { DCHECK(condition_met_map_.count(type)); return condition_met_map_[type]; } protected: RendererFactorySelector selector_; std::map condition_met_map_; }; TEST_F(RendererFactorySelectorTest, SingleFactory) { AddBaseFactory(RendererType::kDefault); EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType()); } TEST_F(RendererFactorySelectorTest, MultipleFactory) { AddBaseFactory(RendererType::kDefault); AddFactory(RendererType::kMojo); EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType()); selector_.SetBaseRendererType(RendererType::kMojo); EXPECT_EQ(RendererType::kMojo, GetCurrentlySelectedRendererType()); } TEST_F(RendererFactorySelectorTest, ConditionalFactory) { AddBaseFactory(RendererType::kDefault); AddFactory(RendererType::kMojo); AddConditionalFactory(RendererType::kCourier); EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType()); condition_met_map_[RendererType::kCourier] = true; EXPECT_EQ(RendererType::kCourier, GetCurrentlySelectedRendererType()); selector_.SetBaseRendererType(RendererType::kMojo); EXPECT_EQ(RendererType::kCourier, GetCurrentlySelectedRendererType()); condition_met_map_[RendererType::kCourier] = false; EXPECT_EQ(RendererType::kMojo, GetCurrentlySelectedRendererType()); } TEST_F(RendererFactorySelectorTest, MultipleConditionalFactories) { AddBaseFactory(RendererType::kDefault); AddConditionalFactory(RendererType::kFlinging); AddConditionalFactory(RendererType::kCourier); EXPECT_EQ(RendererType::kDefault, GetCurrentlySelectedRendererType()); condition_met_map_[RendererType::kFlinging] = false; condition_met_map_[RendererType::kCourier] = true; EXPECT_EQ(RendererType::kCourier, GetCurrentlySelectedRendererType()); condition_met_map_[RendererType::kFlinging] = true; condition_met_map_[RendererType::kCourier] = false; EXPECT_EQ(RendererType::kFlinging, GetCurrentlySelectedRendererType()); // It's up to the implementation detail to decide which one to use. condition_met_map_[RendererType::kFlinging] = true; condition_met_map_[RendererType::kCourier] = true; EXPECT_TRUE(GetCurrentlySelectedRendererType() == RendererType::kFlinging || GetCurrentlySelectedRendererType() == RendererType::kCourier); } } // namespace media