1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
media / cdm / external_clear_key_test_helper.cc [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/cdm/external_clear_key_test_helper.h"
#include "base/debug/leak_annotations.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/native_library.h"
#include "base/path_service.h"
#include "build/build_config.h"
#include "media/cdm/api/content_decryption_module.h"
#include "media/cdm/cdm_paths.h"
#include "media/cdm/clear_key_cdm_common.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
// INITIALIZE_CDM_MODULE is a macro in api/content_decryption_module.h.
// However, we need to pass it as a string to GetFunctionPointer() once it
// is expanded.
#define STRINGIFY(X) #X
#define MAKE_STRING(X) STRINGIFY(X)
ExternalClearKeyTestHelper::ExternalClearKeyTestHelper() {
LoadLibrary();
}
ExternalClearKeyTestHelper::~ExternalClearKeyTestHelper() {
UnloadLibrary();
}
void ExternalClearKeyTestHelper::LoadLibrary() {
// Determine the location of the CDM. It is expected to be in the same
// directory as the current module.
base::FilePath cdm_base_path;
ASSERT_TRUE(base::PathService::Get(base::DIR_ASSETS, &cdm_base_path));
cdm_base_path = cdm_base_path.Append(
GetPlatformSpecificDirectory(kClearKeyCdmBaseDirectory));
library_path_ = cdm_base_path.AppendASCII(
base::GetLoadableModuleName(kClearKeyCdmLibraryName));
ASSERT_TRUE(base::PathExists(library_path_)) << library_path_.value();
// Now load the CDM library.
library_ = base::ScopedNativeLibrary(library_path_);
ASSERT_TRUE(library_.is_valid()) << library_.GetError()->ToString();
// Call INITIALIZE_CDM_MODULE()
typedef void (*InitializeCdmFunc)();
InitializeCdmFunc initialize_cdm_func = reinterpret_cast<InitializeCdmFunc>(
library_.GetFunctionPointer(MAKE_STRING(INITIALIZE_CDM_MODULE)));
ASSERT_TRUE(initialize_cdm_func) << "No INITIALIZE_CDM_MODULE in library";
// Loading and unloading this library leaks all static allocations; previously
// these were suppressed by a similar annotation in base::LazyInstance. With
// the switch to thread-safe statics, we lost the annotation.
//
// TODO(xhwang): Investigate if we are actually leaking memory during the
// normal process by which Chrome uses this library. http://crbug.com/691132.
ANNOTATE_SCOPED_MEMORY_LEAK;
initialize_cdm_func();
}
void ExternalClearKeyTestHelper::UnloadLibrary() {
// Call DeinitializeCdmModule()
typedef void (*DeinitializeCdmFunc)();
DeinitializeCdmFunc deinitialize_cdm_func =
reinterpret_cast<DeinitializeCdmFunc>(
library_.GetFunctionPointer("DeinitializeCdmModule"));
ASSERT_TRUE(deinitialize_cdm_func) << "No DeinitializeCdmModule() in library";
deinitialize_cdm_func();
}
} // namespace media