chromium/chromeos/ash/components/telemetry_extension/diagnostics/diagnostics_service_converters_unittest.cc

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromeos/ash/components/telemetry_extension/diagnostics/diagnostics_service_converters.h"

#include <cstdint>
#include <optional>
#include <vector>

#include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_diagnostics.mojom.h"
#include "chromeos/ash/services/cros_healthd/public/mojom/nullable_primitives.mojom.h"
#include "chromeos/crosapi/mojom/diagnostics_service.mojom.h"
#include "chromeos/crosapi/mojom/nullable_primitives.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ash::converters::diagnostics {

// Tests that |ConvertDiagnosticsPtr| function returns nullptr if input is
// nullptr. ConvertDiagnosticsPtr is a template, so we can test this function
// with any valid type.
TEST(DiagnosticsServiceConvertersTest, ConvertDiagnosticsPtrTakesNullPtr) {
  EXPECT_TRUE(
      ConvertDiagnosticsPtr(cros_healthd::mojom::InteractiveRoutineUpdatePtr())
          .is_null());
}

TEST(DiagnosticsServiceConvertersTest, ConvertDiagnosticRoutineEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kAcPower),
            crosapi::DiagnosticsRoutineEnum::kAcPower);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBatteryCapacity),
            crosapi::DiagnosticsRoutineEnum::kBatteryCapacity);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBatteryHealth),
            crosapi::DiagnosticsRoutineEnum::kBatteryHealth);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBatteryDischarge),
            crosapi::DiagnosticsRoutineEnum::kBatteryDischarge);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBatteryCharge),
            crosapi::DiagnosticsRoutineEnum::kBatteryCharge);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kCpuCache),
            crosapi::DiagnosticsRoutineEnum::kCpuCache);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kCpuStress),
            crosapi::DiagnosticsRoutineEnum::kCpuStress);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kDiskRead),
            crosapi::DiagnosticsRoutineEnum::kDiskRead);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kDnsResolution),
            crosapi::DiagnosticsRoutineEnum::kDnsResolution);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kDnsResolverPresent),
            crosapi::DiagnosticsRoutineEnum::kDnsResolverPresent);
  EXPECT_EQ(
      Convert(cros_healthd::DiagnosticRoutineEnum::kFloatingPointAccuracy),
      crosapi::DiagnosticsRoutineEnum::kFloatingPointAccuracy);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kGatewayCanBePinged),
            crosapi::DiagnosticsRoutineEnum::kGatewayCanBePinged);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kLanConnectivity),
            crosapi::DiagnosticsRoutineEnum::kLanConnectivity);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kMemory),
            crosapi::DiagnosticsRoutineEnum::kMemory);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kNvmeSelfTest),
            crosapi::DiagnosticsRoutineEnum::kNvmeSelfTest);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kPrimeSearch),
            crosapi::DiagnosticsRoutineEnum::kPrimeSearch);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kSignalStrength),
            crosapi::DiagnosticsRoutineEnum::kSignalStrength);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kSensitiveSensor),
            crosapi::DiagnosticsRoutineEnum::kSensitiveSensor);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kFingerprintAlive),
            crosapi::DiagnosticsRoutineEnum::kFingerprintAlive);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::
                        kSmartctlCheckWithPercentageUsed),
            crosapi::DiagnosticsRoutineEnum::kSmartctlCheckWithPercentageUsed);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kEmmcLifetime),
            crosapi::DiagnosticsRoutineEnum::kEmmcLifetime);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBluetoothPower),
            crosapi::DiagnosticsRoutineEnum::kBluetoothPower);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kUfsLifetime),
            crosapi::DiagnosticsRoutineEnum::kUfsLifetime);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kPowerButton),
            crosapi::DiagnosticsRoutineEnum::kPowerButton);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kAudioDriver),
            crosapi::DiagnosticsRoutineEnum::kAudioDriver);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBluetoothDiscovery),
            crosapi::DiagnosticsRoutineEnum::kBluetoothDiscovery);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBluetoothScanning),
            crosapi::DiagnosticsRoutineEnum::kBluetoothScanning);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kBluetoothPairing),
            crosapi::DiagnosticsRoutineEnum::kBluetoothPairing);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kFan),
            crosapi::DiagnosticsRoutineEnum::kFan);

  EXPECT_EQ(
      Convert(cros_healthd::DiagnosticRoutineEnum::DEPRECATED_kNvmeWearLevel),
      crosapi::DiagnosticsRoutineEnum::DEPRECATED_kNvmeWearLevel);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineEnum::kArcHttp),
            std::nullopt);
}

// This test checks, that successful conversion of all
// `cros_health::DiagnosticRoutineEnum` variants match to all
// `crosapi::DiagnosticsRoutineEnum` variants. If this test fails, the
// corresponding crosapi variant was added, but no conversion from a
// cros_healthd variant.
TEST(DiagnosticsServiceConvertersTest, CheckAllVariantsCovered) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  // Create a vector of all conversions by converting all possible
  // cros_healthd variants.
  std::vector<crosapi::DiagnosticsRoutineEnum> found_conversions;
  for (auto iter = cros_healthd::DiagnosticRoutineEnum::kMinValue;
       iter <= cros_healthd::DiagnosticRoutineEnum::kMaxValue;
       iter = static_cast<cros_healthd::DiagnosticRoutineEnum>(
           static_cast<int>(iter) + 1)) {
    auto converted = Convert(iter);
    if (converted) {
      found_conversions.push_back(converted.value());
    }
  }

  // Assure that each crosapi variant is part of the conversions.
  for (auto iter = crosapi::DiagnosticsRoutineEnum::kMinValue;
       iter <= crosapi::DiagnosticsRoutineEnum::kMaxValue;
       iter = static_cast<crosapi::DiagnosticsRoutineEnum>(
           static_cast<int>(iter) + 1)) {
    EXPECT_THAT(found_conversions, testing::Contains(iter));
  }
}

TEST(DiagnosticsServiceConvertersTest, ConvertDiagnosticRoutineStatusEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kReady),
            crosapi::DiagnosticsRoutineStatusEnum::kReady);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kRunning),
            crosapi::DiagnosticsRoutineStatusEnum::kRunning);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kWaiting),
            crosapi::DiagnosticsRoutineStatusEnum::kWaiting);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kPassed),
            crosapi::DiagnosticsRoutineStatusEnum::kPassed);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kFailed),
            crosapi::DiagnosticsRoutineStatusEnum::kFailed);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kError),
            crosapi::DiagnosticsRoutineStatusEnum::kError);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kCancelled),
            crosapi::DiagnosticsRoutineStatusEnum::kCancelled);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kFailedToStart),
            crosapi::DiagnosticsRoutineStatusEnum::kFailedToStart);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kRemoved),
            crosapi::DiagnosticsRoutineStatusEnum::kRemoved);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kCancelling),
            crosapi::DiagnosticsRoutineStatusEnum::kCancelling);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kUnsupported),
            crosapi::DiagnosticsRoutineStatusEnum::kUnsupported);
  EXPECT_EQ(Convert(cros_healthd::DiagnosticRoutineStatusEnum::kNotRun),
            crosapi::DiagnosticsRoutineStatusEnum::kNotRun);
}

TEST(DiagnosticsServiceConvertersTest,
     ConvertDiagnosticRoutineUserMessageEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(
      Convert(cros_healthd::DiagnosticRoutineUserMessageEnum::kUnplugACPower),
      crosapi::DiagnosticsRoutineUserMessageEnum::kUnplugACPower);
  EXPECT_EQ(
      Convert(cros_healthd::DiagnosticRoutineUserMessageEnum::kPlugInACPower),
      crosapi::DiagnosticsRoutineUserMessageEnum::kPlugInACPower);
  // LED routine is not yet supported in telemetry extension.
  EXPECT_EQ(
      Convert(cros_healthd::DiagnosticRoutineUserMessageEnum::kCheckLedColor),
      crosapi::DiagnosticsRoutineUserMessageEnum::kUnknown);
  EXPECT_EQ(
      Convert(
          cros_healthd::DiagnosticRoutineUserMessageEnum::kPressPowerButton),
      crosapi::DiagnosticsRoutineUserMessageEnum::kPressPowerButton);
}

TEST(DiagnosticsServiceConvertersTest, ConvertDiagnosticRoutineCommandEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(Convert(crosapi::DiagnosticsRoutineCommandEnum::kUnknown),
            cros_healthd::DiagnosticRoutineCommandEnum::kUnknown);
  EXPECT_EQ(Convert(crosapi::DiagnosticsRoutineCommandEnum::kContinue),
            cros_healthd::DiagnosticRoutineCommandEnum::kContinue);
  EXPECT_EQ(Convert(crosapi::DiagnosticsRoutineCommandEnum::kCancel),
            cros_healthd::DiagnosticRoutineCommandEnum::kCancel);
  EXPECT_EQ(Convert(crosapi::DiagnosticsRoutineCommandEnum::kGetStatus),
            cros_healthd::DiagnosticRoutineCommandEnum::kGetStatus);
  EXPECT_EQ(Convert(crosapi::DiagnosticsRoutineCommandEnum::kRemove),
            cros_healthd::DiagnosticRoutineCommandEnum::kRemove);
}

TEST(DiagnosticsServiceConvertersTest, ConvertAcPowerStatusEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(Convert(crosapi::DiagnosticsAcPowerStatusEnum::kUnknown),
            cros_healthd::AcPowerStatusEnum::kUnknown);
  EXPECT_EQ(Convert(crosapi::DiagnosticsAcPowerStatusEnum::kConnected),
            cros_healthd::AcPowerStatusEnum::kConnected);
  EXPECT_EQ(Convert(crosapi::DiagnosticsAcPowerStatusEnum::kDisconnected),
            cros_healthd::AcPowerStatusEnum::kDisconnected);
}

TEST(DiagnosticsServiceConvertersTest, ConvertNvmeSelfTestTypeEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(Convert(crosapi::DiagnosticsNvmeSelfTestTypeEnum::kUnknown),
            cros_healthd::NvmeSelfTestTypeEnum::kUnknown);
  EXPECT_EQ(Convert(crosapi::DiagnosticsNvmeSelfTestTypeEnum::kShortSelfTest),
            cros_healthd::NvmeSelfTestTypeEnum::kShortSelfTest);
  EXPECT_EQ(Convert(crosapi::DiagnosticsNvmeSelfTestTypeEnum::kLongSelfTest),
            cros_healthd::NvmeSelfTestTypeEnum::kLongSelfTest);
}

TEST(DiagnosticsServiceConvertersTest, ConvertDiskReadRoutineTypeEnum) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(Convert(crosapi::DiagnosticsDiskReadRoutineTypeEnum::kLinearRead),
            cros_healthd::DiskReadRoutineTypeEnum::kLinearRead);
  EXPECT_EQ(Convert(crosapi::DiagnosticsDiskReadRoutineTypeEnum::kRandomRead),
            cros_healthd::DiskReadRoutineTypeEnum::kRandomRead);
}

TEST(DiagnosticsServiceConvertersTest, ConvertUInt32ValuePtr) {
  namespace cros_healthd = cros_healthd::mojom;
  namespace crosapi = ::crosapi::mojom;

  EXPECT_EQ(ConvertDiagnosticsPtr(crosapi::UInt32ValuePtr()),
            cros_healthd::NullableUint32Ptr());
  EXPECT_EQ(ConvertDiagnosticsPtr(crosapi::UInt32Value::New(42)),
            cros_healthd::NullableUint32::New(42));
}

}  // namespace ash::converters::diagnostics