42IsFrameworkShortNameValid (
43 IN CHAR8 *ShortTitleString
52AllocateAndCopyString (
53 IN CHAR8 *StringToCopy
57 UINTN NewStringLength;
71SetFrameworkFingerprint (
72 OUT UINT8 *Fingerprint,
76 UINT32 NewFingerprint;
80 NewFingerprint = (NewFingerprint >> 8) ^
CalculateCrc32 (Framework->VersionString, (
AsciiStrLen (Framework->VersionString) * sizeof (CHAR8)));
89 OUT UINT8 *Fingerprint,
94 UINT32 NewFingerprint;
108 OUT UINT8 *Fingerprint,
113 UINT32 NewFingerprint;
127 IN UINT8 *FingerprintA,
128 IN UINT8 *FingerprintB
136FreeUnitTestTestEntry (
141 if (TestEntry->UT.Description) {
142 FreePool (TestEntry->UT.Description);
145 if (TestEntry->UT.Name) {
155FreeUnitTestSuiteEntry (
164 TestCaseList = &(SuiteEntry->UTS.TestCaseList);
166 while (&TestCase->Entry != TestCaseList) {
169 FreeUnitTestTestEntry (TestCase);
170 TestCase = NextTestCase;
173 if (SuiteEntry->UTS.Title) {
177 if (SuiteEntry->UTS.Name) {
204 IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle
214 while ((
LIST_ENTRY *)Suite != &Framework->TestSuiteList) {
217 FreeUnitTestSuiteEntry (Suite);
221 if (Framework->Title) {
225 if (Framework->ShortTitle) {
229 if (Framework->VersionString) {
230 FreePool (Framework->VersionString);
266 OUT UNIT_TEST_FRAMEWORK_HANDLE *FrameworkHandle,
268 IN CHAR8 *ShortTitle,
269 IN CHAR8 *VersionString
273 UNIT_TEST_FRAMEWORK_HANDLE NewFrameworkHandle;
283 if ((FrameworkHandle ==
NULL) || (Title ==
NULL) ||
284 (ShortTitle ==
NULL) || (VersionString ==
NULL))
286 return EFI_INVALID_PARAMETER;
292 if (!IsFrameworkShortNameValid (ShortTitle)) {
293 return EFI_INVALID_PARAMETER;
300 if (NewFramework ==
NULL) {
301 return EFI_OUT_OF_RESOURCES;
307 NewFrameworkHandle = (UNIT_TEST_FRAMEWORK_HANDLE)NewFramework;
308 NewFramework->Title = AllocateAndCopyString (Title);
309 NewFramework->ShortTitle = AllocateAndCopyString (ShortTitle);
310 NewFramework->VersionString = AllocateAndCopyString (VersionString);
311 NewFramework->Log =
NULL;
312 NewFramework->CurrentTest =
NULL;
313 NewFramework->SavedState =
NULL;
314 if ((NewFramework->Title ==
NULL) ||
315 (NewFramework->ShortTitle ==
NULL) ||
316 (NewFramework->VersionString ==
NULL))
318 Status = EFI_OUT_OF_RESOURCES;
327 SetFrameworkFingerprint (&NewFramework->Fingerprint[0], NewFramework);
333 Status =
LoadUnitTestCache (NewFrameworkHandle, (
VOID **)(&NewFramework->SavedState), &SaveStateSize);
334 if (EFI_ERROR (Status)) {
338 DEBUG ((DEBUG_ERROR,
"%a - Cache was detected, but failed to load.\n", __func__));
347 if (!EFI_ERROR (Status)) {
348 *FrameworkHandle = NewFrameworkHandle;
388 OUT UNIT_TEST_SUITE_HANDLE *SuiteHandle,
389 IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle,
406 if ((SuiteHandle ==
NULL) || (Framework ==
NULL) || (Title ==
NULL) || (Name ==
NULL)) {
407 return EFI_INVALID_PARAMETER;
414 if (NewSuiteEntry ==
NULL) {
415 return EFI_OUT_OF_RESOURCES;
421 NewSuiteEntry->UTS.NumTests = 0;
422 NewSuiteEntry->UTS.Title = AllocateAndCopyString (Title);
423 NewSuiteEntry->UTS.Name = AllocateAndCopyString (Name);
424 NewSuiteEntry->UTS.Setup = Setup;
425 NewSuiteEntry->UTS.Teardown = Teardown;
426 NewSuiteEntry->UTS.ParentFramework = FrameworkHandle;
429 if (NewSuiteEntry->UTS.Title ==
NULL) {
430 Status = EFI_OUT_OF_RESOURCES;
434 if (NewSuiteEntry->UTS.Name ==
NULL) {
435 Status = EFI_OUT_OF_RESOURCES;
442 SetSuiteFingerprint (&NewSuiteEntry->UTS.Fingerprint[0], Framework, &NewSuiteEntry->UTS);
448 if (!EFI_ERROR (Status)) {
450 *SuiteHandle = (UNIT_TEST_SUITE_HANDLE)(&NewSuiteEntry->UTS);
455 FreeUnitTestSuiteEntry (NewSuiteEntry);
488 IN UNIT_TEST_SUITE_HANDLE SuiteHandle,
489 IN CHAR8 *Description,
508 if ((Suite ==
NULL) || (Description ==
NULL) || (Name ==
NULL) || (Function ==
NULL)) {
509 return EFI_INVALID_PARAMETER;
516 if (NewTestEntry ==
NULL) {
517 return EFI_OUT_OF_RESOURCES;
522 NewTestEntry->UT.Description = AllocateAndCopyString (Description);
523 NewTestEntry->UT.Name = AllocateAndCopyString (Name);
524 NewTestEntry->UT.FailureType = FAILURETYPE_NOFAILURE;
525 NewTestEntry->UT.FailureMessage[0] =
'\0';
526 NewTestEntry->UT.Log =
NULL;
527 NewTestEntry->UT.Prerequisite = Prerequisite;
528 NewTestEntry->UT.CleanUp = CleanUp;
529 NewTestEntry->UT.RunTest = Function;
530 NewTestEntry->UT.Context = Context;
531 NewTestEntry->UT.Result = UNIT_TEST_PENDING;
532 NewTestEntry->UT.ParentSuite = SuiteHandle;
534 if (NewTestEntry->UT.Description ==
NULL) {
535 Status = EFI_OUT_OF_RESOURCES;
539 if (NewTestEntry->UT.Name ==
NULL) {
540 Status = EFI_OUT_OF_RESOURCES;
547 SetTestFingerprint (&NewTestEntry->UT.Fingerprint[0], Suite, &NewTestEntry->UT);
554 if (ParentFramework->SavedState !=
NULL) {
555 UpdateTestFromSave (&NewTestEntry->UT, ParentFramework->SavedState);
562 if (!EFI_ERROR (Status)) {
569 FreeUnitTestTestEntry (NewTestEntry);
584 UINT8 *FloatingPointer;
595 if (SavedState->TestCount == 0) {
604 FloatingPointer = (UINT8 *)SavedState +
sizeof (*SavedState);
605 for (Index = 0; Index < SavedState->TestCount; Index++) {
607 if (CompareFingerprints (&
Test->Fingerprint[0], &CurrentTest->Fingerprint[0])) {
608 MatchingTest = CurrentTest;
612 if (!SavedState->HasSavedContext) {
620 FloatingPointer = (UINT8 *)CurrentTest + CurrentTest->Size;
630 Test->Result = MatchingTest->Result;
632 Test->FailureType = MatchingTest->FailureType;
634 &
Test->FailureMessage[0],
636 &MatchingTest->FailureMessage[0],
656 if (SavedState->HasSavedContext) {
663 CompareFingerprints (&
Test->Fingerprint[0], &SavedContext->Fingerprint[0]))
668 Test->Context = (
VOID *)SavedContext->Data;
676 IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle,
693 UINT8 *FloatingPointer;
701 if ((Framework ==
NULL) ||
702 ((ContextToSave !=
NULL) && (ContextToSaveSize == 0)) ||
703 (ContextToSaveSize > MAX_UINT32))
721 SuiteListHead = &Framework->TestSuiteList;
722 for (Suite =
GetFirstNode (SuiteListHead); Suite != SuiteListHead; Suite =
GetNextNode (SuiteListHead, Suite)) {
736 if (UnitTest->Log !=
NULL) {
740 LogSize = (
AsciiStrLen (UnitTest->Log) + 1) *
sizeof (CHAR8);
741 ASSERT (LogSize < MAX_UINT32);
742 TotalSize += (UINT32)LogSize;
755 if (TestCount == 0) {
762 if (ContextToSave !=
NULL) {
770 if (Header ==
NULL) {
777 Header->Version = UNIT_TEST_PERSISTENCE_LIB_VERSION;
778 Header->SaveStateSize = TotalSize;
780 CopyMem (&Header->StartTime, &Framework->StartTime, sizeof (
EFI_TIME));
781 Header->TestCount = TestCount;
782 Header->HasSavedContext =
FALSE;
792 SuiteListHead = &Framework->TestSuiteList;
793 for (Suite =
GetFirstNode (SuiteListHead); Suite != SuiteListHead; Suite =
GetNextNode (SuiteListHead, Suite)) {
810 TestSaveData->Result = UnitTest->Result;
811 TestSaveData->FailureType = UnitTest->FailureType;
818 if (UnitTest->Log !=
NULL) {
822 LogSize = (
AsciiStrLen (UnitTest->Log) + 1) *
sizeof (CHAR8);
823 CopyMem (FloatingPointer, UnitTest->Log, LogSize);
824 FloatingPointer += LogSize;
831 TestSaveData->Size = (UINT32)(FloatingPointer - (UINT8 *)TestSaveData);
838 if ((ContextToSave !=
NULL) && (Framework->CurrentTest !=
NULL)) {
843 Header->HasSavedContext =
TRUE;
885 UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle;
889 FrameworkHandle = GetActiveFrameworkHandle ();
890 if (FrameworkHandle ==
NULL) {
891 DEBUG ((DEBUG_ERROR,
"%a - Could not save state! FrameworkHandle not initialized\n", __func__));
892 return EFI_DEVICE_ERROR;
898 if (FrameworkHandle ==
NULL) {
899 return EFI_NOT_FOUND;
905 if (((ContextToSave !=
NULL) && (ContextToSaveSize == 0)) ||
906 (ContextToSaveSize > MAX_UINT32))
908 return EFI_INVALID_PARAMETER;
914 Header = SerializeState (FrameworkHandle, ContextToSave, ContextToSaveSize);
915 if (Header ==
NULL) {
916 return EFI_OUT_OF_RESOURCES;
923 if (EFI_ERROR (Status)) {
924 DEBUG ((DEBUG_ERROR,
"%a - Could not save state! %r\n", __func__, Status));
925 Status = EFI_DEVICE_ERROR;
UINTN EFIAPI AsciiStrnLenS(IN CONST CHAR8 *String, IN UINTN MaxSize)
RETURN_STATUS EFIAPI AsciiStrnCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source, IN UINTN Length)
LIST_ENTRY *EFIAPI GetNextNode(IN CONST LIST_ENTRY *List, IN CONST LIST_ENTRY *Node)
UINT32 EFIAPI CalculateCrc32(IN VOID *Buffer, IN UINTN Length)
UINTN EFIAPI AsciiStrLen(IN CONST CHAR8 *String)
LIST_ENTRY *EFIAPI GetFirstNode(IN CONST LIST_ENTRY *List)
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
RETURN_STATUS EFIAPI AsciiStrCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define DEBUG(Expression)
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
EFI_STRING_ID NewString(IN CHAR16 *String, IN EFI_HII_HANDLE HiiHandle)
INTN EFIAPI Test(CONST VOID *b1, CONST VOID *b2)
VOID EFIAPI Exit(IN EFI_STATUS Status)
#define UNIT_TEST_FINGERPRINT_SIZE
#define UNIT_TEST_MAX_STRING_LENGTH
EFI_STATUS EFIAPI SaveFrameworkState(IN UNIT_TEST_CONTEXT ContextToSave OPTIONAL, IN UINTN ContextToSaveSize)
UNIT_TEST_STATUS(EFIAPI * UNIT_TEST_PREREQUISITE)(IN UNIT_TEST_CONTEXT Context)
VOID(EFIAPI * UNIT_TEST_SUITE_TEARDOWN)(VOID)
EFI_STATUS EFIAPI CreateUnitTestSuite(OUT UNIT_TEST_SUITE_HANDLE *SuiteHandle, IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle, IN CHAR8 *Title, IN CHAR8 *Name, IN UNIT_TEST_SUITE_SETUP Setup OPTIONAL, IN UNIT_TEST_SUITE_TEARDOWN Teardown OPTIONAL)
EFI_STATUS EFIAPI FreeUnitTestFramework(IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle)
EFI_STATUS EFIAPI AddTestCase(IN UNIT_TEST_SUITE_HANDLE SuiteHandle, IN CHAR8 *Description, IN CHAR8 *Name, IN UNIT_TEST_FUNCTION Function, IN UNIT_TEST_PREREQUISITE Prerequisite OPTIONAL, IN UNIT_TEST_CLEANUP CleanUp OPTIONAL, IN UNIT_TEST_CONTEXT Context OPTIONAL)
VOID(EFIAPI * UNIT_TEST_SUITE_SETUP)(VOID)
EFI_STATUS EFIAPI InitUnitTestFramework(OUT UNIT_TEST_FRAMEWORK_HANDLE *FrameworkHandle, IN CHAR8 *Title, IN CHAR8 *ShortTitle, IN CHAR8 *VersionString)
UNIT_TEST_STATUS(EFIAPI * UNIT_TEST_FUNCTION)(IN UNIT_TEST_CONTEXT Context)
VOID(EFIAPI * UNIT_TEST_CLEANUP)(IN UNIT_TEST_CONTEXT Context)
EFI_STATUS EFIAPI SaveUnitTestCache(IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle, IN VOID *SaveData, IN UINTN SaveStateSize)
EFI_STATUS EFIAPI LoadUnitTestCache(IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle, OUT VOID **SaveData, OUT UINTN *SaveStateSize)
BOOLEAN EFIAPI DoesCacheExist(IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle)