From d8f3c17e8da2679a74e4433d49c0c4a832743ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20H=C3=B6glund?= Date: Wed, 26 Sep 2018 14:39:17 +0200 Subject: [PATCH] Added test dependency factory. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: b/113654555 Change-Id: I6879d0e7dcbfbb04ad7a5179c4f4fbe8d31cf3d4 Reviewed-on: https://webrtc-review.googlesource.com/101601 Commit-Queue: Patrik Höglund Reviewed-by: Stefan Holmer Cr-Commit-Position: refs/heads/master@{#24855} --- api/BUILD.gn | 18 ++++++++++ api/test/test_dependency_factory.cc | 50 +++++++++++++++++++++++++++ api/test/test_dependency_factory.h | 49 ++++++++++++++++++++++++++ api/test/video_quality_test_fixture.h | 1 + video/BUILD.gn | 2 ++ video/full_stack_tests.cc | 6 +++- 6 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 api/test/test_dependency_factory.cc create mode 100644 api/test/test_dependency_factory.h diff --git a/api/BUILD.gn b/api/BUILD.gn index a267894588..007879b066 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -139,6 +139,7 @@ rtc_source_set("video_quality_test_fixture_api") { "test/video_quality_test_fixture.h", ] deps = [ + ":fec_controller_api", ":libjingle_peerconnection_api", ":simulated_network_api", "../call:fake_network", @@ -153,6 +154,23 @@ rtc_source_set("video_quality_test_fixture_api") { } } +rtc_source_set("test_dependency_factory") { + visibility = [ "*" ] + testonly = true + sources = [ + "test/test_dependency_factory.cc", + "test/test_dependency_factory.h", + ] + deps = [ + ":video_quality_test_fixture_api", + "../rtc_base:thread_checker", + ] + if (!build_with_chromium && is_clang) { + # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163). + suppressed_configs += [ "//build/config/clang:find_bad_constructs" ] + } +} + if (rtc_include_tests) { rtc_source_set("create_video_quality_test_fixture_api") { visibility = [ "*" ] diff --git a/api/test/test_dependency_factory.cc b/api/test/test_dependency_factory.cc new file mode 100644 index 0000000000..3e59bc095c --- /dev/null +++ b/api/test/test_dependency_factory.cc @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include +#include + +#include "api/test/test_dependency_factory.h" +#include "rtc_base/thread_checker.h" + +namespace webrtc { + +// This checks everything in this file gets called on the same thread. It's +// static because it needs to look at the static methods too. +rtc::ThreadChecker* GetThreadChecker() { + static rtc::ThreadChecker checker; + return &checker; +} + +std::unique_ptr TestDependencyFactory::instance_ = + nullptr; + +const TestDependencyFactory& TestDependencyFactory::GetInstance() { + RTC_DCHECK(GetThreadChecker()->CalledOnValidThread()); + if (instance_ == nullptr) { + instance_ = absl::make_unique(); + } + return *instance_; +} + +void TestDependencyFactory::SetInstance( + std::unique_ptr instance) { + RTC_DCHECK(GetThreadChecker()->CalledOnValidThread()); + RTC_CHECK(instance_ == nullptr); + instance_ = std::move(instance); +} + +std::unique_ptr +TestDependencyFactory::CreateComponents() const { + RTC_DCHECK(GetThreadChecker()->CalledOnValidThread()); + return nullptr; +} + +} // namespace webrtc diff --git a/api/test/test_dependency_factory.h b/api/test/test_dependency_factory.h new file mode 100644 index 0000000000..ac2dd70451 --- /dev/null +++ b/api/test/test_dependency_factory.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef API_TEST_TEST_DEPENDENCY_FACTORY_H_ +#define API_TEST_TEST_DEPENDENCY_FACTORY_H_ + +#include + +#include "api/test/video_quality_test_fixture.h" +#include "rtc_base/thread_checker.h" + +namespace webrtc { + +// Override this class if to inject custom components into WebRTC tests. +// Not all WebRTC tests get their components from here, so you need to make +// sure the tests you want actually use this class. +// +// This class is not thread safe and you need to make call calls from the same +// (test main) thread. +class TestDependencyFactory { + public: + virtual ~TestDependencyFactory() = default; + + // The singleton MUST be stateless since tests execute in any order. It must + // be set before tests start executing. + static const TestDependencyFactory& GetInstance(); + static void SetInstance(std::unique_ptr instance); + + // Returns the component a test should use. Returning nullptr means that the + // test is free to use whatever defaults it wants. The injection components + // themselves can be mutable, but we need to make new ones for every test that + // executes so state doesn't spread between tests. + virtual std::unique_ptr + CreateComponents() const; + + private: + static std::unique_ptr instance_; +}; + +} // namespace webrtc + +#endif // API_TEST_TEST_DEPENDENCY_FACTORY_H_ diff --git a/api/test/video_quality_test_fixture.h b/api/test/video_quality_test_fixture.h index 99451f9ee8..5ec77137ae 100644 --- a/api/test/video_quality_test_fixture.h +++ b/api/test/video_quality_test_fixture.h @@ -17,6 +17,7 @@ #include #include "api/bitrate_constraints.h" +#include "api/fec_controller.h" #include "api/mediatypes.h" #include "api/test/simulated_network.h" #include "api/video_codecs/video_encoder_config.h" diff --git a/video/BUILD.gn b/video/BUILD.gn index a01f6ecfe2..cecdd38ad3 100644 --- a/video/BUILD.gn +++ b/video/BUILD.gn @@ -207,6 +207,7 @@ if (rtc_include_tests) { ] deps = [ "../api:fec_controller_api", + "../api:test_dependency_factory", "../api:video_quality_test_fixture_api", "../call:fake_network", "../call:simulated_network", @@ -252,6 +253,7 @@ if (rtc_include_tests) { ] deps = [ ":video_quality_test", + "../api:test_dependency_factory", "../media:rtc_vp9_profile", "../modules/pacing:pacing", "../modules/video_coding:webrtc_vp9", diff --git a/video/full_stack_tests.cc b/video/full_stack_tests.cc index 32625128b6..382440fa78 100644 --- a/video/full_stack_tests.cc +++ b/video/full_stack_tests.cc @@ -9,6 +9,7 @@ */ #include +#include "api/test/test_dependency_factory.h" #include "media/base/vp9_profile.h" #include "modules/video_coding/codecs/vp9/include/vp9.h" #include "rtc_base/experiments/alr_experiment.h" @@ -63,7 +64,10 @@ struct ParamsWithLogging : public VideoQualityTest::Params { std::unique_ptr CreateVideoQualityTestFixture() { - return absl::make_unique(nullptr); + // The components will normally be nullptr (= use defaults), but it's possible + // for external test runners to override the list of injected components. + auto components = TestDependencyFactory::GetInstance().CreateComponents(); + return absl::make_unique(std::move(components)); } // Takes the current active field trials set, and appends some new trials.