]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnitTestFrameworkPkg/Library/UnitTestLib/UnitTestLib.c
UnitTestFrameworkPkg: Modify APIs in UnitTestPersistenceLib
[mirror_edk2.git] / UnitTestFrameworkPkg / Library / UnitTestLib / UnitTestLib.c
index 4a6bbd752c766ea71268bffc22e0cbe682b5cac2..5b442ed122ea1d3fc5f4a1a79829fff07f4413ab 100644 (file)
@@ -2,6 +2,7 @@
   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
@@ -47,7 +48,7 @@ IsFrameworkShortNameValid (
 }\r
 \r
 STATIC\r
-CHAR8*\r
+CHAR8 *\r
 AllocateAndCopyString (\r
   IN CHAR8  *StringToCopy\r
   )\r
@@ -55,12 +56,13 @@ AllocateAndCopyString (
   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
@@ -74,10 +76,10 @@ SetFrameworkFingerprint (
   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
@@ -92,11 +94,11 @@ SetSuiteFingerprint (
   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
@@ -111,11 +113,11 @@ SetTestFingerprint (
   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
@@ -126,7 +128,7 @@ CompareFingerprints (
   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
@@ -209,6 +211,7 @@ InitUnitTestFramework (
   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
@@ -216,8 +219,9 @@ InitUnitTestFramework (
   //\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
@@ -246,12 +250,14 @@ InitUnitTestFramework (
   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
@@ -263,12 +269,12 @@ InitUnitTestFramework (
   // 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
@@ -330,7 +336,7 @@ CreateUnitTestSuite (
   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
@@ -351,12 +357,12 @@ CreateUnitTestSuite (
   //\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
@@ -372,13 +378,13 @@ CreateUnitTestSuite (
   //\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
@@ -432,8 +438,8 @@ AddTestCase (
   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
@@ -445,7 +451,7 @@ AddTestCase (
   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
@@ -468,6 +474,7 @@ AddTestCase (
     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
@@ -492,7 +499,7 @@ Exit:
   // 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
@@ -520,9 +527,10 @@ UpdateTestFromSave (
   //\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
@@ -590,21 +598,22 @@ UpdateTestFromSave (
     // 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
@@ -628,9 +637,10 @@ SerializeState (
   //\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
@@ -658,11 +668,11 @@ SerializeState (
       //\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
@@ -670,18 +680,21 @@ SerializeState (
         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
@@ -700,8 +713,8 @@ SerializeState (
   //\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
@@ -711,7 +724,7 @@ SerializeState (
   // 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
@@ -722,8 +735,8 @@ SerializeState (
     //\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
@@ -733,11 +746,10 @@ SerializeState (
       //\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
@@ -762,9 +774,9 @@ SerializeState (
   //\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
@@ -804,15 +816,15 @@ SerializeState (
 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
@@ -825,8 +837,9 @@ SaveFrameworkState (
   //\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
@@ -841,7 +854,7 @@ SaveFrameworkState (
   //\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