(This is a merge of http://go/wvgerrit/152969.) C++ makes absolutely no guarantees about the order of initialization of global variables in different compilation units. The class-scope static WvCdmTestBase::default_config_ in test_base.cpp invokes the ConfigTestEnv constructor on creation, which depends on the prior initialization of several file-scope static variables in config_test_env.cpp. Since those are different compilation units, there is no guarantee that they will initialize in the correct order to avoid referencing uninitialized memory. This is one of the reasons Google Style really encourages people not to have global-scope variables with complex types. As it happens, on all our internal platforms, these files get linked in such a way that the variables get initialized in the right order and there is no crash. But that's not guaranteed, and some partners have reported crashes here. In at least one case, the "right" linker order was platform-dependent, and the partner ended up having to maintain separate linker orders for separate platforms. This patch defers default_config_ initialization until WvCdmTestBase::Initialize() is called. By that time, all static variables will be initialized, so it will be safe to reference them. Bug: 173252165 Test: x86-64 Test: build_and_run_all_unit_tests.sh Change-Id: If31128a999c7d6945f47293ca57f08e43d8274de
61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
// Copyright 2021 Google LLC. All Rights Reserved. This file and proprietary
|
|
// source code may only be used and distributed under the Widevine License
|
|
// Agreement.
|
|
|
|
#ifndef WVCDM_CORE_REBOOT_TEST_H_
|
|
#define WVCDM_CORE_REBOOT_TEST_H_
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "file_store.h"
|
|
#include "test_base.h"
|
|
|
|
namespace wvcdm {
|
|
class RebootTest : public WvCdmTestBaseWithEngine {
|
|
public:
|
|
// The main test driver may inject the file system for saving persistent test
|
|
// data.
|
|
static void set_file_system(wvutil::FileSystem* file_system) {
|
|
file_system_ = file_system;
|
|
}
|
|
// Dump a map to a std string in an almost human readable way so that the map
|
|
// can be rebuilt using ParseDump below. The keys in the map must be standard
|
|
// identifier strings, which means no special characters or whitespace. By
|
|
// "almost human readable", we mean that a human debugging the dump will be
|
|
// able to find the keys, and see the values if they are printable or see a
|
|
// hex dump of the values if they are not.
|
|
static std::string DumpData(const std::map<std::string, std::string>& data);
|
|
// Parse a dump generated by DumpData and recreate the original data map.
|
|
// Returns true on success.
|
|
static bool ParseDump(const std::string& dump,
|
|
std::map<std::string, std::string>* data);
|
|
|
|
static int test_pass() { return default_config_->test_pass(); }
|
|
|
|
// Load a previously saved time. Returns 0 if the value does not exist or
|
|
// cannot be parsed.
|
|
int64_t LoadTime(const std::string& key);
|
|
// Save a time to persistent storage.
|
|
void SaveTime(const std::string& key, int64_t time);
|
|
|
|
protected:
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
// This is used to store each test's persistent data.
|
|
static wvutil::FileSystem* file_system_;
|
|
|
|
// The persistent data for the current test.
|
|
std::map<std::string, std::string> persistent_data_;
|
|
// Where to store and restore the persistent data for a single test.
|
|
std::string persistent_data_filename_;
|
|
};
|
|
|
|
} // namespace wvcdm
|
|
|
|
#endif // WVCDM_CORE_REBOOT_TEST_H_
|