https://bugzilla.tianocore.org/show_bug.cgi?id=3111 Add host based unit tests for the multiple lock case using Variable Lock Protocol, Variable Policy Protocol, and mixes of Variable Lock Protocol and Variable Policy Protocol. Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Signed-off-by: Bret Barkelew <Bret.Barkelew@microsoft.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
		
			
				
	
	
		
			566 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			566 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, 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, &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, &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;
 | 
						|
}
 |