// Copyright 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/extensions/extension_apitest.h"
#include "content/public/test/browser_test.h"
#include "extensions/browser/api/system_cpu/cpu_info_provider.h"

namespace extensions {

using api::system_cpu::CpuInfo;

class MockCpuInfoProviderImpl : public CpuInfoProvider {
 public:
  MockCpuInfoProviderImpl() = default;
  MockCpuInfoProviderImpl(const MockCpuInfoProviderImpl&) = delete;
  MockCpuInfoProviderImpl& operator=(const MockCpuInfoProviderImpl&) = delete;

  bool QueryInfo() override {
    info_.num_of_processors = 4;
    info_.arch_name = "x86";
    info_.model_name = "unknown";

    info_.features.clear();
    info_.features.push_back("mmx");
    info_.features.push_back("avx");

    info_.processors.clear();
    info_.processors.emplace_back(api::system_cpu::ProcessorInfo());
    info_.processors[0].usage.kernel = 1;
    info_.processors[0].usage.user = 2;
    info_.processors[0].usage.idle = 3;
    info_.processors[0].usage.total = 6;

    // The fractional part of these values should be exactly represented as
    // floating points to avoid rounding errors.
    info_.temperatures = {30.125, 40.0625};
    return true;
  }

 private:
  ~MockCpuInfoProviderImpl() override = default;
};

using ContextType = ExtensionBrowserTest::ContextType;

class SystemCpuApiTest : public ExtensionApiTest,
                         public testing::WithParamInterface<ContextType> {
 public:
  SystemCpuApiTest() : ExtensionApiTest(GetParam()) {}
  ~SystemCpuApiTest() override = default;
  SystemCpuApiTest(const SystemCpuApiTest&) = delete;
  SystemCpuApiTest& operator=(const SystemCpuApiTest&) = delete;
};

INSTANTIATE_TEST_SUITE_P(EventPage,
                         SystemCpuApiTest,
                         ::testing::Values(ContextType::kEventPage));
INSTANTIATE_TEST_SUITE_P(ServiceWorker,
                         SystemCpuApiTest,
                         ::testing::Values(ContextType::kServiceWorker));

IN_PROC_BROWSER_TEST_P(SystemCpuApiTest, Cpu) {
  scoped_refptr<CpuInfoProvider> provider = new MockCpuInfoProviderImpl;
  // The provider is owned by the single CpuInfoProvider instance.
  CpuInfoProvider::InitializeForTesting(provider);
  ASSERT_TRUE(RunExtensionTest("system_cpu")) << message_;
}

}  // namespace extensions
