/** @file Unit tests for the implementation of SecureBootVariableLib. Copyright (c) 2022, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include extern "C" { #include #include #include #include #include #include } using namespace testing; ////////////////////////////////////////////////////////////////////////////// class SetSecureBootModeTest : public Test { protected: MockUefiRuntimeServicesTableLib RtServicesMock; UINT8 SecureBootMode; EFI_STATUS Status; void SetUp() override { // Any random magic number can be used for these tests SecureBootMode = 0xAB; } }; // Test SetSecureBootMode() API from SecureBootVariableLib to verify the // expected error is returned when the call to gRT->SetVariable() fails. TEST_F(SetSecureBootModeTest, SetVarError) { EXPECT_CALL(RtServicesMock, gRT_SetVariable) .WillOnce(Return(EFI_INVALID_PARAMETER)); Status = SetSecureBootMode(SecureBootMode); EXPECT_EQ(Status, EFI_INVALID_PARAMETER); } // Test SetSecureBootMode() API from SecureBootVariableLib to verify the // expected secure boot mode is written to the correct variable in the call // to gRT->SetVariable(). TEST_F(SetSecureBootModeTest, PropogateModeToSetVar) { EXPECT_CALL(RtServicesMock, gRT_SetVariable( Char16StrEq(EFI_CUSTOM_MODE_NAME), BufferEq(&gEfiCustomModeEnableGuid, sizeof(EFI_GUID)), EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, sizeof(SecureBootMode), BufferEq(&SecureBootMode, sizeof(SecureBootMode)))) .WillOnce(Return(EFI_SUCCESS)); Status = SetSecureBootMode(SecureBootMode); EXPECT_EQ(Status, EFI_SUCCESS); } ////////////////////////////////////////////////////////////////////////////// class GetSetupModeTest : public Test { protected: MockUefiRuntimeServicesTableLib RtServicesMock; UINT8 SetupMode; EFI_STATUS Status; UINT8 ExpSetupMode; void SetUp() override { // Any random magic number can be used for these tests ExpSetupMode = 0xAB; } }; // Test GetSetupMode() API from SecureBootVariableLib to verify the expected // error is returned when the call to gRT->GetVariable() fails. TEST_F(GetSetupModeTest, GetVarError) { EXPECT_CALL(RtServicesMock, gRT_GetVariable) .WillOnce(Return(EFI_INVALID_PARAMETER)); Status = GetSetupMode (&SetupMode); EXPECT_EQ(Status, EFI_INVALID_PARAMETER); } // Test GetSetupMode() API from SecureBootVariableLib to verify the expected // setup mode is returned (and with a success return code) when the mode is // successfully read from the call to gRT->GetVariable(). TEST_F(GetSetupModeTest, FetchModeFromGetVar) { EXPECT_CALL(RtServicesMock, gRT_GetVariable( Char16StrEq(EFI_SETUP_MODE_NAME), BufferEq(&gEfiGlobalVariableGuid, sizeof(EFI_GUID)), _, Pointee(Eq(sizeof(SetupMode))), NotNull())) .WillOnce(DoAll( SetArgPointee<3>(sizeof(ExpSetupMode)), SetArgBuffer<4>(&ExpSetupMode, sizeof(ExpSetupMode)), Return(EFI_SUCCESS))); Status = GetSetupMode (&SetupMode); ASSERT_EQ(Status, EFI_SUCCESS); EXPECT_EQ(SetupMode, ExpSetupMode); } ////////////////////////////////////////////////////////////////////////////// class IsSecureBootEnabledTest : public Test { protected: MockUefiLib UefiLibMock; BOOLEAN Enabled; }; // Test IsSecureBootEnabled() API from SecureBootVariableLib to verify FALSE // is returned when the call to GetEfiGlobalVariable2() fails. TEST_F(IsSecureBootEnabledTest, GetVarError) { EXPECT_CALL(UefiLibMock, GetEfiGlobalVariable2) .WillOnce(Return(EFI_ABORTED)); Enabled = IsSecureBootEnabled (); EXPECT_EQ(Enabled, FALSE); } ////////////////////////////////////////////////////////////////////////////// class IsSecureBootEnabledAllocTest : public IsSecureBootEnabledTest { protected: UINT8 *BootEnabledBuffer; void SetUp() override { BootEnabledBuffer = (UINT8*) AllocatePool(1); ASSERT_NE(BootEnabledBuffer, nullptr); } }; // Test IsSecureBootEnabled() API from SecureBootVariableLib to verify TRUE // is returned when the call to GetEfiGlobalVariable2() is successful and // returns SECURE_BOOT_MODE_ENABLE. TEST_F(IsSecureBootEnabledAllocTest, IsEnabled) { *BootEnabledBuffer = SECURE_BOOT_MODE_ENABLE; EXPECT_CALL(UefiLibMock, GetEfiGlobalVariable2( Char16StrEq(EFI_SECURE_BOOT_MODE_NAME), NotNull(), _)) .WillOnce(DoAll( SetArgBuffer<1>(&BootEnabledBuffer, sizeof(VOID*)), Return(EFI_SUCCESS))); Enabled = IsSecureBootEnabled (); EXPECT_EQ(Enabled, TRUE); } // Test IsSecureBootEnabled() API from SecureBootVariableLib to verify FALSE // is returned when the call to GetEfiGlobalVariable2() is successful and // returns SECURE_BOOT_MODE_DISABLE. TEST_F(IsSecureBootEnabledAllocTest, IsDisabled) { *BootEnabledBuffer = SECURE_BOOT_MODE_DISABLE; EXPECT_CALL(UefiLibMock, GetEfiGlobalVariable2( Char16StrEq(EFI_SECURE_BOOT_MODE_NAME), NotNull(), _)) .WillOnce(DoAll( SetArgBuffer<1>(&BootEnabledBuffer, sizeof(VOID*)), Return(EFI_SUCCESS))); Enabled = IsSecureBootEnabled (); EXPECT_EQ(Enabled, FALSE); } int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }