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

#ifndef FLEX_HWIS_TELEMETRY_FOR_TESTING_H_
#define FLEX_HWIS_TELEMETRY_FOR_TESTING_H_

#include <string>
#include <utility>
#include <vector>

#include <diagnostics/mojom/public/cros_healthd_probe.mojom.h>

inline constexpr char kSystemVersion[] = "LENOVO";
inline constexpr char kSystemProductName[] = "20HQS1MX00";
inline constexpr char kSystemProductVersion[] = "ThinkPad X1 Carbon 5th";
inline constexpr char kSystemBiosVersion[] = "N1MET37W";
inline constexpr ash::cros_healthd::mojom::BootMode kBootMode =
    ash::cros_healthd::mojom::BootMode::kCrosEfiSecure;
inline constexpr bool kSystemUefi = true;
inline constexpr bool kSystemSecureboot = true;
inline constexpr char kSystemUefiStr[] = "true";
inline constexpr char kSystemSecurebootStr[] = "true";
inline constexpr char kCpuModelName[] = "Mock CPU Model";
inline constexpr int kMemoryKib = 16131552;
inline constexpr char kMemoryKibStr[] = "16131552";
inline constexpr char kPciId[] = "pci:0bda:8153";
inline constexpr char kSecondPciId[] = "pci:8086:2a43";
inline constexpr char kUsbId[] = "usb:0bda:8153";
inline constexpr char kBusPciName[] = "Mock PCI Vendor I219-LM";
inline constexpr char kBusUsbName[] = "Mock USB Vendor I219-LM";
inline constexpr char kDriver[] = "r8152";
inline constexpr char kGraphicsVersion[] = "OpenGL ES 3.2 Mesa 22.3.3";
inline constexpr char kGraphicsVendor[] = "Intel";
inline constexpr char kGraphicsRenderer[] = "Mesa Intel(R) HD Graphics 620";
inline constexpr char kGraphicsShadingVer[] = "OpenGL ES GLSL ES 3.20";
inline constexpr char kGraphicsExtension1[] = "GL_EXT_blend_minmax";
inline constexpr char kGraphicsExtension2[] = "GL_EXT_multi_draw_arrays";
inline constexpr char kGraphicsExtension3[] = "GL_MESA_bgra";
inline constexpr char kTouchpadLibraryName[] = "gestures";
inline constexpr char kTouchpadDriverName[] = "hid-multitouch";
inline constexpr char kTouchpadVendorId[] = "0x000";
inline constexpr char kTouchpadProductId[] = "0x001";
inline constexpr int kTpmFamily = 0x322e3000;
inline constexpr char kTpmFamilyStr[] = "2.0";
inline constexpr int kTpmSpecLevel = 0;
inline constexpr char kTpmSpecLevelStr[] = "0";
inline constexpr int kTpmManufacturer = 0;
inline constexpr char kTpmManufacturerStr[] = "0";
inline constexpr char kTpmDidVid[] = "test";
inline constexpr char kPciVendorName[] = "Mock PCI Vendor";
inline constexpr char kUsbVendorName[] = "Mock USB Vendor";
inline constexpr char kBusProductName[] = "I219-LM";
inline constexpr int kPciBusVendorId = 0x0bda;
inline constexpr int kPciBusDeviceId = 0x8153;
inline constexpr int kSecondPciBusVendorId = 0x8086;
inline constexpr int kSecondPciBusDeviceId = 0x2a43;
inline constexpr char kPciBusDriver[] = "r8152";
inline constexpr bool kTpmIsAllowed = true;
inline constexpr char kTpmIsAllowedStr[] = "true";
inline constexpr bool kTpmOwned = true;
inline constexpr char kTpmOwnedStr[] = "true";

namespace flex_hwis {
namespace mojom = ::ash::cros_healthd::mojom;

// Builds a mojom::TelemetryInfoPtr for use in tests.
class TelemetryForTesting {
 public:
  // Fill in default fake system information.
  void AddSystemInfo();
  // Fill in default fake cpu information.
  void AddCpuInfo();
  // Fill in default fake memory information.
  void AddMemoryInfo();
  // Fill in default fake pci bus information with a specified device class.
  void AddPciBusInfo(const mojom::BusDeviceClass dev_class);
  // Fill in fake pci bus information.
  void AddPciBusInfo(const mojom::BusDeviceClass dev_class,
                     const std::string& vendor,
                     const std::string& product,
                     uint16_t vendor_id,
                     uint16_t device_id,
                     const std::string& driver);
  // Fill in default fake usb bus information with a specified device class.
  void AddUsbBusInfo(const mojom::BusDeviceClass dev_class);
  // Fill in fake usb bus information.
  void AddUsbBusInfo(const mojom::BusDeviceClass dev_class,
                     const std::string& vendor,
                     const std::string& product,
                     uint16_t vendor_id,
                     uint16_t product_id,
                     const std::vector<std::string>& drivers);
  // Fill in default fake graphics information.
  void AddGraphicsInfo();
  // Fill in default fake input information.
  void AddInputInfo();
  // Fill in default fake tpm information.
  void AddTpmInfo();

  // Returns a copy of the TelemetryInfoPtr we've been building.
  mojom::TelemetryInfoPtr Get() const;

 private:
  mojom::TelemetryInfoPtr info_ = mojom::TelemetryInfo::New();
  // Manipulating the bus_result directly is difficult.
  // Collect devices to add at the last minute.
  std::vector<mojom::BusDevicePtr> devices_;
};

}  // namespace flex_hwis

#endif  // FLEX_HWIS_TELEMETRY_FOR_TESTING_H_
