// Copyright (c) 2013 The Chromium 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 "chrome/browser/chromeos/login/hwid_checker.h"
#include "base/system/sys_info.h"
#include "base/test/scoped_command_line.h"
#include "base/time/time.h"
#include "chrome/browser/chromeos/scoped_set_running_on_chromeos_for_testing.h"
#include "chromeos/system/fake_statistics_provider.h"
#include "content/public/common/content_switches.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace chromeos {

TEST(HWIDCheckerTest, EmptyHWID) {
  EXPECT_FALSE(IsHWIDCorrect(""));
}

TEST(HWIDCheckerTest, HWIDv2) {
  EXPECT_TRUE(IsHWIDCorrect("SOME DATA 7861"));
  EXPECT_FALSE(IsHWIDCorrect("SOME DATA 7861 "));
  EXPECT_FALSE(IsHWIDCorrect("SOME DATA 786 1"));
  EXPECT_FALSE(IsHWIDCorrect("SOME DATA 786"));
  EXPECT_FALSE(IsHWIDCorrect("SOME DATA7861"));
}

TEST(HWIDCheckerTest, ExceptionalHWID) {
  EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKQ-E"));
  EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-3K"));
  EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-2GI"));
  EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-2MRO"));
  EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-2MDG-V"));
  EXPECT_TRUE(IsHWIDCorrect("SPRING DAKB-NM"));
  EXPECT_TRUE(IsHWIDCorrect("FALCO APOM-3"));

  // Not exceptions.
  EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-BJKZ-F"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING LA7N-BJK7-H"));
  EXPECT_FALSE(IsHWIDCorrect("FALCO BPO6-C"));

  // Degenerate cases.
  EXPECT_FALSE(IsHWIDCorrect("SPRING"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING "));
  EXPECT_FALSE(IsHWIDCorrect("SPRING KD"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING T7"));

  // No board name.
  EXPECT_FALSE(IsHWIDCorrect(" CA7N-BJKV-T"));
  EXPECT_FALSE(IsHWIDCorrect("CA7N-BJKH-S"));

  // Excess fields.
  EXPECT_FALSE(IsHWIDCorrect("SPRING WINTER CA7N-BJK7-T"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJKN-D WINTER"));

  // Incorrect BOM format.
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7-NBJK-YO"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA-7NBJ-KYO"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING -CA7N-BJKY-O"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJKK-FS-UN"));

  // Incorrect characters.
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA9N-BJKL-P"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-B0KT-S"));
  EXPECT_FALSE(IsHWIDCorrect("SPrING CA7N-BJKH-W"));

  // Random changes.
  EXPECT_FALSE(IsHWIDCorrect("SPRUNG CA7N-BJKY-O"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-8JKY-O"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJSY-O"));
  EXPECT_FALSE(IsHWIDCorrect("SPRINGS CA7N-BJKY-O"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJKM-L"));
  EXPECT_FALSE(IsHWIDCorrect("SPRINGXCA7N-BJKZ-F"));
}

TEST(HWIDCheckerTest, HWIDv3) {
  EXPECT_TRUE(IsHWIDCorrect("SPRING E2B-C3D-E8X"));
  EXPECT_TRUE(IsHWIDCorrect("SPRING E2B-C3D-E8X-D8J"));
  EXPECT_TRUE(IsHWIDCorrect("FALCO B67-36Y"));
  // New HWIDv3 extended format.
  EXPECT_TRUE(
      IsHWIDCorrect("SARIEN-MCOO 0-20-1DC-180 B2B-A6J-23P-43A-B2L-A7I"));

  // Exceptions.
  EXPECT_FALSE(IsHWIDCorrect("SPRING D2B-C3D-E5D"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING A2B-C3D-E8X-D7T"));
  EXPECT_FALSE(IsHWIDCorrect("FALCO A67-35W"));

  // Degenerate cases.
  EXPECT_FALSE(IsHWIDCorrect("SPRING"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING "));
  EXPECT_TRUE(IsHWIDCorrect("SPRING Z34"));

  // No board name.
  EXPECT_FALSE(IsHWIDCorrect(" C7N-J3V-T4J"));
  EXPECT_FALSE(IsHWIDCorrect("C7N-J3V-T2I"));

  // Excess fields.
  EXPECT_FALSE(IsHWIDCorrect("SPRING WINTER E2B-C3D-E3K"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-E72 WINTER"));

  // Incorrect BOM format.
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2BC3D-E8X"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2-B-C3D-E8X"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-E8X-"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-E85-Y"));

  // Incorrect characters.
  EXPECT_FALSE(IsHWIDCorrect("SPrING E2B-C3D-E3P"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING EAB-C3D-E7Y"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C1D-E3W"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E28-C3D-E7Z"));

  // Random changes.
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2L-C3D-E8X"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-X8X"));
  EXPECT_FALSE(IsHWIDCorrect("SPRINGZE2B-C3D-E8X"));
  EXPECT_FALSE(IsHWIDCorrect("SPRMNG E2B-C3D-E8X"));
  EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-EIX"));
}

TEST(HWIDCheckerTest, KnownHWIDs) {
  EXPECT_TRUE(IsHWIDCorrect("DELL HORIZON MAGENTA 8992"));
  EXPECT_FALSE(IsHWIDCorrect("DELL HORIZ0N MAGENTA 8992"));

  EXPECT_TRUE(IsHWIDCorrect("DELL HORIZON MAGENTA DVT 4770"));
  EXPECT_FALSE(IsHWIDCorrect("DELL MAGENTA HORIZON DVT 4770"));

  EXPECT_TRUE(IsHWIDCorrect("SAMS ALEX GAMMA DVT 9247"));
  EXPECT_FALSE(IsHWIDCorrect("SAMS ALPX GAMMA DVT 9247"));

  // New HWIDv3 extended format.
  EXPECT_TRUE(
      IsHWIDCorrect("SARIEN-MCOO 0-20-1DC-180 B2B-A6J-23P-43A-B2L-A7I"));
}

#if defined(GOOGLE_CHROME_BUILD)
const char kLsbRelease[] =
    "CHROMEOS_RELEASE_NAME=Chrome OS\n"
    "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";

// Test logic for command line "test-type" switch.
TEST(MachineHWIDCheckerTest, TestSwitch) {
  // GIVEN test switch is active.
  base::test::ScopedCommandLine scoped_command_line;
  scoped_command_line.GetProcessCommandLine()->AppendSwitch(
      ::switches::kTestType);

  // THEN IsMachineHWIDCorrect() is always true.
  EXPECT_TRUE(IsMachineHWIDCorrect());
  ScopedSetRunningOnChromeOSForTesting fake_release(kLsbRelease, base::Time());
  EXPECT_TRUE(IsMachineHWIDCorrect());

  system::ScopedFakeStatisticsProvider fake_statistics_provider;
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey,
                                               "INVALID_HWID");
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.ClearMachineStatistic(system::kHardwareClassKey);
  EXPECT_TRUE(IsMachineHWIDCorrect());
}

// Test logic when not running on Chrome OS.
TEST(MachineHWIDCheckerTest, NotOnChromeOS) {
  // GIVEN the OS is not Chrome OS.
  ScopedSetRunningOnChromeOSForTesting fake_release("", base::Time());

  // THEN IsMachineHWIDCorrect() is always true.
  EXPECT_TRUE(IsMachineHWIDCorrect());

  system::ScopedFakeStatisticsProvider fake_statistics_provider;
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey,
                                               "INVALID_HWID");
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.ClearMachineStatistic(system::kHardwareClassKey);
  EXPECT_TRUE(IsMachineHWIDCorrect());
}

// Test logic when running on Chrome OS but the HWID is not present.
TEST(MachineHWIDCheckerTest, OnCrosNoHWID) {
  // GIVEN the OS is Chrome OS.
  ScopedSetRunningOnChromeOSForTesting fake_release(kLsbRelease, base::Time());

  // GIVEN the HWID is not present.
  system::ScopedFakeStatisticsProvider fake_statistics_provider;
  fake_statistics_provider.ClearMachineStatistic(system::kHardwareClassKey);

  // WHEN Chrome OS is running in a VM.
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               system::kIsVmValueTrue);
  // THEN IsMachineHWIDCorrect() is true.
  EXPECT_TRUE(IsMachineHWIDCorrect());
  // WHEN Chrome OS is not running in a VM.
  fake_statistics_provider.ClearMachineStatistic(system::kIsVmKey);
  // THEN IsMachineHWIDCorrect() is always false.
  EXPECT_FALSE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               system::kIsVmValueFalse);
  EXPECT_FALSE(IsMachineHWIDCorrect());
}

// Test logic when the HWID is valid.
TEST(MachineHWIDCheckerTest, ValidHWID) {
  // GIVEN the HWID is valid.
  system::ScopedFakeStatisticsProvider fake_statistics_provider;
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey,
                                               "DELL HORIZON MAGENTA DVT 4770");

  // THEN IsMachineHWIDCorrect() is always true.
  ScopedSetRunningOnChromeOSForTesting fake_release(kLsbRelease, base::Time());
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               system::kIsVmValueFalse);
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               system::kIsVmValueTrue);
  EXPECT_TRUE(IsMachineHWIDCorrect());
}

// Test logic when running inside a VM.
TEST(MachineHWIDCheckerTest, InVM) {
  // GIVEN kIsVmKey is kIsVmValueTrue.
  system::ScopedFakeStatisticsProvider fake_statistics_provider;
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               system::kIsVmValueTrue);

  // GIVEN the OS is Chrome OS.
  ScopedSetRunningOnChromeOSForTesting fake_release(kLsbRelease, base::Time());
  // THEN IsMachineHWIDCorrect() is always true.
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey,
                                               "INVALID_HWID");
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey, "");
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey,
                                               "DELL HORIZON MAGENTA DVT 4770");
  EXPECT_TRUE(IsMachineHWIDCorrect());
  fake_statistics_provider.ClearMachineStatistic(system::kHardwareClassKey);
  EXPECT_TRUE(IsMachineHWIDCorrect());
}

// Test logic when HWID is invalid and we're not in a VM.
TEST(MachineHWIDCheckerTest, InvalidHWIDInVMNotTrue) {
  // GIVEN the OS is Chrome OS.
  ScopedSetRunningOnChromeOSForTesting fake_release(kLsbRelease, base::Time());

  // GIVEN the HWID is invalid.
  system::ScopedFakeStatisticsProvider fake_statistics_provider;
  fake_statistics_provider.SetMachineStatistic(system::kHardwareClassKey,
                                               "INVALID_HWID");

  // GIVEN kIsVmKey is anything but kIsVmValueTrue.
  // THEN IsMachineHWIDCorrect() is always false.
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               system::kIsVmValueFalse);
  EXPECT_FALSE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey,
                                               "INVALID_VM_KEY");
  EXPECT_FALSE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey, "(error)");
  EXPECT_FALSE(IsMachineHWIDCorrect());
  fake_statistics_provider.SetMachineStatistic(system::kIsVmKey, "");
  EXPECT_FALSE(IsMachineHWIDCorrect());
  fake_statistics_provider.ClearMachineStatistic(system::kIsVmKey);
  EXPECT_FALSE(IsMachineHWIDCorrect());
}

#else  // defined(GOOGLE_CHROME_BUILD)

// Test non-Google Chromium builds.
TEST(MachineHWIDCheckerTest, NonGoogleBuild) {
  // GIVEN this is not a Google build.
  // THEN IsMachineHWIDCorrect() is always true.
  EXPECT_TRUE(IsMachineHWIDCorrect());
}

#endif  // defined(GOOGLE_CHROME_BUILD)
}  // namespace chromeos
