// Copyright 2013 The Flutter 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 "cpu_affinity.h"

#include "fml/file.h"
#include "fml/mapping.h"
#include "gtest/gtest.h"
#include "logging.h"

namespace fml {
namespace testing {

TEST(CpuAffinity, NonAndroidPlatformDefaults) {
  ASSERT_FALSE(fml::EfficiencyCoreCount().has_value());
  ASSERT_TRUE(fml::RequestAffinity(fml::CpuAffinity::kEfficiency));
}

TEST(CpuAffinity, NormalSlowMedFastCores) {
  auto speeds = {CpuIndexAndSpeed{.index = 0, .speed = 1},
                 CpuIndexAndSpeed{.index = 1, .speed = 2},
                 CpuIndexAndSpeed{.index = 2, .speed = 3}};
  auto tracker = CPUSpeedTracker(speeds);

  ASSERT_TRUE(tracker.IsValid());
  ASSERT_EQ(tracker.GetIndices(CpuAffinity::kEfficiency)[0], 0u);
  ASSERT_EQ(tracker.GetIndices(CpuAffinity::kPerformance)[0], 2u);
  ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance).size(), 2u);
  ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance)[0], 0u);
  ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance)[1], 1u);
}

TEST(CpuAffinity, NoCpuData) {
  auto tracker = CPUSpeedTracker({});

  ASSERT_FALSE(tracker.IsValid());
}

TEST(CpuAffinity, AllSameSpeed) {
  auto speeds = {CpuIndexAndSpeed{.index = 0, .speed = 1},
                 CpuIndexAndSpeed{.index = 1, .speed = 1},
                 CpuIndexAndSpeed{.index = 2, .speed = 1}};
  auto tracker = CPUSpeedTracker(speeds);

  ASSERT_FALSE(tracker.IsValid());
}

TEST(CpuAffinity, SingleCore) {
  auto speeds = {CpuIndexAndSpeed{.index = 0, .speed = 1}};
  auto tracker = CPUSpeedTracker(speeds);

  ASSERT_FALSE(tracker.IsValid());
}

TEST(CpuAffinity, FileParsing) {
  fml::ScopedTemporaryDirectory base_dir;
  ASSERT_TRUE(base_dir.fd().is_valid());

  // Generate a fake CPU speed file
  fml::DataMapping test_data(std::string("12345"));
  ASSERT_TRUE(fml::WriteAtomically(base_dir.fd(), "test_file", test_data));

  auto file = fml::OpenFileReadOnly(base_dir.fd(), "test_file");
  ASSERT_TRUE(file.is_valid());

  // Open file and parse speed.
  auto result = ReadIntFromFile(base_dir.path() + "/test_file");
  ASSERT_TRUE(result.has_value());
  ASSERT_EQ(result.value_or(0), 12345);
}

TEST(CpuAffinity, FileParsingWithNonNumber) {
  fml::ScopedTemporaryDirectory base_dir;
  ASSERT_TRUE(base_dir.fd().is_valid());

  // Generate a fake CPU speed file
  fml::DataMapping test_data(std::string("whoa this isnt a number"));
  ASSERT_TRUE(fml::WriteAtomically(base_dir.fd(), "test_file", test_data));

  auto file = fml::OpenFileReadOnly(base_dir.fd(), "test_file");
  ASSERT_TRUE(file.is_valid());

  // Open file and parse speed.
  auto result = ReadIntFromFile(base_dir.path() + "/test_file");
  ASSERT_FALSE(result.has_value());
}

TEST(CpuAffinity, MissingFileParsing) {
  auto result = ReadIntFromFile("/does_not_exist");
  ASSERT_FALSE(result.has_value());
}

}  // namespace testing
}  // namespace fml
