// Copyright 2020 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 "diagnostics/wilco_dtc_supportd/telemetry/system_info_service_impl.h"

#include <string>

#include "base/strings/stringprintf.h"
#include <base/system/sys_info.h>
#include <base/time/time.h>
#include <gtest/gtest.h>
#include <gmock/gmock.h>

#include "diagnostics/wilco_dtc_supportd/telemetry/system_info_service.h"

namespace diagnostics {

class SystemInfoServiceImplTest : public testing::Test {
 public:
  SystemInfoServiceImplTest() = default;
  ~SystemInfoServiceImplTest() override = default;

  SystemInfoServiceImplTest(const SystemInfoServiceImplTest&) = delete;
  SystemInfoServiceImplTest& operator=(const SystemInfoServiceImplTest&) =
      delete;

  SystemInfoService* service() { return &service_; }

 private:
  SystemInfoServiceImpl service_;
};

TEST_F(SystemInfoServiceImplTest, GetOsVersion) {
  constexpr char kOsVersion[] = "11932.0.2019_03_20_1100";

  base::SysInfo::SetChromeOSVersionInfoForTest(
      base::StringPrintf("CHROMEOS_RELEASE_VERSION=%s", kOsVersion),
      base::Time());

  std::string version;
  EXPECT_TRUE(service()->GetOsVersion(&version));
  EXPECT_EQ(version, kOsVersion);
}

TEST_F(SystemInfoServiceImplTest, GetOsVersionNoLsbRelease) {
  base::SysInfo::SetChromeOSVersionInfoForTest("", base::Time());

  std::string version;
  EXPECT_FALSE(service()->GetOsVersion(&version));
}

TEST_F(SystemInfoServiceImplTest, GetOsMilestone) {
  constexpr int kMilestone = 75;

  base::SysInfo::SetChromeOSVersionInfoForTest(
      base::StringPrintf("CHROMEOS_RELEASE_CHROME_MILESTONE=%d", kMilestone),
      base::Time());

  int milestone = 0;
  EXPECT_TRUE(service()->GetOsMilestone(&milestone));
  EXPECT_EQ(milestone, kMilestone);
}

TEST_F(SystemInfoServiceImplTest, GetOsMilestoneNoLsbRelease) {
  base::SysInfo::SetChromeOSVersionInfoForTest("", base::Time());

  int milestone = 0;
  EXPECT_FALSE(service()->GetOsMilestone(&milestone));
}

TEST_F(SystemInfoServiceImplTest, GetOsMilestoneNotInteger) {
  base::SysInfo::SetChromeOSVersionInfoForTest(
      "CHROMEOS_RELEASE_CHROME_MILESTONE=abcdef", base::Time());

  int milestone = 0;
  EXPECT_FALSE(service()->GetOsMilestone(&milestone));
}

}  // namespace diagnostics
