Index: boot_mode_unittest.cc |
diff --git a/boot_mode_unittest.cc b/boot_mode_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..922cc24f3a282c006b7377477ada20511d679477 |
--- /dev/null |
+++ b/boot_mode_unittest.cc |
@@ -0,0 +1,218 @@ |
+// Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// Tests for cros_boot_mode::BootMode |
+ |
+#include "boot_mode.h" |
+ |
+#include <base/basictypes.h> |
+#include <base/file_util.h> |
+#include <base/stringprintf.h> |
+#include <gtest/gtest.h> |
+#include <string> |
+ |
+class BootModeTest : public ::testing::Test { |
+ public: |
+ void SetUp() { |
+ EXPECT_TRUE(file_util::CreateNewTempDirectory("", &temp_dir_)); |
+ |
+ developer_switch_path_ = temp_dir_.value(); |
+ developer_switch_path_.append("/CHSW"); |
+ developer_switch_.set_platform_file_path(developer_switch_path_.c_str()); |
+ boot_mode_.set_developer_switch(&developer_switch_); |
+ |
+ bootloader_type_path_ = temp_dir_.value(); |
+ bootloader_type_path_.append("/cmdline"); |
+ bootloader_type_.set_platform_file_path(bootloader_type_path_.c_str()); |
+ boot_mode_.set_bootloader_type(&bootloader_type_); |
+ |
+ firmware_path_ = temp_dir_.value(); |
+ firmware_path_.append("/BINF.1"); |
+ active_main_firmware_.set_platform_file_path(firmware_path_.c_str()); |
+ boot_mode_.set_active_main_firmware(&active_main_firmware_); |
+ } |
+ |
+ ~BootModeTest() { |
+ TearDown(); |
+ } |
+ void TearDown() { |
+ if (!temp_dir_.empty()) |
+ file_util::Delete(temp_dir_, true); |
+ temp_dir_.clear(); |
+ } |
+ |
+ // In SetUp, the temporary files were created and the paths injected |
+ // into the underlying classes. This helper function wraps updating |
+ // each file. |chsw| contains the dev mode switch value. |fw| contains |
+ // the active firmware number, and the |cmdline| is the /proc/cmdline |
+ // that the "system" booted in. |
+ void UpdateFiles(int chsw, int fw, const char *cmdline) { |
+ std::string data = StringPrintf("%d", chsw); |
+ EXPECT_EQ( |
+ file_util::WriteFile(FilePath(developer_switch_.platform_file_path()), |
+ data.c_str(), |
+ data.length()), data.length()); |
+ |
+ data = StringPrintf("%d", fw); |
+ EXPECT_EQ( |
+ file_util::WriteFile(FilePath(active_main_firmware_.platform_file_path()), |
+ data.c_str(), |
+ data.length()), data.length()); |
+ |
+ data.assign(cmdline); |
+ EXPECT_EQ( |
+ file_util::WriteFile(FilePath(bootloader_type_.platform_file_path()), |
+ data.c_str(), |
+ data.length()), data.length()); |
+ |
+ } |
+ |
+ static const char *kUnsupportedText; |
+ static const char *kNormalRecoveryText; |
+ static const char *kNormalText; |
+ static const char *kDeveloperText; |
+ static const char *kDeveloperRecoveryText; |
+ static const int kNormal = 0x0; |
+ static const int kDeveloper = 0x32; |
+ static const int kFwRecovery = 0; |
+ static const int kFwA = 1; |
+ static const int kFwB = 2; |
+ static const char *kCrosDebug; |
+ static const char *kCrosEfi; |
+ static const char *kCrosLegacy; |
+ static const char *kCrosSecure; |
+ protected: |
+ FilePath temp_dir_; |
+ cros_boot_mode::BootMode boot_mode_; |
+ cros_boot_mode::DeveloperSwitch developer_switch_; |
+ std::string developer_switch_path_; |
+ cros_boot_mode::ActiveMainFirmware active_main_firmware_; |
+ std::string firmware_path_; |
+ cros_boot_mode::BootloaderType bootloader_type_; |
+ std::string bootloader_type_path_; |
+}; |
+ |
+const char *BootModeTest::kUnsupportedText = "unsupported"; |
+const char *BootModeTest::kNormalText = "normal"; |
+const char *BootModeTest::kNormalRecoveryText = "normal recovery"; |
+const char *BootModeTest::kDeveloperText = "developer"; |
+const char *BootModeTest::kDeveloperRecoveryText = "developer recovery"; |
+const char *BootModeTest::kCrosSecure = |
+ "some nonsense dm=\"dacros_securesd ada\" cros_secure"; |
+const char *BootModeTest::kCrosLegacy = |
+ "some nonsense dm=\"dacros_securesd ada\" cros_legacy"; |
+const char *BootModeTest::kCrosEfi = |
+ "some nonsense dm=\"dacros_securesd ada\" cros_efi"; |
+const char *BootModeTest::kCrosDebug = |
+ "some nonsense dm=\"dacros_securesd ada\" cros_debug BOOT=hello"; |
+ |
+TEST_F(BootModeTest, NoFilesUseBootloader) { |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kUnsupported, boot_mode_.mode()); |
+ EXPECT_STREQ(kUnsupportedText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, UnsupportedAsDeveloper) { |
+ boot_mode_.Initialize(true, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kDeveloper, boot_mode_.mode()); |
+ EXPECT_STREQ(kDeveloperText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalRecoveryNothingIgnoreBootloader) { |
+ UpdateFiles(kNormal, kFwRecovery, " some kernel noise "); |
+ boot_mode_.Initialize(false, false); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kNormalRecovery, boot_mode_.mode()); |
+ EXPECT_STREQ(kNormalRecoveryText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalFwASecureUseBootloader) { |
+ UpdateFiles(kNormal, kFwA, kCrosSecure); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kNormal, boot_mode_.mode()); |
+ EXPECT_STREQ(kNormalText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalFwBSecureUseBootloader) { |
+ UpdateFiles(kNormal, kFwB, kCrosSecure); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kNormal, boot_mode_.mode()); |
+ EXPECT_STREQ(kNormalText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalFwASecureIgnoreBootloader) { |
+ UpdateFiles(kNormal, kFwA, kCrosSecure); |
+ boot_mode_.Initialize(false, false); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kNormal, boot_mode_.mode()); |
+ EXPECT_STREQ(kNormalText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalFwBSecureIgnoreBootloader) { |
+ UpdateFiles(kNormal, kFwB, kCrosSecure); |
+ boot_mode_.Initialize(false, false); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kNormal, boot_mode_.mode()); |
+ EXPECT_STREQ(kNormalText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, BootloaderPreemptsHardwareUseBootloader) { |
+ UpdateFiles(kNormal, kFwA, " some kernel noise "); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kUnsupported, boot_mode_.mode()); |
+ EXPECT_STREQ(kUnsupportedText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, BootloaderPreemptsHardwareUseBootloaderFwB) { |
+ UpdateFiles(kNormal, kFwB, " some kernel noise "); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kUnsupported, boot_mode_.mode()); |
+ EXPECT_STREQ(kUnsupportedText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalFwADebugUseBootloader) { |
+ UpdateFiles(kNormal, kFwA, kCrosDebug); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kDeveloper, boot_mode_.mode()); |
+ EXPECT_STREQ(kDeveloperText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, NormalFwBDebugUseBootloader) { |
+ UpdateFiles(kNormal, kFwB, kCrosDebug); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kDeveloper, boot_mode_.mode()); |
+ EXPECT_STREQ(kDeveloperText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, UnsupportedDebugUseBootloader) { |
+ UpdateFiles(-1, -1, kCrosDebug); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kDeveloper, boot_mode_.mode()); |
+ EXPECT_STREQ(kDeveloperText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, EfiIsUnsuppportedUseBootloader) { |
+ UpdateFiles(-1, -1, kCrosEfi); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kUnsupported, boot_mode_.mode()); |
+ EXPECT_STREQ(kUnsupportedText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, LegacyIsUnsuppportedUseBootloader) { |
+ UpdateFiles(-1, -1, kCrosLegacy); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kUnsupported, boot_mode_.mode()); |
+ EXPECT_STREQ(kUnsupportedText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, DeveloperFwASecureUseBootloader) { |
+ UpdateFiles(kDeveloper, kFwA, kCrosSecure); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kDeveloper, boot_mode_.mode()); |
+ EXPECT_STREQ(kDeveloperText, boot_mode_.mode_text()); |
+} |
+ |
+TEST_F(BootModeTest, DeveloperRecoverySecureUseBootloader) { |
+ UpdateFiles(kDeveloper, kFwRecovery, kCrosSecure); |
+ boot_mode_.Initialize(false, true); |
+ EXPECT_EQ(cros_boot_mode::BootMode::kDeveloperRecovery, boot_mode_.mode()); |
+ EXPECT_STREQ(kDeveloperRecoveryText, boot_mode_.mode_text()); |
+} |