[edk2-devel] [PATCH v1 1/1] UnitTestFrameworkPkg: UnitTestPersistenceLib: Save Unit Test Cache to Drive

Michael D Kinney michael.d.kinney at intel.com
Wed May 31 20:39:57 UTC 2023


Would it be more flexible for unit tests apps to support an optional command line arg 
to specify the volume to write results? 

Mike

> -----Original Message-----
> From: Kun Qin <kuqin12 at gmail.com>
> Sent: Wednesday, May 31, 2023 12:14 PM
> To: devel at edk2.groups.io
> Cc: Sean Brogan <sean.brogan at microsoft.com>; Michael Kubacki
> <mikuback at linux.microsoft.com>; Kinney, Michael D
> <michael.d.kinney at intel.com>
> Subject: [PATCH v1 1/1] UnitTestFrameworkPkg: UnitTestPersistenceLib: Save
> Unit Test Cache to Drive
> 
> From: kuqin12 <42554914+kuqin12 at users.noreply.github.com>
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4467
> 
> Current implementation of UnitTestFrameworkPkg for shell-based unit test
> will save the unit test cache to the same volume as the test application
> itself. This works as long as the test application is on a writable
> volume, such as USB or EFI partition.
> 
> Instead of saving the files to the same file system of unit test
> application, this change will save the cache file to the path where the
> user ran this test application.
> 
> This change was tested on proprietary physical hardware platforms and
> QEMU based virtual platform.
> 
> Cc: Sean Brogan <sean.brogan at microsoft.com>
> Cc: Michael Kubacki <mikuback at linux.microsoft.com>
> Cc: Michael D Kinney <michael.d.kinney at intel.com>
> Signed-off-by: Kun Qin <kuqin12 at gmail.com>
> ---
> 
> UnitTestFrameworkPkg/Library/UnitTestPersistenceLibSimpleFileSystem/UnitTes
> tPersistenceLibSimpleFileSystem.c | 81 +++++++++++---------
>  1 file changed, 43 insertions(+), 38 deletions(-)
> 
> diff --git
> a/UnitTestFrameworkPkg/Library/UnitTestPersistenceLibSimpleFileSystem/UnitT
> estPersistenceLibSimpleFileSystem.c
> b/UnitTestFrameworkPkg/Library/UnitTestPersistenceLibSimpleFileSystem/UnitT
> estPersistenceLibSimpleFileSystem.c
> index b59991683f48..d4181808b2be 100644
> ---
> a/UnitTestFrameworkPkg/Library/UnitTestPersistenceLibSimpleFileSystem/UnitT
> estPersistenceLibSimpleFileSystem.c
> +++
> b/UnitTestFrameworkPkg/Library/UnitTestPersistenceLibSimpleFileSystem/UnitT
> estPersistenceLibSimpleFileSystem.c
> @@ -22,7 +22,7 @@
>  #define CACHE_FILE_SUFFIX  L"_Cache.dat"
> 
> 
> 
>  /**
> 
> -  Generate the device path to the cache file.
> 
> +  Generate the file name and path to the cache file.
> 
> 
> 
>    @param[in]  FrameworkHandle  A pointer to the framework that is being
> persisted.
> 
> 
> 
> @@ -31,8 +31,8 @@
> 
> 
>  **/
> 
>  STATIC
> 
> -EFI_DEVICE_PATH_PROTOCOL *
> 
> -GetCacheFileDevicePath (
> 
> +CHAR16 *
> 
> +GetCacheFileName (
> 
>    IN UNIT_TEST_FRAMEWORK_HANDLE  FrameworkHandle
> 
>    )
> 
>  {
> 
> @@ -85,7 +85,12 @@ GetCacheFileDevicePath (
>    // PathCleanUpDirectories (FileNameCopy);
> 
>    //     if (PathRemoveLastItem (FileNameCopy)) {
> 
>    //
> 
> -  AppPath              = ConvertDevicePathToText (LoadedImage->FilePath,
> TRUE, TRUE); // NOTE: This must be freed.
> 
> +  AppPath = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);
> // NOTE: This must be freed.
> 
> +  if (AppPath == NULL) {
> 
> +    DEBUG ((DEBUG_ERROR, "%a - Failed to convert device path to text.\n",
> __func__));
> 
> +    goto Exit;
> 
> +  }
> 
> +
> 
>    DirectorySlashOffset = StrLen (AppPath);
> 
>    //
> 
>    // Make sure we didn't get any weird data.
> 
> @@ -148,15 +153,15 @@ Exit:
>      FreePool (AppPath);
> 
>    }
> 
> 
> 
> -  if (CacheFilePath != NULL) {
> 
> -    FreePool (CacheFilePath);
> 
> +  if (CacheFileDevicePath != NULL) {
> 
> +    FreePool (CacheFileDevicePath);
> 
>    }
> 
> 
> 
>    if (TestName != NULL) {
> 
>      FreePool (TestName);
> 
>    }
> 
> 
> 
> -  return CacheFileDevicePath;
> 
> +  return CacheFilePath;
> 
>  }
> 
> 
> 
>  /**
> 
> @@ -175,21 +180,21 @@ DoesCacheExist (
>    IN UNIT_TEST_FRAMEWORK_HANDLE  FrameworkHandle
> 
>    )
> 
>  {
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *FileDevicePath;
> 
> -  EFI_STATUS                Status;
> 
> -  SHELL_FILE_HANDLE         FileHandle;
> 
> +  CHAR16             *FileName;
> 
> +  EFI_STATUS         Status;
> 
> +  SHELL_FILE_HANDLE  FileHandle;
> 
> 
> 
>    //
> 
>    // NOTE: This devpath is allocated and must be freed.
> 
>    //
> 
> -  FileDevicePath = GetCacheFileDevicePath (FrameworkHandle);
> 
> +  FileName = GetCacheFileName (FrameworkHandle);
> 
> 
> 
>    //
> 
>    // Check to see whether the file exists.  If the file can be opened for
> 
>    // reading, it exists.  Otherwise, probably not.
> 
>    //
> 
> -  Status = ShellOpenFileByDevicePath (
> 
> -             &FileDevicePath,
> 
> +  Status = ShellOpenFileByName (
> 
> +             FileName,
> 
>               &FileHandle,
> 
>               EFI_FILE_MODE_READ,
> 
>               0
> 
> @@ -198,8 +203,8 @@ DoesCacheExist (
>      ShellCloseFile (&FileHandle);
> 
>    }
> 
> 
> 
> -  if (FileDevicePath != NULL) {
> 
> -    FreePool (FileDevicePath);
> 
> +  if (FileName != NULL) {
> 
> +    FreePool (FileName);
> 
>    }
> 
> 
> 
>    DEBUG ((DEBUG_VERBOSE, "%a - Returning %d\n", __func__, !EFI_ERROR
> (Status)));
> 
> @@ -229,10 +234,10 @@ SaveUnitTestCache (
>    IN UINTN                       SaveStateSize
> 
>    )
> 
>  {
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *FileDevicePath;
> 
> -  EFI_STATUS                Status;
> 
> -  SHELL_FILE_HANDLE         FileHandle;
> 
> -  UINTN                     WriteCount;
> 
> +  CHAR16             *FileName;
> 
> +  EFI_STATUS         Status;
> 
> +  SHELL_FILE_HANDLE  FileHandle;
> 
> +  UINTN              WriteCount;
> 
> 
> 
>    //
> 
>    // Check the inputs for sanity.
> 
> @@ -245,13 +250,13 @@ SaveUnitTestCache (
>    // Determine the path for the cache file.
> 
>    // NOTE: This devpath is allocated and must be freed.
> 
>    //
> 
> -  FileDevicePath = GetCacheFileDevicePath (FrameworkHandle);
> 
> +  FileName = GetCacheFileName (FrameworkHandle);
> 
> 
> 
>    //
> 
>    // First lets open the file if it exists so we can delete it...This is
> the work around for truncation
> 
>    //
> 
> -  Status = ShellOpenFileByDevicePath (
> 
> -             &FileDevicePath,
> 
> +  Status = ShellOpenFileByName (
> 
> +             FileName,
> 
>               &FileHandle,
> 
>               (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE),
> 
>               0
> 
> @@ -270,8 +275,8 @@ SaveUnitTestCache (
>    //
> 
>    // Now that we know the path to the file... let's open it for writing.
> 
>    //
> 
> -  Status = ShellOpenFileByDevicePath (
> 
> -             &FileDevicePath,
> 
> +  Status = ShellOpenFileByName (
> 
> +             FileName,
> 
>               &FileHandle,
> 
>               (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |
> EFI_FILE_MODE_CREATE),
> 
>               0
> 
> @@ -304,8 +309,8 @@ SaveUnitTestCache (
>    ShellCloseFile (&FileHandle);
> 
> 
> 
>  Exit:
> 
> -  if (FileDevicePath != NULL) {
> 
> -    FreePool (FileDevicePath);
> 
> +  if (FileName != NULL) {
> 
> +    FreePool (FileName);
> 
>    }
> 
> 
> 
>    return Status;
> 
> @@ -334,13 +339,13 @@ LoadUnitTestCache (
>    OUT UINTN                       *SaveStateSize
> 
>    )
> 
>  {
> 
> -  EFI_STATUS                Status;
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *FileDevicePath;
> 
> -  SHELL_FILE_HANDLE         FileHandle;
> 
> -  BOOLEAN                   IsFileOpened;
> 
> -  UINT64                    LargeFileSize;
> 
> -  UINTN                     FileSize;
> 
> -  VOID                      *Buffer;
> 
> +  EFI_STATUS         Status;
> 
> +  CHAR16             *FileName;
> 
> +  SHELL_FILE_HANDLE  FileHandle;
> 
> +  BOOLEAN            IsFileOpened;
> 
> +  UINT64             LargeFileSize;
> 
> +  UINTN              FileSize;
> 
> +  VOID               *Buffer;
> 
> 
> 
>    IsFileOpened = FALSE;
> 
>    Buffer       = NULL;
> 
> @@ -356,13 +361,13 @@ LoadUnitTestCache (
>    // Determine the path for the cache file.
> 
>    // NOTE: This devpath is allocated and must be freed.
> 
>    //
> 
> -  FileDevicePath = GetCacheFileDevicePath (FrameworkHandle);
> 
> +  FileName = GetCacheFileName (FrameworkHandle);
> 
> 
> 
>    //
> 
>    // Now that we know the path to the file... let's open it for writing.
> 
>    //
> 
> -  Status = ShellOpenFileByDevicePath (
> 
> -             &FileDevicePath,
> 
> +  Status = ShellOpenFileByName (
> 
> +             FileName,
> 
>               &FileHandle,
> 
>               EFI_FILE_MODE_READ,
> 
>               0
> 
> @@ -407,8 +412,8 @@ Exit:
>    //
> 
>    // Free allocated buffers
> 
>    //
> 
> -  if (FileDevicePath != NULL) {
> 
> -    FreePool (FileDevicePath);
> 
> +  if (FileName != NULL) {
> 
> +    FreePool (FileName);
> 
>    }
> 
> 
> 
>    if (IsFileOpened) {
> 
> --
> 2.40.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#105515): https://edk2.groups.io/g/devel/message/105515
Mute This Topic: https://groups.io/mt/99249446/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/3943202/1813853/130120423/xyzzy [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list