/** @file Unit tests for CEDT Generator Copyright (c) 2025, Google, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include extern "C" { #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GoogleTest/Protocol/MockConfigurationManagerProtocol.h" EFI_STATUS EFIAPI AcpiCedtLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); EFI_STATUS EFIAPI AcpiCedtLibDestructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); // Global generator instance static ACPI_TABLE_GENERATOR *gCedtGenerator = NULL; // C++ wrapper functions for C linkage functions EFI_STATUS RegisterAcpiTableGenerator ( IN CONST ACPI_TABLE_GENERATOR *CONST TableGenerator ) { if (TableGenerator == NULL) { return EFI_INVALID_PARAMETER; } gCedtGenerator = const_cast(TableGenerator); return EFI_SUCCESS; } EFI_STATUS DeregisterAcpiTableGenerator ( IN CONST ACPI_TABLE_GENERATOR *CONST TableGenerator ) { if (TableGenerator == NULL) { return EFI_INVALID_PARAMETER; } // Clear the stored generator gCedtGenerator = NULL; return EFI_SUCCESS; } } using namespace testing; using ::testing::_; using ::testing::NiceMock; using ::testing::Return; using ::testing::DoAll; using ::testing::SetArgPointee; using ::testing::AtLeast; #define WRAP_ACCESSOR(accessor) \ [this] \ (IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This, \ IN CONST CM_OBJECT_ID CmObjectId, \ IN CONST CM_OBJECT_TOKEN Token, \ IN OUT CM_OBJ_DESCRIPTOR *CmObject \ ) \ { \ return this->accessor(This, CmObjectId, Token, CmObject); \ } class CedtGeneratorTest : public ::testing::Test { protected: MockConfigurationManagerProtocol MockConfigMgrProtocol; CM_STD_OBJ_CONFIGURATION_MANAGER_INFO CfgMgrInfo = { 0 }; void ValidateChbs ( EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Expected, EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Actual ) { // Fields that should never change. EXPECT_EQ ( Actual->Type, EFI_ACPI_6_4_CEDT_STRUCTURE_TYPE_CXL_HOST_BRIDGE_STRUCTURE ); EXPECT_EQ (Actual->Reserved0, 0U); EXPECT_EQ ( Actual->RecordLength, sizeof (EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE) ); EXPECT_EQ (Actual->Reserved1, 0U); // Fields that can change. EXPECT_EQ (Actual->Uid, Expected->Uid); EXPECT_EQ (Actual->CxlVersion, Expected->CxlVersion); EXPECT_EQ (Actual->Base, Expected->Base); EXPECT_EQ (Actual->Length, Expected->Length); } void ValidateCfmws ( CONST EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Expected, EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Actual, UINT32 *ExpectedInterleaveTargets, UINT32 ExpectedInterleaveTargetCount ) { EXPECT_EQ ( Actual->Type, EFI_ACPI_6_4_CEDT_STRUCTURE_TYPE_CXL_FIXED_MEMORY_WINDOW_STRUCTURE ); EXPECT_EQ (Actual->Reserved0, 0U); EXPECT_EQ (Actual->Reserved1, 0U); EXPECT_EQ (Actual->Reserved2, 0U); EXPECT_EQ (Actual->RecordLength, Expected->RecordLength); EXPECT_EQ (Actual->BaseHpa, Expected->BaseHpa); EXPECT_EQ (Actual->WindowSize, Expected->WindowSize); EXPECT_EQ ( Actual->EncodedNumberOfInterleaveWays, Expected->EncodedNumberOfInterleaveWays ); EXPECT_EQ (Actual->InterleaveArithmetic, Expected->InterleaveArithmetic); EXPECT_EQ ( Actual->HostBridgeInterleaveGranularity, Expected->HostBridgeInterleaveGranularity ); EXPECT_EQ (Actual->WindowRestrictions, Expected->WindowRestrictions); EXPECT_EQ (Actual->QtgId, Expected->QtgId); for (UINT32 Index = 0; Index < ExpectedInterleaveTargetCount; Index++) { EXPECT_EQ (Actual->InterleaveTargetList[Index], ExpectedInterleaveTargets[Index]); } } void SetUp ( ) override { // Set up default behavior for GetObject ON_CALL (MockConfigMgrProtocol, GetObject (_, _, _, _)) .WillByDefault (Return (EFI_NOT_FOUND)); // Set up configuration manager info CfgMgrInfo.Revision = CREATE_REVISION (1, 0); CfgMgrInfo.OemId[0] = 'T'; CfgMgrInfo.OemId[1] = 'E'; CfgMgrInfo.OemId[2] = 'S'; CfgMgrInfo.OemId[3] = 'T'; CfgMgrInfo.OemId[4] = 'I'; CfgMgrInfo.OemId[5] = 'D'; EXPECT_CALL (MockConfigMgrProtocol, GetObject (_, CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo), CM_NULL_TOKEN, _)) .WillRepeatedly ( DoAll ( SetArgPointee<3>( CM_OBJ_DESCRIPTOR { CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo), sizeof (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO), &CfgMgrInfo, 1 } ), Return (EFI_SUCCESS) ) ); // Set up call to get all host bridges. EXPECT_CALL ( MockConfigMgrProtocol, GetObject ( _, CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo), CM_NULL_TOKEN, _ ) ) .WillRepeatedly ( Invoke (WRAP_ACCESSOR (GetAllHostBridges)) ); // Set up call to get a single host bridge. EXPECT_CALL ( MockConfigMgrProtocol, GetObject ( _, CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo), Ne ((UINTN)CM_NULL_TOKEN), _ ) ) .WillRepeatedly ( Invoke (WRAP_ACCESSOR (GetHostBridgeByToken)) ); // Setup call to get fixed memory windows. EXPECT_CALL ( MockConfigMgrProtocol, GetObject ( _, CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlFixedMemoryWindowInfo), CM_NULL_TOKEN, _ ) ) .WillRepeatedly ( Invoke (WRAP_ACCESSOR (GetAllWindows)) ); // Initialize the CEDT library with our mock protocol EXPECT_EQ (AcpiCedtLibConstructor (NULL, NULL), EFI_SUCCESS); // Setup common test data with proper initialization mAcpiTableInfo.TableGeneratorId = CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdCedt); mAcpiTableInfo.AcpiTableSignature = EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE_SIGNATURE; mAcpiTableInfo.AcpiTableRevision = EFI_ACPI_6_4_CEDT_CXL_EARLY_DISCOVERY_TABLE_REVISION_01; } void TearDown ( ) override { if (mTableUnderTest != nullptr) { gCedtGenerator->FreeTableResources ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ); } // Clean up the CEDT library AcpiCedtLibDestructor (NULL, NULL); } // Setup the mocks for each type of object that can be requested from // ConfigurationManager. void SetupHostBridgeInfo ( CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO *HostBridges, UINT64 HostBridgesCount ) { // Copy config into test vector. mHostBridgeInfo.resize (HostBridgesCount); for (UINT64 i = 0; i < HostBridgesCount; i++) { mHostBridgeInfo[i] = HostBridges[i]; } } void SetupFixedMemoryWindowInfo ( CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO *Windows, UINT64 WindowsCount ) { // Copy config into test vector. mWindowInfo.resize (WindowsCount); for (UINT64 i = 0; i < WindowsCount; i++) { mWindowInfo[i] = Windows[i]; } } EFI_STATUS GetHostBridgeByToken ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR *CmObject ) { (void)This; (void)CmObjectId; if (CmObject == nullptr) { return EFI_INVALID_PARAMETER; } for (CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO &HostBridge : mHostBridgeInfo) { if ((UINTN)HostBridge.Token == Token) { *CmObject = CM_OBJ_DESCRIPTOR { CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo), sizeof (CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO), &HostBridge, 1 }; return EFI_SUCCESS; } } return EFI_NOT_FOUND; } EFI_STATUS GetAllHostBridges ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR *CmObject ) { (void)This; (void)CmObjectId; if (CmObject == nullptr) { return EFI_INVALID_PARAMETER; } *CmObject = CM_OBJ_DESCRIPTOR { CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlHostBridgeInfo), static_cast(sizeof (CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO) * mHostBridgeInfo.size ()), mHostBridgeInfo.data (), static_cast(mHostBridgeInfo.size ()) }; return EFI_SUCCESS; } EFI_STATUS GetAllWindows ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR *CmObject ) { (void)This; (void)CmObjectId; if (CmObject == nullptr) { return EFI_INVALID_PARAMETER; } *CmObject = CM_OBJ_DESCRIPTOR { CREATE_CM_ARCH_COMMON_OBJECT_ID (EArchCommonObjCxlFixedMemoryWindowInfo), static_cast(sizeof (CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO) * mWindowInfo.size ()), mWindowInfo.data (), static_cast(mWindowInfo.size ()) }; return EFI_SUCCESS; } CM_STD_OBJ_ACPI_TABLE_INFO mAcpiTableInfo; std::vector mHostBridgeInfo; std::vector mWindowInfo; EFI_ACPI_DESCRIPTION_HEADER *mTableUnderTest = nullptr; CM_ARCH_COMMON_CXL_HOST_BRIDGE_INFO mDefaultHb[2] = { { 42, 5, 1, 0x100000000 }, { 71, 2, 0, 0xF00000000 }, }; EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE mDefaultHbExpected[2] = { { 0, 0, 32, 5, 1, 0, 0x100000000, 0x10000 }, { 0, 0, 32, 2, 0, 0, 0xF00000000, 0x2000 } }; CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO mDefaultWindows[2] = { { 0x40000000, 0xA0000000, 2, 0, 1024, EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT, 7, { 42, 71 }, }, { 0xF0000000, 0xC0000000, 2, 0, 16384, EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT, 7, { 71, 42 }, } }; }; TEST_F (CedtGeneratorTest, SmokeTest) { EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_SUCCESS ); EXPECT_EQ (mTableUnderTest->Length, 36U); } TEST_F (CedtGeneratorTest, ChbsOnlyTest) { SetupHostBridgeInfo (&mDefaultHb[0], 2); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_SUCCESS ); EXPECT_EQ (mTableUnderTest->Length, 100U); EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *Cedt = (EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *)mTableUnderTest; EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Chbs = (EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)(&Cedt->CedtStructure[0]); ValidateChbs (&mDefaultHbExpected[0], &Chbs[0]); ValidateChbs (&mDefaultHbExpected[1], &Chbs[1]); } TEST_F (CedtGeneratorTest, CfmwsWithNoInterleavingTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.NumberOfInterleaveWays = 1; Window.HostBridgeInterleaveGranularity = 256; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_SUCCESS ); EXPECT_EQ (mTableUnderTest->Length, 108U); EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *Cedt = (EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *)mTableUnderTest; EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Chbs = (EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)(&Cedt->CedtStructure[0]); EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Cfmws = (EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *) (((EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)&Cedt->CedtStructure[0]) + 1); CONST EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE ExpectedCfmws = { 1, 0, 40, 0, 0x40000000, 0xA0000000, 0, 0, 0, 0, EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT, 7, }; UINT32 ExpectedInterleaveTargetList[1] = { 5 }; ValidateChbs (&mDefaultHbExpected[0], &Chbs[0]); ValidateCfmws (&ExpectedCfmws, Cfmws, &ExpectedInterleaveTargetList[0], 1); } TEST_F (CedtGeneratorTest, CfmwsWith2WayInterleavingTest) { SetupHostBridgeInfo (&mDefaultHb[0], 2); SetupFixedMemoryWindowInfo (&mDefaultWindows[0], 2); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_SUCCESS ); EXPECT_EQ (mTableUnderTest->Length, 188U); EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *Cedt = (EFI_ACPI_6_4_CXL_EARLY_DISCOVERY_TABLE *)mTableUnderTest; EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *Chbs = (EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)(&Cedt->CedtStructure[0]); EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Cfmws0 = (EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *) (((EFI_ACPI_6_4_CEDT_CXL_HOST_BRIDGE_STRUCTURE *)&Cedt->CedtStructure[0]) + 2); EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *Cfmws1 = (EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE *) (((UINT8 *)(Cfmws0 + 1)) + 2 * sizeof (UINT32)); EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE Cfmws0Expected = { 1, 0, 44, 0, 0x40000000, 0xA0000000, 1, 0, 0, 2, EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT, 7, }; EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE Cfmws1Expected = { 1, 0, 44, 0, 0xF0000000, 0xC0000000, 1, 0, 0, 6, EFI_ACPI_6_4_CEDT_CXL_FIXED_MEMORY_WINDOW_STRUCTURE_WINDOW_RESTRICTIONS_HOST_ONLY_COHERENT, 7, }; UINT32 InterleaveTargetListExpected[2][2] = { { 5, 2 }, { 2, 5 }, }; ValidateChbs (&mDefaultHbExpected[0], &Chbs[0]); ValidateChbs (&mDefaultHbExpected[1], &Chbs[1]); ValidateCfmws (&Cfmws0Expected, Cfmws0, &InterleaveTargetListExpected[0][0], 2); ValidateCfmws (&Cfmws1Expected, Cfmws1, &InterleaveTargetListExpected[1][0], 2); } TEST_F (CedtGeneratorTest, InvalidInterleaveWaysTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.NumberOfInterleaveWays = 7; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidInterleaveGranularityTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.HostBridgeInterleaveGranularity = 42; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidHpaAlignmentTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.BaseHostPhysicalAddress = 0x04000000; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidWindowSizeTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.WindowSizeBytes = 0xA1000000; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidWindowSizeWithInterleavingTest) { SetupHostBridgeInfo (&mDefaultHb[0], 2); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Windows[2] = { mDefaultWindows[0], mDefaultWindows[1], }; // Window size should be a multiple of 512MB. Windows[0].WindowSizeBytes = 0x30000000; SetupFixedMemoryWindowInfo (&Windows[0], 2); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidWindowRestrictionsTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.WindowRestrictions = 0xF0; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidInterleaveArithmeticTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.InterleaveArithmetic = 2; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_INVALID_PARAMETER ); } TEST_F (CedtGeneratorTest, InvalidInterleaveTargetTest) { SetupHostBridgeInfo (&mDefaultHb[0], 1); CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.InterleaveTargetTokens[0] = 41; Window.NumberOfInterleaveWays = 1; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_NOT_FOUND ); } TEST_F (CedtGeneratorTest, InvalidAbsentChbsForCfmwsTest) { CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO Window = mDefaultWindows[0]; Window.NumberOfInterleaveWays = 1; SetupFixedMemoryWindowInfo (&Window, 1); EXPECT_EQ ( gCedtGenerator->BuildAcpiTable ( gCedtGenerator, &mAcpiTableInfo, gConfigurationManagerProtocol, &mTableUnderTest ), EFI_NOT_FOUND ); } int main ( int argc, char *argv[] ) { testing::InitGoogleTest (&argc, argv); return RUN_ALL_TESTS (); }