From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web09.1020.1663117286868446793 for ; Tue, 13 Sep 2022 18:01:27 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=aya1nqKq; spf=pass (domain: intel.com, ip: 192.55.52.43, mailfrom: gua.guo@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663117286; x=1694653286; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=lstH+fUodPuchr/0UpicHZzv5mZgPBEeFDsJVre3KRQ=; b=aya1nqKqr7iHw5PFvDO1pPp7Kw5kP1mCvosY7jy2cD1gzGUk4Tm5OQTZ 5i/NO5kPR4RBGmWym+GMses0NtzE/UQnDMr6oyiOBNmUCjRUog9YmU/S4 GhSpkF+1Y/3tGc4xX+F+75pd3SR/9scIiiuqRbayAIAgTHDadJAUa/wfD v2eLdCZJBL9VHkBUSdtaO2RvfJUVz12EE+JLfOxTVHt6TTn7cFgjIm/kV c1p8eyVsFfHPzZdslW5QOiWnC/6F/gsTStQmB+eqmvZ3n7UQgo6oKhkHY bzjLV2aFuEXVVlaVs5yGT2AX4kQg2vncNb7FFwilH9tBWOmdShj4xBqRV A==; X-IronPort-AV: E=McAfee;i="6500,9779,10469"; a="384593109" X-IronPort-AV: E=Sophos;i="5.93,313,1654585200"; d="scan'208";a="384593109" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2022 18:01:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,313,1654585200"; d="scan'208";a="619131154" Received: from gguo-desk.gar.corp.intel.com ([10.5.215.23]) by fmsmga007.fm.intel.com with ESMTP; 13 Sep 2022 18:01:24 -0700 From: "Guo, Gua" To: devel@edk2.groups.io Cc: Gua Guo , Michael D Kinney , Sean Brogan , Bret Barkelew , Michael Kubacki Subject: [PATCH v2] UnitTestFrameworkPkg: Add code coverage support for GCC Date: Wed, 14 Sep 2022 09:01:18 +0800 Message-Id: <20220914010118.1643-1-gua.guo@intel.com> X-Mailer: git-send-email 2.31.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Gua Guo In order to collect code coverage after running executable file, generate *.gcda and *.gcno file that require by lcov tool to generate code coverage report. Cc: Michael D Kinney Cc: Sean Brogan Cc: Bret Barkelew Cc: Michael Kubacki Signed-off-by: Gua Guo --- UnitTestFrameworkPkg/ReadMe.md | 116 ++++++++++++++= +++++- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 2 +- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/UnitTestFrameworkPkg/ReadMe.md b/UnitTestFrameworkPkg/ReadMe.md index e696412cb3..93fdacfc4a 100644 --- a/UnitTestFrameworkPkg/ReadMe.md +++ b/UnitTestFrameworkPkg/ReadMe.md @@ -361,7 +361,7 @@ RUNNING TEST SUITE: Int Safe Conversions Test Suite ```=0D =0D You can also, if you are so inclined, read the output from the exact insta= nce of the test that was run during=0D -`stuart_ci_build`. The ouput file can be found on a path that looks like:= =0D +`stuart_ci_build`. The output file can be found on a path that looks like:= =0D =0D `Build//HostTest//...result.= xml`=0D =0D @@ -399,6 +399,120 @@ CMOCKA_XML_FILE=3D =0D This mode is used by the test running plugin to aggregate the results for = CI test status reporting in the web view.=0D =0D +### Enable Code Coverage for GCC host-based tests=0D +=0D +LCOV is an extension of GCOV, a GNU tool which provides information about = what parts of a program are actually executed (i.e. "covered") while runnin= g a particular test case. The extension consists of a set of scripts which = build on the textual GCOV output to implement it.=0D +=0D +Documentation for LCOV can be found here:=0D +https://lcov.readthedocs.io/=0D +=0D +You can follow below steps to generate your code coverage report.=0D +=0D +=0D +=0D +```bash=0D +user@linux_machine:~/_uefi$stuart_ci_build -c .pytool/CISettings.py TOOL_C= HAIN_TAG=3DGCC5 -p MdePkg -t NOOPT=0D +...=0D +user@linux_machine:~/_uefi$lcov -c --rc lcov_branch_coverage=3D1 -o UnitTe= st.info -d Build/MdePkg/HostTest/NOOPT_GCC5/X64/MdePkg/=0D +Capturing coverage data from Build/MdePkg/HostTest/NOOPT_GCC5/X64/MdePkg/= =0D +Found gcov version: 9.4.0=0D +Using intermediate gcov format=0D +Scanning Build/MdePkg/HostTest/NOOPT_GCC5/X64/MdePkg/ for .gcda files ...= =0D +Found 38 data files in Build/MdePkg/HostTest/NOOPT_GCC5/X64/MdePkg/=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/RShiftU64.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/Math64.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/SafeString.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/SwapBytes32.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/CpuDeadLoop.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/MultU64x64.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/LongJump.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/SetJump.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/BitField.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/String.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/DivU64x32Remainder.g= cda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/X64/GccInline.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/MultU64x32.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/MultS64x64.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/LinkedList.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/LShiftU64.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/DivU64x32.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/SwapBytes16.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/Unaligned.gcda=0D +Processing Library/BaseLib/UnitTestHostBaseLib/OUTPUT/CheckSum.gcda=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/CopyMem.gcda=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/MemLibGuid.gcda=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/CompareMemWrapper.gc= da=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/SetMemWrapper.gcda=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/SetMem64Wrapper.gcda= =0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/MemLibGeneric.gcda=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/CopyMemWrapper.gcda= =0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/SetMem.gcda=0D +Processing Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/ZeroMemWrapper.gcda= =0D +Processing Library/BasePrintLib/BasePrintLib/OUTPUT/PrintLibInternal.gcda= =0D +Processing Library/BasePrintLib/BasePrintLib/OUTPUT/PrintLib.gcda=0D +Processing Library/BaseSafeIntLib/BaseSafeIntLib/OUTPUT/SafeIntLib64.gcda= =0D +Processing Library/BaseSafeIntLib/BaseSafeIntLib/OUTPUT/SafeIntLib.gcda=0D +Processing Test/UnitTest/Library/BaseLib/BaseLibUnitTestsHost/OUTPUT/Base6= 4UnitTest.gcda=0D +Processing Test/UnitTest/Library/BaseLib/BaseLibUnitTestsHost/OUTPUT/AutoG= en.gcda=0D +Processing Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost/OUT= PUT/SafeIntLibUintnIntnUnitTests64.gcda=0D +Processing Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost/OUT= PUT/TestBaseSafeIntLib.gcda=0D +Processing Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost/OUT= PUT/AutoGen.gcda=0D +=0D +user@linux_machine:~/_uefi$genhtml UnitTest.info --branch-coverage -o Buil= d/UnitTestReport=0D +=0D +Reading data file UnitTest.info=0D +Found 38 entries.=0D +Found common filename prefix "~/_uefi/MdePkg/Library"=0D +Writing .css and .png files.=0D +Generating output.=0D +Processing file ~/_uefi/Build/MdePkg/HostTest/NOOPT_GCC5/X64/MdePkg/Test/U= nitTest/Library/BaseLib/BaseLibUnitTestsHost/DEBUG/AutoGen.c=0D +Processing file ~/_uefi/Build/MdePkg/HostTest/NOOPT_GCC5/X64/MdePkg/Test/U= nitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost/DEBUG/AutoGen.c=0D +Processing file BaseLib/Unaligned.c=0D +Processing file BaseLib/CheckSum.c=0D +Processing file BaseLib/BitField.c=0D +Processing file BaseLib/DivU64x32.c=0D +Processing file BaseLib/CpuDeadLoop.c=0D +Processing file BaseLib/LongJump.c=0D +Processing file BaseLib/MultU64x64.c=0D +Processing file BaseLib/RShiftU64.c=0D +Processing file BaseLib/SwapBytes32.c=0D +Processing file BaseLib/SwapBytes16.c=0D +Processing file BaseLib/SetJump.c=0D +Processing file BaseLib/LinkedList.c=0D +Processing file BaseLib/LShiftU64.c=0D +Processing file BaseLib/SafeString.c=0D +Processing file BaseLib/String.c=0D +Processing file BaseLib/DivU64x32Remainder.c=0D +Processing file BaseLib/MultS64x64.c=0D +Processing file BaseLib/MultU64x32.c=0D +Processing file BaseLib/Math64.c=0D +Processing file BaseLib/X64/GccInline.c=0D +Processing file BaseMemoryLib/SetMemWrapper.c=0D +Processing file BaseMemoryLib/CompareMemWrapper.c=0D +Processing file BaseMemoryLib/SetMem64Wrapper.c=0D +Processing file BaseMemoryLib/ZeroMemWrapper.c=0D +Processing file BaseMemoryLib/CopyMemWrapper.c=0D +Processing file BaseMemoryLib/CopyMem.c=0D +Processing file BaseMemoryLib/SetMem.c=0D +Processing file BaseMemoryLib/MemLibGuid.c=0D +Processing file BaseMemoryLib/MemLibGeneric.c=0D +Processing file BasePrintLib/PrintLib.c=0D +Processing file BasePrintLib/PrintLibInternal.c=0D +Processing file BaseSafeIntLib/SafeIntLib64.c=0D +Processing file BaseSafeIntLib/SafeIntLib.c=0D +Processing file ~/_uefi/MdePkg/Test/UnitTest/Library/BaseLib/Base64UnitTes= t.c=0D +Processing file ~/_uefi/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBa= seSafeIntLib.c=0D +Processing file ~/_uefi/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/SafeIn= tLibUintnIntnUnitTests64.c=0D +Writing directory view page.=0D +Overall coverage rate:=0D + lines......: 58.6% (2688 of 4589 lines)=0D + functions..: 57.1% (249 of 436 functions)=0D + branches...: 25.3% (1062 of 4195 branches)=0D +=0D +...=0D +=0D +```=0D +=0D ### Important Note=0D =0D This works on both Windows and Linux, but is currently limited to x64 arch= itectures. Working on getting others, but we=0D diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTe= stFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index 4dd8d4ac67..8623aecb33 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -19,7 +19,7 @@ MemoryAllocationLib|UnitTestFrameworkPkg/Library/Posix/MemoryAllocationL= ibPosix/MemoryAllocationLibPosix.inf=0D =0D [BuildOptions]=0D - GCC:*_*_*_CC_FLAGS =3D -fno-pie=0D + GCC:*_*_*_CC_FLAGS =3D -fno-pie -ftest-coverage -fprofile-arcs=0D !ifdef $(UNIT_TESTING_DEBUG)=0D MSFT:*_*_*_CC_FLAGS =3D -D UNIT_TESTING_DEBUG=3D1=0D GCC:*_*_*_CC_FLAGS =3D -D UNIT_TESTING_DEBUG=3D1=0D --=20 2.31.1.windows.1