blob: 3c9b50a0cf60fef5119bdc4e062f6c7c5a3ad0fe [file] [log] [blame]
// 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 "rmad/metrics/metrics_utils.h"
#include "rmad/metrics/metrics_utils_impl.h"
#include "rmad/metrics/mock_metrics_utils.h"
#include <map>
#include <memory>
#include <vector>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <base/memory/scoped_refptr.h>
#include <base/time/time.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "rmad/constants.h"
#include "rmad/metrics/metrics_constants.h"
#include "rmad/metrics/state_metrics.h"
#include "rmad/utils/json_store.h"
using testing::_;
using testing::Return;
namespace {
constexpr char kTestJsonStoreFilename[] = "test.json";
constexpr char kDefaultMetricsJson[] = R"(
{
"metrics": {
"first_setup_timestamp": 123.456,
"setup_timestamp": 456.789,
"running_time": 333.333,
"ro_firmware_verified": true,
"replaced_component_names": [],
"occurred_errors": ["RMAD_ERROR_MISSING_COMPONENT"],
"additional_activities": ["RMAD_ADDITIONAL_ACTIVITY_REBOOT"],
"state_metrics": {
"1": {
"state_case": 1,
"state_is_aborted": false,
"state_setup_timestamp": 0.0,
"state_overall_time": 123.456,
"state_transition_count": 2,
"state_get_log_count": 3,
"state_save_log_count": 4
},
"2": {
"state_case": 2,
"state_is_aborted": true,
"state_setup_timestamp": 123.456,
"state_overall_time": 332.544,
"state_transition_count": 1,
"state_get_log_count": 0,
"state_save_log_count": 0
}
}
}
}
)";
constexpr char kEmptyMetricsJson[] = "{}";
// This is the exact json string to match. DO NOT format it.
constexpr char kDefaultMetricsSummaryJson[] = R"({
"additional_activities": [ "RMAD_ADDITIONAL_ACTIVITY_REBOOT" ],
"occurred_errors": [ "RMAD_ERROR_MISSING_COMPONENT" ],
"replaced_component_names": [ ],
"ro_firmware_verified": true,
"running_time": 333.333,
"state_metrics": {
"ComponentsRepair": {
"state_case": 2,
"state_get_log_count": 0,
"state_is_aborted": true,
"state_overall_time": 332.544,
"state_save_log_count": 0,
"state_transition_count": 1
},
"Welcome": {
"state_case": 1,
"state_get_log_count": 3,
"state_is_aborted": false,
"state_overall_time": 123.456,
"state_save_log_count": 4,
"state_transition_count": 2
}
}
}
)";
constexpr char kInvalidStateMetricsTimestampJson[] = R"(
{
"metrics": {
"state_metrics": {
"1": {
"state_case": 1,
"state_is_aborted": false,
"state_setup_timestamp": -1,
"state_overall_time": 123.456,
"state_transition_count": 2,
"state_get_log_count": 3,
"state_save_log_count": 4
}
}
}
}
)";
constexpr double kDefaultFirstSetupTimestamp = 123.456;
constexpr double kDefaultSetupTimestamp = 456.789;
constexpr double kDefaultRunningTime = 333.333;
constexpr bool kDefaultRoFirmwareVerified = true;
const std::vector<std::string> kDefaultOccurredErrors = {
"RMAD_ERROR_MISSING_COMPONENT"};
const std::vector<std::string> kDefaultAdditionalActivities = {
"RMAD_ADDITIONAL_ACTIVITY_REBOOT"};
const std::map<int, rmad::StateMetricsData> kDefaultStateMetrics = {
{1,
{.state_case = rmad::RmadState::StateCase::kWelcome,
.is_aborted = false,
.setup_timestamp = 0.0,
.overall_time = 123.456,
.transition_count = 2,
.get_log_count = 3,
.save_log_count = 4}},
{2,
{.state_case = rmad::RmadState::StateCase::kComponentsRepair,
.is_aborted = true,
.setup_timestamp = 123.456,
.overall_time = 332.544,
.transition_count = 1,
.get_log_count = 0,
.save_log_count = 0}}};
constexpr double kTestFirstSetupTimestamp = 111.111;
constexpr double kTestSetupTimestamp = 666.666;
constexpr double kTestRunningTime = 555.555;
constexpr bool kTestRoFirmwareVerified = false;
const std::vector<std::string> kTestOccurredErrors = {
"RMAD_ERROR_RMA_NOT_REQUIRED", "RMAD_ERROR_STATE_HANDLER_MISSING",
"RMAD_ERROR_STATE_HANDLER_INITIALIZATION_FAILED"};
const std::vector<std::string> kTestAdditionalActivities = {
"RMAD_ADDITIONAL_ACTIVITY_REBOOT",
"RMAD_ADDITIONAL_ACTIVITY_BATTERY_CUTOFF",
"RMAD_ADDITIONAL_ACTIVITY_DIAGNOSTICS"};
constexpr double kTestStateSetupTimestamp = 111.111;
constexpr double kTestStateLeaveTimestamp = 666.666;
constexpr double kTestStateOverallTime = 555.555;
} // namespace
namespace rmad {
class MetricsUtilsTest : public testing::Test {
public:
MetricsUtilsTest() = default;
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
file_path_ = temp_dir_.GetPath().AppendASCII(kTestJsonStoreFilename);
}
bool CreateInputFile(const char* str, int size) {
if (base::WriteFile(file_path_, str, size) == size) {
json_store_ = base::MakeRefCounted<JsonStore>(file_path_, false);
return true;
}
return false;
}
base::ScopedTempDir temp_dir_;
scoped_refptr<JsonStore> json_store_;
base::FilePath file_path_;
};
TEST_F(MetricsUtilsTest, GetValue) {
EXPECT_TRUE(
CreateInputFile(kDefaultMetricsJson, std::size(kDefaultMetricsJson) - 1));
double first_setup_ts;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(
json_store_, kMetricsFirstSetupTimestamp, &first_setup_ts));
EXPECT_EQ(first_setup_ts, kDefaultFirstSetupTimestamp);
double setup_ts;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kMetricsSetupTimestamp,
&setup_ts));
EXPECT_EQ(setup_ts, kDefaultSetupTimestamp);
double running_time;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kMetricsRunningTime,
&running_time));
EXPECT_EQ(running_time, kDefaultRunningTime);
bool ro_fw_verified;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(
json_store_, kMetricsRoFirmwareVerified, &ro_fw_verified));
EXPECT_EQ(ro_fw_verified, kDefaultRoFirmwareVerified);
std::vector<std::string> occurred_errors;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kMetricsOccurredErrors,
&occurred_errors));
EXPECT_EQ(occurred_errors, kDefaultOccurredErrors);
std::vector<std::string> additional_activities;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(
json_store_, kMetricsAdditionalActivities, &additional_activities));
EXPECT_EQ(additional_activities, kDefaultAdditionalActivities);
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
EXPECT_EQ(state_metrics, kDefaultStateMetrics);
}
TEST_F(MetricsUtilsTest, SetValue_FirstSetupTimestamp) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsFirstSetupTimestamp, kTestFirstSetupTimestamp));
double first_setup_ts;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(
json_store_, kMetricsFirstSetupTimestamp, &first_setup_ts));
EXPECT_EQ(first_setup_ts, kTestFirstSetupTimestamp);
}
TEST_F(MetricsUtilsTest, SetValue_SetupTimestamp) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(json_store_, kMetricsSetupTimestamp,
kTestSetupTimestamp));
double setup_ts;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kMetricsSetupTimestamp,
&setup_ts));
EXPECT_EQ(setup_ts, kTestSetupTimestamp);
}
TEST_F(MetricsUtilsTest, SetValue_RunningTime) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(json_store_, kMetricsRunningTime,
kTestRunningTime));
double running_time;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kMetricsRunningTime,
&running_time));
EXPECT_EQ(running_time, kTestRunningTime);
}
TEST_F(MetricsUtilsTest, SetValue_RoFirmwareVerified) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsRoFirmwareVerified, kTestRoFirmwareVerified));
bool ro_fw_verified;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(
json_store_, kMetricsRoFirmwareVerified, &ro_fw_verified));
EXPECT_EQ(ro_fw_verified, kTestRoFirmwareVerified);
}
TEST_F(MetricsUtilsTest, SetValue_OccurredErrors) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(json_store_, kMetricsOccurredErrors,
kTestOccurredErrors));
std::vector<std::string> occurred_errors;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kMetricsOccurredErrors,
&occurred_errors));
EXPECT_EQ(occurred_errors, kTestOccurredErrors);
}
TEST_F(MetricsUtilsTest, SetValue_AddtionalActivities) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsAdditionalActivities, kTestAdditionalActivities));
std::vector<std::string> additional_activities;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(
json_store_, kMetricsAdditionalActivities, &additional_activities));
EXPECT_EQ(additional_activities, kTestAdditionalActivities);
}
TEST_F(MetricsUtilsTest, SetValue_StateMetrics) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_TRUE(MetricsUtils::SetMetricsValue(json_store_, kStateMetrics,
kDefaultStateMetrics));
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
EXPECT_EQ(state_metrics, kDefaultStateMetrics);
}
TEST_F(MetricsUtilsTest, UpdateStateMetricsOnStateTransition) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
RmadState::StateCase state_case = RmadState::StateCase::kRestock;
EXPECT_TRUE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, RmadState::StateCase::STATE_NOT_SET, state_case,
kTestStateSetupTimestamp));
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
auto state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_NEAR(state_it->second.setup_timestamp, kTestStateSetupTimestamp, 1e-4);
EXPECT_TRUE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, state_case, RmadState::StateCase::STATE_NOT_SET,
kTestStateLeaveTimestamp));
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_NEAR(state_it->second.setup_timestamp, kTestStateLeaveTimestamp, 1e-4);
EXPECT_NEAR(state_it->second.overall_time, kTestStateOverallTime, 1e-4);
}
TEST_F(MetricsUtilsTest, UpdateStateMetricsOnStateTransition_StateNotFound) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_FALSE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, RmadState::StateCase::kWelcome,
RmadState::StateCase::kRestock, kTestStateSetupTimestamp));
}
TEST_F(MetricsUtilsTest, UpdateStateMetricsOnStateTransition_InvalidTimestamp) {
EXPECT_TRUE(
CreateInputFile(kInvalidStateMetricsTimestampJson,
std::size(kInvalidStateMetricsTimestampJson) - 1));
RmadState::StateCase state_case = RmadState::StateCase::kRestock;
EXPECT_FALSE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, RmadState::StateCase::kWelcome, state_case,
kTestStateLeaveTimestamp));
}
TEST_F(MetricsUtilsTest,
UpdateStateMetricsOnStateTransition_NotIncreasedTimestamp) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
RmadState::StateCase state_case = RmadState::StateCase::kRestock;
EXPECT_TRUE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, RmadState::StateCase::STATE_NOT_SET, state_case,
kTestStateSetupTimestamp));
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
auto state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_NEAR(state_it->second.setup_timestamp, kTestStateSetupTimestamp, 1e-4);
// Invalid timestamp: timestamp should be incremented each time.
EXPECT_FALSE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, state_case, RmadState::StateCase::STATE_NOT_SET,
kTestStateSetupTimestamp - 1));
}
TEST_F(MetricsUtilsTest, UpdateStateMetricsOnAbort) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
RmadState::StateCase state_case = RmadState::StateCase::kRestock;
EXPECT_TRUE(MetricsUtils::UpdateStateMetricsOnStateTransition(
json_store_, RmadState::StateCase::STATE_NOT_SET, state_case,
kTestStateSetupTimestamp));
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
auto state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_NEAR(state_it->second.setup_timestamp, kTestStateSetupTimestamp, 1e-4);
EXPECT_TRUE(MetricsUtils::UpdateStateMetricsOnAbort(
json_store_, state_case, kTestStateLeaveTimestamp));
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_NEAR(state_it->second.setup_timestamp, kTestStateLeaveTimestamp, 1e-4);
EXPECT_NEAR(state_it->second.overall_time, kTestStateOverallTime, 1e-4);
EXPECT_EQ(state_it->second.is_aborted, true);
}
TEST_F(MetricsUtilsTest, UpdateStateMetricsOnGetLog) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
RmadState::StateCase state_case = RmadState::StateCase::kRestock;
EXPECT_TRUE(
MetricsUtils::UpdateStateMetricsOnGetLog(json_store_, state_case));
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
auto state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_EQ(state_it->second.get_log_count, 1);
EXPECT_TRUE(
MetricsUtils::UpdateStateMetricsOnGetLog(json_store_, state_case));
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_EQ(state_it->second.get_log_count, 2);
}
TEST_F(MetricsUtilsTest, UpdateStateMetricsOnSaveLog) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
RmadState::StateCase state_case = RmadState::StateCase::kRestock;
EXPECT_TRUE(
MetricsUtils::UpdateStateMetricsOnSaveLog(json_store_, state_case));
std::map<int, StateMetricsData> state_metrics;
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
auto state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_EQ(state_it->second.save_log_count, 1);
EXPECT_TRUE(
MetricsUtils::UpdateStateMetricsOnSaveLog(json_store_, state_case));
EXPECT_TRUE(MetricsUtils::GetMetricsValue(json_store_, kStateMetrics,
&state_metrics));
state_it = state_metrics.find(static_cast<int>(state_case));
EXPECT_NE(state_it, state_metrics.end());
EXPECT_EQ(state_it->second.save_log_count, 2);
}
TEST_F(MetricsUtilsTest, GetMetricsSummaryAsString) {
EXPECT_TRUE(
CreateInputFile(kDefaultMetricsJson, std::size(kDefaultMetricsJson) - 1));
EXPECT_EQ(MetricsUtils::GetMetricsSummaryAsString(json_store_),
kDefaultMetricsSummaryJson);
}
TEST_F(MetricsUtilsTest, GetMetricsSummaryAsString_NoData) {
EXPECT_TRUE(
CreateInputFile(kEmptyMetricsJson, std::size(kEmptyMetricsJson) - 1));
EXPECT_EQ(MetricsUtils::GetMetricsSummaryAsString(json_store_), "");
}
class MetricsUtilsImplTest : public testing::Test {
public:
MetricsUtilsImplTest() = default;
void SetupShimlessRmaReportValues(bool first_timestamp = true,
bool timestamp = true,
bool is_complete = true,
bool ro_verified = true,
bool returning_owner = true,
bool mlb_replacement = true,
bool wp_method = true) {
double current_timestamp = base::Time::Now().InSecondsFSinceUnixEpoch();
if (first_timestamp) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsFirstSetupTimestamp, current_timestamp));
}
if (timestamp) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsSetupTimestamp, current_timestamp));
}
if (is_complete) {
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsIsComplete, true));
}
if (ro_verified) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsRoFirmwareVerified,
RoVerificationStatus_Name(RMAD_RO_VERIFICATION_PASS)));
}
if (returning_owner) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsReturningOwner,
ReturningOwner_Name(
ReturningOwner::RMAD_RETURNING_OWNER_DIFFERENT_OWNER)));
}
if (mlb_replacement) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(json_store_,
kMetricsMlbReplacement, true));
}
if (wp_method) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsWpDisableMethod,
WpDisableMethod_Name(WpDisableMethod::RMAD_WP_DISABLE_METHOD_RSU)));
}
}
void SetupMetricsValues(bool is_report_valid = true,
bool is_replaced_components_valid = true,
bool is_occurred_errors_valid = true,
bool is_additional_activities_valid = true,
bool is_state_reports_valid = true) {
if (is_report_valid) {
SetupShimlessRmaReportValues();
} else {
SetupShimlessRmaReportValues(false);
}
if (is_replaced_components_valid) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsReplacedComponents,
std::vector<std::string>(
{RmadComponent_Name(RMAD_COMPONENT_AUDIO_CODEC),
RmadComponent_Name(RMAD_COMPONENT_BATTERY)})));
} else {
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsReplacedComponents,
std::vector<std::string>({"test"})));
}
if (is_occurred_errors_valid) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsOccurredErrors,
std::vector<std::string>(
{RmadErrorCode_Name(RMAD_ERROR_CANNOT_CANCEL_RMA),
RmadErrorCode_Name(RMAD_ERROR_CANNOT_GET_LOG)})));
} else {
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsOccurredErrors,
std::vector<std::string>({"test"})));
}
if (is_additional_activities_valid) {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsAdditionalActivities,
std::vector<std::string>(
{AdditionalActivity_Name(RMAD_ADDITIONAL_ACTIVITY_REBOOT),
AdditionalActivity_Name(RMAD_ADDITIONAL_ACTIVITY_SHUTDOWN)})));
} else {
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsAdditionalActivities,
std::vector<std::string>({"test"})));
}
if (is_state_reports_valid) {
std::map<int, StateMetricsData> test_data;
test_data[1] = StateMetricsData();
// The transition count is always >= 1.
test_data[1].transition_count = 1;
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
} else {
std::map<int, StateMetricsData> test_data;
test_data[1] = StateMetricsData();
// The transition count should be >= 1.
test_data[1].transition_count = 0;
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
}
}
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
base::FilePath file_path =
temp_dir_.GetPath().AppendASCII(kTestJsonStoreFilename);
json_store_ = base::MakeRefCounted<JsonStore>(file_path, false);
}
base::ScopedTempDir temp_dir_;
scoped_refptr<JsonStore> json_store_;
};
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues();
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest,
RecordShimlessRmaReport_FirstSetupTimestampMissed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(false);
EXPECT_FALSE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_SetupTimestampMissed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(true, false);
EXPECT_FALSE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_Abort_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(true, true, false);
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest,
RecordShimlessRmaReport_RoVerifiedUnsupported_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues();
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsRoFirmwareVerified,
RoVerificationStatus_Name(RMAD_RO_VERIFICATION_UNSUPPORTED)));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest,
RecordShimlessRmaReport_UnknownRoVerified_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(true, true, true, false);
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_SameOnwer_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues();
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsReturningOwner,
ReturningOwner_Name(ReturningOwner::RMAD_RETURNING_OWNER_SAME_OWNER)));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_DifferentOnwer_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues();
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsReturningOwner,
ReturningOwner_Name(
ReturningOwner::RMAD_RETURNING_OWNER_DIFFERENT_OWNER)));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_UnknownOnwer_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(true, true, true, true, false);
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_MlbReplaced_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues();
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsMlbReplacement,
MainboardReplacement_Name(
MainboardReplacement::RMAD_MLB_REPLACEMENT_REPLACED)));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_MlbOriginal_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues();
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsMlbReplacement,
MainboardReplacement_Name(
MainboardReplacement::RMAD_MLB_REPLACEMENT_ORIGINAL)));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_MlbUnknown_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(true, true, true, true, true, false);
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaReport_WpDisableMethod_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupShimlessRmaReportValues(true, true, true, true, true, true, false);
// The write protect disable method hasn't been set yet.
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
std::array<WpDisableMethod, 5> methods = {
RMAD_WP_DISABLE_METHOD_UNKNOWN, RMAD_WP_DISABLE_METHOD_SKIPPED,
RMAD_WP_DISABLE_METHOD_RSU,
RMAD_WP_DISABLE_METHOD_PHYSICAL_ASSEMBLE_DEVICE,
RMAD_WP_DISABLE_METHOD_PHYSICAL_KEEP_DEVICE_OPEN};
for (auto wp_disable_method : methods) {
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsWpDisableMethod,
WpDisableMethod_Name(wp_disable_method)));
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsIsComplete, true));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaReport(json_store_));
}
}
TEST_F(MetricsUtilsImplTest, RecordReplacedComponents_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsReplacedComponents,
std::vector<std::string>({RmadComponent_Name(RMAD_COMPONENT_AUDIO_CODEC),
RmadComponent_Name(RMAD_COMPONENT_BATTERY)})));
EXPECT_TRUE(metrics_utils->RecordReplacedComponents(json_store_));
}
TEST_F(MetricsUtilsImplTest,
RecordReplacedComponents_UnknownReplacedComponent) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsReplacedComponents,
std::vector<std::string>({"test"})));
EXPECT_FALSE(metrics_utils->RecordReplacedComponents(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordOccurredErrors_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsOccurredErrors,
std::vector<std::string>(
{RmadErrorCode_Name(RMAD_ERROR_CANNOT_CANCEL_RMA),
RmadErrorCode_Name(RMAD_ERROR_CANNOT_GET_LOG)})));
EXPECT_TRUE(metrics_utils->RecordOccurredErrors(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordOccurredErrors_UnknownOccurredError) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsOccurredErrors, std::vector<std::string>({"test"})));
EXPECT_FALSE(metrics_utils->RecordOccurredErrors(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAdditionalActivities_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
EXPECT_TRUE(MetricsUtils::SetMetricsValue(
json_store_, kMetricsAdditionalActivities,
std::vector<std::string>(
{AdditionalActivity_Name(RMAD_ADDITIONAL_ACTIVITY_REBOOT),
AdditionalActivity_Name(RMAD_ADDITIONAL_ACTIVITY_SHUTDOWN)})));
EXPECT_TRUE(metrics_utils->RecordAdditionalActivities(json_store_));
}
TEST_F(MetricsUtilsImplTest,
RecordAdditionalActivities_UnknownAdditionalActivity) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kMetricsAdditionalActivities,
std::vector<std::string>({"test"})));
EXPECT_FALSE(metrics_utils->RecordAdditionalActivities(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaStateReport_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
std::map<int, StateMetricsData> test_data;
// The transition count should be >= 1.
test_data[1] = {.transition_count = 1};
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
EXPECT_TRUE(metrics_utils->RecordShimlessRmaStateReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaStateReport_WrongOverallTime) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
std::map<int, StateMetricsData> test_data;
// The transition count should be >= 1; The overall time should be >= 0.
test_data[1] = {.overall_time = -1, .transition_count = 1};
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
EXPECT_FALSE(metrics_utils->RecordShimlessRmaStateReport(json_store_));
}
TEST_F(MetricsUtilsImplTest,
RecordShimlessRmaStateReport_WrongTransitionCount) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
std::map<int, StateMetricsData> test_data;
// The transition count should be >= 1.
test_data[1] = {.transition_count = 0};
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
EXPECT_FALSE(metrics_utils->RecordShimlessRmaStateReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaStateReport_WrongGetLogCount) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
std::map<int, StateMetricsData> test_data;
// The transition count should be >= 1; The get log count should be >= 0.
test_data[1] = {.transition_count = 1, .get_log_count = -1};
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
EXPECT_FALSE(metrics_utils->RecordShimlessRmaStateReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordShimlessRmaStateReport_WrongSaveLogCount) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
std::map<int, StateMetricsData> test_data;
// The transition count should be >= 1; The save log count should be >= 0.
test_data[1] = {.transition_count = 1, .save_log_count = -1};
EXPECT_TRUE(
MetricsUtils::SetMetricsValue(json_store_, kStateMetrics, test_data));
EXPECT_FALSE(metrics_utils->RecordShimlessRmaStateReport(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAll_Success) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupMetricsValues();
EXPECT_TRUE(metrics_utils->RecordAll(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAll_RecordShimleeRmaReportFailed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupMetricsValues(false);
EXPECT_FALSE(metrics_utils->RecordAll(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAll_RecordReplacedComponentsFailed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupMetricsValues(true, false);
EXPECT_FALSE(metrics_utils->RecordAll(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAll_RecordOccurredErrorsFailed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupMetricsValues(true, true, false);
EXPECT_FALSE(metrics_utils->RecordAll(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAll_RecordAdditionalActivitiesFailed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupMetricsValues(true, true, true, false);
EXPECT_FALSE(metrics_utils->RecordAll(json_store_));
}
TEST_F(MetricsUtilsImplTest, RecordAll_RecordShimlessRmaStateReportFailed) {
auto metrics_utils = std::make_unique<MetricsUtilsImpl>(false);
SetupMetricsValues(true, true, true, true, false);
EXPECT_FALSE(metrics_utils->RecordAll(json_store_));
}
} // namespace rmad