| // Copyright (C) 2014 The Android Open Source Project |
| // |
| // This software is licensed under the terms of the GNU General Public |
| // License version 2, as published by the Free Software Foundation, and |
| // may be copied, distributed, and modified under those terms. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| #include "android/emulation/CpuAccelerator.h" |
| #include "android/emulation/internal/CpuAccelerator.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include <string> |
| |
| #include <stdio.h> |
| |
| namespace android { |
| |
| class CpuAcceleratorTest : public ::testing::Test { |
| public: |
| CpuAcceleratorTest() { |
| saved_accel_ = GetCurrentCpuAccelerator(); |
| saved_status_ = GetCurrentCpuAcceleratorStatus(); |
| } |
| |
| ~CpuAcceleratorTest() { |
| // Restore previous state. |
| SetCurrentCpuAcceleratorForTesting(saved_accel_, |
| saved_status_code_, |
| saved_status_.c_str()); |
| } |
| private: |
| CpuAccelerator saved_accel_; |
| AndroidCpuAcceleration saved_status_code_; |
| std::string saved_status_; |
| }; |
| |
| // Not really a test, but a simple way to print the current accelerator |
| // value for simple verification. |
| TEST_F(CpuAcceleratorTest, Default) { |
| CpuAccelerator accel = GetCurrentCpuAccelerator(); |
| std::string status = GetCurrentCpuAcceleratorStatus(); |
| |
| switch (accel) { |
| case CPU_ACCELERATOR_NONE: |
| printf("No acceleration possible on this machine!\n"); |
| break; |
| |
| case CPU_ACCELERATOR_KVM: |
| printf("KVM acceleration usable on this machine!\n"); |
| break; |
| |
| case CPU_ACCELERATOR_HAX: |
| printf("HAX acceleration usable on this machine!\n"); |
| break; |
| |
| default: |
| ASSERT_FALSE(1) << "Invalid accelerator value: " << accel; |
| } |
| printf("Status: %s\n", status.c_str()); |
| } |
| |
| TEST(CpuAccelerator, GetCpuInfo) { |
| auto info = android::GetCpuInfo(); |
| EXPECT_NE(info.first, ANDROID_CPU_INFO_FAILED); |
| EXPECT_GT(info.second.size(), 0); |
| } |
| |
| #ifdef __APPLE__ |
| |
| TEST(cpuAcceleratorGetHaxVersion, Test) { |
| const char* kext_dir[] = { |
| "this-directory-does-not-exist", |
| "android", // this directory exists but doesn't contain the file |
| "android/emulation", |
| }; |
| |
| // this is a real version from from HAXM 1.2.1 |
| ASSERT_EQ(0x01020001, cpuAcceleratorGetHaxVersion(kext_dir, 3, "CpuAccelerator_unittest.dat2")); |
| |
| // this is a real version from from HAXM 1.1.4 |
| const char* version_file = "CpuAccelerator_unittest.dat"; |
| |
| ASSERT_EQ(0x01010004, cpuAcceleratorGetHaxVersion(kext_dir, 3, version_file)); |
| |
| // only looking in the first directory, won't be found |
| ASSERT_EQ(0, cpuAcceleratorGetHaxVersion(kext_dir, 1, version_file)); |
| |
| // the second directory will be found but the version file will be missing |
| ASSERT_EQ(-1, cpuAcceleratorGetHaxVersion(kext_dir, 2, version_file)); |
| |
| // this file will have "VERSION=" but not a valid number following it |
| ASSERT_EQ(-1, cpuAcceleratorGetHaxVersion(kext_dir, 3, "CpuAccelerator_unittest.cpp")); |
| } |
| |
| TEST(cpuAcceleratorParseVersionScript, Test) { |
| ASSERT_EQ(0x01020004, cpuAcceleratorParseVersionScript("VERSION=1.2.4")); |
| ASSERT_EQ(0x0203000a, cpuAcceleratorParseVersionScript("VERSION=2.3.10\r")); |
| ASSERT_EQ(0x04010000, cpuAcceleratorParseVersionScript("VERSION=4.1")); |
| ASSERT_EQ(0x03000000, cpuAcceleratorParseVersionScript("VERSION=3\n")); |
| ASSERT_EQ(0x7fffffff, cpuAcceleratorParseVersionScript("VERSION=127.255.65535")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("VERSION=.1")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("VERSION=128.0.0")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("VERSION=0")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("VERSION=1.256.3")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("VERSION=1.2.65536")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("VERSION=\n")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("asdf")); |
| ASSERT_EQ(-1, cpuAcceleratorParseVersionScript("")); |
| } |
| |
| #endif // __APPLE__ |
| |
| } // namespace android |