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
This commit is contained in:
John "Juce" Bruce
2022-06-17 15:51:14 -07:00
parent f558ae4244
commit 0890fae039
10 changed files with 43 additions and 12 deletions

View File

@@ -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<EngineMetrics> engine_metrics(new EngineMetrics);
test_cdm_metrics_engine_.reset(
new CdmEngineMetricsImpl<StrictMock<MockCdmEngineImpl>>(

View File

@@ -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_

View File

@@ -4,8 +4,10 @@
#include <gtest/gtest.h>
#include <chrono>
#include <memory>
#include <thread>
#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<wvutil::FileSystem> file_system(CreateTestFileSystem());
TestCdmEngine cdm_engine(file_system.get(),
std::shared_ptr<EngineMetrics>(new EngineMetrics));
// Remove any existing certificate.
cdm_engine.Unprovision(kSecurityLevelL1);

View File

@@ -10,6 +10,7 @@
#include <sstream>
#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();

View File

@@ -324,12 +324,12 @@ void WvCdmTestBase::Provision() {
std::string cert, wrapped_key;
CdmSessionId session_id;
wvutil::FileSystem file_system;
std::unique_ptr<wvutil::FileSystem> 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<EngineMetrics>(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<EngineMetrics>(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<wvutil::FileSystem> 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<EngineMetrics>(new EngineMetrics));
CdmResponseType status = cdm_engine.OpenSession(config_.key_system(), nullptr,
nullptr, &session_id);

View File

@@ -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<wvutil::FileSystem> file_system_;
std::shared_ptr<metrics::EngineMetrics> dummy_engine_metrics_;
TestCdmEngine cdm_engine_;
};