public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "Gao, Liming" <gaoliming@byosoft.com.cn>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: 'Michael Kubacki' <mikuback@linux.microsoft.com>,
	'Sean Brogan' <sean.brogan@microsoft.com>
Subject: Re: [edk2-devel] [Patch V2 3/7] UnitTestFrameworkPkg: Add googletest submodule and GoogleTestLib
Date: Tue, 8 Nov 2022 23:03:30 +0000	[thread overview]
Message-ID: <CO1PR11MB49291E36DB637293746865A8D23F9@CO1PR11MB4929.namprd11.prod.outlook.com> (raw)
In-Reply-To: <03b001d8f346$5247ff20$f6d7fd60$@byosoft.com.cn>

Hi Liming,

Thank you for the reminder.  I will update Readme.rst

Mike

> -----Original Message-----
> From: gaoliming <gaoliming@byosoft.com.cn>
> Sent: Monday, November 7, 2022 11:47 PM
> To: devel@edk2.groups.io; Kinney, Michael D <michael.d.kinney@intel.com>
> Cc: 'Michael Kubacki' <mikuback@linux.microsoft.com>; 'Sean Brogan' <sean.brogan@microsoft.com>
> Subject: 回复: [edk2-devel] [Patch V2 3/7] UnitTestFrameworkPkg: Add googletest submodule and GoogleTestLib
> 
> Mike:
>   For new submodule, I think it is also required to be mentioned in License
> Details section in Edk2\ReadMe.rst
> 
> Thanks
> Liming
> > -----邮件原件-----
> > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Michael D
> > Kinney
> > 发送时间: 2022年11月5日 4:25
> > 收件人: devel@edk2.groups.io
> > 抄送: Michael Kubacki <mikuback@linux.microsoft.com>; Sean Brogan
> > <sean.brogan@microsoft.com>
> > 主题: [edk2-devel] [Patch V2 3/7] UnitTestFrameworkPkg: Add googletest
> > submodule and GoogleTestLib
> >
> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4134
> >
> > Add submodule for googletest and add GoogleTestLib that is
> > required for GoogleTest based unit tests. Add GoogleTest
> > documentation to Readme.md along with a port of the sample
> > unit test to the GoogleTest style.
> >
> > Cc: Michael Kubacki <mikuback@linux.microsoft.com>
> > Cc: Sean Brogan <sean.brogan@microsoft.com>
> > Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> > Reviewed-by: Michael Kubacki <mikuback@linux.microsoft.com>
> > ---
> >  .gitmodules                                   |   3 +
> >  .../Include/Library/GoogleTestLib.h           |  14 +
> >  .../Library/GoogleTestLib/GoogleTestLib.inf   |  36 +++
> >  .../Library/GoogleTestLib/GoogleTestLib.uni   |  14 +
> >  .../Library/GoogleTestLib/googletest          |   1 +
> >  UnitTestFrameworkPkg/ReadMe.md                | 255
> > +++++++++++++++--
> >  .../SampleGoogleTest/SampleGoogleTest.cpp     | 263
> > ++++++++++++++++++
> >  .../SampleGoogleTest/SampleGoogleTestHost.inf |  35 +++
> >  .../Test/UnitTestFrameworkPkgHostTest.dsc     |   4 +-
> >  .../UnitTestFrameworkPkg.ci.yaml              |   4 +-
> >  UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec |   8 +
> >  .../UnitTestFrameworkPkgHost.dsc.inc          |   4 +-
> >  12 files changed, 610 insertions(+), 31 deletions(-)
> >  create mode 100644
> > UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h
> >  create mode 100644
> > UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf
> >  create mode 100644
> > UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.uni
> >  create mode 160000
> > UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
> >  create mode 100644
> > UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleG
> > oogleTest.cpp
> >  create mode 100644
> > UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleG
> > oogleTestHost.inf
> >
> > diff --git a/.gitmodules b/.gitmodules
> > index b845c9ee3ff0..8011a88d9d25 100644
> > --- a/.gitmodules
> > +++ b/.gitmodules
> > @@ -20,3 +20,6 @@
> >  [submodule "RedfishPkg/Library/JsonLib/jansson"]
> >  	path = RedfishPkg/Library/JsonLib/jansson
> >  	url = https://github.com/akheron/jansson
> > +[submodule "UnitTestFrameworkPkg/Library/GoogleTestLib/googletest"]
> > +	path = UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
> > +	url = https://github.com/google/googletest.git
> > diff --git a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h
> > b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h
> > new file mode 100644
> > index 000000000000..ebec766d4cf7
> > --- /dev/null
> > +++ b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h
> > @@ -0,0 +1,14 @@
> > +/** @file
> > +  GoogleTestLib class with APIs from the googletest project
> > +
> > +  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#ifndef GOOGLE_TEST_LIB_H_
> > +#define GOOGLE_TEST_LIB_H_
> > +
> > +#include <gtest/gtest.h>
> > +
> > +#endif
> > diff --git a/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf
> > b/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf
> > new file mode 100644
> > index 000000000000..68db75d7023f
> > --- /dev/null
> > +++ b/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf
> > @@ -0,0 +1,36 @@
> > +## @file
> > +#  This module provides GoogleTest Library implementation.
> > +#
> > +#  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> > +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +#
> > +##
> > +
> > +[Defines]
> > +  INF_VERSION     = 0x00010005
> > +  BASE_NAME       = GoogleTestLib
> > +  MODULE_UNI_FILE = GoogleTestLib.uni
> > +  FILE_GUID       = A90E4751-AD30-43CC-980B-01E356B49ADF
> > +  MODULE_TYPE     = BASE
> > +  VERSION_STRING  = 0.1
> > +  LIBRARY_CLASS   = GoogleTestLib|HOST_APPLICATION
> > +
> > +#
> > +#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64
> > +#
> > +
> > +[Sources]
> > +  googletest/googletest/src/gtest-all.cc
> > +
> > +[Packages]
> > +  UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > +
> > +[BuildOptions]
> > +  MSFT:*_*_*_CC_FLAGS     == /c /EHsc /Zi
> > +  MSFT:NOOPT_*_*_CC_FLAGS =  /Od
> > +
> > +  GCC:*_*_*_CC_FLAGS     == -g -c
> > +
> > +  GCC:NOOPT_*_*_CC_FLAGS =  -O0
> > +  GCC:*_*_IA32_CC_FLAGS  =  -m32
> > +  GCC:*_*_X64_CC_FLAGS   =  -m64
> > diff --git a/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.uni
> > b/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.uni
> > new file mode 100644
> > index 000000000000..14c862a23744
> > --- /dev/null
> > +++ b/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.uni
> > @@ -0,0 +1,14 @@
> > +// /** @file
> > +// This module provides GoogleTest Library implementation.
> > +//
> > +// This module provides GoogleTest Library implementation.
> > +//
> > +// Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> > +//
> > +// SPDX-License-Identifier: BSD-2-Clause-Patent
> > +//
> > +// **/
> > +
> > +#string STR_MODULE_ABSTRACT             #language en-US
> > "GoogleTest Library implementation"
> > +
> > +#string STR_MODULE_DESCRIPTION          #language en-US "This
> > module provides GoogleTest Library implementation."
> > diff --git a/UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
> > b/UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
> > new file mode 160000
> > index 000000000000..86add13493e5
> > --- /dev/null
> > +++ b/UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
> > @@ -0,0 +1 @@
> > +Subproject commit 86add13493e5c881d7e4ba77fb91c1f57752b3a4
> > diff --git a/UnitTestFrameworkPkg/ReadMe.md
> > b/UnitTestFrameworkPkg/ReadMe.md
> > index e696412cb3cf..9ce04b7f3eb6 100644
> > --- a/UnitTestFrameworkPkg/ReadMe.md
> > +++ b/UnitTestFrameworkPkg/ReadMe.md
> > @@ -2,12 +2,67 @@
> >
> >  ## About
> >
> > -This package adds a unit test framework capable of building tests for
> multiple
> > contexts including
> > +This package provides unit test frameworks capable of building tests for
> > multiple contexts including
> >  the UEFI shell environment and host-based environments. It allows for
> unit
> > test development to focus
> > -on the tests and leave error logging, result formatting, context
> persistance,
> > and test running to the framework.
> > +on the tests and leave error logging, result formatting, context
> persistence,
> > and test running to the framework.
> >  The unit test framework works well for low level unit tests as well as
> system
> > level tests and
> >  fits easily in automation frameworks.
> >
> > +### Framework
> > +
> > +The first unit test framework is called **Framework** and is implemented
> > as a set of EDK II libraries.
> > +The Framework supports both host-based unit tests and target-based unit
> > tests that share the same
> > +source style, macros, and APIs. In some scenarios, the same unit test
> case
> > sources can be built
> > +for both host-based unit test execution and target-based unit test
> execution.
> > Host-based unit tests
> > +that require mocked interfaces can use the mocking infrastructure
> provided
> > by
> > +[cmocka](https://api.cmocka.org/) that is included in the
> > UnitTestFrameworkPkg as a submodule.
> > +
> > +### GoogleTest
> > +
> > +The second unit test framework supported by the UnitTestFrameworkPkg is
> > +[GoogleTest](http://google.github.io/googletest/) that can be used to
> > implement host-based unit tests.
> > +Use of GoogleTest for target-based unit tests of EDK II components is not
> > supported. If a
> > +host-based unit test requires mocked interfaces, then the Framework with
> > cmocka support should be
> > +used instead. Enabling support for mocked interfaces with GoogleTest is
> > being actively investigated.
> > +[GoogleTest on GitHub](https://github.com/google/googletest) is included
> in
> > the UnitTestFrameworkPkg
> > +as a submodule.
> > +
> > +GoogleTest requires less overhead to register test suites and test cases
> > compared to the Framework.
> > +There are also a number of tools that layer on top of GoogleTest that
> improve
> > developer productivity.
> > +One example is the VS Code extension
> > +[C++
> > TestMate](https://marketplace.visualstudio.com/items?itemName=matepek.
> > vscode-catch2-test-adapter)
> > +that may be used to implement, run, and debug unit tests implemented
> using
> > GoogleTest.
> > +
> > +If a component can be tested with host-based unit tests without support
> for
> > mocked interfaces,
> > +then GoogleTest is recommended. The MdePkg contains a port of the
> > BaseSafeIntLib unit tests in
> > +the GoogleTest style so the differences between GoogleTest and Framework
> > unit tests can be reviewed.
> > +The paths to the BaseSafeIntLib unit tests are:
> > +
> > +* MdePkg\Test\UnitTest\Library\BaseSafeIntLib
> > +* MdePkg\Test\GoogleTest\Library\BaseSafeIntLib
> > +
> > +## Framework and GoogleTest Feature Comparison
> > +
> > +| Feature                     | Framework | GoogleTest |
> > +|:----------------------------|:---------:|:----------:|
> > +| Host Based Unit Tests       |    YES    |    YES     |
> > +| Target Based Unit Tests     |    YES    |     NO     |
> > +| Unit Test Source Language   |     C     |    C++     |
> > +| Register Test Suite         |    YES    |    Auto    |
> > +| Register Test Case          |    YES    |    Auto    |
> > +| Death/Expected Assert Tests |    YES    |    YES     |
> > +| Setup/Teardown Hooks        |    YES    |    YES     |
> > +| Value-Parameterized Tests   |    NO     |    YES     |
> > +| Typed Tests                 |    NO     |    YES     |
> > +| Type-Parameterized Tests    |    NO     |    YES     |
> > +| Timeout Support             |    NO     |    YES     |
> > +| Mocking Support             |   Cmocka  |     NO     |
> > +| JUNIT XML Reports           |    YES    |    YES     |
> > +| Execute subset of tests     |    NO     |    YES     |
> > +| VS Code Extensions          |    NO     |    YES     |
> > +
> > +## Framework Libraries
> > +
> >  ### UnitTestLib
> >
> >  The main "framework" library. The core of the framework is the Framework
> > object, which can have any number
> > @@ -31,10 +86,10 @@ in supporting a system reboot in the middle of a test
> > run.
> >
> >  Library provides function to run at the end of a framework test run and
> > handles formatting the report.
> >  This is a common customization point and allows the unit test framework
> to
> > fit its output reports into
> > -other test infrastructure. In this package a simple library instances has
> been
> > supplied to output test
> > +other test infrastructure. In this package simple library instances have
> been
> > supplied to output test
> >  results to the console as plain text.
> >
> > -## Samples
> > +## Framework Samples
> >
> >  There is a sample unit test provided as both an example of how to write a
> > unit test and leverage
> >  many of the features of the framework. This sample can be found in the
> > `Test/UnitTest/Sample/SampleUnitTest`
> > @@ -43,7 +98,7 @@ directory.
> >  The sample is provided in PEI, SMM, DXE, and UEFI App flavors. It also
> has a
> > flavor for the HOST_APPLICATION
> >  build type, which can be run on a host system without needing a target.
> >
> > -## Usage
> > +## Framework Usage
> >
> >  This section is built a lot like a "Getting Started". We'll go through
> some of
> > the components that are needed
> >  when constructing a unit test and some of the decisions that are made by
> > the test writer. We'll also describe
> > @@ -51,7 +106,7 @@ how to check for expected conditions in test cases and
> > a bit of the logging char
> >
> >  Most of these examples will refer to the SampleUnitTestUefiShell app
> found
> > in this package.
> >
> > -### Requirements - INF
> > +### Framework Requirements - INF
> >
> >  In our INF file, we'll need to bring in the `UnitTestLib` library.
> Conveniently,
> > the interface
> >  header for the `UnitTestLib` is located in `MdePkg`, so you shouldn't
> need to
> > depend on any other
> > @@ -80,7 +135,7 @@ to make sure that the module `BASE_NAME` contains
> > the word `Test`...
> >    BASE_NAME      = SampleUnitTestUefiShell
> >  ```
> >
> > -### Requirements - Code
> > +### Framework Requirements - Code
> >
> >  Not to state the obvious, but let's make sure we have the following
> include
> > before getting too far along...
> >
> > @@ -90,9 +145,9 @@ Not to state the obvious, but let's make sure we have
> > the following include befo
> >
> >  Now that we've got that squared away, let's look at our 'Main()'' routine
> (or
> > DriverEntryPoint() or whatever).
> >
> > -### Configuring the Framework
> > +### Framework Configuration
> >
> > -Everything in the UnitTestPkg framework is built around an object called
> --
> > conveniently -- the Framework.
> > +Everything in the UnitTestFrameworkPkg framework is built around an
> object
> > called -- conveniently -- the Framework.
> >  This Framework object will contain all the information about our test,
> the
> > test suites and test cases associated
> >  with it, the current location within the test pass, and any results that
> have
> > been recorded so far.
> >
> > @@ -102,7 +157,7 @@ The long name and version strings are just for user
> > presentation and relatively
> >  will be used to name any cache files and/or test results, so should be a
> name
> > that makes sense in that context.
> >  These strings are copied internally to the Framework, so using
> > stack-allocated or literal strings is fine.
> >
> > -In the 'SampleUnitTestUefiShell' app, the module name is used as the
> short
> > name, so the init looks like this.
> > +In the 'SampleUnitTestUefiShell' app, the module name is used as the
> short
> > name, so the initialization looks like this.
> >
> >  ```c
> >  DEBUG(( DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME,
> > UNIT_TEST_APP_VERSION ));
> > @@ -144,11 +199,11 @@ will be used when adding test cases.
> >  Great! Now we've finished some of the cruft, red tape, and busy work.
> We're
> > ready to add some tests. Adding a test
> >  to a test suite is accomplished with the -- you guessed it --
> `AddTestCase`
> > function. It takes in the suite handle;
> >  a `CHAR8` string for the description and class name; a function pointer
> for
> > the test case itself; additional, optional
> > -function pointers for prerequisite check and cleanup routines; and and
> > optional pointer to a context structure.
> > +function pointers for prerequisite check and cleanup routines; and an
> > optional pointer to a context structure.
> >
> >  Okay, that's a lot. Let's take it one piece at a time. The description
> and class
> > name strings are very similar in
> >  usage to the suite title and package name strings in the test suites. The
> > former is for user presentation and the
> > -latter is for xUnit parsing. The test case function pointer is what is
> actually
> > executed as the "test" and the
> > +latter is for xUnit parsing. The test case function pointer is what is
> executed
> > as the "test" and the
> >  prototype should be `UNIT_TEST_FUNCTION`. The last three parameters
> > require a little bit more explaining.
> >
> >  The prerequisite check function has a prototype of
> > `UNIT_TEST_PREREQUISITE` and -- if provided -- will be called
> > @@ -180,7 +235,7 @@ Once all the suites and cases are added, it's time to
> > run the Framework.
> >  Status = RunAllTestSuites( Framework );
> >  ```
> >
> > -### A Simple Test Case
> > +### Framework - A Simple Test Case
> >
> >  We'll take a look at the below test case from 'SampleUnitTestApp'...
> >
> > @@ -217,9 +272,9 @@ _Note_ that this early return can have implications
> for
> > memory leakage.
> >
> >  At the end, if all test criteria pass, you should return
> `UNIT_TEST_PASSED`.
> >
> > -### More Complex Cases
> > +### Framework - More Complex Cases
> >
> > -To write more advanced tests, first take a look at all the Assertion and
> > Logging macros provided in the framework.
> > +To write more advanced tests, first look at all the Assertion and Logging
> > macros provided in the framework.
> >
> >  Beyond that, if you're writing host-based tests and want to take a
> > dependency on the UnitTestFrameworkPkg, you can
> >  leverage the `cmocka.h` interface and write tests with all the features
> of the
> > Cmocka framework.
> > @@ -227,6 +282,125 @@ leverage the `cmocka.h` interface and write tests
> > with all the features of the C
> >  Documentation for Cmocka can be found here:
> >  https://api.cmocka.org/
> >
> > +## GoogleTest Samples
> > +
> > +There is a sample unit test provided as both an example of how to write a
> > unit test and leverage
> > +many of the GoogleTest features. This sample can be found in the
> > `Test/GoogleTest/Sample/SampleGoogleTest`
> > +directory.
> > +
> > +The sample is provided for the HOST_APPLICATION build type, which can be
> > run on a host system without
> > +needing a target.
> > +
> > +## GoogleTest Usage
> > +
> > +This section is built a lot like a "Getting Started". We'll go through
> some of
> > the components that are needed
> > +when constructing a unit test and some of the decisions that are made by
> > the test writer. We'll also describe
> > +how to check for expected conditions in test cases and a bit of the
> logging
> > characteristics.
> > +
> > +Most of these examples will refer to the SampleGoogleTestHost app found
> in
> > this package.
> > +
> > +### GoogleTest Requirements - INF
> > +
> > +In our INF file, we'll need to bring in the `GoogleTest` library.
> Conveniently,
> > the interface
> > +header for the `GoogleTest` is in `UnitTestFrameworkPkg`, so you
> shouldn't
> > need to depend on any other
> > +packages. As long as your DSC file knows where to find the lib
> > implementation that you want to use,
> > +you should be good to go.
> > +
> > +See this example in 'SampleGoogleTestHost.inf'...
> > +
> > +```
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > +
> > +[LibraryClasses]
> > +  GoogleTestLib
> > +  BaseLib
> > +  DebugLib
> > +```
> > +
> > +Also, if you want you test to automatically be picked up by the Test
> Runner
> > plugin, you will need
> > +to make sure that the module `BASE_NAME` contains the word `Test`...
> > +
> > +```
> > +[Defines]
> > +  BASE_NAME      = SampleGoogleTestHost
> > +```
> > +
> > +### GoogleTest Requirements - Code
> > +
> > +Not to state the obvious, but let's make sure we have the following
> include
> > before getting too far along...
> > +
> > +```
> > +#include <gtest/gtest.h>
> > +extern "C" {
> > +  #include <Uefi.h>
> > +  #include <Library/BaseLib.h>
> > +  #include <Library/DebugLib.h>
> > +}
> > +```
> > +
> > +GoogleTest applications are implemented in C++. The first include brings
> in
> > the
> > +GoogleTest definitions. Other EDK II related include files must be
> wrapped in
> > +`extern "C" {}` because they are C include files. Link failures will
> occur if
> > +this is not done.
> > +
> > +Now that we've got that squared away, let's look at our 'Main()'' routine
> (or
> > DriverEntryPoint() or whatever).
> > +
> > +### GoogleTest Configuration
> > +
> > +Unlike the Framework, GoogleTest does not require test suites or test
> cases
> > to
> > +be registered. Instead, the test cases declare the test suite name and
> test
> > +case name as part of their implementation. The only requirement for
> > GoogleTest
> > +is to have a `main()` function that initialize the GoogleTest
> infrastructure and
> > +call the service `RUN_ALL_TESTS()` to run all the unit tests.
> > +
> > +```c
> > +int main(int argc, char* argv[]) {
> > +  testing::InitGoogleTest(&argc, argv);
> > +  return RUN_ALL_TESTS();
> > +}
> > +```
> > +
> > +### GoogleTest - A Simple Test Case
> > +
> > +We'll look at the below test case from 'SampleGoogleTestHost'...
> > +
> > +```c
> > +TEST(SimpleMathTests, OnePlusOneShouldEqualTwo) {
> > +  UINTN  A;
> > +  UINTN  B;
> > +  UINTN  C;
> > +
> > +  A = 1;
> > +  B = 1;
> > +  C = A + B;
> > +
> > +  ASSERT_EQ (C, 2);
> > +}
> > +```
> > +
> > +This uses the simplest form of a GoogleTest unit test using `TEST()` that
> > +declares the test suite name and the unit test name within that test
> suite.
> > +The unit test performs actions and typically makes calls to the code
> under
> > test
> > +and contains test assertions to verify that the code under test behaves
> as
> > +expected for the given inputs.
> > +
> > +In this test case, the `ASSERT_EQ` assertion is being used to establish
> that
> > the business logic has functioned
> > +correctly. There are several assertion macros, and you are encouraged to
> > use one that matches as closely to your
> > +intended test criterium as possible, because the logging is specific to
> the
> > macro and more specific macros have more
> > +detailed logs. When in doubt, there are always `ASSERT_TRUE` and
> > `ASSERT_FALSE`. Assertion macros that fail their
> > +test criterium will immediately return from the test case with a failed
> status
> > and log an error string.
> > +_Note_ that this early return can have implications for memory leakage.
> > +
> > +There is no return status from a GooglTest unit test. If no assertions
> are
> > +triggered then the unit test has a passing status.
> > +
> > +### GoogleTest - More Complex Cases
> > +
> > +To write more advanced tests, take a look at the
> > +[GoogleTest User's Guide](http://google.github.io/googletest/).
> > +
> >  ## Development
> >
> >  ### Iterating on a Single Test
> > @@ -243,11 +417,11 @@ stuart_ci_build -c .pytool/CISettings.py
> > TOOL_CHAIN_TAG=VS2017 -p MdePkg -t NOOP
> >
> >  ### Hooking BaseLib
> >
> > -Most unit test mocking can be performed by the functions provided in the
> > UnitTestFramework libraries, but since
> > +Most unit test mocking can be performed by the functions provided in the
> > UnitTestFrameworkPkg libraries, but since
> >  BaseLib is consumed by the Framework itself, it requires different
> techniques
> > to substitute parts of the
> >  functionality.
> >
> > -To solve some of this, the UnitTestFramework consumes a special
> > implementation of BaseLib for host-based tests.
> > +To solve some of this, the UnitTestFrameworkPkg consumes a special
> > implementation of BaseLib for host-based tests.
> >  This implementation contains a [hook
> > table](https://github.com/tianocore/edk2/blob/e188ecc8b4aed8fdd26b731d
> > 43883861f5e5e7b4/MdePkg/Test/UnitTest/Include/Library/UnitTestHostBase
> > Lib.h#L507)
> >  that can be used to substitute test functionality for any of the BaseLib
> > functions. By default, this implementation
> >  will use the underlying BaseLib implementation, so the unit test writer
> only
> > has to supply minimal code to test a
> > @@ -255,7 +429,7 @@ particular case.
> >
> >  ### Debugging the Framework Itself
> >
> > -While most of the tests that are produced by the UnitTestFramework are
> > easy to step through in a debugger, the Framework
> > +While most of the tests that are produced by the UnitTestFrameworkPkg are
> > easy to step through in a debugger, the Framework
> >  itself consumes code (mostly Cmocka) that sets its own build flags. These
> > flags cause parts of the Framework to not
> >  export symbols and captures exceptions, and as such are harder to debug.
> > We have provided a Stuart parameter to force
> >  symbolic debugging to be enabled.
> > @@ -269,15 +443,17 @@ stuart_ci_build -c .pytool/CISettings.py
> > TOOL_CHAIN_TAG=VS2019 -p MdePkg -t NOOP
> >  ## Building and Running Host-Based Tests
> >
> >  The EDK2 CI infrastructure provides a convenient way to run all
> host-based
> > tests -- in the the entire tree or just
> > -selected packages -- and aggregate all the the reports, including
> highlighting
> > any failures. This functionality is
> > -provided through the Stuart build system (published by EDK2-PyTools) and
> > the `NOOPT` build target.
> > +selected packages -- and aggregate all the reports, including
> highlighting any
> > failures. This functionality is
> > +provided through the Stuart build system (published by EDK2-PyTools) and
> > the `NOOPT` build target. The sections that
> > +follow use Framework examples. Unit tests based on GoogleTest are built
> > and run the same way. The text output and
> > +JUNIT XML output format have small differences.
> >
> >  ### Building Locally
> >
> >  First, to make sure you're working with the latest PyTools, run the
> following
> > command:
> >
> >  ```bash
> > -# Would recommend to run this in a Python venv, but that's out of scope
> for
> > this doc.
> > +# Would recommend running this in a Python venv, but that's out of scope
> for
> > this doc.
> >  python -m pip install --upgrade -r ./pip-requirements.txt
> >  ```
> >
> > @@ -361,7 +537,7 @@ RUNNING TEST SUITE: Int Safe Conversions Test
> > Suite
> >  ```
> >
> >  You can also, if you are so inclined, read the output from the exact
> instance
> > of the test that was run during
> > -`stuart_ci_build`. The ouput file can be found on a path that looks like:
> > +`stuart_ci_build`. The output file can be found on a path that looks
> like:
> >
> >
> > `Build/<Package>/HostTest/<Arch>/<TestName>.<TestSuiteName>.<Arch>.re
> > sult.xml`
> >
> > @@ -389,22 +565,30 @@
> > c:\_uefi\MdePkg\Test\UnitTest\Library\BaseSafeIntLib\TestBaseSafeIntLib.c:
> > 35: er
> >
> >  ### XML Reporting Mode
> >
> > -Since these applications are built using the CMocka framework, they can
> also
> > use the following env variables to output
> > -in a structured XML rather than text:
> > +Unit test applications using Framework are built using Cmocka that
> requires
> > the
> > +following environment variables to be set to generate structured XML
> output
> > +rather than text:
> >
> > -```text
> > +```
> >  CMOCKA_MESSAGE_OUTPUT=xml
> >  CMOCKA_XML_FILE=<absolute or relative path to output file>
> >  ```
> >
> > +Unit test applications using GoogleTest require the following environment
> > +variable to be set to generate structured XML output rather than text:
> > +
> > +```
> > +GTEST_OUTPUT=xml:<absolute or relative path to output file>
> > +```
> > +
> >  This mode is used by the test running plugin to aggregate the results for
> CI
> > test status reporting in the web view.
> >
> >  ### Important Note
> >
> > -This works on both Windows and Linux, but is currently limited to x64
> > architectures. Working on getting others, but we
> > +This works on both Windows and Linux but is currently limited to x64
> > architectures. Working on getting others, but we
> >  also welcome contributions.
> >
> > -## Known Limitations
> > +## Framework Known Limitations
> >
> >  ### PEI, DXE, SMM
> >
> > @@ -418,7 +602,7 @@ PEI, DXE, and SMM is forthcoming, but should be
> > considered beta/staging for now.
> >  The host-based test framework is powered internally by the Cmocka
> > framework. As such, it has abilities
> >  that the target-based tests don't (yet). It would be awesome if this
> meant
> > that it was a super set of
> >  the target-based tests, and it worked just like the target-based tests
> but
> > with more features. Unfortunately,
> > -this is not the case. While care has been taken to keep them as close a
> > possible, there are a few known
> > +this is not the case. While care has been taken to keep them as close as
> > possible, there are a few known
> >  inconsistencies that we're still ironing out. For example, the logging
> > messages in the target-based tests
> >  are cached internally and associated with the running test case. They can
> be
> > saved later as part of the
> >  reporting lib. This isn't currently possible with host-based. Only the
> assertion
> > failures are logged.
> > @@ -441,6 +625,9 @@ Non-Host-Based (PEI/DXE/SMM/Shell) Tests for a
> > Functionality or Feature   | Simi
> >    ComponentY/
> >      ComponentY.inf
> >      ComponentY.c
> > +    GoogleTest/
> > +      ComponentYHostGoogleTest.inf    # Host-Based Test for Driver
> > Module
> > +      ComponentYGoogleTest.cpp
> >      UnitTest/
> >        ComponentYHostUnitTest.inf      # Host-Based Test for Driver
> > Module
> >        ComponentYUnitTest.c
> > @@ -455,11 +642,23 @@ Non-Host-Based (PEI/DXE/SMM/Shell) Tests for a
> > Functionality or Feature   | Simi
> >      SpecificLibDxe/
> >        SpecificLibDxe.c
> >        SpecificLibDxe.inf
> > +      GoogleTest/                    # Host-Based Test for Specific
> > Library Implementation
> > +        SpecificLibDxeHostGoogleTest.cpp
> > +        SpecificLibDxeHostGoogleTest.inf
> >        UnitTest/                      # Host-Based Test for Specific
> > Library Implementation
> >          SpecificLibDxeHostUnitTest.c
> >          SpecificLibDxeHostUnitTest.inf
> >    Test/
> >      <Package>HostTest.dsc             # Host-Based Test Apps
> > +    GoogleTest/
> > +      InterfaceX
> > +        InterfaceXHostGoogleTest.inf  # Host-Based App (should be in
> > Test/<Package>HostTest.dsc)
> > +        InterfaceXUnitTest.cpp        # Test Logic
> > +
> > +      GeneralPurposeLib/              # Host-Based Test for any
> > implementation of GeneralPurposeLib
> > +        GeneralPurposeLibTest.cpp
> > +        GeneralPurposeLibHostUnitTest.inf
> > +
> >      UnitTest/
> >        InterfaceX
> >          InterfaceXHostUnitTest.inf    # Host-Based App (should be in
> > Test/<Package>HostTest.dsc)
> > diff --git
> > a/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/Sampl
> > eGoogleTest.cpp
> > b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/Sampl
> > eGoogleTest.cpp
> > new file mode 100644
> > index 000000000000..c83e58596a82
> > --- /dev/null
> > +++
> > b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/Sampl
> > eGoogleTest.cpp
> > @@ -0,0 +1,263 @@
> > +/** @file
> > +  This is a sample to demonstrates the use of GoogleTest that supports
> host
> > +  execution environments.
> > +
> > +  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include <gtest/gtest.h>
> > +extern "C" {
> > +  #include <Uefi.h>
> > +  #include <Library/BaseLib.h>
> > +  #include <Library/DebugLib.h>
> > +}
> > +
> > +/**
> > +  Sample unit test that verifies the expected result of an unsigned
> integer
> > +  addition operation.
> > +**/
> > +TEST(SimpleMathTests, OnePlusOneShouldEqualTwo) {
> > +  UINTN  A;
> > +  UINTN  B;
> > +  UINTN  C;
> > +
> > +  A = 1;
> > +  B = 1;
> > +  C = A + B;
> > +
> > +  ASSERT_EQ (C, (UINTN)2);
> > +}
> > +
> > +/**
> > +  Sample unit test that verifies that a global BOOLEAN is updatable.
> > +**/
> > +class GlobalBooleanVarTests : public ::testing::Test {
> > +  public:
> > +    BOOLEAN  SampleGlobalTestBoolean  = FALSE;
> > +};
> > +
> > +TEST_F(GlobalBooleanVarTests, GlobalBooleanShouldBeChangeable) {
> > +  SampleGlobalTestBoolean = TRUE;
> > +  ASSERT_TRUE (SampleGlobalTestBoolean);
> > +
> > +  SampleGlobalTestBoolean = FALSE;
> > +  ASSERT_FALSE (SampleGlobalTestBoolean);
> > +}
> > +
> > +/**
> > +  Sample unit test that logs a warning message and verifies that a global
> > +  pointer is updatable.
> > +**/
> > +class GlobalVarTests : public ::testing::Test {
> > +  public:
> > +    VOID  *SampleGlobalTestPointer = NULL;
> > +
> > +  protected:
> > +  void SetUp() override {
> > +    ASSERT_EQ ((UINTN)SampleGlobalTestPointer, (UINTN)NULL);
> > +  }
> > +  void TearDown() {
> > +    SampleGlobalTestPointer = NULL;
> > +  }
> > +};
> > +
> > +TEST_F(GlobalVarTests, GlobalPointerShouldBeChangeable) {
> > +  SampleGlobalTestPointer = (VOID *)-1;
> > +  ASSERT_EQ ((UINTN)SampleGlobalTestPointer, (UINTN)((VOID *)-1));
> > +}
> > +
> > +
> > +/**
> > +  Set PcdDebugPropertyMask for each MacroTestsAssertsEnabledDisabled
> > test
> > +**/
> > +class MacroTestsAssertsEnabledDisabled : public
> > testing::TestWithParam<UINT8> {
> > +  void SetUp() {
> > +    PatchPcdSet8 (PcdDebugPropertyMask, GetParam());
> > +  }
> > +};
> > +
> > +/**
> > +  Sample unit test using the ASSERT_TRUE() macro.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertTrue) {
> > +  UINT64  Result;
> > +
> > +  //
> > +  // This test passes because expression always evaluated to TRUE.
> > +  //
> > +  ASSERT_TRUE (TRUE);
> > +
> > +  //
> > +  // This test passes because expression always evaluates to TRUE.
> > +  //
> > +  Result = LShiftU64 (BIT0, 1);
> > +  ASSERT_TRUE (Result == BIT1);
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_FALSE() macro.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertFalse) {
> > +  UINT64  Result;
> > +
> > +  //
> > +  // This test passes because expression always evaluated to FALSE.
> > +  //
> > +  ASSERT_FALSE (FALSE);
> > +
> > +  //
> > +  // This test passes because expression always evaluates to FALSE.
> > +  //
> > +  Result = LShiftU64 (BIT0, 1);
> > +  ASSERT_FALSE (Result == BIT0);
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_EQ() macro.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertEqual) {
> > +  UINT64  Result;
> > +
> > +  //
> > +  // This test passes because both values are always equal.
> > +  //
> > +  ASSERT_EQ (1, 1);
> > +
> > +  //
> > +  // This test passes because both values are always equal.
> > +  //
> > +  Result = LShiftU64 (BIT0, 1);
> > +  ASSERT_EQ (Result, (UINT64)BIT1);
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_STREQ() macro.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertMemEqual) {
> > +  CHAR8  *String1;
> > +  CHAR8  *String2;
> > +
> > +  //
> > +  // This test passes because String1 and String2 are the same.
> > +  //
> > +  String1 = (CHAR8 *)"Hello";
> > +  String2 = (CHAR8 *)"Hello";
> > +  ASSERT_STREQ (String1, String2);
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_NE() macro.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertNotEqual) {
> > +  UINT64  Result;
> > +
> > +  //
> > +  // This test passes because both values are never equal.
> > +  //
> > +  ASSERT_NE (0, 1);
> > +
> > +  //
> > +  // This test passes because both values are never equal.
> > +  //
> > +  Result = LShiftU64 (BIT0, 1);
> > +  ASSERT_NE (Result, (UINT64)BIT0);
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_TRUE() and ASSERT(FALSE)
> > +  and EFI_EFFOR() macros to check status
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertNotEfiError) {
> > +  //
> > +  // This test passes because the status is not an EFI error.
> > +  //
> > +  ASSERT_FALSE (EFI_ERROR (EFI_SUCCESS));
> > +
> > +  //
> > +  // This test passes because the status is not an EFI error.
> > +  //
> > +  ASSERT_FALSE (EFI_ERROR (EFI_WARN_BUFFER_TOO_SMALL));
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_EQ() macro to compare EFI_STATUS
> > values.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertStatusEqual) {
> > +  //
> > +  // This test passes because the status value are always equal.
> > +  //
> > +  ASSERT_EQ (EFI_SUCCESS, EFI_SUCCESS);
> > +}
> > +
> > +/**
> > +  Sample unit test using ASSERT_NE() macro to make sure a pointer is not
> > NULL.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroAssertNotNull) {
> > +  UINT64  Result;
> > +
> > +  //
> > +  // This test passes because the pointer is never NULL.
> > +  //
> > +  ASSERT_NE (&Result, (UINT64 *)NULL);
> > +}
> > +
> > +/**
> > +  Sample unit test using that should not generate any ASSERTs()
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroExpectNoAssertFailure) {
> > +  //
> > +  // This test passes because it never triggers an ASSERT().
> > +  //
> > +  ASSERT (TRUE);
> > +
> > +  //
> > +  // This test passes because DecimalToBcd() does not ASSERT() if the
> > +  // value passed in is <= 99.
> > +  //
> > +  DecimalToBcd8 (99);
> > +}
> > +
> > +/**
> > +  Sample unit test using the ASSERT_DEATH() macro to test expected
> > ASSERT()s.
> > +**/
> > +TEST_P(MacroTestsAssertsEnabledDisabled, MacroExpectAssertFailure) {
> > +  //
> > +  // Skip tests that verify an ASSERT() is triggered if ASSERT()s are
> disabled.
> > +  //
> > +  if ((PcdGet8 (PcdDebugPropertyMask) & BIT0) == 0x00) {
> > +    return;
> > +  }
> > +
> > +  //
> > +  // This test passes because it directly triggers an ASSERT().
> > +  //
> > +  ASSERT_DEATH (ASSERT (FALSE), "");
> > +
> > +  //
> > +  // This test passes because DecimalToBcd() generates an ASSERT() if the
> > +  // value passed in is >= 100.  The expected ASSERT() is caught by the
> unit
> > +  // test framework and ASSERT_DEATH() returns without an error.
> > +  //
> > +  ASSERT_DEATH (DecimalToBcd8 (101), "");
> > +}
> > +
> > +INSTANTIATE_TEST_SUITE_P(ValidInput,
> > +                         MacroTestsAssertsEnabledDisabled,
> > +                         ::testing::Values(PcdGet8
> > (PcdDebugPropertyMask) | BIT0, PcdGet8 (PcdDebugPropertyMask) &
> > (~BIT0)));
> > +
> > +/**
> > +  Sample unit test using the SCOPED_TRACE() macro for trace messages.
> > +**/
> > +TEST(MacroTestsMessages, MacroTraceMessage) {
> > +  //
> > +  // Example of logging.
> > +  //
> > +  SCOPED_TRACE ("SCOPED_TRACE message\n");
> > +}
> > +
> > +int main(int argc, char* argv[]) {
> > +  testing::InitGoogleTest(&argc, argv);
> > +  return RUN_ALL_TESTS();
> > +}
> > diff --git
> > a/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/Sampl
> > eGoogleTestHost.inf
> > b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/Sampl
> > eGoogleTestHost.inf
> > new file mode 100644
> > index 000000000000..37e7c86910ed
> > --- /dev/null
> > +++
> > b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/Sampl
> > eGoogleTestHost.inf
> > @@ -0,0 +1,35 @@
> > +## @file
> > +# This is a sample to demonstrates the use of GoogleTest that supports
> host
> > +# execution environments.
> > +#
> > +# Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> > +# SPDX-License-Identifier: BSD-2-Clause-Patent
> > +##
> > +
> > +[Defines]
> > +  INF_VERSION    = 0x00010005
> > +  BASE_NAME      = SampleGoogleTestHost
> > +  FILE_GUID      = 7D8BBFBB-7977-4AEE-A59F-257BF5C2F87C
> > +  MODULE_TYPE    = HOST_APPLICATION
> > +  VERSION_STRING = 1.0
> > +
> > +#
> > +# The following information is for reference only and not required by the
> > build tools.
> > +#
> > +#  VALID_ARCHITECTURES           = IA32 X64
> > +#
> > +
> > +[Sources]
> > +  SampleGoogleTest.cpp
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > +
> > +[LibraryClasses]
> > +  GoogleTestLib
> > +  BaseLib
> > +  DebugLib
> > +
> > +[Pcd]
> > +  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask
> > diff --git a/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest.dsc
> > b/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest.dsc
> > index 184fdec87acf..708ef7f9ab35 100644
> > --- a/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest.dsc
> > +++ b/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest.dsc
> > @@ -23,14 +23,16 @@ [PcdsPatchableInModule]
> >
> >  [Components]
> >    #
> > -  # Build HOST_APPLICATION that tests the SampleUnitTest
> > +  # Build HOST_APPLICATIONs that test the SampleUnitTest
> >    #
> >
> > UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest/SampleUnitTe
> > stHost.inf
> > +
> > UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleG
> > oogleTestHost.inf
> >
> >    #
> >    # Build HOST_APPLICATION Libraries
> >    #
> >    UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf
> > +  UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf
> >    UnitTestFrameworkPkg/Library/Posix/DebugLibPosix/DebugLibPosix.inf
> >
> > UnitTestFrameworkPkg/Library/Posix/MemoryAllocationLibPosix/MemoryAllo
> > cationLibPosix.inf
> >    UnitTestFrameworkPkg/Library/UnitTestLib/UnitTestLibCmocka.inf
> > diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
> > b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
> > index 77d51e13484c..072df6208c92 100644
> > --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
> > +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
> > @@ -78,7 +78,8 @@
> >      "SpellCheck": {
> >          "AuditOnly": False,           # Fails test but run in AuditOnly
> > mode to collect log
> >          "IgnoreFiles": [             # use gitignore syntax to ignore
> > errors in matching files
> > -            "Library/CmockaLib/cmocka/**/*.*"  # not going to spell
> > check a submodule
> > +            "Library/CmockaLib/cmocka/**/*.*",  # not going to spell
> > check a submodule
> > +            "Library/GoogleTestLib/googletest/**/*.*"  # not going to
> > spell check a submodule
> >          ],
> >          "ExtendWords": [             # words to extend to the
> > dictionary for this package
> >              "testcase",
> > @@ -91,6 +92,7 @@
> >              "NOFAILURE",
> >              "cmockery",
> >              "DHAVE", # build flag for cmocka in the INF
> > +            "gtest", # file name in GoogleTestLib.inf
> >              "corthon",      # Contact GitHub account in Readme
> >              "mdkinney",     # Contact GitHub account in Readme
> >              "spbrogan"      # Contact GitHub account in Readme
> > diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > index 069289f00969..ed12f32009d8 100644
> > --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
> > @@ -16,11 +16,15 @@ [Defines]
> >    PACKAGE_VERSION   = 1.00
> >
> >  [Includes]
> > +  Include
> >    Library/CmockaLib/cmocka/include
> > +  Library/GoogleTestLib/googletest/googletest/include
> > +  Library/GoogleTestLib/googletest/googlemock/include
> >
> >  [Includes.Common.Private]
> >    PrivateInclude
> >    Library/CmockaLib/cmocka/include/cmockery
> > +  Library/GoogleTestLib/googletest/googletest
> >
> >  [LibraryClasses.Common.Private]
> >    ## @libraryclass Allows save and restore unit test internal state
> > @@ -35,6 +39,10 @@ [LibraryClasses.Common.Private]
> >    #
> >    UnitTestBootLib|PrivateInclude/Library/UnitTestBootLib.h
> >
> > +  ## @libraryclass GoogleTest infrastructure
> > +  #
> > +  GoogleTestLib|Include/Library/GoogleTestLib.h
> > +
> >  [Guids]
> >    gUnitTestFrameworkPkgTokenSpaceGuid = { 0x833d3aba, 0x39b4, 0x43a2,
> > { 0xb9, 0x30, 0x7a, 0x34, 0x53, 0x39, 0x31, 0xb3 } }
> >
> > diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> > b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> > index f249813713a8..6d5f651f689f 100644
> > --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> > +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> > @@ -14,6 +14,7 @@ [LibraryClasses.common.HOST_APPLICATION]
> >    CpuLib|MdePkg/Library/BaseCpuLibNull/BaseCpuLibNull.inf
> >
> > CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLibNull/Base
> > CacheMaintenanceLibNull.inf
> >    CmockaLib|UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf
> > +
> > GoogleTestLib|UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.i
> > nf
> >
> > UnitTestLib|UnitTestFrameworkPkg/Library/UnitTestLib/UnitTestLibCmocka.i
> > nf
> >
> > DebugLib|UnitTestFrameworkPkg/Library/Posix/DebugLibPosix/DebugLibPosi
> > x.inf
> >
> > MemoryAllocationLib|UnitTestFrameworkPkg/Library/Posix/MemoryAllocatio
> > nLibPosix/MemoryAllocationLibPosix.inf
> > @@ -30,6 +31,7 @@ [BuildOptions.common.EDKII.HOST_APPLICATION]
> >    #
> >    # MSFT
> >    #
> > +  MSFT:*_*_*_CC_FLAGS               = /EHsc
> >    MSFT:*_*_*_DLINK_FLAGS            ==
> > /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe"
> > /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /IGNORE:4001 /NOLOGO
> > /SUBSYSTEM:CONSOLE /DEBUG /STACK:0x40000,0x40000
> > /NODEFAULTLIB:libcmt.lib libcmtd.lib
> >    MSFT:*_*_IA32_DLINK_FLAGS         = /MACHINE:I386
> >    MSFT:*_*_X64_DLINK_FLAGS          = /MACHINE:AMD64
> > @@ -49,7 +51,7 @@ [BuildOptions.common.EDKII.HOST_APPLICATION]
> >    #
> >    GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID)
> > -m32 -no-pie
> >    GCC:*_*_X64_DLINK_FLAGS  == -o
> > $(BIN_DIR)/$(MODULE_NAME_GUID) -m64 -no-pie
> > -  GCC:*_*_*_DLINK2_FLAGS   == -lgcov
> > +  GCC:*_*_*_DLINK2_FLAGS   == -lgcov -lpthread -lstdc++ -lm
> >
> >    #
> >    # Need to do this link via gcc and not ld as the pathing to libraries
> changes
> > from OS version to OS version
> > --
> > 2.37.1.windows.1
> >
> >
> >
> > 
> >
> >
> >
> 
> 
> 


  reply	other threads:[~2022-11-08 23:03 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-04 20:25 [Patch V2 0/7] Add GoogleTest to UnitTestFrameworkPkg Michael D Kinney
2022-11-04 20:25 ` [Patch V2 1/7] MdePkg/Include: Update Base.h to improve C++ compatibility Michael D Kinney
2022-11-08  6:59   ` 回复: " gaoliming
2022-11-04 20:25 ` [Patch V2 2/7] MdePkg/Include/Library: Undefine _ASSERT() if already defined Michael D Kinney
2022-11-08  6:59   ` 回复: " gaoliming
2022-11-04 20:25 ` [Patch V2 3/7] UnitTestFrameworkPkg: Add googletest submodule and GoogleTestLib Michael D Kinney
2022-11-08  7:47   ` 回复: [edk2-devel] " gaoliming
2022-11-08 23:03     ` Michael D Kinney [this message]
2022-11-04 20:25 ` [Patch V2 4/7] UnitTestFrameworkPkg/Library/CmockaLib: Enable symbol files Michael D Kinney
2022-11-04 20:25 ` [Patch V2 5/7] .pytool: Add googletest submodule to CISettings.py Michael D Kinney
2022-11-04 20:25 ` [Patch V2 6/7] BaseTools/Plugin/HostBaseUnitTestRunner: Enable gtest xml output Michael D Kinney
2022-11-04 20:25 ` [Patch V2 7/7] MdePkg/Test: Add port of BaseSafeIntLib unit tests to GoogleTest Michael D Kinney
2022-11-08  6:59   ` 回复: [edk2-devel] " gaoliming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CO1PR11MB49291E36DB637293746865A8D23F9@CO1PR11MB4929.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox