From 0890fae039eaecbe1eed0382a5ff9566c36fd31d Mon Sep 17 00:00:00 2001 From: "John \"Juce\" Bruce" Date: Fri, 17 Jun 2022 15:51:14 -0700 Subject: [PATCH] Create test FileSystems in a platform-specific manner (This is a merge of http://go/wvgerrit/153552.) The correct way to create a FileSystem object for testing CdmEngine depends on the platform. However, our code has historically just instantiated a new FileSystem object using the default constructor. This works fine for Android and has historically worked fine for the CE CDM tests because they did not implement storage correctly. However, an upcoming commit will fix the implementation of storage in the CE CDM TestHost, causing tests that use a default FileSystem constructor to fail. This patch adds a new platform-defined function that instantiates per-origin test storage in a platform-correct way. For Android, it continues to use the default constructor, while for CE CDM, it uses the TestHost. Bug: 193060708 Test: x86-64 w/ storage separated Test: build_and_run_all_unit_tests.sh Change-Id: I0a9b6a4d3943e053d51d6018e392b7f215f50642 --- .../cdm_engine_metrics_decorator_unittest.cpp | 3 ++- .../cdm/core/test/create_test_file_system.h | 15 +++++++++++++++ libwvdrmengine/cdm/core/test/keybox_ota_test.cpp | 6 ++++-- libwvdrmengine/cdm/core/test/reboot_test.cpp | 3 ++- libwvdrmengine/cdm/core/test/test_base.cpp | 10 +++++----- libwvdrmengine/cdm/core/test/test_base.h | 8 +++++--- libwvdrmengine/cdm/test/coverage-test.mk | 1 + .../cdm/test/create_test_file_system.cpp | 7 +++++++ libwvdrmengine/cdm/test/integration-test.mk | 1 + libwvdrmengine/cdm/test/unit-test.mk | 1 + 10 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 libwvdrmengine/cdm/core/test/create_test_file_system.h create mode 100644 libwvdrmengine/cdm/test/create_test_file_system.cpp diff --git a/libwvdrmengine/cdm/core/test/cdm_engine_metrics_decorator_unittest.cpp b/libwvdrmengine/cdm/core/test/cdm_engine_metrics_decorator_unittest.cpp index 8b039cc2..b453235f 100644 --- a/libwvdrmengine/cdm/core/test/cdm_engine_metrics_decorator_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_engine_metrics_decorator_unittest.cpp @@ -13,6 +13,7 @@ #include "cdm_client_property_set.h" #include "cdm_engine.h" +#include "create_test_file_system.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "wv_cdm_event_listener.h" @@ -115,7 +116,7 @@ class MockCdmEngineImpl : public CdmEngine { class WvCdmEngineMetricsImplTest : public ::testing::Test { public: void SetUp() override { - file_system_.reset(new wvutil::FileSystem); + file_system_.reset(CreateTestFileSystem()); std::shared_ptr engine_metrics(new EngineMetrics); test_cdm_metrics_engine_.reset( new CdmEngineMetricsImpl>( diff --git a/libwvdrmengine/cdm/core/test/create_test_file_system.h b/libwvdrmengine/cdm/core/test/create_test_file_system.h new file mode 100644 index 00000000..fbd6505f --- /dev/null +++ b/libwvdrmengine/cdm/core/test/create_test_file_system.h @@ -0,0 +1,15 @@ +// Copyright 2022 Google LLC. All Rights Reserved. This file and proprietary +// source code may only be used and distributed under the Widevine License +// Agreement. + +#ifndef CDM_TEST_CREATE_TEST_FILE_SYSTEM_H_ +#define CDM_TEST_CREATE_TEST_FILE_SYSTEM_H_ + +#include "file_store.h" + +// Create a new FileSystem object that is suitable for using to create a new +// CdmEngine object. How this is implemented is platform-specific. The caller +// owns the returned pointer and is responsible for deleting it. +wvutil::FileSystem* CreateTestFileSystem(); + +#endif // CDM_TEST_CREATE_TEST_FILE_SYSTEM_H_ diff --git a/libwvdrmengine/cdm/core/test/keybox_ota_test.cpp b/libwvdrmengine/cdm/core/test/keybox_ota_test.cpp index 66046417..cc3e1580 100644 --- a/libwvdrmengine/cdm/core/test/keybox_ota_test.cpp +++ b/libwvdrmengine/cdm/core/test/keybox_ota_test.cpp @@ -4,8 +4,10 @@ #include #include +#include #include +#include "create_test_file_system.h" #include "crypto_session.h" #include "properties.h" #include "test_base.h" @@ -95,8 +97,8 @@ TEST_F(CdmOtaKeyboxTest, TestThatTheBuildFilesWork) { ASSERT_TRUE(true); } * should be skipped. */ TEST_F(CdmOtaKeyboxTest, BasicTest) { - wvutil::FileSystem file_system; - TestCdmEngine cdm_engine(&file_system, + std::unique_ptr file_system(CreateTestFileSystem()); + TestCdmEngine cdm_engine(file_system.get(), std::shared_ptr(new EngineMetrics)); // Remove any existing certificate. cdm_engine.Unprovision(kSecurityLevelL1); diff --git a/libwvdrmengine/cdm/core/test/reboot_test.cpp b/libwvdrmengine/cdm/core/test/reboot_test.cpp index 30d60b6f..32950f7b 100644 --- a/libwvdrmengine/cdm/core/test/reboot_test.cpp +++ b/libwvdrmengine/cdm/core/test/reboot_test.cpp @@ -10,6 +10,7 @@ #include +#include "create_test_file_system.h" #include "license_holder.h" #include "log.h" #include "test_sleep.h" @@ -201,7 +202,7 @@ bool RebootTest::ParseDump(const std::string& dump, void RebootTest::SetUp() { WvCdmTestBase::SetUp(); - if (!file_system_) file_system_ = new FileSystem(); + if (!file_system_) file_system_ = CreateTestFileSystem(); const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info(); diff --git a/libwvdrmengine/cdm/core/test/test_base.cpp b/libwvdrmengine/cdm/core/test/test_base.cpp index f2c931eb..51470ace 100644 --- a/libwvdrmengine/cdm/core/test/test_base.cpp +++ b/libwvdrmengine/cdm/core/test/test_base.cpp @@ -324,12 +324,12 @@ void WvCdmTestBase::Provision() { std::string cert, wrapped_key; CdmSessionId session_id; - wvutil::FileSystem file_system; + std::unique_ptr file_system(CreateTestFileSystem()); if (config_.provisioning_server() == "fake") { LOGD("Using fake provisioning server."); - TestCdmEngine cdm_engine(&file_system, + TestCdmEngine cdm_engine(file_system.get(), std::shared_ptr(new EngineMetrics)); FakeProvisioningServer server; CdmResponseType result = cdm_engine.GetProvisioningRequest( @@ -349,7 +349,7 @@ void WvCdmTestBase::Provision() { EXPECT_EQ(NO_ERROR, result); } else { // TODO(fredgc): provision for different SPOIDs. - TestCdmEngine cdm_engine(&file_system, + TestCdmEngine cdm_engine(file_system.get(), std::shared_ptr(new EngineMetrics)); CdmResponseType result = cdm_engine.GetProvisioningRequest( @@ -424,11 +424,11 @@ void WvCdmTestBase::Provision() { // that certificate from the provisioning request. void WvCdmTestBase::EnsureProvisioned() { CdmSessionId session_id; - wvutil::FileSystem file_system; + std::unique_ptr file_system(CreateTestFileSystem()); // OpenSession will check if a DRM certificate exists, while // GenerateKeyRequest will actually load the wrapped private key. // Either may return a NEED_PROVISIONING error, so both have to be checked. - TestCdmEngine cdm_engine(&file_system, + TestCdmEngine cdm_engine(file_system.get(), std::shared_ptr(new EngineMetrics)); CdmResponseType status = cdm_engine.OpenSession(config_.key_system(), nullptr, nullptr, &session_id); diff --git a/libwvdrmengine/cdm/core/test/test_base.h b/libwvdrmengine/cdm/core/test/test_base.h index 68372c3a..9119363e 100644 --- a/libwvdrmengine/cdm/core/test/test_base.h +++ b/libwvdrmengine/cdm/core/test/test_base.h @@ -13,6 +13,7 @@ #include "cdm_engine.h" #include "config_test_env.h" +#include "create_test_file_system.h" #include "crypto_session.h" #include "metrics_collections.h" #include "oemcrypto_types.h" @@ -92,11 +93,12 @@ class TestCdmEngine : public CdmEngine { class WvCdmTestBaseWithEngine : public WvCdmTestBase { public: WvCdmTestBaseWithEngine() - : dummy_engine_metrics_(new metrics::EngineMetrics()), - cdm_engine_(&file_system_, dummy_engine_metrics_) {} + : file_system_(CreateTestFileSystem()), + dummy_engine_metrics_(new metrics::EngineMetrics()), + cdm_engine_(file_system_.get(), dummy_engine_metrics_) {} protected: - wvutil::FileSystem file_system_; + std::unique_ptr file_system_; std::shared_ptr dummy_engine_metrics_; TestCdmEngine cdm_engine_; }; diff --git a/libwvdrmengine/cdm/test/coverage-test.mk b/libwvdrmengine/cdm/test/coverage-test.mk index 0c771811..66102d86 100644 --- a/libwvdrmengine/cdm/test/coverage-test.mk +++ b/libwvdrmengine/cdm/test/coverage-test.mk @@ -19,6 +19,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := \ ./cdm_coverage_main.cpp \ + ./create_test_file_system.cpp \ ../core/test/buffer_reader_test.cpp \ ../core/test/config_test_env.cpp \ ../core/test/device_files_unittest.cpp \ diff --git a/libwvdrmengine/cdm/test/create_test_file_system.cpp b/libwvdrmengine/cdm/test/create_test_file_system.cpp new file mode 100644 index 00000000..926782c5 --- /dev/null +++ b/libwvdrmengine/cdm/test/create_test_file_system.cpp @@ -0,0 +1,7 @@ +// Copyright 2022 Google LLC. All Rights Reserved. This file and proprietary +// source code may only be used and distributed under the Widevine License +// Agreement. + +#include "create_test_file_system.h" + +wvutil::FileSystem* CreateTestFileSystem() { return new wvutil::FileSystem(); } diff --git a/libwvdrmengine/cdm/test/integration-test.mk b/libwvdrmengine/cdm/test/integration-test.mk index 92227ee8..cd9eb659 100644 --- a/libwvdrmengine/cdm/test/integration-test.mk +++ b/libwvdrmengine/cdm/test/integration-test.mk @@ -23,6 +23,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := \ $(test_main) \ $(test_src_dir)/$(test_name).cpp \ + ./create_test_file_system.cpp \ ../core/test/config_test_env.cpp \ ../core/test/fake_provisioning_server.cpp \ ../core/test/http_socket.cpp \ diff --git a/libwvdrmengine/cdm/test/unit-test.mk b/libwvdrmengine/cdm/test/unit-test.mk index 8b099d9c..084f79df 100644 --- a/libwvdrmengine/cdm/test/unit-test.mk +++ b/libwvdrmengine/cdm/test/unit-test.mk @@ -22,6 +22,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := \ $(test_src_dir)/$(test_name).cpp \ + ./create_test_file_system.cpp \ ../core/test/config_test_env.cpp \ ../core/test/fake_provisioning_server.cpp \ ../core/test/http_socket.cpp \