From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.byosoft.com.cn (mail.byosoft.com.cn [58.240.74.242]) by mx.groups.io with SMTP id smtpd.web11.3752.1607993777910157307 for ; Mon, 14 Dec 2020 16:56:19 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=none, err=permanent DNS error (domain: byosoft.com.cn, ip: 58.240.74.242, mailfrom: gaoliming@byosoft.com.cn) Received: from DESKTOPS6D0PVI ([58.246.60.130]) (envelope-sender ) by 192.168.6.13 with ESMTP for ; Tue, 15 Dec 2020 08:56:13 +0800 X-WM-Sender: gaoliming@byosoft.com.cn X-WM-AuthFlag: YES X-WM-AuthUser: gaoliming@byosoft.com.cn From: "gaoliming" To: , Cc: "'Wu, Hao A'" , "'Bret Barkelew'" References: <20201211080118.1885-1-michael.d.kinney@intel.com> <20201211080118.1885-3-michael.d.kinney@intel.com> <005001d6d1bc$487da920$d978fb60$@byosoft.com.cn> In-Reply-To: Subject: =?UTF-8?B?5Zue5aSNOiBbZWRrMi1kZXZlbF0gW1BhdGNoIHY0IDIvMl0gTWRlTW9kdWxlUGtnL1ZhcmlhYmxlL1J1bnRpbWVEeGU6IEFkZCBWYXJpYWJsZSBMb2NrIFByb3RvY29sIFVuaXQgVGVzdHM=?= Date: Tue, 15 Dec 2020 08:56:15 +0800 Message-ID: <00c901d6d27d$1742b140$45c813c0$@byosoft.com.cn> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQIl4wcJKLWfmmDjkbh9mjGnD2xDxAHXcY2iAa41tJABy5GXcKkuqe8w Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Language: zh-cn Mike: I understand unit test purpose. I am OK to record this issue first. I ha= ve no other comments. Reviewed-by: Liming Gao Thanks Liming > -----=E9=82=AE=E4=BB=B6=E5=8E=9F=E4=BB=B6----- > =E5=8F=91=E4=BB=B6=E4=BA=BA: bounce+27952+68804+4905953+8761045@groups.i= o > =E4=BB=A3=E8=A1=A8 Michae= l D > Kinney > =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: 2020=E5=B9=B412=E6=9C=8815=E6=97= =A5 1:53 > =E6=94=B6=E4=BB=B6=E4=BA=BA: devel@edk2.groups.io; gaoliming@byosoft.com= .cn; Kinney, Michael > D > =E6=8A=84=E9=80=81: Wu, Hao A ; 'Bret Barkelew' > > =E4=B8=BB=E9=A2=98: Re: [edk2-devel] [Patch v4 2/2] MdeModulePkg/Variabl= e/RuntimeDxe: > Add Variable Lock Protocol Unit Tests >=20 > Hi Liming, >=20 > I agree it breaks the rules to use .. in the [Sources] section of an INF= file. >=20 > However, I do think it is important to isolate all unit test related cod= e > (including INFs) > into their own Test directories so developers can easily distinguish sou= rce > code and INFs > associated with FW implementations from unit tests and potentially set u= p > sparse check out > rules or filters so code searches can be configured to only search FW co= de > artifacts. >=20 > There is a host based unit test feature gap that needs to be addresses f= or > module scoped > testing vs library scoped testing. Library scoped testing can use lib c= lass/lib > instance > mapping in host based unit test DSC file to pull lib interfaces into a h= ost based > unit test. > For module scoped testing today, we do not have access to the module cod= e > as a library, so > you see the example here of referencing a module source file from a unit= test. >=20 > I would prefer we allow this code remain "as is" today and enter 2 new B= Zs: >=20 > * Add better support for module scoped testing to UnitTestFrameworkPkg t= hat > avoids the > need to use .. in [Sources] sections of host based unit test INF files= . >=20 > * Remove use of .. from INF in host based unit test of Variable Lock Pro= tocol > and > Variable Policy Protocol in > MdeModulePkg/Universal/Variable/RuntimeDxe/Test. >=20 > Best regards, >=20 > Mike >=20 >=20 > > -----Original Message----- > > From: devel@edk2.groups.io On Behalf Of > gaoliming > > Sent: Sunday, December 13, 2020 5:56 PM > > To: devel@edk2.groups.io; Kinney, Michael D > > > Cc: Wu, Hao A ; 'Bret Barkelew' > > > Subject: =E5=9B=9E=E5=A4=8D: [edk2-devel] [Patch v4 2/2] > MdeModulePkg/Variable/RuntimeDxe: Add Variable Lock Protocol Unit Tests > > > > Mike and Bret: > > Seemly, this is the first unit test case for the logic in the driver= . This > > unit test module needs to include the driver source file. Then, its IN= F file > > has to use the below style to include the source file. But, edk2 modul= e INF > > doesn't recommend to specify the source file with the relative upper > > directory (..). How about add VariableLockRequestToLockUnitTest.inf in= to > > MdeModulePkg\Universal\Variable\RuntimeDxe\ directory? If so, this INF > can > > directly specify the source file in [Sources] section. > > > > > +[Sources] > > > + VariableLockRequestToLockUnitTest.c > > > + ../VariableLockRequestToLock.c > > > + > > > > Thanks > > Liming > > > -----=E9=82=AE=E4=BB=B6=E5=8E=9F=E4=BB=B6----- > > > =E5=8F=91=E4=BB=B6=E4=BA=BA: bounce+27952+68703+4905953+8761045@grou= ps.io > > > =E4=BB=A3=E8=A1=A8 Mi= chael D > > > Kinney > > > =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: 2020=E5=B9=B412=E6=9C=8811=E6= =97=A5 16:01 > > > =E6=94=B6=E4=BB=B6=E4=BA=BA: devel@edk2.groups.io > > > =E6=8A=84=E9=80=81: Hao A Wu ; Liming Gao > > > ; Bret Barkelew > > > > =E4=B8=BB=E9=A2=98: [edk2-devel] [Patch v4 2/2] MdeModulePkg/Variabl= e/RuntimeDxe: > Add > > > Variable Lock Protocol Unit Tests > > > > > > https://bugzilla.tianocore.org/show_bug.cgi?id=3D3111 > > > > > > Add host based unit tests for the multiple lock case using Variable = Lock > > > Protocol, Variable Policy Protocol, and mixes of Variable Lock Proto= col > > > and Variable Policy Protocol. > > > > > > Cc: Michael D Kinney > > > Cc: Hao A Wu > > > Cc: Liming Gao > > > Signed-off-by: Bret Barkelew > > > --- > > > MdeModulePkg/Test/MdeModulePkgHostTest.dsc | 11 + > > > .../VariableLockRequestToLockUnitTest.c | 565 > > > ++++++++++++++++++ > > > .../VariableLockRequestToLockUnitTest.inf | 36 ++ > > > 3 files changed, 612 insertions(+) > > > create mode 100644 > > > > MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Variab > > > leLockRequestToLockUnitTest.c > > > create mode 100644 > > > > MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Variab > > > leLockRequestToLockUnitTest.inf > > > > > > diff --git a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc > > > b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc > > > index 72a119db4568..4da4692c8451 100644 > > > --- a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc > > > +++ b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc > > > @@ -19,6 +19,9 @@ [Defines] > > > > > > !include UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc > > > > > > +[LibraryClasses] > > > + SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf > > > + > > > [Components] > > > > > > > MdeModulePkg/Library/DxeResetSystemLib/UnitTest/MockUefiRuntimeServi > > > cesTableLib.inf > > > > > > @@ -30,3 +33,11 @@ [Components] > > > > > > > ResetSystemLib|MdeModulePkg/Library/DxeResetSystemLib/DxeResetSyste > > > mLib.inf > > > > > > > UefiRuntimeServicesTableLib|MdeModulePkg/Library/DxeResetSystemLib/U > > > nitTest/MockUefiRuntimeServicesTableLib.inf > > > } > > > + > > > + > > > > MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Variab > > > leLockRequestToLockUnitTest.inf { > > > + > > > + > > > > VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyL= ib > > > .inf > > > + > > > > VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/Var= i > > > ablePolicyHelperLib.inf > > > + > > > + > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdAllowVariablePolicyEnforcementDisab > > > le|TRUE > > > + } > > > diff --git > > > > a/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Vari > > > ableLockRequestToLockUnitTest.c > > > > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Vari > > > ableLockRequestToLockUnitTest.c > > > new file mode 100644 > > > index 000000000000..44d70e639d77 > > > --- /dev/null > > > +++ > > > > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Vari > > > ableLockRequestToLockUnitTest.c > > > @@ -0,0 +1,565 @@ > > > +/** @file > > > + This is a host-based unit test for the VariableLockRequestToLock = shim. > > > + > > > + Copyright (c) Microsoft Corporation. > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > + > > > +**/ > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#include > > > + > > > +#define UNIT_TEST_NAME "VarPol/VarLock Shim Unit Test" > > > +#define UNIT_TEST_VERSION "1.0" > > > + > > > +///=3D=3D=3D CODE UNDER TEST > > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > + > > > +EFI_STATUS > > > +EFIAPI > > > +VariableLockRequestToLock ( > > > + IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This, > > > + IN CHAR16 *VariableName, > > > + IN EFI_GUID *VendorGuid > > > + ); > > > + > > > +///=3D=3D=3D TEST DATA > > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > + > > > +// > > > +// Test GUID 1 {F955BA2D-4A2C-480C-BFD1-3CC522610592} > > > +// > > > +EFI_GUID mTestGuid1 =3D { > > > + 0xf955ba2d, 0x4a2c, 0x480c, {0xbf, 0xd1, 0x3c, 0xc5, 0x22, 0x61, = 0x5, > > > 0x92} > > > +}; > > > + > > > +// > > > +// Test GUID 2 {2DEA799E-5E73-43B9-870E-C945CE82AF3A} > > > +// > > > +EFI_GUID mTestGuid2 =3D { > > > + 0x2dea799e, 0x5e73, 0x43b9, {0x87, 0xe, 0xc9, 0x45, 0xce, 0x82, 0= xaf, > > > 0x3a} > > > +}; > > > + > > > +// > > > +// Test GUID 3 {698A2BFD-A616-482D-B88C-7100BD6682A9} > > > +// > > > +EFI_GUID mTestGuid3 =3D { > > > + 0x698a2bfd, 0xa616, 0x482d, {0xb8, 0x8c, 0x71, 0x0, 0xbd, 0x66, 0= x82, > > > 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 > > > + > > > +///=3D=3D=3D HELPER FUNCTIONS > > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > + > > > +/** > > > + 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 =3D (UINT32)mock(); > > > + MockedDataSize =3D (UINTN)mock(); > > > + MockedData =3D (VOID*)(UINTN)mock(); > > > + MockedReturn =3D (EFI_STATUS)mock(); > > > + > > > + if (Attributes !=3D NULL) { > > > + *Attributes =3D MockedAttr; > > > + } > > > + if (Data !=3D NULL && !EFI_ERROR (MockedReturn)) { > > > + CopyMem (Data, MockedData, MockedDataSize); > > > + } > > > + > > > + *DataSize =3D 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 a= lways > > > + 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(); > > > +} > > > + > > > +///=3D=3D=3D TEST CASES > > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > + > > > +///=3D=3D=3D=3D=3D SHIM SUITE > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > + > > > +/** > > > + 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 =3D 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 L= ock > > > 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 =3D VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, > > > &mTestGuid1); > > > + UT_ASSERT_NOT_EFI_ERROR (Status); > > > + > > > + Status =3D 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 Protoco= l 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 =3D 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 =3D RegisterVariablePolicy (NewEntry); > > > + > > > + Status =3D 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 Protoco= l with > > a > > > + policy other than LOCK_NOW then attempts to lock the same variabl= e > > > 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 =3D 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 =3D 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 var= iable > > > 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 =3D 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 Protoco= l with > > a > > > + policy other than LOCK_NOW, but is currently locked. Then attemp= ts > 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 =3D 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 =3D 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 var= iable > > > doesn't exist. > > > + Data =3D 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 =3D 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 Protoco= l 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 L= ock 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 =3D 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 =3D 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 var= iable > > > doesn't exist. > > > + Data =3D 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 =3D 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 Poli= cy > > Protocol > > > + then and then attempts to lock the same variable using the Variab= le > > Policy > > > + Protocol. The call to Variable Lock is expected to succeed and t= he > > 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 =3D VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, > > > &mTestGuid1); > > > + UT_ASSERT_NOT_EFI_ERROR (Status); > > > + > > > + // Create a variable policy that locks the variable. > > > + Status =3D 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 =3D 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 =3D 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 =3D InitUnitTestFramework (&Framework, UNIT_TEST_NAME, > > > gEfiCallerBaseName, UNIT_TEST_VERSION); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status > > > =3D %r\n", Status)); > > > + goto EXIT; > > > + } > > > + > > > + // > > > + // Add all test suites and tests. > > > + // > > > + Status =3D 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 =3D EFI_OUT_OF_RESOURCES; > > > + goto EXIT; > > > + } > > > + AddTestCase ( > > > + ShimTests, > > > + "Locking a variable with no matching policies should always wor= k", > > > "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 sho= uld > > 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 matc= hing > > > 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 =3D RunAllTestSuites (Framework); > > > + > > > +EXIT: > > > + if (Framework !=3D NULL) { > > > + FreeUnitTestFramework (Framework); > > > + } > > > + > > > + return; > > > +} > > > + > > > +/// > > > +/// Avoid ECC error for function name that starts with lower case l= etter > > > +/// > > > +#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; > > > +} > > > diff --git > > > > a/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Vari > > > ableLockRequestToLockUnitTest.inf > > > > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Vari > > > ableLockRequestToLockUnitTest.inf > > > new file mode 100644 > > > index 000000000000..2a659d7e1370 > > > --- /dev/null > > > +++ > > > > b/MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/Vari > > > ableLockRequestToLockUnitTest.inf > > > @@ -0,0 +1,36 @@ > > > +## @file > > > +# This is a host-based unit test for the VariableLockRequestToLock = shim. > > > +# > > > +# Copyright (c) Microsoft Corporation. > > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > > +## > > > + > > > +[Defines] > > > + INF_VERSION =3D 0x00010017 > > > + BASE_NAME =3D VariableLockRequestToLockUnitTest > > > + FILE_GUID =3D > A7388B6C-7274-4717-9649-BDC5DFD1FCBE > > > + VERSION_STRING =3D 1.0 > > > + MODULE_TYPE =3D HOST_APPLICATION > > > + > > > +# > > > +# The following information is for reference only and not required = by the > > > build tools. > > > +# > > > +# VALID_ARCHITECTURES =3D IA32 X64 ARM AARCH64 > > > +# > > > + > > > +[Sources] > > > + VariableLockRequestToLockUnitTest.c > > > + ../VariableLockRequestToLock.c > > > + > > > +[Packages] > > > + MdePkg/MdePkg.dec > > > + MdeModulePkg/MdeModulePkg.dec > > > + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec > > > + > > > +[LibraryClasses] > > > + UnitTestLib > > > + DebugLib > > > + VariablePolicyLib > > > + VariablePolicyHelperLib > > > + BaseMemoryLib > > > + MemoryAllocationLib > > > -- > > > 2.29.2.windows.2 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 >=20 >=20 >=20 >=20