blob: 88d1c7056936d2e8a9c341e1aefe16238fde0244 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdint.h>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "content/browser/media/cdm_storage_database.h"
#include "media/cdm/cdm_type.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
namespace content {
namespace {
const media::CdmType kCdmType{1234, 5678};
const char kFileName[] = "file.txt";
const char kFileNameTwo[] = "file2.txt";
const std::vector<uint8_t> kPopulatedFileValue = {1, 2, 3};
} // namespace
class CdmStorageDatabaseTest : public testing::Test {
public:
using CdmStorageHostOpenError = CdmStorageHost::CdmStorageHostOpenError;
CdmStorageDatabaseTest() = default;
~CdmStorageDatabaseTest() override = default;
void SetUp() override { ASSERT_TRUE(profile_path_.CreateUniqueTempDir()); }
protected:
const blink::StorageKey kTestStorageKey =
blink::StorageKey::CreateFromStringForTesting("https://example.com/");
const blink::StorageKey kTestStorageKeyTwo =
blink::StorageKey::CreateFromStringForTesting("https://exampletwo.com/");
std::unique_ptr<CdmStorageDatabase> cdm_storage_database_;
void SetUpDatabase(base::FilePath file_path) {
cdm_storage_database_ = std::make_unique<CdmStorageDatabase>(file_path);
}
base::ScopedTempDir profile_path_;
};
// This class is to test for when db_.Open() fails.
class CdmStorageDatabaseInvalidOpenTest : public CdmStorageDatabaseTest {
public:
void SetUp() override {
ASSERT_TRUE(profile_path_.CreateUniqueTempDir());
SetUpDatabase(profile_path_.GetPath());
}
void TearDown() override { ASSERT_TRUE(profile_path_.Delete()); }
};
// This class tests the CdmStorageDatabase when the path is empty.
class CdmStorageDatabaseInMemoryTest : public CdmStorageDatabaseTest {
public:
void SetUp() override { SetUpDatabase(base::FilePath()); }
};
// This class tests the CdmStorageDatabase with the CdmStorage path.
class CdmStorageDatabaseValidPathTest : public CdmStorageDatabaseTest {
public:
void SetUp() override {
ASSERT_TRUE(profile_path_.CreateUniqueTempDir());
const base::FilePath cdm_storage_path =
profile_path_.GetPath().AppendASCII("CdmStorage.db");
SetUpDatabase(cdm_storage_path);
}
void TearDown() override {
cdm_storage_database_->ClearDatabase();
ASSERT_TRUE(profile_path_.Delete());
}
};
TEST_F(CdmStorageDatabaseInvalidOpenTest, EnsureOpenFails) {
auto error = cdm_storage_database_->EnsureOpenForTesting();
// The database cannot be opened in a temporary directory, as it requires to
// be opened at a file, thus we get an SQL open error. We return this as a
// `kDatabaseOpenError`.
EXPECT_EQ(error, CdmStorageHostOpenError::kDatabaseOpenError);
}
TEST_F(CdmStorageDatabaseInMemoryTest, EnsureOpenWithoutErrors) {
auto error = cdm_storage_database_->EnsureOpenForTesting();
EXPECT_EQ(error, CdmStorageHostOpenError::kOk);
}
TEST_F(CdmStorageDatabaseInMemoryTest, FileManipulation) {
// When nothing is written to the database, we return an empty file.
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKey, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_TRUE(
cdm_storage_database_->DeleteFile(kTestStorageKey, kCdmType, kFileName));
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
}
TEST_F(CdmStorageDatabaseInMemoryTest, DeleteDatabase) {
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKey, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->ClearDatabase());
auto error = cdm_storage_database_->EnsureOpenForTesting();
EXPECT_EQ(error, CdmStorageHostOpenError::kOk);
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
}
TEST_F(CdmStorageDatabaseInMemoryTest, DeleteForStorageKey) {
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKey, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->WriteFile(
kTestStorageKey, kCdmType, kFileNameTwo, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKeyTwo, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->WriteFile(
kTestStorageKeyTwo, kCdmType, kFileNameTwo, kPopulatedFileValue));
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileNameTwo),
kPopulatedFileValue);
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_EQ(cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType,
kFileNameTwo),
kPopulatedFileValue);
EXPECT_TRUE(cdm_storage_database_->DeleteDataForStorageKey(kTestStorageKey,
kCdmType));
// Expect that for the storage key, all of the file content returned is empty.
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileNameTwo)
->empty());
// Expect that its not deleted for other storage keys.
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_EQ(cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType,
kFileNameTwo),
kPopulatedFileValue);
}
TEST_F(CdmStorageDatabaseInMemoryTest, DeleteForStorageKeyWithNoData) {
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
// Even if there is no data for the storage key, the SQL statement should
// still run properly.
EXPECT_TRUE(cdm_storage_database_->DeleteDataForStorageKey(kTestStorageKey,
kCdmType));
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
}
TEST_F(CdmStorageDatabaseValidPathTest, EnsureOpenWithoutErrors) {
auto error = cdm_storage_database_->EnsureOpenForTesting();
EXPECT_EQ(error, CdmStorageHostOpenError::kOk);
}
TEST_F(CdmStorageDatabaseValidPathTest, FileManipulation) {
// When nothing is written to the database, we return an empty file.
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKey, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_TRUE(
cdm_storage_database_->DeleteFile(kTestStorageKey, kCdmType, kFileName));
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
}
TEST_F(CdmStorageDatabaseValidPathTest, DeleteDatabase) {
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKey, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->ClearDatabase());
auto error = cdm_storage_database_->EnsureOpenForTesting();
EXPECT_EQ(error, CdmStorageHostOpenError::kOk);
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
}
TEST_F(CdmStorageDatabaseValidPathTest, DeleteForStorageKey) {
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKey, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->WriteFile(
kTestStorageKey, kCdmType, kFileNameTwo, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->WriteFile(kTestStorageKeyTwo, kCdmType,
kFileName, kPopulatedFileValue));
EXPECT_TRUE(cdm_storage_database_->WriteFile(
kTestStorageKeyTwo, kCdmType, kFileNameTwo, kPopulatedFileValue));
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileNameTwo),
kPopulatedFileValue);
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_EQ(cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType,
kFileNameTwo),
kPopulatedFileValue);
EXPECT_TRUE(cdm_storage_database_->DeleteDataForStorageKey(kTestStorageKey,
kCdmType));
// Expect that for the storage key, all of the file content returned is empty.
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileNameTwo)
->empty());
// Expect that its not deleted for other storage keys.
EXPECT_EQ(
cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType, kFileName),
kPopulatedFileValue);
EXPECT_EQ(cdm_storage_database_->ReadFile(kTestStorageKeyTwo, kCdmType,
kFileNameTwo),
kPopulatedFileValue);
}
TEST_F(CdmStorageDatabaseValidPathTest, DeleteForStorageKeyWithNoData) {
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
// Even if there is no data for the storage key, the SQL statement should
// still run properly.
EXPECT_TRUE(cdm_storage_database_->DeleteDataForStorageKey(kTestStorageKey,
kCdmType));
EXPECT_TRUE(
cdm_storage_database_->ReadFile(kTestStorageKey, kCdmType, kFileName)
->empty());
}
} // namespace content