/** @file
  Unit tests of the implementation of SecureBootVariableLib.

  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 <Uefi.h>
#include <UefiSecureBoot.h>
#include <Guid/GlobalVariable.h>
#include <Guid/AuthenticatedVariableFormat.h>
#include <Guid/ImageAuthentication.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>

#include <Library/UnitTestLib.h>
#include <Library/SecureBootVariableLib.h>

#define UNIT_TEST_APP_NAME     "SecureBootVariableLib Unit Tests"
#define UNIT_TEST_APP_VERSION  "1.0"
#define VAR_AUTH_DESC_SIZE     OFFSET_OF (EFI_VARIABLE_AUTHENTICATION_2, AuthInfo) + OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData)

extern EFI_TIME  mMaxTimestamp;
extern EFI_TIME  mDefaultPayloadTimestamp;

/**
  Sets the value of a variable.

  @param[in]  VariableName       A Null-terminated string that is the name of the vendor's variable.
                                 Each VariableName is unique for each VendorGuid. VariableName must
                                 contain 1 or more characters. If VariableName is an empty string,
                                 then EFI_INVALID_PARAMETER is returned.
  @param[in]  VendorGuid         A unique identifier for the vendor.
  @param[in]  Attributes         Attributes bitmask to set for the variable.
  @param[in]  DataSize           The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE or
                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero
                                 causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is
                                 set, then a SetVariable() call with a DataSize of zero will not cause any change to
                                 the variable value (the timestamp associated with the variable may be updated however
                                 even if no new data value is provided,see the description of the
                                 EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not
                                 be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated).
  @param[in]  Data               The contents for the variable.

  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
                                 defined by the Attributes.
  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
                                 DataSize exceeds the maximum allowed.
  @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
  @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
  @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set,
                                 but the AuthInfo does NOT pass the validation check carried out by the firmware.

  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.

**/
STATIC
EFI_STATUS
EFIAPI
MockSetVariable (
  IN  CHAR16    *VariableName,
  IN  EFI_GUID  *VendorGuid,
  IN  UINT32    Attributes,
  IN  UINTN     DataSize,
  IN  VOID      *Data
  )
{
  DEBUG ((
    DEBUG_INFO,
    "%a %s %g %x %x %p\n",
    __func__,
    VariableName,
    VendorGuid,
    Attributes,
    DataSize,
    Data
    ));
  check_expected_ptr (VariableName);
  check_expected_ptr (VendorGuid);
  check_expected (Attributes);
  check_expected (DataSize);
  check_expected_ptr (Data);

  return (EFI_STATUS)mock ();
}

/**
  Returns the value of a variable.

  @param[in]       VariableName  A Null-terminated string that is the name of the vendor's
                                 variable.
  @param[in]       VendorGuid    A unique identifier for the vendor.
  @param[out]      Attributes    If not NULL, a pointer to the memory location to return the
                                 attributes bitmask for the variable.
  @param[in, out]  DataSize      On input, the size in bytes of the return Data buffer.
                                 On output the size of data returned in Data.
  @param[out]      Data          The buffer to return the contents of the variable. May be NULL
                                 with a zero DataSize in order to determine the size buffer needed.

  @retval EFI_SUCCESS            The function completed successfully.
  @retval EFI_NOT_FOUND          The variable was not found.
  @retval EFI_BUFFER_TOO_SMALL   The DataSize is too small for the result.
  @retval EFI_INVALID_PARAMETER  VariableName is NULL.
  @retval EFI_INVALID_PARAMETER  VendorGuid is NULL.
  @retval EFI_INVALID_PARAMETER  DataSize is NULL.
  @retval EFI_INVALID_PARAMETER  The DataSize is not too small and Data is NULL.
  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
  @retval EFI_SECURITY_VIOLATION The variable could not be retrieved due to an authentication failure.

**/
STATIC
EFI_STATUS
EFIAPI
MockGetVariable (
  IN     CHAR16    *VariableName,
  IN     EFI_GUID  *VendorGuid,
  OUT    UINT32    *Attributes     OPTIONAL,
  IN OUT UINTN     *DataSize,
  OUT    VOID      *Data           OPTIONAL
  )
{
  UINTN    TargetSize;
  BOOLEAN  Exist;

  DEBUG ((
    DEBUG_INFO,
    "%a %s %g %p %x %p\n",
    __func__,
    VariableName,
    VendorGuid,
    Attributes,
    *DataSize,
    Data
    ));
  assert_non_null (DataSize);
  check_expected_ptr (VariableName);
  check_expected_ptr (VendorGuid);
  check_expected (*DataSize);

  Exist = (BOOLEAN)mock ();

  if (!Exist) {
    return EFI_NOT_FOUND;
  }

  TargetSize = (UINTN)mock ();
  if (TargetSize > *DataSize) {
    *DataSize = TargetSize;
    return EFI_BUFFER_TOO_SMALL;
  } else {
    assert_non_null (Data);
    CopyMem (Data, (VOID *)(UINTN)mock (), TargetSize);
  }

  return EFI_SUCCESS;
}

///
/// Mock version of the UEFI Runtime Services Table
///
EFI_RUNTIME_SERVICES  gMockRuntime = {
  {
    EFI_RUNTIME_SERVICES_SIGNATURE,     // Signature
    EFI_RUNTIME_SERVICES_REVISION,      // Revision
    sizeof (EFI_RUNTIME_SERVICES),      // HeaderSize
    0,                                  // CRC32
    0                                   // Reserved
  },
  NULL,               // GetTime
  NULL,               // SetTime
  NULL,               // GetWakeupTime
  NULL,               // SetWakeupTime
  NULL,               // SetVirtualAddressMap
  NULL,               // ConvertPointer
  MockGetVariable,    // GetVariable
  NULL,               // GetNextVariableName
  MockSetVariable,    // SetVariable
  NULL,               // GetNextHighMonotonicCount
  NULL,               // ResetSystem
  NULL,               // UpdateCapsule
  NULL,               // QueryCapsuleCapabilities
  NULL                // QueryVariableInfo
};

/**
  Unit test for SetSecureBootMode () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootModeShouldSetVar (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  UINT8       SecureBootMode;
  EFI_STATUS  Status;

  SecureBootMode = 0xAB; // Any random magic number...
  expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS);
  expect_value (MockSetVariable, DataSize, sizeof (SecureBootMode));
  expect_memory (MockSetVariable, Data, &SecureBootMode, sizeof (SecureBootMode));

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = SetSecureBootMode (SecureBootMode);

  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for GetSetupMode () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
GetSetupModeShouldGetVar (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       TargetMode;
  UINT8       SetupMode;

  TargetMode = 0xAB; // Any random magic number...
  expect_memory (MockGetVariable, VariableName, EFI_SETUP_MODE_NAME, sizeof (EFI_SETUP_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (SetupMode));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (SetupMode));
  will_return (MockGetVariable, (UINTN)&TargetMode);

  Status = GetSetupMode (&SetupMode);

  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (SetupMode, TargetMode);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for GetSetupMode () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
IsSecureBootEnableShouldGetVar (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Enabled;
  UINT8    TargetMode;

  TargetMode = SECURE_BOOT_MODE_ENABLE;
  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (TargetMode));

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (TargetMode));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (TargetMode));
  will_return (MockGetVariable, (UINTN)&TargetMode);

  Enabled = IsSecureBootEnabled ();

  UT_ASSERT_EQUAL (Enabled, SECURE_BOOT_MODE_ENABLE);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SecureBootCreateDataFromInput () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SecureBootCreateDataFromInputSimple (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_SIGNATURE_LIST            *SigList    = NULL;
  EFI_SIGNATURE_DATA            *SigData    = NULL;
  UINTN                         SigListSize = 0;
  EFI_STATUS                    Status;
  UINT8                         TestData[] = { 0 };
  SECURE_BOOT_CERTIFICATE_INFO  KeyInfo;

  KeyInfo.Data     = TestData;
  KeyInfo.DataSize = sizeof (TestData);

  Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 1, &KeyInfo);

  UT_ASSERT_NOT_EFI_ERROR (Status);

  UT_ASSERT_NOT_NULL (SigList);
  UT_ASSERT_TRUE (CompareGuid (&SigList->SignatureType, &gEfiCertX509Guid));
  UT_ASSERT_EQUAL (SigList->SignatureSize, sizeof (EFI_SIGNATURE_DATA) - 1 + sizeof (TestData));
  UT_ASSERT_EQUAL (SigList->SignatureHeaderSize, 0);
  UT_ASSERT_EQUAL (SigList->SignatureListSize, sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + sizeof (TestData));
  UT_ASSERT_EQUAL (SigList->SignatureListSize, SigListSize);

  SigData = (EFI_SIGNATURE_DATA *)((UINTN)SigList + sizeof (EFI_SIGNATURE_LIST));
  UT_ASSERT_TRUE (CompareGuid (&SigData->SignatureOwner, &gEfiGlobalVariableGuid));
  UT_ASSERT_MEM_EQUAL (SigData->SignatureData, TestData, sizeof (TestData));

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SecureBootCreateDataFromInput () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SecureBootCreateDataFromInputNull (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_SIGNATURE_LIST            *SigList    = NULL;
  UINTN                         SigListSize = 0;
  EFI_STATUS                    Status;
  SECURE_BOOT_CERTIFICATE_INFO  KeyInfo = {
    .Data     = NULL,
    .DataSize = 0
  };

  Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 0, NULL);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

  Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 1, &KeyInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_FOUND);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SecureBootCreateDataFromInput () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SecureBootCreateDataFromInputMultiple (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_SIGNATURE_LIST            *SigList    = NULL;
  EFI_SIGNATURE_DATA            *SigData    = NULL;
  UINTN                         SigListSize = 0;
  UINTN                         TotalSize   = 0;
  UINTN                         Index       = 0;
  UINT8                         TestData1[] = { 0 };
  UINT8                         TestData2[] = { 1, 2 };
  EFI_STATUS                    Status;
  SECURE_BOOT_CERTIFICATE_INFO  KeyInfo[2];

  KeyInfo[0].Data     = TestData1;
  KeyInfo[0].DataSize = sizeof (TestData1);
  KeyInfo[1].Data     = TestData2;
  KeyInfo[1].DataSize = sizeof (TestData2);

  Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 2, KeyInfo);
  UT_ASSERT_NOT_EFI_ERROR (Status);

  UT_ASSERT_NOT_NULL (SigList);

  for (Index = 0; Index < 2; Index++) {
    UT_ASSERT_TRUE (SigListSize > TotalSize);

    UT_ASSERT_TRUE (CompareGuid (&SigList->SignatureType, &gEfiCertX509Guid));
    UT_ASSERT_EQUAL (SigList->SignatureSize, sizeof (EFI_SIGNATURE_DATA) - 1 + KeyInfo[Index].DataSize);
    UT_ASSERT_EQUAL (SigList->SignatureHeaderSize, 0);
    UT_ASSERT_EQUAL (SigList->SignatureListSize, sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + KeyInfo[Index].DataSize);

    SigData = (EFI_SIGNATURE_DATA *)((UINTN)SigList + sizeof (EFI_SIGNATURE_LIST));
    UT_ASSERT_TRUE (CompareGuid (&SigData->SignatureOwner, &gEfiGlobalVariableGuid));
    UT_ASSERT_MEM_EQUAL (SigData->SignatureData, KeyInfo[Index].Data, KeyInfo[Index].DataSize);
    TotalSize = TotalSize + SigList->SignatureListSize;
    SigList   = (EFI_SIGNATURE_LIST *)((UINTN)SigList + SigList->SignatureListSize);
  }

  UT_ASSERT_EQUAL (SigListSize, TotalSize);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for CreateTimeBasedPayload () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
CreateTimeBasedPayloadShouldPopulateDescriptor (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  UINT8                          Data[]   = { 2 };
  UINTN                          DataSize = sizeof (Data);
  UINT8                          *CheckData;
  EFI_VARIABLE_AUTHENTICATION_2  *VarAuth;
  EFI_STATUS                     Status;
  EFI_TIME                       Time = {
    .Year       = 2012,
    .Month      = 3,
    .Day        = 4,
    .Hour       = 5,
    .Minute     = 6,
    .Second     = 7,
    .Pad1       = 0,
    .Nanosecond = 8910,
    .TimeZone   = 1112,
    .Pad2       = 0
  };

  CheckData = AllocateCopyPool (DataSize, Data);
  Status    = CreateTimeBasedPayload (&DataSize, &CheckData, &Time);
  UT_ASSERT_NOT_EFI_ERROR (Status);

  // This is result that we did not pack this structure...
  // we cannot even use the sizeof (EFI_VARIABLE_AUTHENTICATION_2) - 1,
  // because the structure is not at the end of this structure, but partially
  // inside it...
  UT_ASSERT_EQUAL (DataSize, VAR_AUTH_DESC_SIZE + sizeof (Data));
  UT_ASSERT_NOT_NULL (CheckData);

  VarAuth = (EFI_VARIABLE_AUTHENTICATION_2 *)CheckData;
  UT_ASSERT_MEM_EQUAL (&(VarAuth->TimeStamp), &Time, sizeof (EFI_TIME));

  UT_ASSERT_EQUAL (VarAuth->AuthInfo.Hdr.dwLength, OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData));
  UT_ASSERT_EQUAL (VarAuth->AuthInfo.Hdr.wRevision, 0x0200);
  UT_ASSERT_EQUAL (VarAuth->AuthInfo.Hdr.wCertificateType, WIN_CERT_TYPE_EFI_GUID);
  UT_ASSERT_TRUE (CompareGuid (&VarAuth->AuthInfo.CertType, &gEfiCertPkcs7Guid));

  UT_ASSERT_MEM_EQUAL (VarAuth->AuthInfo.CertData, Data, sizeof (Data));

  return UNIT_TEST_PASSED;
}

/**
  Unit test for CreateTimeBasedPayload () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
CreateTimeBasedPayloadShouldCheckInput (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  UINTN       DataSize = 0;
  UINT8       *Data    = NULL;
  EFI_TIME    Time;
  EFI_STATUS  Status;

  Status = CreateTimeBasedPayload (NULL, &Data, &Time);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

  Status = CreateTimeBasedPayload (&DataSize, NULL, &Time);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

  Status = CreateTimeBasedPayload (&DataSize, &Data, NULL);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteDb () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteDbShouldDelete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = 0;

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE);

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = DeleteDb ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteDbx () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteDbxShouldDelete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = 0;

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE);

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = DeleteDbx ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteDbt () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteDbtShouldDelete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = 0;

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE);

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = DeleteDbt ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteKEK () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteKEKShouldDelete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = 0;

  expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE);

  expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = DeleteKEK ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeletePlatformKey () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeletePKShouldDelete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = 0;
  UINT8       BootMode    = CUSTOM_SECURE_BOOT_MODE;

  expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS);
  expect_value (MockSetVariable, DataSize, sizeof (BootMode));
  expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode));

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE);

  expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = DeletePlatformKey ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteSecureBootVariablesShouldDelete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = 0;
  UINT8       BootMode    = CUSTOM_SECURE_BOOT_MODE;

  Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE);

  will_return (DisablePKProtection, EFI_SUCCESS);

  expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS);
  expect_value (MockSetVariable, DataSize, sizeof (BootMode));
  expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode));

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (Dummy));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (Dummy));
  will_return (MockGetVariable, (UINTN)&Dummy);

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE);
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE);

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = DeleteSecureBootVariables ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteSecureBootVariablesShouldCheckProtection (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;

  will_return (DisablePKProtection, EFI_SECURITY_VIOLATION);

  Status = DeleteSecureBootVariables ();
  UT_ASSERT_STATUS_EQUAL (Status, EFI_ABORTED);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
DeleteSecureBootVariablesShouldProceedWithNotFound (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       BootMode = CUSTOM_SECURE_BOOT_MODE;

  will_return (DisablePKProtection, EFI_SUCCESS);

  expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS);
  expect_value (MockSetVariable, DataSize, sizeof (BootMode));
  expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode));

  will_return (MockSetVariable, EFI_SUCCESS);

  expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Status = DeleteSecureBootVariables ();
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
EnrollFromInputShouldComplete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS  Status;
  UINT8       Dummy       = 3;
  UINT8       *Payload    = NULL;
  UINTN       PayloadSize = sizeof (Dummy);

  Payload = AllocateCopyPool (sizeof (Dummy), &Dummy);
  Status  = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (Dummy));

  expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (Dummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (Dummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = EnrollFromInput (EFI_PLATFORM_KEY_NAME, &gEfiGlobalVariableGuid, sizeof (Dummy), &Dummy);
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldComplete (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbDummy    = 0xDE;
  UINT8                     DbtDummy   = 0xAD;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     KekDummy = 0xEF;
  UINT8                     PkDummy  = 0xFE;
  UINT8                     *Payload = NULL;
  UINTN                     PayloadSize;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbPtr             = &DbDummy;
  PayloadInfo.DbSize            = sizeof (DbDummy);
  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.DbtPtr            = &DbtDummy;
  PayloadInfo.DbtSize           = sizeof (DbtDummy);
  PayloadInfo.KekPtr            = &KekDummy;
  PayloadInfo.KekSize           = sizeof (KekDummy);
  PayloadInfo.PkPtr             = &PkDummy;
  PayloadInfo.PkSize            = sizeof (PkDummy);
  PayloadInfo.SecureBootKeyName = L"Food";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);
  Payload     = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  PayloadSize = sizeof (DbxDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbDummy, sizeof (DbDummy));
  PayloadSize = sizeof (DbDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbtDummy, sizeof (DbtDummy));
  PayloadSize = sizeof (DbtDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &KekDummy, sizeof (KekDummy));
  PayloadSize = sizeof (KekDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &PkDummy, sizeof (PkDummy));
  PayloadSize = sizeof (PkDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));

  expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldStopWhenSecure (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     TargetMode = SECURE_BOOT_MODE_ENABLE;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  ZeroMem (&PayloadInfo, sizeof (PayloadInfo));

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (TargetMode));

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, sizeof (TargetMode));

  will_return (MockGetVariable, TRUE);
  will_return (MockGetVariable, sizeof (TargetMode));
  will_return (MockGetVariable, (UINTN)&TargetMode);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_ABORTED);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldStopFailDBX (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     *Payload    = NULL;
  UINTN                     PayloadSize = sizeof (DbxDummy);
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.SecureBootKeyName = L"Fail DBX";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  Status  = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_WRITE_PROTECTED);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_WRITE_PROTECTED);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldStopFailDB (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbDummy    = 0xDE;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     *Payload = NULL;
  UINTN                     PayloadSize;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbPtr             = &DbDummy;
  PayloadInfo.DbSize            = sizeof (DbDummy);
  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.SecureBootKeyName = L"Fail DB";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Payload     = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  PayloadSize = sizeof (DbxDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbDummy, sizeof (DbDummy));
  PayloadSize = sizeof (DbDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  will_return (MockSetVariable, EFI_WRITE_PROTECTED);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_WRITE_PROTECTED);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldStopFailDBT (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbDummy    = 0xDE;
  UINT8                     DbtDummy   = 0xAD;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     *Payload = NULL;
  UINTN                     PayloadSize;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbPtr             = &DbDummy;
  PayloadInfo.DbSize            = sizeof (DbDummy);
  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.DbtPtr            = &DbtDummy;
  PayloadInfo.DbtSize           = sizeof (DbtDummy);
  PayloadInfo.SecureBootKeyName = L"Fail DBT";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Payload     = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  PayloadSize = sizeof (DbxDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbDummy, sizeof (DbDummy));
  PayloadSize = sizeof (DbDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbtDummy, sizeof (DbtDummy));
  PayloadSize = sizeof (DbtDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  will_return (MockSetVariable, EFI_ACCESS_DENIED);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_ACCESS_DENIED);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldStopFailKEK (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbDummy    = 0xDE;
  UINT8                     DbtDummy   = 0xAD;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     KekDummy = 0xEF;
  UINT8                     PkDummy  = 0xFE;
  UINT8                     *Payload = NULL;
  UINTN                     PayloadSize;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbPtr             = &DbDummy;
  PayloadInfo.DbSize            = sizeof (DbDummy);
  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.DbtPtr            = &DbtDummy;
  PayloadInfo.DbtSize           = sizeof (DbtDummy);
  PayloadInfo.KekPtr            = &KekDummy;
  PayloadInfo.KekSize           = sizeof (KekDummy);
  PayloadInfo.PkPtr             = &PkDummy;
  PayloadInfo.PkSize            = sizeof (PkDummy);
  PayloadInfo.SecureBootKeyName = L"Food";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Payload     = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  PayloadSize = sizeof (DbxDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbDummy, sizeof (DbDummy));
  PayloadSize = sizeof (DbDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbtDummy, sizeof (DbtDummy));
  PayloadSize = sizeof (DbtDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &KekDummy, sizeof (KekDummy));
  PayloadSize = sizeof (KekDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  will_return (MockSetVariable, EFI_DEVICE_ERROR);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_DEVICE_ERROR);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesShouldStopFailPK (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbDummy    = 0xDE;
  UINT8                     DbtDummy   = 0xAD;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     KekDummy = 0xEF;
  UINT8                     PkDummy  = 0xFE;
  UINT8                     *Payload = NULL;
  UINTN                     PayloadSize;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbPtr             = &DbDummy;
  PayloadInfo.DbSize            = sizeof (DbDummy);
  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.DbtPtr            = &DbtDummy;
  PayloadInfo.DbtSize           = sizeof (DbtDummy);
  PayloadInfo.KekPtr            = &KekDummy;
  PayloadInfo.KekSize           = sizeof (KekDummy);
  PayloadInfo.PkPtr             = &PkDummy;
  PayloadInfo.PkSize            = sizeof (PkDummy);
  PayloadInfo.SecureBootKeyName = L"Food";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Payload     = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  PayloadSize = sizeof (DbxDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbDummy, sizeof (DbDummy));
  PayloadSize = sizeof (DbDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbtDummy, sizeof (DbtDummy));
  PayloadSize = sizeof (DbtDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &KekDummy, sizeof (KekDummy));
  PayloadSize = sizeof (KekDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &PkDummy, sizeof (PkDummy));
  PayloadSize = sizeof (PkDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));

  expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));

  will_return (MockSetVariable, EFI_INVALID_PARAMETER);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_STATUS_EQUAL (Status, EFI_SECURITY_VIOLATION);

  return UNIT_TEST_PASSED;
}

/**
  Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib.

  @param[in]  Context    [Optional] An optional parameter that enables:
                         1) test-case reuse with varied parameters and
                         2) test-case re-entry for Target tests that need a
                         reboot.  This parameter is a VOID* and it is the
                         responsibility of the test author to ensure that the
                         contents are well understood by all test cases that may
                         consume it.

  @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
SetSecureBootVariablesDBTOptional (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  EFI_STATUS                Status;
  UINT8                     DbDummy    = 0xDE;
  UINT8                     DbxDummy[] = {
    // Valid Dbx value (SHA256 hash of all 0x00)
    0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28,
    0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77,
    0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
  UINT8                     KekDummy = 0xEF;
  UINT8                     PkDummy  = 0xFE;
  UINT8                     *Payload = NULL;
  UINTN                     PayloadSize;
  SECURE_BOOT_PAYLOAD_INFO  PayloadInfo;

  PayloadInfo.DbPtr             = &DbDummy;
  PayloadInfo.DbSize            = sizeof (DbDummy);
  PayloadInfo.DbxPtr            = &DbxDummy;
  PayloadInfo.DbxSize           = sizeof (DbxDummy);
  PayloadInfo.DbtPtr            = NULL;
  PayloadInfo.DbtSize           = 0;
  PayloadInfo.KekPtr            = &KekDummy;
  PayloadInfo.KekSize           = sizeof (KekDummy);
  PayloadInfo.PkPtr             = &PkDummy;
  PayloadInfo.PkSize            = sizeof (PkDummy);
  PayloadInfo.SecureBootKeyName = L"Food";

  expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME));
  expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockGetVariable, *DataSize, 0);

  will_return (MockGetVariable, FALSE);

  Payload     = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy);
  PayloadSize = sizeof (DbxDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &DbDummy, sizeof (DbDummy));
  PayloadSize = sizeof (DbDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE));
  expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &KekDummy, sizeof (KekDummy));
  PayloadSize = sizeof (KekDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  CopyMem (Payload, &PkDummy, sizeof (PkDummy));
  PayloadSize = sizeof (PkDummy);
  Status      = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp);
  UT_ASSERT_NOT_EFI_ERROR (Status);
  UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));

  expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME));
  expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid));
  expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS);
  expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));
  expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy));

  will_return (MockSetVariable, EFI_SUCCESS);

  Status = SetSecureBootVariablesToDefault (&PayloadInfo);
  UT_ASSERT_NOT_EFI_ERROR (Status);

  return UNIT_TEST_PASSED;
}

/**
  Initialze the unit test framework, suite, and unit tests for the
  SecureBootVariableLib and run the SecureBootVariableLib unit test.

  @retval  EFI_SUCCESS           All test cases were dispatched.
  @retval  EFI_OUT_OF_RESOURCES  There are not enough resources available to
                                 initialize the unit tests.
**/
STATIC
EFI_STATUS
EFIAPI
UnitTestingEntry (
  VOID
  )
{
  EFI_STATUS                  Status;
  UNIT_TEST_FRAMEWORK_HANDLE  Framework;
  UNIT_TEST_SUITE_HANDLE      SecureBootVarMiscTests;
  UNIT_TEST_SUITE_HANDLE      SecureBootVarDeleteTests;
  UNIT_TEST_SUITE_HANDLE      SecureBootVarEnrollTests;

  Framework = NULL;

  DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME, UNIT_TEST_APP_VERSION));

  //
  // Start setting up the test framework for running the tests.
  //
  Status = InitUnitTestFramework (&Framework, UNIT_TEST_APP_NAME, gEfiCallerBaseName, UNIT_TEST_APP_VERSION);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));
    goto EXIT;
  }

  //
  // Populate the SecureBootVariableLib Unit Test Suite.
  //
  Status = CreateUnitTestSuite (&SecureBootVarMiscTests, Framework, "SecureBootVariableLib Miscellaneous Tests", "SecureBootVariableLib.Miscellaneous", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for SecureBootVariableLib\n"));
    Status = EFI_OUT_OF_RESOURCES;
    goto EXIT;
  }

  Status = CreateUnitTestSuite (&SecureBootVarDeleteTests, Framework, "SecureBootVariableLib Deletion Tests", "SecureBootVariableLib.Deletion", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for SecureBootVariableLib\n"));
    Status = EFI_OUT_OF_RESOURCES;
    goto EXIT;
  }

  Status = CreateUnitTestSuite (&SecureBootVarEnrollTests, Framework, "SecureBootVariableLib Enrollment Tests", "SecureBootVariableLib.Enrollment", NULL, NULL);
  if (EFI_ERROR (Status)) {
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for SecureBootVariableLib\n"));
    Status = EFI_OUT_OF_RESOURCES;
    goto EXIT;
  }

  //
  // --------------Suite-----------Description--------------Name----------Function--------Pre---Post-------------------Context-----------
  //
  AddTestCase (SecureBootVarMiscTests, "SetSecureBootMode should propagate to set variable", "SetSecureBootMode", SetSecureBootModeShouldSetVar, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "GetSetupMode should propagate to get variable", "GetSetupMode", GetSetupModeShouldGetVar, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "IsSecureBootEnabled should propagate to get variable", "IsSecureBootEnabled", IsSecureBootEnableShouldGetVar, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "SecureBootCreateDataFromInput with one input cert", "SecureBootCreateDataFromInput One Cert", SecureBootCreateDataFromInputSimple, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "SecureBootCreateDataFromInput with no input cert", "SecureBootCreateDataFromInput No Cert", SecureBootCreateDataFromInputNull, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "SecureBootCreateDataFromInput with multiple input cert", "SecureBootCreateDataFromInput No Cert", SecureBootCreateDataFromInputMultiple, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "CreateTimeBasedPayload should populate descriptor data", "CreateTimeBasedPayload Normal", CreateTimeBasedPayloadShouldPopulateDescriptor, NULL, NULL, NULL);
  AddTestCase (SecureBootVarMiscTests, "CreateTimeBasedPayload should fail on NULL inputs", "CreateTimeBasedPayload NULL", CreateTimeBasedPayloadShouldCheckInput, NULL, NULL, NULL);

  AddTestCase (SecureBootVarDeleteTests, "DeleteDb should delete DB with auth info", "DeleteDb", DeleteDbShouldDelete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeleteDbx should delete DBX with auth info", "DeleteDbx", DeleteDbxShouldDelete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeleteDbt should delete DBT with auth info", "DeleteDbt", DeleteDbtShouldDelete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeleteKEK should delete KEK with auth info", "DeleteKEK", DeleteKEKShouldDelete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeletePlatformKey should delete PK with auth info", "DeletePlatformKey", DeletePKShouldDelete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeleteSecureBootVariables should delete properly", "DeleteSecureBootVariables Normal", DeleteSecureBootVariablesShouldDelete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeleteSecureBootVariables should fail if protection disable fails", "DeleteSecureBootVariables Fail", DeleteSecureBootVariablesShouldCheckProtection, NULL, NULL, NULL);
  AddTestCase (SecureBootVarDeleteTests, "DeleteSecureBootVariables should continue if any variable is not found", "DeleteSecureBootVariables Proceed", DeleteSecureBootVariablesShouldProceedWithNotFound, NULL, NULL, NULL);

  AddTestCase (SecureBootVarEnrollTests, "EnrollFromInput should supply with authenticated payload", "EnrollFromInput Normal", EnrollFromInputShouldComplete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should complete", "SetSecureBootVariablesToDefault Normal", SetSecureBootVariablesShouldComplete, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when already enabled", "SetSecureBootVariablesToDefault Already Started", SetSecureBootVariablesShouldStopWhenSecure, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when DB failed", "SetSecureBootVariablesToDefault Fails DB", SetSecureBootVariablesShouldStopFailDB, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when DBT failed", "SetSecureBootVariablesToDefault Fails DBT", SetSecureBootVariablesShouldStopFailDBT, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when DBX failed", "SetSecureBootVariablesToDefault Fails DBX", SetSecureBootVariablesShouldStopFailDBX, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when KEK failed", "SetSecureBootVariablesToDefault Fails KEK", SetSecureBootVariablesShouldStopFailKEK, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when PK failed", "SetSecureBootVariablesToDefault Fails PK", SetSecureBootVariablesShouldStopFailPK, NULL, NULL, NULL);
  AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should only be optional", "SetSecureBootVariablesToDefault DBT Optional", SetSecureBootVariablesDBTOptional, NULL, NULL, NULL);

  //
  // Execute the tests.
  //
  Status = RunAllTestSuites (Framework);

EXIT:
  if (Framework) {
    FreeUnitTestFramework (Framework);
  }

  return Status;
}

/**
  Standard POSIX C entry point for host based unit test execution.
**/
int
main (
  int   argc,
  char  *argv[]
  )
{
  return UnitTestingEntry ();
}
