/** @file
  Common code to test EdkiiPeiMpServices2Ppi and EfiMpServiceProtocol.

  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "EfiMpServicesUnitTestCommom.h"

/**
  Prep routine for Unit test function.
  To save the ProcessorNumber of disabled AP and temporarily enable it.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             Prep routine runs successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  Prep routine runs unsuccessful.
**/
UNIT_TEST_STATUS
EFIAPI
InitUTContext (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                 Status;
  UINTN                      NumberOfProcessors;
  UINTN                      NumberOfEnabledProcessors;
  UINTN                      NumberOfDisabledAPs;
  UINTN                      IndexOfDisabledAPs;
  UINTN                      BspNumber;
  UINTN                      ProcessorNumber;
  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
  MP_SERVICE_UT_CONTEXT      *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  if (LocalContext->MpServices.Ppi != NULL) {
    return UNIT_TEST_PASSED;
  }

  Status = MpServicesUnitTestGetMpServices (&LocalContext->MpServices);
  UT_ASSERT_NOT_EFI_ERROR (Status);

  Status = MpServicesUnitTestWhoAmI (LocalContext->MpServices, &BspNumber);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  DEBUG ((DEBUG_INFO, "%a: BspNumber = 0x%x\n", __func__, BspNumber));

  Status = MpServicesUnitTestGetNumberOfProcessors (
             LocalContext->MpServices,
             &NumberOfProcessors,
             &NumberOfEnabledProcessors
             );
  UT_ASSERT_NOT_EFI_ERROR (Status);
  DEBUG ((
    DEBUG_INFO,
    "%a: NumberOfProcessors = 0x%x, NumberOfEnabledProcessors = 0x%x\n",
    __func__,
    NumberOfProcessors,
    NumberOfEnabledProcessors
    ));

  LocalContext->BspNumber                 = BspNumber;
  LocalContext->NumberOfProcessors        = NumberOfProcessors;
  LocalContext->NumberOfEnabledProcessors = NumberOfEnabledProcessors;

  LocalContext->CommonBuffer = AllocatePages (EFI_SIZE_TO_PAGES (NumberOfProcessors * sizeof (*LocalContext->CommonBuffer)));
  UT_ASSERT_NOT_NULL (LocalContext->CommonBuffer);

  NumberOfDisabledAPs = NumberOfProcessors - NumberOfEnabledProcessors;
  if ((NumberOfDisabledAPs > 0) && (LocalContext->DisabledApNumber == NULL)) {
    LocalContext->DisabledApNumber = AllocatePages (EFI_SIZE_TO_PAGES (NumberOfDisabledAPs * sizeof (*LocalContext->DisabledApNumber)));
    UT_ASSERT_NOT_NULL (LocalContext->DisabledApNumber);
    ZeroMem (LocalContext->DisabledApNumber, NumberOfDisabledAPs * sizeof (*LocalContext->DisabledApNumber));

    for (ProcessorNumber = 0, IndexOfDisabledAPs = 0; ProcessorNumber < LocalContext->NumberOfProcessors; ProcessorNumber++) {
      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 ProcessorNumber,
                 &ProcessorInfoBuffer
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);

      if (!(ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT)) {
        //
        // Save ProcessorNumber of disabled AP.
        //
        LocalContext->DisabledApNumber[IndexOfDisabledAPs] = ProcessorNumber;
        IndexOfDisabledAPs++;

        DEBUG ((DEBUG_INFO, "%a: AP(0x%x) is disabled and temporarily enable it.\n", __func__, ProcessorNumber));
        Status = MpServicesUnitTestEnableDisableAP (
                   LocalContext->MpServices,
                   ProcessorNumber,
                   TRUE,
                   NULL
                   );
        UT_ASSERT_NOT_EFI_ERROR (Status);
      }
    }

    UT_ASSERT_TRUE (IndexOfDisabledAPs == NumberOfDisabledAPs);
  }

  return UNIT_TEST_PASSED;
}

/**
  Cleanup routine for Unit test function.
  If any processor is disabled unexpectedly then reenable it.

  @param[in]  Context   Context pointer for this test.
**/
VOID
EFIAPI
CheckUTContext (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                 Status;
  UINTN                      NumberOfProcessors;
  UINTN                      NumberOfEnabledProcessors;
  UINTN                      BspNumber;
  UINTN                      ProcessorNumber;
  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
  MP_SERVICE_UT_CONTEXT      *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;
  ASSERT (LocalContext->MpServices.Ppi != NULL);

  Status = MpServicesUnitTestWhoAmI (LocalContext->MpServices, &BspNumber);
  ASSERT_EFI_ERROR (Status);

  if (BspNumber != LocalContext->BspNumber) {
    LocalContext->BspNumber = BspNumber;
    DEBUG ((DEBUG_INFO, "%a: New BspNumber = 0x%x\n", __func__, BspNumber));
  }

  ASSERT (BspNumber == LocalContext->BspNumber);

  Status = MpServicesUnitTestGetNumberOfProcessors (
             LocalContext->MpServices,
             &NumberOfProcessors,
             &NumberOfEnabledProcessors
             );
  ASSERT_EFI_ERROR (Status);

  if (NumberOfProcessors != LocalContext->NumberOfProcessors) {
    LocalContext->NumberOfProcessors = NumberOfProcessors;
    DEBUG ((DEBUG_INFO, "%a: New NumberOfProcessors = 0x%x\n", __func__, NumberOfProcessors));
  }

  if (NumberOfEnabledProcessors != LocalContext->NumberOfProcessors) {
    DEBUG ((DEBUG_INFO, "%a: New NumberOfEnabledProcessors = 0x%x\n", __func__, NumberOfEnabledProcessors));

    for (ProcessorNumber = 0; ProcessorNumber < LocalContext->NumberOfProcessors; ProcessorNumber++) {
      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 ProcessorNumber,
                 &ProcessorInfoBuffer
                 );
      ASSERT_EFI_ERROR (Status);

      if (!(ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT)) {
        DEBUG ((DEBUG_INFO, "%a: AP(0x%x) is disabled unexpectedly and reenable it.\n", __func__, ProcessorNumber));
        Status = MpServicesUnitTestEnableDisableAP (
                   LocalContext->MpServices,
                   ProcessorNumber,
                   TRUE,
                   NULL
                   );
        ASSERT_EFI_ERROR (Status);
      }
    }
  }
}

/**
  Cleanup routine for Unit test function.
  It will be called by the last "AddTestCase" to restore AP state and free pointer.

  @param[in]  Context   Context pointer for this test.
**/
VOID
EFIAPI
FreeUTContext (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  NumberOfDisabledAPs;
  UINTN                  IndexOfDisabledAPs;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  CheckUTContext (Context);

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;
  ASSERT (LocalContext->MpServices.Ppi != NULL);

  if (LocalContext->DisabledApNumber != NULL) {
    NumberOfDisabledAPs = LocalContext->NumberOfProcessors - LocalContext->NumberOfEnabledProcessors;
    for (IndexOfDisabledAPs = 0; IndexOfDisabledAPs < NumberOfDisabledAPs; IndexOfDisabledAPs++) {
      DEBUG ((
        DEBUG_INFO,
        "%a: Disable AP(0x%x) to restore its state.\n",
        __func__,
        LocalContext->DisabledApNumber[IndexOfDisabledAPs]
        ));

      Status = MpServicesUnitTestEnableDisableAP (
                 LocalContext->MpServices,
                 LocalContext->DisabledApNumber[IndexOfDisabledAPs],
                 FALSE,
                 NULL
                 );
      ASSERT_EFI_ERROR (Status);
    }

    FreePages (LocalContext->DisabledApNumber, EFI_SIZE_TO_PAGES (NumberOfDisabledAPs * sizeof (*LocalContext->DisabledApNumber)));
  }

  if (LocalContext->CommonBuffer != NULL) {
    FreePages (LocalContext->CommonBuffer, EFI_SIZE_TO_PAGES (LocalContext->NumberOfProcessors * sizeof (*LocalContext->CommonBuffer)));
  }
}

/**
  Produce to store ProcessorNumber in the corresponding location of CommonBuffer.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
StoreCpuNumbers (
  IN OUT VOID  *Buffer
  )
{
  EFI_STATUS             Status;
  UINTN                  ProcessorNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  Status = MpServicesUnitTestWhoAmI (LocalContext->MpServices, &ProcessorNumber);
  ASSERT_EFI_ERROR (Status);

  //
  // The layout of CommonBuffer (E.g. BspNumber = 2 and NumberOfProcessors = 6)
  // Index  00    01    02    03    04    05
  // Value  00    01    02    03    04    05
  //
  if (ProcessorNumber < LocalContext->NumberOfProcessors) {
    LocalContext->CommonBuffer[ProcessorNumber] = ProcessorNumber;
  }
}

/**
  Produce to store the ProcessorNumber of AP execution order in CommonBuffer.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
StoreAPsExecutionOrder (
  IN OUT VOID  *Buffer
  )
{
  EFI_STATUS             Status;
  UINTN                  ProcessorNumber;
  UINTN                  *ApCounter;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  Status = MpServicesUnitTestWhoAmI (LocalContext->MpServices, &ProcessorNumber);
  ASSERT_EFI_ERROR (Status);

  //
  // The layout of CommonBuffer (E.g. BspNumber = 2 and NumberOfProcessors = 6)
  // Index  00    01    02    03    04    05
  // Value  00    01    03    04    05  ApCounter(5)
  //
  ApCounter                              = &(LocalContext->CommonBuffer[LocalContext->NumberOfProcessors - 1]);
  LocalContext->CommonBuffer[*ApCounter] = ProcessorNumber;
  (*ApCounter)++;
}

/**
  Infinite loop procedure to be run on specified CPU.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
InfiniteLoopProcedure (
  IN OUT VOID  *Buffer
  )
{
  volatile BOOLEAN  InfiniteLoop;

  InfiniteLoop = TRUE;

  while (InfiniteLoop) {
  }
}

/**
  Empty procedure to be run on specified CPU.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
EmptyProcedure (
  IN OUT VOID  *Buffer
  )
{
}

/**
  Procedure to run MP service GetNumberOfProcessors on AP.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
RunMpServiceGetNumberOfProcessorsOnAp (
  IN OUT VOID  *Buffer
  )
{
  UINTN                  NumberOfProcessors;
  UINTN                  NumberOfEnabledProcessors;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  LocalContext->ApProcedureReturnStatus = MpServicesUnitTestGetNumberOfProcessors (
                                            LocalContext->MpServices,
                                            &NumberOfProcessors,
                                            &NumberOfEnabledProcessors
                                            );
}

/**
  Procedure to run MP service GetProcessorInfo on AP.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
RunMpServiceGetProcessorInfoOnAp (
  IN OUT VOID  *Buffer
  )
{
  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
  MP_SERVICE_UT_CONTEXT      *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  LocalContext->ApProcedureReturnStatus = MpServicesUnitTestGetProcessorInfo (
                                            LocalContext->MpServices,
                                            LocalContext->ApNumber,
                                            &ProcessorInfoBuffer
                                            );
}

/**
  Procedure to run MP service EnableDisableAP on AP.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
RunMpServiceEnableDisableAPOnAp (
  IN OUT VOID  *Buffer
  )
{
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  LocalContext->ApProcedureReturnStatus = MpServicesUnitTestEnableDisableAP (
                                            LocalContext->MpServices,
                                            LocalContext->ApNumber,
                                            FALSE,
                                            NULL
                                            );
}

/**
  Procedure to run MP service StartupThisAP on AP.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
RunMpServiceStartupThisAPOnAp (
  IN OUT VOID  *Buffer
  )
{
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  LocalContext->ApProcedureReturnStatus = MpServicesUnitTestStartupThisAP (
                                            LocalContext->MpServices,
                                            (EFI_AP_PROCEDURE)EmptyProcedure,
                                            LocalContext->ApNumber,
                                            0,
                                            NULL
                                            );
}

/**
  Procedure to run MP service StartupAllAPs on AP.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
RunMpServiceStartupAllAPsOnAp (
  IN OUT VOID  *Buffer
  )
{
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  LocalContext->ApProcedureReturnStatus = MpServicesUnitTestStartupAllAPs (
                                            LocalContext->MpServices,
                                            (EFI_AP_PROCEDURE)EmptyProcedure,
                                            FALSE,
                                            0,
                                            NULL
                                            );
}

/**
  Procedure to run MP service SwitchBSP on AP.

  @param[in,out] Buffer   The pointer to private data buffer.
**/
VOID
RunMpServiceSwitchBSPOnAp (
  IN OUT VOID  *Buffer
  )
{
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Buffer;

  LocalContext->ApProcedureReturnStatus = MpServicesUnitTestSwitchBSP (
                                            LocalContext->MpServices,
                                            LocalContext->ApNumber,
                                            TRUE
                                            );
}

/**
  Unit test of MP service WhoAmI.
  The range of ProcessorNumber should be from 0 to NumberOfCPUs minus 1.
  The ProcessorNumbers of all CPUs are unique.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestWhoAmI1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ProcessorNumber;
  UINTN                  ProcessorIndex;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  Status = MpServicesUnitTestWhoAmI (
             LocalContext->MpServices,
             &ProcessorNumber
             );
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_TRUE (ProcessorNumber < LocalContext->NumberOfProcessors);

  SetMem (LocalContext->CommonBuffer, LocalContext->NumberOfProcessors * sizeof (*LocalContext->CommonBuffer), 0xFF);
  LocalContext->CommonBuffer[ProcessorNumber] = ProcessorNumber;

  Status = MpServicesUnitTestStartupAllAPs (
             LocalContext->MpServices,
             (EFI_AP_PROCEDURE)StoreCpuNumbers,
             FALSE,
             0,
             (VOID *)LocalContext
             );
  UT_ASSERT_NOT_EFI_ERROR (Status);

  //
  // The layout of CommonBuffer (E.g. BspNumber = 2 and NumberOfProcessors = 6)
  // Index  00    01    02    03    04    05
  // Value  00    01    02    03    04    05
  //
  for (ProcessorIndex = 0; ProcessorIndex < LocalContext->NumberOfProcessors; ProcessorIndex++) {
    UT_ASSERT_TRUE (LocalContext->CommonBuffer[ProcessorIndex] == ProcessorIndex);
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service GetNumberOfProcessors.
  NumberOfProcessors should be greater that 0 and not less than NumberOfEnabledProcessors.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestGetNumberOfProcessors1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  NumberOfProcessors;
  UINTN                  NumberOfEnabledProcessors;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  Status = MpServicesUnitTestGetNumberOfProcessors (
             LocalContext->MpServices,
             &NumberOfProcessors,
             &NumberOfEnabledProcessors
             );
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_TRUE (NumberOfProcessors > 0 && NumberOfProcessors >= NumberOfEnabledProcessors);

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service GetNumberOfProcessors.
  When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestGetNumberOfProcessors2 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    LocalContext->ApNumber = ApNumber;
    Status                 = MpServicesUnitTestStartupThisAP (
                               LocalContext->MpServices,
                               (EFI_AP_PROCEDURE)RunMpServiceGetNumberOfProcessorsOnAp,
                               ApNumber,
                               0,
                               (VOID *)LocalContext
                               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_STATUS_EQUAL (LocalContext->ApProcedureReturnStatus, EFI_DEVICE_ERROR);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service GetNumberOfProcessors.
  Call EnableDisableAP() to change the number of enabled AP.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestGetNumberOfProcessors3 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  UINTN                  NumberOfProcessors;
  UINTN                  NumberOfEnabledProcessors;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               ApNumber,
               FALSE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestGetNumberOfProcessors (
                 LocalContext->MpServices,
                 &NumberOfProcessors,
                 &NumberOfEnabledProcessors
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE (NumberOfProcessors == LocalContext->NumberOfProcessors);

      if (ApNumber < LocalContext->BspNumber) {
        UT_ASSERT_TRUE (NumberOfEnabledProcessors == LocalContext->NumberOfProcessors - (ApNumber + 1));
      } else {
        UT_ASSERT_TRUE (NumberOfEnabledProcessors == LocalContext->NumberOfProcessors - ApNumber);
      }
    }
  }

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               ApNumber,
               TRUE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestGetNumberOfProcessors (
                 LocalContext->MpServices,
                 &NumberOfProcessors,
                 &NumberOfEnabledProcessors
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE (NumberOfProcessors == LocalContext->NumberOfProcessors);

      if (ApNumber < LocalContext->BspNumber) {
        UT_ASSERT_TRUE (NumberOfEnabledProcessors == ApNumber + 2);
      } else {
        UT_ASSERT_TRUE (NumberOfEnabledProcessors == ApNumber + 1);
      }
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service GetProcessorInfo.
  When all the parameters are valid, all reserved bits of StatusFlag in ProcessorInfoBuffer should be set to zero.
  When all the parameters are valid, the StatusFlag should not have an invalid value (The BSP can never be in the disabled state.).
  When called with nonexistent processor handle, the return status should be EFI_NOT_FOUND.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestGetProcessorInfo1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                 Status;
  UINTN                      ProcessorNumber;
  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
  MP_SERVICE_UT_CONTEXT      *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ProcessorNumber = 0; ProcessorNumber <= LocalContext->NumberOfProcessors; ProcessorNumber++) {
    Status = MpServicesUnitTestGetProcessorInfo (
               LocalContext->MpServices,
               ProcessorNumber,
               &ProcessorInfoBuffer
               );

    if (ProcessorNumber == LocalContext->NumberOfProcessors) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_FOUND);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE ((ProcessorInfoBuffer.StatusFlag & (UINT32) ~(PROCESSOR_AS_BSP_BIT|PROCESSOR_ENABLED_BIT|PROCESSOR_HEALTH_STATUS_BIT)) == 0);

      if (ProcessorNumber == LocalContext->BspNumber) {
        UT_ASSERT_TRUE ((ProcessorInfoBuffer.StatusFlag & PROCESSOR_AS_BSP_BIT) && (ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT));
      } else {
        UT_ASSERT_TRUE (!(ProcessorInfoBuffer.StatusFlag & PROCESSOR_AS_BSP_BIT));
      }
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service GetProcessorInfo.
  When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestGetProcessorInfo2 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    LocalContext->ApNumber = ApNumber;
    Status                 = MpServicesUnitTestStartupThisAP (
                               LocalContext->MpServices,
                               (EFI_AP_PROCEDURE)RunMpServiceGetProcessorInfoOnAp,
                               ApNumber,
                               0,
                               (VOID *)LocalContext
                               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_STATUS_EQUAL (LocalContext->ApProcedureReturnStatus, EFI_DEVICE_ERROR);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service EnableDisableAP.
  When called with BSP number, the return status should be EFI_INVALID_PARAMETER.
  When called with a nonexistent processor handle, the return status should be EFI_NOT_FOUND.
  The AP should be really Enable/Disabled.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestEnableDisableAP1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber <= LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               ApNumber,
               FALSE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else if (ApNumber == LocalContext->NumberOfProcessors) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_FOUND);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestStartupThisAP (
                 LocalContext->MpServices,
                 (EFI_AP_PROCEDURE)EmptyProcedure,
                 ApNumber,
                 0,
                 NULL
                 );
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

      Status = MpServicesUnitTestEnableDisableAP (
                 LocalContext->MpServices,
                 ApNumber,
                 TRUE,
                 NULL
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestStartupThisAP (
                 LocalContext->MpServices,
                 (EFI_AP_PROCEDURE)EmptyProcedure,
                 ApNumber,
                 0,
                 NULL
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service EnableDisableAP.
  When run this procedure on AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestEnableDisableAP2 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    LocalContext->ApNumber = ApNumber;
    Status                 = MpServicesUnitTestStartupThisAP (
                               LocalContext->MpServices,
                               (EFI_AP_PROCEDURE)RunMpServiceEnableDisableAPOnAp,
                               ApNumber,
                               0,
                               (VOID *)LocalContext
                               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_STATUS_EQUAL (LocalContext->ApProcedureReturnStatus, EFI_DEVICE_ERROR);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service EnableDisableAP.
  When run this procedure on AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestEnableDisableAP3 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                 Status;
  UINTN                      ApNumber;
  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
  UINT32                     OldHealthFlag;
  UINT32                     NewHealthFlag;
  MP_SERVICE_UT_CONTEXT      *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestGetProcessorInfo (
               LocalContext->MpServices,
               ApNumber,
               &ProcessorInfoBuffer
               );
    UT_ASSERT_NOT_EFI_ERROR (Status);

    OldHealthFlag = ProcessorInfoBuffer.StatusFlag & PROCESSOR_HEALTH_STATUS_BIT;
    NewHealthFlag = OldHealthFlag ^ PROCESSOR_HEALTH_STATUS_BIT;
    Status        = MpServicesUnitTestEnableDisableAP (
                      LocalContext->MpServices,
                      ApNumber,
                      TRUE,
                      &NewHealthFlag
                      );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 ApNumber,
                 &ProcessorInfoBuffer
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE ((ProcessorInfoBuffer.StatusFlag & PROCESSOR_HEALTH_STATUS_BIT) == NewHealthFlag);

      Status = MpServicesUnitTestEnableDisableAP (
                 LocalContext->MpServices,
                 ApNumber,
                 TRUE,
                 &OldHealthFlag
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupThisAP.
  When called to startup a BSP, the return status should be EFI_INVALID_PARAMETER.
  When called with a nonexistent processor handle, the return status should be EFI_NOT_FOUND.
  The requested AP should execute the Procedure when called by StartupThisAP.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupThisAP1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  UINTN                  ProcessorIndex;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber <= LocalContext->NumberOfProcessors; ApNumber++) {
    SetMem (LocalContext->CommonBuffer, LocalContext->NumberOfProcessors * sizeof (*LocalContext->CommonBuffer), 0xFF);
    Status = MpServicesUnitTestStartupThisAP (
               LocalContext->MpServices,
               (EFI_AP_PROCEDURE)StoreCpuNumbers,
               ApNumber,
               0,
               (VOID *)LocalContext
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else if (ApNumber == LocalContext->NumberOfProcessors) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_FOUND);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      for (ProcessorIndex = 0; ProcessorIndex < LocalContext->NumberOfProcessors; ProcessorIndex++) {
        UT_ASSERT_TRUE (
          ((ProcessorIndex == ApNumber) && (LocalContext->CommonBuffer[ProcessorIndex] == ProcessorIndex)) ||
          ((ProcessorIndex != ApNumber) && (LocalContext->CommonBuffer[ProcessorIndex] == (UINTN) ~0))
          );
      }
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupThisAP.
  When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupThisAP2 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    LocalContext->ApNumber = ApNumber;
    Status                 = MpServicesUnitTestStartupThisAP (
                               LocalContext->MpServices,
                               (EFI_AP_PROCEDURE)RunMpServiceStartupThisAPOnAp,
                               ApNumber,
                               0,
                               (VOID *)LocalContext
                               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_STATUS_EQUAL (LocalContext->ApProcedureReturnStatus, EFI_DEVICE_ERROR);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupThisAP.
  When timeout expired before the requested AP has finished, the return status should be EFI_TIMEOUT.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupThisAP3 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestStartupThisAP (
               LocalContext->MpServices,
               (EFI_AP_PROCEDURE)InfiniteLoopProcedure,
               ApNumber,
               RUN_PROCEDURE_TIMEOUT_VALUE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_TIMEOUT);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupThisAP.
  When called with disabled AP, the return status should be EFI_INVALID_PARAMETER.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupThisAP4 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               ApNumber,
               FALSE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestStartupThisAP (
                 LocalContext->MpServices,
                 (EFI_AP_PROCEDURE)EmptyProcedure,
                 ApNumber,
                 0,
                 NULL
                 );
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

      Status = MpServicesUnitTestEnableDisableAP (
                 LocalContext->MpServices,
                 ApNumber,
                 TRUE,
                 NULL
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestStartupThisAP (
                 LocalContext->MpServices,
                 (EFI_AP_PROCEDURE)EmptyProcedure,
                 ApNumber,
                 0,
                 NULL
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupAllAPs.
  All APs should execute the Procedure when called by StartupAllAPs.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupAllAPs1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ProcessorIndex;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  SetMem (LocalContext->CommonBuffer, LocalContext->NumberOfProcessors * sizeof (*LocalContext->CommonBuffer), 0xFF);
  Status = MpServicesUnitTestStartupAllAPs (
             LocalContext->MpServices,
             (EFI_AP_PROCEDURE)StoreCpuNumbers,
             FALSE,
             0,
             (VOID *)LocalContext
             );
  UT_ASSERT_NOT_EFI_ERROR (Status);

  for (ProcessorIndex = 0; ProcessorIndex < LocalContext->NumberOfProcessors; ProcessorIndex++) {
    UT_ASSERT_TRUE (
      ((ProcessorIndex == LocalContext->BspNumber) && (LocalContext->CommonBuffer[ProcessorIndex] == (UINTN) ~0)) ||
      ((ProcessorIndex != LocalContext->BspNumber) && (LocalContext->CommonBuffer[ProcessorIndex] == ProcessorIndex))
      );
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupAllAPs.
  When called in single thread, the return status should be EFI_SUCCESS and AP executes in ascending order
  of processor handle number.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupAllAPs2 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ProcessorIndex;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  ZeroMem (LocalContext->CommonBuffer, LocalContext->NumberOfProcessors * sizeof (*LocalContext->CommonBuffer));
  Status = MpServicesUnitTestStartupAllAPs (
             LocalContext->MpServices,
             (EFI_AP_PROCEDURE)StoreAPsExecutionOrder,
             TRUE,
             0,
             (VOID *)LocalContext
             );
  UT_ASSERT_NOT_EFI_ERROR (Status);

  //
  // The layout of CommonBuffer (E.g. BspNumber = 2 and NumberOfProcessors = 6)
  // Index  00    01    02    03    04    05
  // Value  00    01    03    04    05  ApCounter(5)
  //
  for (ProcessorIndex = 0; ProcessorIndex < LocalContext->NumberOfProcessors - 2; ProcessorIndex++) {
    UT_ASSERT_TRUE (LocalContext->CommonBuffer[ProcessorIndex] < LocalContext->CommonBuffer[ProcessorIndex + 1]);
  }

  UT_ASSERT_EQUAL (LocalContext->CommonBuffer[LocalContext->NumberOfProcessors - 1], LocalContext->NumberOfProcessors - 1);

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupAllAPs.
  When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupAllAPs3 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    LocalContext->ApNumber = ApNumber;
    Status                 = MpServicesUnitTestStartupThisAP (
                               LocalContext->MpServices,
                               (EFI_AP_PROCEDURE)RunMpServiceStartupAllAPsOnAp,
                               ApNumber,
                               0,
                               (VOID *)LocalContext
                               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_STATUS_EQUAL (LocalContext->ApProcedureReturnStatus, EFI_DEVICE_ERROR);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupAllAPs.
  When called with all AP timeout, the return status should be EFI_TIMEOUT.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupAllAPs4 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  Status = MpServicesUnitTestStartupAllAPs (
             LocalContext->MpServices,
             (EFI_AP_PROCEDURE)InfiniteLoopProcedure,
             TRUE,
             RUN_PROCEDURE_TIMEOUT_VALUE,
             NULL
             );
  UT_ASSERT_STATUS_EQUAL (Status, EFI_TIMEOUT);

  Status = MpServicesUnitTestStartupAllAPs (
             LocalContext->MpServices,
             (EFI_AP_PROCEDURE)InfiniteLoopProcedure,
             FALSE,
             RUN_PROCEDURE_TIMEOUT_VALUE,
             NULL
             );
  UT_ASSERT_STATUS_EQUAL (Status, EFI_TIMEOUT);

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service StartupAllAPs.
  When called with the empty Procedure on all disabled APs, the return status should be EFI_NOT_STARTED.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestStartupAllAPs5 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               ApNumber,
               FALSE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  Status = MpServicesUnitTestStartupAllAPs (
             LocalContext->MpServices,
             (EFI_AP_PROCEDURE)EmptyProcedure,
             FALSE,
             0,
             NULL
             );
  UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_STARTED);

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               ApNumber,
               TRUE,
               NULL
               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service SwitchBSP.
  When switch current BSP to be BSP, the return status should be EFI_INVALID_PARAMETER.
  When switch nonexistent processor to be BSP, the return status should be EFI_NOT_FOUND.
  After switch BSP, all APs(includes new AP) should execute the Procedure when called by StartupAllAP.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestSwitchBSP1 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  NewBspNumber;
  UINTN                  ProcessorIndex;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (NewBspNumber = 0; NewBspNumber <= LocalContext->NumberOfProcessors; NewBspNumber++) {
    Status = MpServicesUnitTestSwitchBSP (
               LocalContext->MpServices,
               NewBspNumber,
               TRUE
               );

    if (NewBspNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else if (NewBspNumber == LocalContext->NumberOfProcessors) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_FOUND);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      SetMem (LocalContext->CommonBuffer, LocalContext->NumberOfProcessors * sizeof (*LocalContext->CommonBuffer), 0xFF);
      Status = MpServicesUnitTestStartupAllAPs (
                 LocalContext->MpServices,
                 (EFI_AP_PROCEDURE)StoreCpuNumbers,
                 FALSE,
                 0,
                 (VOID *)LocalContext
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);

      for (ProcessorIndex = 0; ProcessorIndex < LocalContext->NumberOfProcessors; ProcessorIndex++) {
        UT_ASSERT_TRUE (
          ((ProcessorIndex == NewBspNumber) && (LocalContext->CommonBuffer[ProcessorIndex] == (UINTN) ~0)) ||
          ((ProcessorIndex != NewBspNumber) && (LocalContext->CommonBuffer[ProcessorIndex] == ProcessorIndex))
          );
      }

      Status = MpServicesUnitTestSwitchBSP (
                 LocalContext->MpServices,
                 LocalContext->BspNumber,
                 TRUE
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service SwitchBSP.
  When run this procedure on AP, the return status should be EFI_DEVICE_ERROR.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestSwitchBSP2 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  ApNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (ApNumber = 0; ApNumber < LocalContext->NumberOfProcessors; ApNumber++) {
    LocalContext->ApNumber = ApNumber;
    Status                 = MpServicesUnitTestStartupThisAP (
                               LocalContext->MpServices,
                               (EFI_AP_PROCEDURE)RunMpServiceSwitchBSPOnAp,
                               ApNumber,
                               0,
                               (VOID *)LocalContext
                               );

    if (ApNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_STATUS_EQUAL (LocalContext->ApProcedureReturnStatus, EFI_DEVICE_ERROR);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service SwitchBSP.
  When switch a disabled AP to be BSP, the return status should be EFI_INVALID_PARAMETER.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestSwitchBSP3 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS             Status;
  UINTN                  NewBspNumber;
  MP_SERVICE_UT_CONTEXT  *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (NewBspNumber = 0; NewBspNumber < LocalContext->NumberOfProcessors; NewBspNumber++) {
    Status = MpServicesUnitTestEnableDisableAP (
               LocalContext->MpServices,
               NewBspNumber,
               FALSE,
               NULL
               );

    if (NewBspNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestSwitchBSP (
                 LocalContext->MpServices,
                 NewBspNumber,
                 TRUE
                 );
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

      Status = MpServicesUnitTestEnableDisableAP (
                 LocalContext->MpServices,
                 NewBspNumber,
                 TRUE,
                 NULL
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Unit test of MP service SwitchBSP.
  When SwitchBSP and EnableOldBSP is TRUE, the new BSP should be in the enabled state and the old BSP should
  be in the enabled state.
  When SwitchBSP and EnableOldBSP is False, the new BSP should be in the enabled state and the old BSP should
  be in the disabled state.

  @param[in]  Context   Context pointer for this test.

  @retval  UNIT_TEST_PASSED             The Unit test has completed and the test
                                        case was successful.
  @retval  UNIT_TEST_ERROR_TEST_FAILED  A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestSwitchBSP4 (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                 Status;
  UINTN                      NewBspNumber;
  EFI_PROCESSOR_INFORMATION  ProcessorInfoBuffer;
  MP_SERVICE_UT_CONTEXT      *LocalContext;

  LocalContext = (MP_SERVICE_UT_CONTEXT *)Context;

  for (NewBspNumber = 0; NewBspNumber < LocalContext->NumberOfProcessors; NewBspNumber++) {
    Status = MpServicesUnitTestSwitchBSP (
               LocalContext->MpServices,
               NewBspNumber,
               FALSE
               );

    if (NewBspNumber == LocalContext->BspNumber) {
      UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);
    } else {
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 NewBspNumber,
                 &ProcessorInfoBuffer
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE (
        (ProcessorInfoBuffer.StatusFlag & PROCESSOR_AS_BSP_BIT) &&
        (ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT)
        );

      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 LocalContext->BspNumber,
                 &ProcessorInfoBuffer
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE (
        !(ProcessorInfoBuffer.StatusFlag & PROCESSOR_AS_BSP_BIT) &&
        !(ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT)
        );

      Status = MpServicesUnitTestEnableDisableAP (
                 LocalContext->MpServices,
                 LocalContext->BspNumber,
                 TRUE,
                 NULL
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestSwitchBSP (
                 LocalContext->MpServices,
                 LocalContext->BspNumber,
                 TRUE
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);

      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 LocalContext->BspNumber,
                 &ProcessorInfoBuffer
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE (
        (ProcessorInfoBuffer.StatusFlag & PROCESSOR_AS_BSP_BIT) &&
        (ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT)
        );

      Status = MpServicesUnitTestGetProcessorInfo (
                 LocalContext->MpServices,
                 NewBspNumber,
                 &ProcessorInfoBuffer
                 );
      UT_ASSERT_NOT_EFI_ERROR (Status);
      UT_ASSERT_TRUE (
        !(ProcessorInfoBuffer.StatusFlag & PROCESSOR_AS_BSP_BIT) &&
        (ProcessorInfoBuffer.StatusFlag & PROCESSOR_ENABLED_BIT)
        );
    }
  }

  return UNIT_TEST_PASSED;
}

/**
  Create test suite and unit tests for both EdkiiPeiMpServices2Ppi and EfiMpServiceProtocol.

  @param[in]  Framework     A pointer to the framework that is being persisted.
  @param[in]  Context       A pointer to the private data buffer.

  @retval     EFI_SUCCESS   Create test suite and unit tests successfully.
  @retval     Others        Create test suite and unit tests unsuccessfully.
**/
EFI_STATUS
AddCommonTestCase (
  IN  UNIT_TEST_FRAMEWORK_HANDLE  Framework,
  IN  MP_SERVICE_UT_CONTEXT       *Context
  )
{
  EFI_STATUS              Status;
  UNIT_TEST_SUITE_HANDLE  MpServiceWhoAmITestSuite;
  UNIT_TEST_SUITE_HANDLE  MpServiceGetNumberOfProcessorsTestSuite;
  UNIT_TEST_SUITE_HANDLE  MpServiceGetProcessorInfoTestSuite;
  UNIT_TEST_SUITE_HANDLE  MpServiceEnableDisableAPTestSuite;
  UNIT_TEST_SUITE_HANDLE  MpServiceStartupThisAPTestSuite;
  UNIT_TEST_SUITE_HANDLE  MpServiceStartupAllAPsTestSuite;
  UNIT_TEST_SUITE_HANDLE  MpServiceSwitchBSPTestSuite;

  MpServiceWhoAmITestSuite                = NULL;
  MpServiceGetNumberOfProcessorsTestSuite = NULL;
  MpServiceGetProcessorInfoTestSuite      = NULL;
  MpServiceEnableDisableAPTestSuite       = NULL;
  MpServiceStartupThisAPTestSuite         = NULL;
  MpServiceStartupAllAPsTestSuite         = NULL;
  MpServiceSwitchBSPTestSuite             = NULL;

  //
  // Test WhoAmI function
  //
  Status = CreateUnitTestSuite (&MpServiceWhoAmITestSuite, Framework, "Identify the currently executing processor", "MpServices.WhoAmI", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceWhoAmI Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceWhoAmITestSuite, "Test WhoAmI 1", "TestWhoAmI1", TestWhoAmI1, InitUTContext, CheckUTContext, Context);

  //
  // Test GetNumberOfProcessors function
  //
  Status = CreateUnitTestSuite (&MpServiceGetNumberOfProcessorsTestSuite, Framework, "Retrieve the number of logical processor", "MpServices.GetNumberOfProcessors", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceGetNumberOfProcessors Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceGetNumberOfProcessorsTestSuite, "Test GetNumberOfProcessors 1", "TestGetNumberOfProcessors1", TestGetNumberOfProcessors1, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceGetNumberOfProcessorsTestSuite, "Test GetNumberOfProcessors 2", "TestGetNumberOfProcessors2", TestGetNumberOfProcessors2, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceGetNumberOfProcessorsTestSuite, "Test GetNumberOfProcessors 3", "TestGetNumberOfProcessors3", TestGetNumberOfProcessors3, InitUTContext, CheckUTContext, Context);

  //
  // Test GetProcessorInfo function
  //
  Status = CreateUnitTestSuite (&MpServiceGetProcessorInfoTestSuite, Framework, "Get detailed information on the requested logical processor", "MpServices.GetProcessorInfo", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceGetProcessorInfo Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceGetProcessorInfoTestSuite, "Test GetProcessorInfo 1", "TestGetProcessorInfo1", TestGetProcessorInfo1, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceGetProcessorInfoTestSuite, "Test GetProcessorInfo 2", "TestGetProcessorInfo2", TestGetProcessorInfo2, InitUTContext, CheckUTContext, Context);

  //
  // Test EnableDisableAP function
  //
  Status = CreateUnitTestSuite (&MpServiceEnableDisableAPTestSuite, Framework, "Caller enables or disables an AP from this point onward", "MpServices.EnableDisableAP", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceEnableDisableAP Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceEnableDisableAPTestSuite, "Test EnableDisableAP 1", "TestEnableDisableAP1", TestEnableDisableAP1, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceEnableDisableAPTestSuite, "Test EnableDisableAP 2", "TestEnableDisableAP2", TestEnableDisableAP2, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceEnableDisableAPTestSuite, "Test EnableDisableAP 3", "TestEnableDisableAP3", TestEnableDisableAP3, InitUTContext, CheckUTContext, Context);

  //
  // Test StartupThisAP function
  //
  Status = CreateUnitTestSuite (&MpServiceStartupThisAPTestSuite, Framework, "Get the requested AP to execute a caller-provided function", "MpServices.StartupThisAP", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceStartupThisAP Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceStartupThisAPTestSuite, "Test StartupThisAP 1", "TestStartupThisAP1", TestStartupThisAP1, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupThisAPTestSuite, "Test StartupThisAP 2", "TestStartupThisAP2", TestStartupThisAP2, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupThisAPTestSuite, "Test StartupThisAP 3", "TestStartupThisAP3", TestStartupThisAP3, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupThisAPTestSuite, "Test StartupThisAP 4", "TestStartupThisAP4", TestStartupThisAP4, InitUTContext, CheckUTContext, Context);

  //
  // Test StartupAllAPs function
  //
  Status = CreateUnitTestSuite (&MpServiceStartupAllAPsTestSuite, Framework, "Execute a caller provided function on all enabled APs", "MpServices.StartupAllAPs", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceStartupAllAPs Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceStartupAllAPsTestSuite, "Test StartupAllAPs 1", "TestStartupAllAPs1", TestStartupAllAPs1, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupAllAPsTestSuite, "Test StartupAllAPs 2", "TestStartupAllAPs2", TestStartupAllAPs2, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupAllAPsTestSuite, "Test StartupAllAPs 3", "TestStartupAllAPs3", TestStartupAllAPs3, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupAllAPsTestSuite, "Test StartupAllAPs 4", "TestStartupAllAPs4", TestStartupAllAPs4, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceStartupAllAPsTestSuite, "Test StartupAllAPs 5", "TestStartupAllAPs5", TestStartupAllAPs5, InitUTContext, CheckUTContext, Context);

  //
  // Test SwitchBSP function
  //
  Status = CreateUnitTestSuite (&MpServiceSwitchBSPTestSuite, Framework, "Switch the requested AP to be the BSP from that point onward", "MpServices.SwitchBSP", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MpServiceSwitchBSP Test Suite\n"));
    return Status;
  }

  AddTestCase (MpServiceSwitchBSPTestSuite, "Test SwitchBSP 1", "TestSwitchBSP1", TestSwitchBSP1, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceSwitchBSPTestSuite, "Test SwitchBSP 2", "TestSwitchBSP2", TestSwitchBSP2, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceSwitchBSPTestSuite, "Test SwitchBSP 3", "TestSwitchBSP3", TestSwitchBSP3, InitUTContext, CheckUTContext, Context);
  AddTestCase (MpServiceSwitchBSPTestSuite, "Test SwitchBSP 4", "TestSwitchBSP4", TestSwitchBSP4, InitUTContext, FreeUTContext, Context);

  return EFI_SUCCESS;
}
