/** @file

  Unit tests for the PRM Module Discovery Library.

  Copyright (c) Microsoft Corporation
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PrmModuleDiscoveryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UnitTestLib.h>

#include "../PrmModuleDiscovery.h"

#define UNIT_TEST_NAME     "PRM Module Discovery Library Unit Test"
#define UNIT_TEST_VERSION  "0.1"

/// === TEST CASES =================================================================================

/// ===== CREATE NEW PRM MODULE IMAGE CONTEXT LIST ENTRY TESTS SUITE ==================================================

/**
  Verifies that the buffer returned can be deallocated.

  @param[in]  Context             [Optional] An optional context parameter.
                                  Not used in this unit test.

  @retval  UNIT_TEST_PASSED                      Unit test case prerequisites are met.
  @retval  UNIT_TEST_ERROR_PREREQUISITE_NOT_MET  Test case should be skipped..

**/
UNIT_TEST_STATUS
EFIAPI
PrmModuleImageContextListEntryShouldDeallocate (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  PRM_MODULE_IMAGE_CONTEXT_LIST_ENTRY  *ListEntry;

  ListEntry = CreateNewPrmModuleImageContextListEntry ();

  UT_ASSERT_NOT_NULL (ListEntry);
  if (ListEntry != NULL) {
    FreePool (ListEntry);
  }

  return UNIT_TEST_PASSED;
}

/**
  Verifies that the list entry signature is set to the appropriate value.

  @param[in]  Context             [Optional] An optional context parameter.
                                  Not used in this unit test.

  @retval  UNIT_TEST_PASSED                      Unit test case prerequisites are met.
  @retval  UNIT_TEST_ERROR_PREREQUISITE_NOT_MET  Test case should be skipped..

**/
UNIT_TEST_STATUS
EFIAPI
PrmModuleImageContextListEntrySignatureShouldBeValid (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  PRM_MODULE_IMAGE_CONTEXT_LIST_ENTRY  *ListEntry;

  ListEntry = CreateNewPrmModuleImageContextListEntry ();

  UT_ASSERT_TRUE (ListEntry->Signature == PRM_MODULE_IMAGE_CONTEXT_LIST_ENTRY_SIGNATURE);

  if (ListEntry != NULL) {
    FreePool (ListEntry);
  }

  return UNIT_TEST_PASSED;
}

/**
  Verifies that the Context buffer in the list entry is initialized to zero.

  @param[in]  Context             [Optional] An optional context parameter.
                                  Not used in this unit test.

  @retval  UNIT_TEST_PASSED                      Unit test case prerequisites are met.
  @retval  UNIT_TEST_ERROR_PREREQUISITE_NOT_MET  Test case should be skipped..

**/
UNIT_TEST_STATUS
EFIAPI
PrmModuleImageContextListEntryImageContextShouldBeZeroed (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  PRM_MODULE_IMAGE_CONTEXT_LIST_ENTRY  *ListEntry;
  PRM_MODULE_IMAGE_CONTEXT             ImageContext;

  ListEntry = CreateNewPrmModuleImageContextListEntry ();

  ZeroMem (&ImageContext, sizeof (ImageContext));
  UT_ASSERT_MEM_EQUAL (&ListEntry->Context, &ImageContext, sizeof (ImageContext));

  if (ListEntry != NULL) {
    FreePool (ListEntry);
  }

  return UNIT_TEST_PASSED;
}

/// === TEST ENGINE ================================================================================

/**
  Entry point for the PRM Context Buffer Library unit tests.

  @param[in] ImageHandle  The firmware allocated handle for the EFI image.
  @param[in] SystemTable  A pointer to the EFI System Table.

  @retval EFI_SUCCESS     The entry point executed successfully.
  @retval other           Some error occurred when executing this entry point.

**/
int
main (
  )
{
  EFI_STATUS                  Status;
  UNIT_TEST_FRAMEWORK_HANDLE  Framework;
  UNIT_TEST_SUITE_HANDLE      CreateNewPrmModuleImageContextListEntryTests;

  Framework = NULL;

  DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));

  //
  // Start setting up the test framework for running the tests.
  //
  Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));
    goto EXIT;
  }

  Status =  CreateUnitTestSuite (
              &CreateNewPrmModuleImageContextListEntryTests,
              Framework,
              "Create New PRM Module Image Context List Entry Tests",
              "PrmModuleDiscoveryLib.CreateNewPrmModuleImageContextListEntry",
              NULL,
              NULL
              );
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmModuleDiscoveryLib.CreateNewPrmModuleImageContextListEntry\n"));
    Status = EFI_OUT_OF_RESOURCES;
    goto EXIT;
  }

  AddTestCase (
    CreateNewPrmModuleImageContextListEntryTests,
    "",
    "PrmModuleDiscoveryLib.CreateNewPrmModuleImageContextListEntry.ListEntryShouldDeallocate",
    PrmModuleImageContextListEntryShouldDeallocate,
    NULL,
    NULL,
    NULL
    );

  AddTestCase (
    CreateNewPrmModuleImageContextListEntryTests,
    "",
    "PrmModuleDiscoveryLib.CreateNewPrmModuleImageContextListEntry.ListEntrySignatureShouldBeValid",
    PrmModuleImageContextListEntrySignatureShouldBeValid,
    NULL,
    NULL,
    NULL
    );

  AddTestCase (
    CreateNewPrmModuleImageContextListEntryTests,
    "",
    "PrmModuleDiscoveryLib.CreateNewPrmModuleImageContextListEntry.ListEntryImageContextShouldBeZeroed",
    PrmModuleImageContextListEntryImageContextShouldBeZeroed,
    NULL,
    NULL,
    NULL
    );

  //
  // Execute the tests.
  //
  Status = RunAllTestSuites (Framework);

EXIT:
  if (Framework) {
    FreeUnitTestFramework (Framework);
  }

  return Status;
}
