blob: 419dd803dec29ad863d6c75c5944d39179496b9a [file] [log] [blame] [edit]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "missive/analytics/metrics_test_util.h"
#include <base/logging.h>
#include <base/memory/scoped_refptr.h>
#include <base/run_loop.h>
#include <base/task/sequenced_task_runner.h>
#include <base/task/single_thread_task_runner.h>
#include <metrics/metrics_library_mock.h>
#include "missive/analytics/metrics.h"
namespace reporting::analytics {
Metrics::TestEnvironment::TestEnvironment() {
InitializeMock();
}
Metrics::TestEnvironment::~TestEnvironment() {
CleanUpMock();
}
// static
void Metrics::TestEnvironment::InitializeMock() {
if (GetMetricsTaskRunner()) {
LOG(ERROR) << "Metrics, either fake or real, already initialized or "
"scheduled to be initialized. skipping...";
return;
}
// Switch to the current thread because EXPECT_CALL for another thread is
// flaky.
GetMetricsTaskRunner() = base::SequencedTaskRunner::GetCurrentDefault();
// Safe to modify GetMetricsLibrary here because it is attached to the current
// thread.
GetMetricsLibrary() = new ::testing::NiceMock<MetricsLibraryMock>();
}
// static
void Metrics::TestEnvironment::CleanUpMock() {
if (!GetMetricsTaskRunner()) {
LOG(ERROR) << "Metrics not initialized. Skip cleanup.";
return;
}
// Must be on the current task runner.
ASSERT_EQ(base::SequencedTaskRunner::GetCurrentDefault(),
GetMetricsTaskRunner());
GetMetricsTaskRunner() = nullptr;
// Safe to modify GetMetricsLibrary here because it is attached to the current
// thread.
delete GetMetricsLibrary();
GetMetricsLibrary() = nullptr;
// Clear the task runner up to this point to prevent GetMetricsLibrary from
// being accidentally accessed by this task runner in a later test.
base::RunLoop run_loop;
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, run_loop.QuitClosure());
}
// static
::testing::NiceMock<MetricsLibraryMock>&
Metrics::TestEnvironment::GetMockMetricsLibrary() {
return *static_cast<::testing::NiceMock<MetricsLibraryMock>*>(
GetMetricsLibrary());
}
} // namespace reporting::analytics