mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 05:25:45 +01:00 
			
		
		
		
	REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			608 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			608 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This is a host-based unit test for the VariableLockRequestToLock shim.
 | 
						|
 | 
						|
  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 <Library/DebugLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/UnitTestLib.h>
 | 
						|
#include <Library/VariablePolicyLib.h>
 | 
						|
#include <Library/VariablePolicyHelperLib.h>
 | 
						|
 | 
						|
#include <Protocol/VariableLock.h>
 | 
						|
 | 
						|
#define UNIT_TEST_NAME     "VarPol/VarLock Shim Unit Test"
 | 
						|
#define UNIT_TEST_VERSION  "1.0"
 | 
						|
 | 
						|
/// === CODE UNDER TEST ===========================================================================
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
VariableLockRequestToLock (
 | 
						|
  IN CONST EDKII_VARIABLE_LOCK_PROTOCOL  *This,
 | 
						|
  IN       CHAR16                        *VariableName,
 | 
						|
  IN       EFI_GUID                      *VendorGuid
 | 
						|
  );
 | 
						|
 | 
						|
/// === TEST DATA ==================================================================================
 | 
						|
 | 
						|
//
 | 
						|
// Test GUID 1 {F955BA2D-4A2C-480C-BFD1-3CC522610592}
 | 
						|
//
 | 
						|
EFI_GUID  mTestGuid1 = {
 | 
						|
  0xf955ba2d, 0x4a2c, 0x480c, { 0xbf, 0xd1, 0x3c, 0xc5, 0x22, 0x61, 0x5, 0x92 }
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// Test GUID 2 {2DEA799E-5E73-43B9-870E-C945CE82AF3A}
 | 
						|
//
 | 
						|
EFI_GUID  mTestGuid2 = {
 | 
						|
  0x2dea799e, 0x5e73, 0x43b9, { 0x87, 0xe, 0xc9, 0x45, 0xce, 0x82, 0xaf, 0x3a }
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// Test GUID 3 {698A2BFD-A616-482D-B88C-7100BD6682A9}
 | 
						|
//
 | 
						|
EFI_GUID  mTestGuid3 = {
 | 
						|
  0x698a2bfd, 0xa616, 0x482d, { 0xb8, 0x8c, 0x71, 0x0, 0xbd, 0x66, 0x82, 0xa9 }
 | 
						|
};
 | 
						|
 | 
						|
#define TEST_VAR_1_NAME  L"TestVar1"
 | 
						|
#define TEST_VAR_2_NAME  L"TestVar2"
 | 
						|
#define TEST_VAR_3_NAME  L"TestVar3"
 | 
						|
 | 
						|
#define TEST_POLICY_ATTRIBUTES_NULL  0
 | 
						|
#define TEST_POLICY_MIN_SIZE_NULL    0
 | 
						|
#define TEST_POLICY_MAX_SIZE_NULL    MAX_UINT32
 | 
						|
 | 
						|
#define TEST_POLICY_MIN_SIZE_10   10
 | 
						|
#define TEST_POLICY_MAX_SIZE_200  200
 | 
						|
 | 
						|
/// === HELPER FUNCTIONS ===========================================================================
 | 
						|
 | 
						|
/**
 | 
						|
  Mocked version of GetVariable, for testing.
 | 
						|
 | 
						|
  @param  VariableName
 | 
						|
  @param  VendorGuid
 | 
						|
  @param  Attributes
 | 
						|
  @param  DataSize
 | 
						|
  @param  Data
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
StubGetVariableNull (
 | 
						|
  IN     CHAR16    *VariableName,
 | 
						|
  IN     EFI_GUID  *VendorGuid,
 | 
						|
  OUT    UINT32    *Attributes   OPTIONAL,
 | 
						|
  IN OUT UINTN     *DataSize,
 | 
						|
  OUT    VOID      *Data         OPTIONAL
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32      MockedAttr;
 | 
						|
  UINTN       MockedDataSize;
 | 
						|
  VOID        *MockedData;
 | 
						|
  EFI_STATUS  MockedReturn;
 | 
						|
 | 
						|
  check_expected_ptr (VariableName);
 | 
						|
  check_expected_ptr (VendorGuid);
 | 
						|
  check_expected_ptr (DataSize);
 | 
						|
 | 
						|
  MockedAttr     = (UINT32)mock ();
 | 
						|
  MockedDataSize = (UINTN)mock ();
 | 
						|
  MockedData     = (VOID *)(UINTN)mock ();
 | 
						|
  MockedReturn   = (EFI_STATUS)mock ();
 | 
						|
 | 
						|
  if (Attributes != NULL) {
 | 
						|
    *Attributes = MockedAttr;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Data != NULL) && !EFI_ERROR (MockedReturn)) {
 | 
						|
    CopyMem (Data, MockedData, MockedDataSize);
 | 
						|
  }
 | 
						|
 | 
						|
  *DataSize = MockedDataSize;
 | 
						|
 | 
						|
  return MockedReturn;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// Anything you think might be helpful that isn't a test itself.
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
  This is a common setup function that will ensure the library is always
 | 
						|
  initialized with the stubbed GetVariable.
 | 
						|
 | 
						|
  Not used by all test cases, but by most.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LibInitMocked (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  return EFI_ERROR (InitVariablePolicyLib (StubGetVariableNull)) ? UNIT_TEST_ERROR_PREREQUISITE_NOT_MET : UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Common cleanup function to make sure that the library is always de-initialized
 | 
						|
  prior to the next test case.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
LibCleanup (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  DeinitVariablePolicyLib ();
 | 
						|
}
 | 
						|
 | 
						|
/// === TEST CASES =================================================================================
 | 
						|
 | 
						|
/// ===== SHIM SUITE ===========================================================
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks a single variable using the Variable Lock Protocol.
 | 
						|
  The call is expected to succeed.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
**/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LockingWithoutAnyPoliciesShouldSucceed (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks the same variable twice using the Variable Lock Protocol.
 | 
						|
  Both calls are expected to succeed.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
  **/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LockingTwiceShouldSucceed (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks a variable using the Variable Policy Protocol then locks
 | 
						|
  the same variable using the Variable Lock Protocol.
 | 
						|
  Both calls are expected to succeed.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
  **/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LockingALockedVariableShouldSucceed (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS             Status;
 | 
						|
  VARIABLE_POLICY_ENTRY  *NewEntry;
 | 
						|
 | 
						|
  //
 | 
						|
  // Create a variable policy that locks the variable.
 | 
						|
  //
 | 
						|
  Status = CreateBasicVariablePolicy (
 | 
						|
             &mTestGuid1,
 | 
						|
             TEST_VAR_1_NAME,
 | 
						|
             TEST_POLICY_MIN_SIZE_NULL,
 | 
						|
             TEST_POLICY_MAX_SIZE_200,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             VARIABLE_POLICY_TYPE_LOCK_NOW,
 | 
						|
             &NewEntry
 | 
						|
             );
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  //
 | 
						|
  // Register the new policy.
 | 
						|
  //
 | 
						|
  Status = RegisterVariablePolicy (NewEntry);
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  FreePool (NewEntry);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks a variable using the Variable Policy Protocol with a
 | 
						|
  policy other than LOCK_NOW then attempts to lock the same variable using the
 | 
						|
  Variable Lock Protocol.  The call to Variable Policy is expected to succeed
 | 
						|
  and the call to Variable Lock is expected to fail.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
  **/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LockingAnUnlockedVariableShouldFail (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS             Status;
 | 
						|
  VARIABLE_POLICY_ENTRY  *NewEntry;
 | 
						|
 | 
						|
  // Create a variable policy that locks the variable.
 | 
						|
  Status = CreateVarStateVariablePolicy (
 | 
						|
             &mTestGuid1,
 | 
						|
             TEST_VAR_1_NAME,
 | 
						|
             TEST_POLICY_MIN_SIZE_NULL,
 | 
						|
             TEST_POLICY_MAX_SIZE_200,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             &mTestGuid2,
 | 
						|
             1,
 | 
						|
             TEST_VAR_2_NAME,
 | 
						|
             &NewEntry
 | 
						|
             );
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Register the new policy.
 | 
						|
  Status = RegisterVariablePolicy (NewEntry);
 | 
						|
 | 
						|
  // Configure the stub to not care about parameters. We're testing errors.
 | 
						|
  expect_any_always (StubGetVariableNull, VariableName);
 | 
						|
  expect_any_always (StubGetVariableNull, VendorGuid);
 | 
						|
  expect_any_always (StubGetVariableNull, DataSize);
 | 
						|
 | 
						|
  // With a policy, make sure that writes still work, since the variable doesn't exist.
 | 
						|
  will_return (StubGetVariableNull, TEST_POLICY_ATTRIBUTES_NULL);     // Attributes
 | 
						|
  will_return (StubGetVariableNull, 0);                               // Size
 | 
						|
  will_return (StubGetVariableNull, (UINTN)NULL);                     // DataPtr
 | 
						|
  will_return (StubGetVariableNull, EFI_NOT_FOUND);                   // Status
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_TRUE (EFI_ERROR (Status));
 | 
						|
 | 
						|
  FreePool (NewEntry);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks a variable using the Variable Policy Protocol with a
 | 
						|
  policy other than LOCK_NOW, but is currently locked.  Then attempts to lock
 | 
						|
  the same variable using the Variable Lock Protocol.  The call to Variable
 | 
						|
  Policy is expected to succeed and the call to Variable Lock also expected to
 | 
						|
  succeed.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
  **/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LockingALockedVariableWithMatchingDataShouldSucceed (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS             Status;
 | 
						|
  VARIABLE_POLICY_ENTRY  *NewEntry;
 | 
						|
  UINT8                  Data;
 | 
						|
 | 
						|
  // Create a variable policy that locks the variable.
 | 
						|
  Status = CreateVarStateVariablePolicy (
 | 
						|
             &mTestGuid1,
 | 
						|
             TEST_VAR_1_NAME,
 | 
						|
             TEST_POLICY_MIN_SIZE_NULL,
 | 
						|
             TEST_POLICY_MAX_SIZE_200,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             &mTestGuid2,
 | 
						|
             1,
 | 
						|
             TEST_VAR_2_NAME,
 | 
						|
             &NewEntry
 | 
						|
             );
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Register the new policy.
 | 
						|
  Status = RegisterVariablePolicy (NewEntry);
 | 
						|
 | 
						|
  // Configure the stub to not care about parameters. We're testing errors.
 | 
						|
  expect_any_always (StubGetVariableNull, VariableName);
 | 
						|
  expect_any_always (StubGetVariableNull, VendorGuid);
 | 
						|
  expect_any_always (StubGetVariableNull, DataSize);
 | 
						|
 | 
						|
  // With a policy, make sure that writes still work, since the variable doesn't exist.
 | 
						|
  Data = 1;
 | 
						|
  will_return (StubGetVariableNull, TEST_POLICY_ATTRIBUTES_NULL);     // Attributes
 | 
						|
  will_return (StubGetVariableNull, sizeof (Data));                   // Size
 | 
						|
  will_return (StubGetVariableNull, (UINTN)&Data);                    // DataPtr
 | 
						|
  will_return (StubGetVariableNull, EFI_SUCCESS);                     // Status
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_TRUE (!EFI_ERROR (Status));
 | 
						|
 | 
						|
  FreePool (NewEntry);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks a variable using the Variable Policy Protocol with a
 | 
						|
  policy other than LOCK_NOW, but variable data does not match.  Then attempts
 | 
						|
  to lock the same variable using the Variable Lock Protocol.  The call to
 | 
						|
  Variable Policy is expected to succeed and the call to Variable Lock is
 | 
						|
  expected to fail.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
  **/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
LockingALockedVariableWithNonMatchingDataShouldFail (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS             Status;
 | 
						|
  VARIABLE_POLICY_ENTRY  *NewEntry;
 | 
						|
  UINT8                  Data;
 | 
						|
 | 
						|
  // Create a variable policy that locks the variable.
 | 
						|
  Status = CreateVarStateVariablePolicy (
 | 
						|
             &mTestGuid1,
 | 
						|
             TEST_VAR_1_NAME,
 | 
						|
             TEST_POLICY_MIN_SIZE_NULL,
 | 
						|
             TEST_POLICY_MAX_SIZE_200,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             &mTestGuid2,
 | 
						|
             1,
 | 
						|
             TEST_VAR_2_NAME,
 | 
						|
             &NewEntry
 | 
						|
             );
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Register the new policy.
 | 
						|
  Status = RegisterVariablePolicy (NewEntry);
 | 
						|
 | 
						|
  // Configure the stub to not care about parameters. We're testing errors.
 | 
						|
  expect_any_always (StubGetVariableNull, VariableName);
 | 
						|
  expect_any_always (StubGetVariableNull, VendorGuid);
 | 
						|
  expect_any_always (StubGetVariableNull, DataSize);
 | 
						|
 | 
						|
  // With a policy, make sure that writes still work, since the variable doesn't exist.
 | 
						|
  Data = 2;
 | 
						|
  will_return (StubGetVariableNull, TEST_POLICY_ATTRIBUTES_NULL);     // Attributes
 | 
						|
  will_return (StubGetVariableNull, sizeof (Data));                   // Size
 | 
						|
  will_return (StubGetVariableNull, (UINTN)&Data);                    // DataPtr
 | 
						|
  will_return (StubGetVariableNull, EFI_SUCCESS);                     // Status
 | 
						|
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_TRUE (EFI_ERROR (Status));
 | 
						|
 | 
						|
  FreePool (NewEntry);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Test Case that locks a variable using Variable Lock Protocol Policy Protocol
 | 
						|
  then and then attempts to lock the same variable using the Variable Policy
 | 
						|
  Protocol.  The call to Variable Lock is expected to succeed and the call to
 | 
						|
  Variable Policy is expected to fail.
 | 
						|
 | 
						|
  @param[in]  Context  Unit test case context
 | 
						|
  **/
 | 
						|
UNIT_TEST_STATUS
 | 
						|
EFIAPI
 | 
						|
SettingPolicyForALockedVariableShouldFail (
 | 
						|
  IN UNIT_TEST_CONTEXT  Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS             Status;
 | 
						|
  VARIABLE_POLICY_ENTRY  *NewEntry;
 | 
						|
 | 
						|
  // Lock the variable.
 | 
						|
  Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Create a variable policy that locks the variable.
 | 
						|
  Status = CreateVarStateVariablePolicy (
 | 
						|
             &mTestGuid1,
 | 
						|
             TEST_VAR_1_NAME,
 | 
						|
             TEST_POLICY_MIN_SIZE_NULL,
 | 
						|
             TEST_POLICY_MAX_SIZE_200,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             TEST_POLICY_ATTRIBUTES_NULL,
 | 
						|
             &mTestGuid2,
 | 
						|
             1,
 | 
						|
             TEST_VAR_2_NAME,
 | 
						|
             &NewEntry
 | 
						|
             );
 | 
						|
  UT_ASSERT_NOT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Register the new policy.
 | 
						|
  Status = RegisterVariablePolicy (NewEntry);
 | 
						|
  UT_ASSERT_TRUE (EFI_ERROR (Status));
 | 
						|
 | 
						|
  FreePool (NewEntry);
 | 
						|
 | 
						|
  return UNIT_TEST_PASSED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Main entry point to this unit test application.
 | 
						|
 | 
						|
  Sets up and runs the test suites.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
UnitTestMain (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                  Status;
 | 
						|
  UNIT_TEST_FRAMEWORK_HANDLE  Framework;
 | 
						|
  UNIT_TEST_SUITE_HANDLE      ShimTests;
 | 
						|
 | 
						|
  Framework = NULL;
 | 
						|
 | 
						|
  DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));
 | 
						|
 | 
						|
  //
 | 
						|
  // Start setting up the test framework for running the tests.
 | 
						|
  //
 | 
						|
  Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));
 | 
						|
    goto EXIT;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Add all test suites and tests.
 | 
						|
  //
 | 
						|
  Status = CreateUnitTestSuite (
 | 
						|
             &ShimTests,
 | 
						|
             Framework,
 | 
						|
             "Variable Lock Shim Tests",
 | 
						|
             "VarPolicy.VarLockShim",
 | 
						|
             NULL,
 | 
						|
             NULL
 | 
						|
             );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for ShimTests\n"));
 | 
						|
    Status = EFI_OUT_OF_RESOURCES;
 | 
						|
    goto EXIT;
 | 
						|
  }
 | 
						|
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Locking a variable with no matching policies should always work",
 | 
						|
    "EmptyPolicies",
 | 
						|
    LockingWithoutAnyPoliciesShouldSucceed,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Locking a variable twice should always work",
 | 
						|
    "DoubleLock",
 | 
						|
    LockingTwiceShouldSucceed,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Locking a variable that's already locked by another policy should work",
 | 
						|
    "LockAfterPolicy",
 | 
						|
    LockingALockedVariableShouldSucceed,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Locking a variable that already has an unlocked policy should fail",
 | 
						|
    "LockAfterUnlockedPolicy",
 | 
						|
    LockingAnUnlockedVariableShouldFail,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Locking a variable that already has an locked policy should succeed",
 | 
						|
    "LockAfterLockedPolicyMatchingData",
 | 
						|
    LockingALockedVariableWithMatchingDataShouldSucceed,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Locking a variable that already has an locked policy with matching data should succeed",
 | 
						|
    "LockAfterLockedPolicyNonMatchingData",
 | 
						|
    LockingALockedVariableWithNonMatchingDataShouldFail,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  AddTestCase (
 | 
						|
    ShimTests,
 | 
						|
    "Adding a policy for a variable that has previously been locked should always fail",
 | 
						|
    "SetPolicyAfterLock",
 | 
						|
    SettingPolicyForALockedVariableShouldFail,
 | 
						|
    LibInitMocked,
 | 
						|
    LibCleanup,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
 | 
						|
  //
 | 
						|
  // Execute the tests.
 | 
						|
  //
 | 
						|
  Status = RunAllTestSuites (Framework);
 | 
						|
 | 
						|
EXIT:
 | 
						|
  if (Framework != NULL) {
 | 
						|
    FreeUnitTestFramework (Framework);
 | 
						|
  }
 | 
						|
 | 
						|
  return;
 | 
						|
}
 | 
						|
 | 
						|
///
 | 
						|
/// Avoid ECC error for function name that starts with lower case letter
 | 
						|
///
 | 
						|
#define Main  main
 | 
						|
 | 
						|
/**
 | 
						|
  Standard POSIX C entry point for host based unit test execution.
 | 
						|
 | 
						|
  @param[in] Argc  Number of arguments
 | 
						|
  @param[in] Argv  Array of pointers to arguments
 | 
						|
 | 
						|
  @retval 0      Success
 | 
						|
  @retval other  Error
 | 
						|
**/
 | 
						|
INT32
 | 
						|
Main (
 | 
						|
  IN INT32  Argc,
 | 
						|
  IN CHAR8  *Argv[]
 | 
						|
  )
 | 
						|
{
 | 
						|
  UnitTestMain ();
 | 
						|
  return 0;
 | 
						|
}
 |