[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