Implement UnitTestLib\r
\r
Copyright (c) Microsoft Corporation.\r
+ Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
**/\r
\r
}\r
\r
STATIC\r
-CHAR8*\r
+CHAR8 *\r
AllocateAndCopyString (\r
IN CHAR8 *StringToCopy\r
)\r
CHAR8 *NewString;\r
UINTN NewStringLength;\r
\r
- NewString = NULL;\r
+ NewString = NULL;\r
NewStringLength = AsciiStrnLenS (StringToCopy, UNIT_TEST_MAX_STRING_LENGTH) + 1;\r
- NewString = AllocatePool (NewStringLength * sizeof( CHAR8 ));\r
+ NewString = AllocatePool (NewStringLength * sizeof (CHAR8));\r
if (NewString != NULL) {\r
AsciiStrCpyS (NewString, NewStringLength, StringToCopy);\r
}\r
+\r
return NewString;\r
}\r
\r
UINT32 NewFingerprint;\r
\r
// For this one we'll just use the title and version as the unique fingerprint.\r
- NewFingerprint = CalculateCrc32( Framework->Title, (AsciiStrLen( Framework->Title ) * sizeof( CHAR8 )) );\r
- NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32( Framework->VersionString, (AsciiStrLen( Framework->VersionString ) * sizeof( CHAR8 )) );\r
+ NewFingerprint = CalculateCrc32 (Framework->Title, (AsciiStrLen (Framework->Title) * sizeof (CHAR8)));\r
+ NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32 (Framework->VersionString, (AsciiStrLen (Framework->VersionString) * sizeof (CHAR8)));\r
\r
- CopyMem( Fingerprint, &NewFingerprint, UNIT_TEST_FINGERPRINT_SIZE );\r
+ CopyMem (Fingerprint, &NewFingerprint, UNIT_TEST_FINGERPRINT_SIZE);\r
return;\r
}\r
\r
UINT32 NewFingerprint;\r
\r
// For this one, we'll use the fingerprint from the framework, and the title of the suite.\r
- NewFingerprint = CalculateCrc32( &Framework->Fingerprint[0], UNIT_TEST_FINGERPRINT_SIZE );\r
- NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32( Suite->Title, (AsciiStrLen( Suite->Title ) * sizeof( CHAR8 )) );\r
- NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32( Suite->Name, (AsciiStrLen(Suite->Name) * sizeof(CHAR8)) );\r
+ NewFingerprint = CalculateCrc32 (&Framework->Fingerprint[0], UNIT_TEST_FINGERPRINT_SIZE);\r
+ NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32 (Suite->Title, (AsciiStrLen (Suite->Title) * sizeof (CHAR8)));\r
+ NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32 (Suite->Name, (AsciiStrLen (Suite->Name) * sizeof (CHAR8)));\r
\r
- CopyMem( Fingerprint, &NewFingerprint, UNIT_TEST_FINGERPRINT_SIZE );\r
+ CopyMem (Fingerprint, &NewFingerprint, UNIT_TEST_FINGERPRINT_SIZE);\r
return;\r
}\r
\r
UINT32 NewFingerprint;\r
\r
// For this one, we'll use the fingerprint from the suite, and the description and classname of the test.\r
- NewFingerprint = CalculateCrc32( &Suite->Fingerprint[0], UNIT_TEST_FINGERPRINT_SIZE );\r
- NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32( Test->Description, (AsciiStrLen( Test->Description ) * sizeof( CHAR8 )) );\r
- NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32( Test->Name, (AsciiStrLen(Test->Name) * sizeof(CHAR8)) );\r
+ NewFingerprint = CalculateCrc32 (&Suite->Fingerprint[0], UNIT_TEST_FINGERPRINT_SIZE);\r
+ NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32 (Test->Description, (AsciiStrLen (Test->Description) * sizeof (CHAR8)));\r
+ NewFingerprint = (NewFingerprint >> 8) ^ CalculateCrc32 (Test->Name, (AsciiStrLen (Test->Name) * sizeof (CHAR8)));\r
\r
- CopyMem( Fingerprint, &NewFingerprint, UNIT_TEST_FINGERPRINT_SIZE );\r
+ CopyMem (Fingerprint, &NewFingerprint, UNIT_TEST_FINGERPRINT_SIZE);\r
return;\r
}\r
\r
IN UINT8 *FingerprintB\r
)\r
{\r
- return (CompareMem( FingerprintA, FingerprintB, UNIT_TEST_FINGERPRINT_SIZE ) == 0);\r
+ return (CompareMem (FingerprintA, FingerprintB, UNIT_TEST_FINGERPRINT_SIZE) == 0);\r
}\r
\r
/**\r
EFI_STATUS Status;\r
UNIT_TEST_FRAMEWORK_HANDLE NewFrameworkHandle;\r
UNIT_TEST_FRAMEWORK *NewFramework;\r
+ UINTN SaveStateSize;\r
\r
Status = EFI_SUCCESS;\r
NewFramework = NULL;\r
//\r
// First, check all pointers and make sure nothing's broked.\r
//\r
- if (FrameworkHandle == NULL || Title == NULL ||\r
- ShortTitle == NULL || VersionString == NULL) {\r
+ if ((FrameworkHandle == NULL) || (Title == NULL) ||\r
+ (ShortTitle == NULL) || (VersionString == NULL))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
NewFramework->Log = NULL;\r
NewFramework->CurrentTest = NULL;\r
NewFramework->SavedState = NULL;\r
- if (NewFramework->Title == NULL ||\r
- NewFramework->ShortTitle == NULL ||\r
- NewFramework->VersionString == NULL) {\r
+ if ((NewFramework->Title == NULL) ||\r
+ (NewFramework->ShortTitle == NULL) ||\r
+ (NewFramework->VersionString == NULL))\r
+ {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
+\r
InitializeListHead (&(NewFramework->TestSuiteList));\r
\r
//\r
// If there is a persisted context, load it now.\r
//\r
if (DoesCacheExist (NewFrameworkHandle)) {\r
- Status = LoadUnitTestCache (NewFrameworkHandle, (UNIT_TEST_SAVE_HEADER**)(&NewFramework->SavedState));\r
+ Status = LoadUnitTestCache (NewFrameworkHandle, (VOID **)(&NewFramework->SavedState), &SaveStateSize);\r
if (EFI_ERROR (Status)) {\r
//\r
// Don't actually report it as an error, but emit a warning.\r
//\r
- DEBUG (( DEBUG_ERROR, "%a - Cache was detected, but failed to load.\n", __FUNCTION__ ));\r
+ DEBUG ((DEBUG_ERROR, "%a - Cache was detected, but failed to load.\n", __FUNCTION__));\r
Status = EFI_SUCCESS;\r
}\r
}\r
UNIT_TEST_SUITE_LIST_ENTRY *NewSuiteEntry;\r
UNIT_TEST_FRAMEWORK *Framework;\r
\r
- Status = EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
Framework = (UNIT_TEST_FRAMEWORK *)FrameworkHandle;\r
\r
//\r
//\r
// Copy the fields we think we need.\r
//\r
- NewSuiteEntry->UTS.NumTests = 0;\r
- NewSuiteEntry->UTS.Title = AllocateAndCopyString (Title);\r
- NewSuiteEntry->UTS.Name = AllocateAndCopyString (Name);\r
- NewSuiteEntry->UTS.Setup = Setup;\r
- NewSuiteEntry->UTS.Teardown = Teardown;\r
- NewSuiteEntry->UTS.ParentFramework = FrameworkHandle;\r
+ NewSuiteEntry->UTS.NumTests = 0;\r
+ NewSuiteEntry->UTS.Title = AllocateAndCopyString (Title);\r
+ NewSuiteEntry->UTS.Name = AllocateAndCopyString (Name);\r
+ NewSuiteEntry->UTS.Setup = Setup;\r
+ NewSuiteEntry->UTS.Teardown = Teardown;\r
+ NewSuiteEntry->UTS.ParentFramework = FrameworkHandle;\r
InitializeListHead (&(NewSuiteEntry->Entry)); // List entry for sibling suites.\r
InitializeListHead (&(NewSuiteEntry->UTS.TestCaseList)); // List entry for child tests.\r
if (NewSuiteEntry->UTS.Title == NULL) {\r
//\r
// Create the suite fingerprint.\r
//\r
- SetSuiteFingerprint( &NewSuiteEntry->UTS.Fingerprint[0], Framework, &NewSuiteEntry->UTS );\r
+ SetSuiteFingerprint (&NewSuiteEntry->UTS.Fingerprint[0], Framework, &NewSuiteEntry->UTS);\r
\r
Exit:\r
//\r
// If everything is going well, add the new suite to the tail list for the framework.\r
//\r
- if (!EFI_ERROR( Status )) {\r
+ if (!EFI_ERROR (Status)) {\r
InsertTailList (&(Framework->TestSuiteList), (LIST_ENTRY *)NewSuiteEntry);\r
*SuiteHandle = (UNIT_TEST_SUITE_HANDLE)(&NewSuiteEntry->UTS);\r
} else {\r
UNIT_TEST_FRAMEWORK *ParentFramework;\r
UNIT_TEST_SUITE *Suite;\r
\r
- Status = EFI_SUCCESS;\r
- Suite = (UNIT_TEST_SUITE *)SuiteHandle;\r
+ Status = EFI_SUCCESS;\r
+ Suite = (UNIT_TEST_SUITE *)SuiteHandle;\r
\r
//\r
// First, let's check to make sure that our parameters look good.\r
ParentFramework = (UNIT_TEST_FRAMEWORK *)Suite->ParentFramework;\r
//\r
// Create the new entry.\r
- NewTestEntry = AllocateZeroPool (sizeof( UNIT_TEST_LIST_ENTRY ));\r
+ NewTestEntry = AllocateZeroPool (sizeof (UNIT_TEST_LIST_ENTRY));\r
if (NewTestEntry == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
+\r
if (NewTestEntry->UT.Name == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
// If everything is going well, add the new suite to the tail list for the framework.\r
//\r
if (!EFI_ERROR (Status)) {\r
- InsertTailList (&(Suite->TestCaseList), (LIST_ENTRY*)NewTestEntry);\r
+ InsertTailList (&(Suite->TestCaseList), (LIST_ENTRY *)NewTestEntry);\r
Suite->NumTests++;\r
} else {\r
//\r
//\r
// First, evaluate the inputs.\r
//\r
- if (Test == NULL || SavedState == NULL) {\r
+ if ((Test == NULL) || (SavedState == NULL)) {\r
return;\r
}\r
+\r
if (SavedState->TestCount == 0) {\r
return;\r
}\r
// at the beginning of the context structure.\r
//\r
SavedContext = (UNIT_TEST_SAVE_CONTEXT *)FloatingPointer;\r
- if ((SavedContext->Size - sizeof (UNIT_TEST_SAVE_CONTEXT)) > 0 &&\r
- CompareFingerprints (&Test->Fingerprint[0], &SavedContext->Fingerprint[0])) {\r
+ if (((SavedContext->Size - sizeof (UNIT_TEST_SAVE_CONTEXT)) > 0) &&\r
+ CompareFingerprints (&Test->Fingerprint[0], &SavedContext->Fingerprint[0]))\r
+ {\r
//\r
// Override the test context with the saved context.\r
//\r
- Test->Context = (VOID*)SavedContext->Data;\r
+ Test->Context = (VOID *)SavedContext->Data;\r
}\r
}\r
}\r
\r
STATIC\r
-UNIT_TEST_SAVE_HEADER*\r
+UNIT_TEST_SAVE_HEADER *\r
SerializeState (\r
IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle,\r
- IN UNIT_TEST_CONTEXT ContextToSave, OPTIONAL\r
+ IN UNIT_TEST_CONTEXT ContextToSave OPTIONAL,\r
IN UINTN ContextToSaveSize\r
)\r
{\r
//\r
// First, let's not make assumptions about the parameters.\r
//\r
- if (Framework == NULL ||\r
- (ContextToSave != NULL && ContextToSaveSize == 0) ||\r
- ContextToSaveSize > MAX_UINT32) {\r
+ if ((Framework == NULL) ||\r
+ ((ContextToSave != NULL) && (ContextToSaveSize == 0)) ||\r
+ (ContextToSaveSize > MAX_UINT32))\r
+ {\r
return NULL;\r
}\r
\r
//\r
// Account for the size of a test structure.\r
//\r
- TotalSize += sizeof( UNIT_TEST_SAVE_TEST );\r
+ TotalSize += sizeof (UNIT_TEST_SAVE_TEST);\r
//\r
// If there's a log, make sure to account for the log size.\r
//\r
- if (UnitTest->Log != NULL) {\r
+ if (UnitTest->Log != NULL) {\r
//\r
// The +1 is for the NULL character. Can't forget the NULL character.\r
//\r
ASSERT (LogSize < MAX_UINT32);\r
TotalSize += (UINT32)LogSize;\r
}\r
+\r
//\r
// Increment the test count.\r
//\r
TestCount++;\r
}\r
}\r
+\r
//\r
// If there are no tests, we're done here.\r
//\r
if (TestCount == 0) {\r
return NULL;\r
}\r
+\r
//\r
// Add room for the context, if there is one.\r
//\r
//\r
// Alright, let's start setting up some data.\r
//\r
- Header->Version = UNIT_TEST_PERSISTENCE_LIB_VERSION;\r
- Header->SaveStateSize = TotalSize;\r
+ Header->Version = UNIT_TEST_PERSISTENCE_LIB_VERSION;\r
+ Header->SaveStateSize = TotalSize;\r
CopyMem (&Header->Fingerprint[0], &Framework->Fingerprint[0], UNIT_TEST_FINGERPRINT_SIZE);\r
CopyMem (&Header->StartTime, &Framework->StartTime, sizeof (EFI_TIME));\r
Header->TestCount = TestCount;\r
// Start adding all of the test cases.\r
// Set the floating pointer to the start of the current test save buffer.\r
//\r
- FloatingPointer = (UINT8*)Header + sizeof( UNIT_TEST_SAVE_HEADER );\r
+ FloatingPointer = (UINT8 *)Header + sizeof (UNIT_TEST_SAVE_HEADER);\r
//\r
// Iterate all suites.\r
//\r
//\r
TestListHead = &((UNIT_TEST_SUITE_LIST_ENTRY *)Suite)->UTS.TestCaseList;\r
for (Test = GetFirstNode (TestListHead); Test != TestListHead; Test = GetNextNode (TestListHead, Test)) {\r
- TestSaveData = (UNIT_TEST_SAVE_TEST *)FloatingPointer;\r
- UnitTest = &((UNIT_TEST_LIST_ENTRY *)Test)->UT;\r
+ TestSaveData = (UNIT_TEST_SAVE_TEST *)FloatingPointer;\r
+ UnitTest = &((UNIT_TEST_LIST_ENTRY *)Test)->UT;\r
\r
//\r
// Save the fingerprint.\r
//\r
// Save the result.\r
//\r
- TestSaveData->Result = UnitTest->Result;\r
+ TestSaveData->Result = UnitTest->Result;\r
TestSaveData->FailureType = UnitTest->FailureType;\r
AsciiStrnCpyS (&TestSaveData->FailureMessage[0], UNIT_TEST_TESTFAILUREMSG_LENGTH, &UnitTest->FailureMessage[0], UNIT_TEST_TESTFAILUREMSG_LENGTH);\r
\r
-\r
//\r
// If there is a log, save the log.\r
//\r
//\r
// If there is a context to save, let's do that now.\r
//\r
- if (ContextToSave != NULL && Framework->CurrentTest != NULL) {\r
- TestSaveContext = (UNIT_TEST_SAVE_CONTEXT*)FloatingPointer;\r
- TestSaveContext->Size = (UINT32)ContextToSaveSize + sizeof (UNIT_TEST_SAVE_CONTEXT);\r
+ if ((ContextToSave != NULL) && (Framework->CurrentTest != NULL)) {\r
+ TestSaveContext = (UNIT_TEST_SAVE_CONTEXT *)FloatingPointer;\r
+ TestSaveContext->Size = (UINT32)ContextToSaveSize + sizeof (UNIT_TEST_SAVE_CONTEXT);\r
CopyMem (&TestSaveContext->Fingerprint[0], &Framework->CurrentTest->Fingerprint[0], UNIT_TEST_FINGERPRINT_SIZE);\r
CopyMem (((UINT8 *)TestSaveContext + sizeof (UNIT_TEST_SAVE_CONTEXT)), ContextToSave, ContextToSaveSize);\r
Header->HasSavedContext = TRUE;\r
EFI_STATUS\r
EFIAPI\r
SaveFrameworkState (\r
- IN UNIT_TEST_CONTEXT ContextToSave OPTIONAL,\r
- IN UINTN ContextToSaveSize\r
+ IN UNIT_TEST_CONTEXT ContextToSave OPTIONAL,\r
+ IN UINTN ContextToSaveSize\r
)\r
{\r
EFI_STATUS Status;\r
UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle;\r
UNIT_TEST_SAVE_HEADER *Header;\r
\r
- Header = NULL;\r
+ Header = NULL;\r
FrameworkHandle = GetActiveFrameworkHandle ();\r
\r
//\r
//\r
// First, let's not make assumptions about the parameters.\r
//\r
- if ((ContextToSave != NULL && ContextToSaveSize == 0) ||\r
- ContextToSaveSize > MAX_UINT32) {\r
+ if (((ContextToSave != NULL) && (ContextToSaveSize == 0)) ||\r
+ (ContextToSaveSize > MAX_UINT32))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// All that should be left to do is save it using the associated persistence lib.\r
//\r
- Status = SaveUnitTestCache (FrameworkHandle, Header);\r
+ Status = SaveUnitTestCache (FrameworkHandle, Header, Header->SaveStateSize);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "%a - Could not save state! %r\n", __FUNCTION__, Status));\r
Status = EFI_DEVICE_ERROR;\r