blob: f09882bfe465249969b36c850549944ff8b431a0 [file] [log] [blame]
// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <dbus/dlcservice/dbus-constants.h>
#include <dbus/modemfwd/dbus-constants.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <metrics/metrics_library_mock.h>
#include "modemfwd/error.h"
#include "modemfwd/metrics.h"
using modemfwd::metrics::DlcInstallResult;
using modemfwd::metrics::DlcUninstallResult;
using modemfwd::metrics::FwUpdateLocation;
namespace modemfwd {
class MetricsTest : public testing::Test {
public:
MetricsTest() = default;
private:
void SetUp() override {
auto mock_metrics_library =
std::make_unique<testing::StrictMock<MetricsLibraryMock>>();
metrics_library_ = mock_metrics_library.get();
metrics_ = std::make_unique<Metrics>(std::move(mock_metrics_library));
}
protected:
MetricsLibraryMock* metrics_library_;
std::unique_ptr<Metrics> metrics_;
private:
MetricsTest(const MetricsTest&) = delete;
MetricsTest& operator=(const MetricsTest&) = delete;
};
TEST_F(MetricsTest, Init) {
EXPECT_CALL(*metrics_library_, Init());
metrics_->Init();
}
TEST_F(MetricsTest, SendDlcInstallResultSuccess) {
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult, 1 /*kSuccess*/,
static_cast<int>(DlcInstallResult::kNumConstants)));
metrics_->SendDlcInstallResultSuccess();
}
TEST_F(MetricsTest, SendDlcInstallResult_UnknownError) {
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult, 0 /*kUnknownError*/,
static_cast<int>(DlcInstallResult::kNumConstants)))
.Times(2);
auto err = brillo::Error::Create(FROM_HERE, "domain", "some error", "msg");
metrics_->SendDlcInstallResultFailure(err.get());
err = brillo::Error::Create(FROM_HERE, "dbus",
"org.chromium.ModemfwdInterface.INTERNAL", "msg");
metrics_->SendDlcInstallResultFailure(err.get());
}
TEST_F(MetricsTest, SendDlcInstallResult_Failures) {
const int num_consts = static_cast<int>(DlcInstallResult::kNumConstants);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
2 /*kDlcServiceReturnedInvalidDlc*/, num_consts));
auto err = brillo::Error::Create(FROM_HERE, "dbus",
dlcservice::kErrorInvalidDlc, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
3 /*kDlcServiceReturnedAllocation*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorAllocation,
"msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
4 /*kDlcServiceReturnedNoImageFound*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorNoImageFound,
"msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
5 /*kDlcServiceReturnedNeedReboot*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorNeedReboot,
"msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
6 /*kDlcServiceReturnedBusy*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorBusy, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
7 /*kFailedUnexpectedDlcState*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", error::kUnexpectedDlcState,
"msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
8 /*kFailedTimeoutWaitingForDlcService*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus",
error::kTimeoutWaitingForDlcService, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
9 /*kFailedTimeoutWaitingForDlcInstall*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus",
error::kTimeoutWaitingForDlcInstall, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
10 /*kFailedTimeoutWaitingForInstalledState*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus",
error::kTimeoutWaitingForInstalledState, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
11 /*kDlcServiceReturnedErrorOnInstall*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus",
error::kDlcServiceReturnedErrorOnInstall, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
12 /*kDlcServiceReturnedErrorOnGetDlcState*/, num_consts));
err = brillo::Error::Create(
FROM_HERE, "dbus", error::kDlcServiceReturnedErrorOnGetDlcState, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
13 /*kUnexpectedEmptyDlcId*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", error::kUnexpectedEmptyDlcId,
"msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
// Check that all values were tested.
EXPECT_EQ(14, static_cast<int>(DlcInstallResult::kNumConstants));
}
TEST_F(MetricsTest, SendDlcInstallResult_VerifyErrorIteration) {
const int num_consts = static_cast<int>(DlcInstallResult::kNumConstants);
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(
metrics::kMetricDlcInstallResult,
static_cast<int>(DlcInstallResult::kDlcServiceReturnedInvalidDlc),
num_consts))
.Times(3);
// known root error
auto err = brillo::Error::Create(FROM_HERE, "dbus",
dlcservice::kErrorInvalidDlc, "msg");
// known linked error
brillo::Error::AddTo(&err, FROM_HERE, kModemfwdErrorDomain,
error::kDlcServiceReturnedErrorOnInstall, "msg");
metrics_->SendDlcInstallResultFailure(err.get());
// unknown root error
err = brillo::Error::Create(FROM_HERE, "dbus", "unknown_error", "msg");
// known linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", dlcservice::kErrorInvalidDlc,
"msg");
metrics_->SendDlcInstallResultFailure(err.get());
// unknown root error
err = brillo::Error::Create(FROM_HERE, "dbus", "unknown_error", "msg");
// known linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", dlcservice::kErrorInvalidDlc,
"msg");
// unknown linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", "unknown_error2", "msg");
metrics_->SendDlcInstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcInstallResult,
static_cast<int>(DlcInstallResult::kUnknownError),
num_consts));
// unknown root error
err = brillo::Error::Create(FROM_HERE, "dbus", "unknown_error", "msg");
// unknown linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", "unknown_error2", "msg");
metrics_->SendDlcInstallResultFailure(err.get());
}
TEST_F(MetricsTest, SendDlcUninstallResultSuccess) {
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult, 1 /*kSuccess*/,
static_cast<int>(DlcUninstallResult::kNumConstants)))
.Times(1);
metrics_->SendDlcUninstallResultSuccess();
}
TEST_F(MetricsTest, SendDlcUninstallResult_UnknownError) {
EXPECT_CALL(
*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult, 0 /*kUnknownError*/,
static_cast<int>(DlcUninstallResult::kNumConstants)))
.Times(2);
auto err = brillo::Error::Create(FROM_HERE, "domain", "some error", "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
err = brillo::Error::Create(FROM_HERE, "dbus",
"org.chromium.ModemfwdInterface.INTERNAL", "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
}
TEST_F(MetricsTest, SendDlcUninstallResult_Failures) {
const int num_consts = static_cast<int>(DlcUninstallResult::kNumConstants);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
2 /*kDlcServiceReturnedInvalidDlc*/, num_consts));
auto err = brillo::Error::Create(FROM_HERE, "dbus",
dlcservice::kErrorInvalidDlc, "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
3 /*kDlcServiceReturnedAllocation*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorAllocation,
"msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
4 /*kDlcServiceReturnedNoImageFound*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorNoImageFound,
"msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
5 /*kDlcServiceReturnedNeedReboot*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorNeedReboot,
"msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
6 /*kDlcServiceReturnedBusy*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", dlcservice::kErrorBusy, "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
7 /*kDlcServiceReturnedErrorOnGetExistingDlcs*/,
num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus",
error::kDlcServiceReturnedErrorOnGetExistingDlcs,
"msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
8 /*kDlcServiceReturnedErrorOnPurge*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus",
error::kDlcServiceReturnedErrorOnPurge, "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
9 /*kUnexpectedEmptyVariant*/, num_consts));
err = brillo::Error::Create(FROM_HERE, "dbus", error::kUnexpectedEmptyVariant,
"msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
// Check that all values were tested.
EXPECT_EQ(10, static_cast<int>(DlcUninstallResult::kNumConstants));
}
TEST_F(MetricsTest, SendDlcUninstallResult_VerifyErrorIteration) {
const int num_consts = static_cast<int>(DlcUninstallResult::kNumConstants);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(
metrics::kMetricDlcUninstallResult,
static_cast<int>(DlcUninstallResult::kUnexpectedEmptyVariant),
num_consts))
.Times(3);
// known root error
auto err = brillo::Error::Create(FROM_HERE, "dbus",
error::kUnexpectedEmptyVariant, "msg");
// known linked error
brillo::Error::AddTo(&err, FROM_HERE, kModemfwdErrorDomain,
error::kDlcServiceReturnedErrorOnGetExistingDlcs, "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
// unknown root error
err = brillo::Error::Create(FROM_HERE, "dbus", "unknown_error", "msg");
// known linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", error::kUnexpectedEmptyVariant,
"msg");
metrics_->SendDlcUninstallResultFailure(err.get());
// unknown root error
err = brillo::Error::Create(FROM_HERE, "dbus", "unknown_error", "msg");
// known linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", error::kUnexpectedEmptyVariant,
"msg");
// unknown linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", "unknown_error2", "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricDlcUninstallResult,
static_cast<int>(DlcUninstallResult::kUnknownError),
num_consts));
// unknown root error
err = brillo::Error::Create(FROM_HERE, "dbus", "unknown_error", "msg");
// unknown linked error
brillo::Error::AddTo(&err, FROM_HERE, "dbus", "unknown_error2", "msg");
metrics_->SendDlcUninstallResultFailure(err.get());
}
TEST_F(MetricsTest, SendFwUpdateLocation) {
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricFwUpdateLocation, 0,
static_cast<int>(FwUpdateLocation::kNumConstants)));
metrics_->SendFwUpdateLocation(FwUpdateLocation::kRootFS);
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricFwUpdateLocation, 1,
static_cast<int>(FwUpdateLocation::kNumConstants)));
metrics_->SendFwUpdateLocation(FwUpdateLocation::kDlc);
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
EXPECT_CALL(*metrics_library_,
SendEnumToUMA(metrics::kMetricFwUpdateLocation, 2,
static_cast<int>(FwUpdateLocation::kNumConstants)));
metrics_->SendFwUpdateLocation(FwUpdateLocation::kFallbackToRootFS);
testing::Mock::VerifyAndClearExpectations(&metrics_library_);
// Check that all values were tested.
EXPECT_EQ(3, static_cast<int>(FwUpdateLocation::kNumConstants));
}
} // namespace modemfwd