+/** @file\r
+ This is a sample to demonstrates the use of GoogleTest that supports host\r
+ execution environments.\r
+\r
+ Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <gtest/gtest.h>\r
+extern "C" {\r
+ #include <Uefi.h>\r
+ #include <Library/BaseLib.h>\r
+ #include <Library/DebugLib.h>\r
+}\r
+\r
+/**\r
+ Sample unit test that verifies the expected result of an unsigned integer\r
+ addition operation.\r
+**/\r
+TEST(SimpleMathTests, OnePlusOneShouldEqualTwo) {\r
+ UINTN A;\r
+ UINTN B;\r
+ UINTN C;\r
+\r
+ A = 1;\r
+ B = 1;\r
+ C = A + B;\r
+\r
+ ASSERT_EQ (C, (UINTN)2);\r
+}\r
+\r
+/**\r
+ Sample unit test that verifies that a global BOOLEAN is updatable.\r
+**/\r
+class GlobalBooleanVarTests : public ::testing::Test {\r
+ public:\r
+ BOOLEAN SampleGlobalTestBoolean = FALSE;\r
+};\r
+\r
+TEST_F(GlobalBooleanVarTests, GlobalBooleanShouldBeChangeable) {\r
+ SampleGlobalTestBoolean = TRUE;\r
+ ASSERT_TRUE (SampleGlobalTestBoolean);\r
+\r
+ SampleGlobalTestBoolean = FALSE;\r
+ ASSERT_FALSE (SampleGlobalTestBoolean);\r
+}\r
+\r
+/**\r
+ Sample unit test that logs a warning message and verifies that a global\r
+ pointer is updatable.\r
+**/\r
+class GlobalVarTests : public ::testing::Test {\r
+ public:\r
+ VOID *SampleGlobalTestPointer = NULL;\r
+\r
+ protected:\r
+ void SetUp() override {\r
+ ASSERT_EQ ((UINTN)SampleGlobalTestPointer, (UINTN)NULL);\r
+ }\r
+ void TearDown() {\r
+ SampleGlobalTestPointer = NULL;\r
+ }\r
+};\r
+\r
+TEST_F(GlobalVarTests, GlobalPointerShouldBeChangeable) {\r
+ SampleGlobalTestPointer = (VOID *)-1;\r
+ ASSERT_EQ ((UINTN)SampleGlobalTestPointer, (UINTN)((VOID *)-1));\r
+}\r
+\r
+\r
+/**\r
+ Set PcdDebugPropertyMask for each MacroTestsAssertsEnabledDisabled test\r
+**/\r
+class MacroTestsAssertsEnabledDisabled : public testing::TestWithParam<UINT8> {\r
+ void SetUp() {\r
+ PatchPcdSet8 (PcdDebugPropertyMask, GetParam());\r
+ }\r
+};\r
+\r
+/**\r
+ Sample unit test using the ASSERT_TRUE() macro.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertTrue) {\r
+ UINT64 Result;\r
+\r
+ //\r
+ // This test passes because expression always evaluated to TRUE.\r
+ //\r
+ ASSERT_TRUE (TRUE);\r
+\r
+ //\r
+ // This test passes because expression always evaluates to TRUE.\r
+ //\r
+ Result = LShiftU64 (BIT0, 1);\r
+ ASSERT_TRUE (Result == BIT1);\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_FALSE() macro.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertFalse) {\r
+ UINT64 Result;\r
+\r
+ //\r
+ // This test passes because expression always evaluated to FALSE.\r
+ //\r
+ ASSERT_FALSE (FALSE);\r
+\r
+ //\r
+ // This test passes because expression always evaluates to FALSE.\r
+ //\r
+ Result = LShiftU64 (BIT0, 1);\r
+ ASSERT_FALSE (Result == BIT0);\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_EQ() macro.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertEqual) {\r
+ UINT64 Result;\r
+\r
+ //\r
+ // This test passes because both values are always equal.\r
+ //\r
+ ASSERT_EQ (1, 1);\r
+\r
+ //\r
+ // This test passes because both values are always equal.\r
+ //\r
+ Result = LShiftU64 (BIT0, 1);\r
+ ASSERT_EQ (Result, (UINT64)BIT1);\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_STREQ() macro.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertMemEqual) {\r
+ CHAR8 *String1;\r
+ CHAR8 *String2;\r
+\r
+ //\r
+ // This test passes because String1 and String2 are the same.\r
+ //\r
+ String1 = (CHAR8 *)"Hello";\r
+ String2 = (CHAR8 *)"Hello";\r
+ ASSERT_STREQ (String1, String2);\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_NE() macro.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertNotEqual) {\r
+ UINT64 Result;\r
+\r
+ //\r
+ // This test passes because both values are never equal.\r
+ //\r
+ ASSERT_NE (0, 1);\r
+\r
+ //\r
+ // This test passes because both values are never equal.\r
+ //\r
+ Result = LShiftU64 (BIT0, 1);\r
+ ASSERT_NE (Result, (UINT64)BIT0);\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_TRUE() and ASSERT(FALSE)\r
+ and EFI_EFFOR() macros to check status\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertNotEfiError) {\r
+ //\r
+ // This test passes because the status is not an EFI error.\r
+ //\r
+ ASSERT_FALSE (EFI_ERROR (EFI_SUCCESS));\r
+\r
+ //\r
+ // This test passes because the status is not an EFI error.\r
+ //\r
+ ASSERT_FALSE (EFI_ERROR (EFI_WARN_BUFFER_TOO_SMALL));\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_EQ() macro to compare EFI_STATUS values.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertStatusEqual) {\r
+ //\r
+ // This test passes because the status value are always equal.\r
+ //\r
+ ASSERT_EQ (EFI_SUCCESS, EFI_SUCCESS);\r
+}\r
+\r
+/**\r
+ Sample unit test using ASSERT_NE() macro to make sure a pointer is not NULL.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertNotNull) {\r
+ UINT64 Result;\r
+\r
+ //\r
+ // This test passes because the pointer is never NULL.\r
+ //\r
+ ASSERT_NE (&Result, (UINT64 *)NULL);\r
+}\r
+\r
+/**\r
+ Sample unit test using that should not generate any ASSERTs()\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroExpectNoAssertFailure) {\r
+ //\r
+ // This test passes because it never triggers an ASSERT().\r
+ //\r
+ ASSERT (TRUE);\r
+\r
+ //\r
+ // This test passes because DecimalToBcd() does not ASSERT() if the\r
+ // value passed in is <= 99.\r
+ //\r
+ DecimalToBcd8 (99);\r
+}\r
+\r
+/**\r
+ Sample unit test using the ASSERT_DEATH() macro to test expected ASSERT()s.\r
+**/\r
+TEST_P(MacroTestsAssertsEnabledDisabled, MacroExpectAssertFailure) {\r
+ //\r
+ // Skip tests that verify an ASSERT() is triggered if ASSERT()s are disabled.\r
+ //\r
+ if ((PcdGet8 (PcdDebugPropertyMask) & BIT0) == 0x00) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // This test passes because it directly triggers an ASSERT().\r
+ //\r
+ ASSERT_DEATH (ASSERT (FALSE), "");\r
+\r
+ //\r
+ // This test passes because DecimalToBcd() generates an ASSERT() if the\r
+ // value passed in is >= 100. The expected ASSERT() is caught by the unit\r
+ // test framework and ASSERT_DEATH() returns without an error.\r
+ //\r
+ ASSERT_DEATH (DecimalToBcd8 (101), "");\r
+}\r
+\r
+INSTANTIATE_TEST_SUITE_P(ValidInput,\r
+ MacroTestsAssertsEnabledDisabled,\r
+ ::testing::Values(PcdGet8 (PcdDebugPropertyMask) | BIT0, PcdGet8 (PcdDebugPropertyMask) & (~BIT0)));\r
+\r
+/**\r
+ Sample unit test using the SCOPED_TRACE() macro for trace messages.\r
+**/\r
+TEST(MacroTestsMessages, MacroTraceMessage) {\r
+ //\r
+ // Example of logging.\r
+ //\r
+ SCOPED_TRACE ("SCOPED_TRACE message\n");\r
+}\r
+\r
+int main(int argc, char* argv[]) {\r
+ testing::InitGoogleTest(&argc, argv);\r
+ return RUN_ALL_TESTS();\r
+}\r