// 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); ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency).size(), 2u); ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency)[0], 1u); ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency)[1], 2u); } 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