Source code coverage feature for tests on target added.
authorOleg Lekarev <o.lekarev@samsung.com>
Fri, 1 Sep 2023 09:12:11 +0000 (12:12 +0300)
committerGleb Balykov/Advanced System SW Lab /SRR/Staff Engineer/Samsung Electronics <g.balykov@samsung.com>
Fri, 22 Sep 2023 09:15:44 +0000 (18:15 +0900)
packaging/netcoredbg.spec
test-suite/run_tests.sh
test-suite/sdb_run_tests.sh

index 5bbf91d3ea64545571891345700fb0d04096ba29..592001ee15b7f785012af8b8bc4f3f237fe71379 100644 (file)
@@ -8,6 +8,7 @@ Source0:   %{name}-%{version}.tar.gz
 Source1001: %{name}.manifest
 AutoReqProv: no
 
+%{!?coverage: %define coverage 0}
 # Accelerate clang
 %ifarch armv7l
 BuildRequires: clang-accel-armv7l-cross-arm
@@ -30,6 +31,11 @@ BuildRequires: unzip
 BuildRequires: corefx-managed
 BuildRequires: libdlog-devel
 BuildRequires: libunwind-devel
+
+%if 0%{coverage}
+BuildRequires: compiler-rt
+%endif
+
 Requires: coreclr
 
 %{!?build_type:%define build_type Release}
@@ -121,7 +127,8 @@ cmake .. \
     -DBUILD_MANAGED=OFF \
     -DNCDB_DOTNET_STARTUP_HOOK=$STARTUP_HOOK \
     -DINTEROP_DEBUGGING=1 \
-    -DBUILD_TESTING=%{build_testing}
+    -DBUILD_TESTING=%{build_testing} \
+    -DCLR_CMAKE_ENABLE_CODE_COVERAGE=%{coverage}
 
 make %{?jobs:-j%jobs} %{?verbose:VERBOSE=1}
 
index f98fe3d5f25059ce3d8d629e4835c816554ea32c..c2b39a9ae9ca9c89e111c195bd4fa536b9a273b3 100755 (executable)
@@ -5,13 +5,17 @@
 generate_xml()
 {
     local xml_path=$1
-    local testnames=$2
-
-    echo -e "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
-    <testsuites>
-        <testsuite name=\"Tests\" tests=\"$(($test_pass + $test_fail))\" failures=\"$test_fail\" errors=\"0\" time=\"\">
-${testnames}        </testsuite>
-    </testsuites>" > "${xml_path}/test-results.xml"
+    xml_filename="${xml_path}/test-results.xml"
+
+    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $xml_filename
+    echo "    <testsuites>" >> $xml_filename
+    echo "        <testsuite name=\"Tests\" tests=\"$(($test_pass+$test_fail))\" failures=\"$test_fail\">"  >> $xml_filename
+    for item in ${test_xml[*]}
+    do
+        echo "            <testcase name=\"${item}" >> $xml_filename
+    done
+    echo "        </testsuite>" >> $xml_filename
+    echo "    </testsuites>" >> $xml_filename
 }
 
 ALL_TEST_NAMES=(
@@ -128,8 +132,9 @@ dotnet build TestRunner || exit $?
 
 test_pass=0
 test_fail=0
+test_count=0
 test_list=""
-test_xml=""
+test_xml=()
 
 DOC=<<EOD
   test_timeout run a command with timelimit and with housekeeping of all child processes
@@ -242,12 +247,13 @@ for TEST_NAME in $TEST_NAMES; do
     if [ "$res" -ne "0" ]; then
         test_fail=$(($test_fail + 1))
         test_list="$test_list$TEST_NAME ... failed res=$res\n"
-        test_xml+="            <testcase name=\"$TEST_NAME\"><failure></failure></testcase>\n"
+        test_xml[test_count]="$TEST_NAME\"><failure></failure></testcase>"
     else
         test_pass=$(($test_pass + 1))
         test_list="$test_list$TEST_NAME ... passed\n"
-        test_xml+="            <testcase name=\"$TEST_NAME\"></testcase>\n"
+        test_xml[test_count]="$TEST_NAME\"></testcase>"
     fi
+    test_count=$(($test_count + 1))
 done
 
 if [[ $code_coverage_report == true ]]; then
@@ -261,8 +267,7 @@ fi
 
 if [[ $generate_report == true ]]; then
     #Generate xml test file to current directory
-    generate_xml "${XML_ABS_PATH}" "${test_xml}"
-    zip test.zip test-results.xml
+    generate_xml "${XML_ABS_PATH}"
 fi
 
 echo ""
index e064794ca7f6a5c6d3141cd9a8bdf1f52bd9eb2c..cf2d1e69f3bb0e0169cfb165c0947a656b7d9d6a 100755 (executable)
@@ -15,19 +15,24 @@ print_help()
     echo "  -r, --rpm         path to netcordbg rmp file"
     echo "  -x, --xml_path    path to test-results xml xunit format file,"
     echo "                    \"/home/owner/share/tmp/\" by default"
+    echo "  -c, --coverage    create code coverage report, do not create by default"
     echo "      --help        display this help and exit"
 }
+
 generate_xml()
 {
     local xml_path=$1
-    local testnames=$2
-
-    echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?>
-        <testsuites>
-            <testsuite name=\"Tests\" tests=\"\" failures=\"\" errors=\"\" time=\"\">
-                ${testnames}
-            </testsuite>
-        </testsuites>" > "${xml_path}/test-results.xml"
+    xml_filename="${xml_path}/test-results.xml"
+
+    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $xml_filename
+    echo "    <testsuites>" >> $xml_filename
+    echo "        <testsuite name=\"Tests\" tests=\"$(($test_pass+$test_fail))\" failures=\"$test_fail\">"  >> $xml_filename
+    for item in ${test_xml[*]}
+    do
+        echo "            <testcase name=\"${item}" >> $xml_filename
+    done
+    echo "        </testsuite>" >> $xml_filename
+    echo "    </testsuites>" >> $xml_filename
 }
 
 ALL_TEST_NAMES=(
@@ -112,6 +117,9 @@ GBSROOT=${GBSROOT:-$HOME/GBS-ROOT}
 TOOLS_ABS_PATH=${TOOLS_ABS_PATH:-/home/owner/share/tmp/sdk_tools}
 SCRIPTDIR=$(dirname $(readlink -f $0))
 XML_ABS_PATH=${XML_ABS_PATH:-/tmp}
+COVERAGE_DATA_DIR=${COVERAGE_DATA_DIR:-/home/abuild}
+OBJS_DIR=${OBJS_DIR:-$COVERAGE_DATA_DIR/rpmbuild/BUILD}
+CODE_COVERAGE_REPORT=false
 
 for i in "$@"
 do
@@ -152,6 +160,10 @@ case $i in
     print_help
     exit 0
     ;;
+    -c|--coverage)
+    CODE_COVERAGE_REPORT=true
+    shift
+    ;;
     *)
         TEST_NAMES="$TEST_NAMES *"
     ;;
@@ -162,6 +174,11 @@ TEST_NAMES="$@"
 
 if [[ -z $TEST_NAMES ]]; then
     TEST_NAMES="${ALL_TEST_NAMES[@]}"
+    # delete all accumulated coverage data
+    $SDB root on
+    $SDB shell rm -rf $COVERAGE_DATA_DIR
+    $SDB root off
+    rm -rf build
 fi
 
 if [[ -z $RPMFILE ]]; then
@@ -238,8 +255,9 @@ $SDB forward tcp:$PORT tcp:4711
 
 test_pass=0
 test_fail=0
+test_count=0
 test_list=""
-test_xml=""
+test_xml=()
 
 for i in $(eval echo {1..$REPEAT}); do
 # Build, push and run tests
@@ -319,18 +337,33 @@ for TEST_NAME in $TEST_NAMES; do
 
     if [ "$RC" -ne "0" ]; then
         test_fail=$(($test_fail + 1))
-        test_list="$test_list$TEST_NAME ... failed\n"
-        test_xml+="<testcase name=\"$TEST_NAME\"><failure></failure></testcase>"
+        test_list="$test_list$TEST_NAME ... failed res=$res\n"
+        test_xml[test_count]="$TEST_NAME\"><failure></failure></testcase>"
     else
         test_pass=$(($test_pass + 1))
         test_list="$test_list$TEST_NAME ... passed\n"
-        test_xml+="<testcase name=\"$TEST_NAME\"></testcase>"
+        test_xml[test_count]="$TEST_NAME\"></testcase>"
     fi
+    test_count=$(($test_count + 1))
 done
 done # REPEAT
 
+#Collect code coverage artifacts if enabled
+if [[ $CODE_COVERAGE_REPORT == true ]]; then
+    cp -r $GBSROOT/local/BUILD-ROOTS/scratch.$ARCH.0/$OBJS_DIR/$PKGNAME-$PKGVERSION/build .
+    $SDB shell tar -czf $REMOTETESTDIR/coverage.tar.gz -C $OBJS_DIR/$PKGNAME-$PKGVERSION build
+    $SDB pull $REMOTETESTDIR/coverage.tar.gz
+    tar -xf coverage.tar.gz
+    echo "geninfo_adjust_src_path = $COVERAGE_DATA_DIR => $GBSROOT/local/BUILD-ROOTS/scratch.$ARCH.0$COVERAGE_DATA_DIR" > build/lcov.cfg
+    lcov --capture --derive-func-data --gcov-tool $PWD/llvm-gcov.sh --config-file build/lcov.cfg --directory build/src/CMakeFiles/netcoredbg.dir/ --output-file build/coverage.info
+    lcov --remove build/coverage.info '*third_party/*' '/lib/*' '/usr/*' '*errormessage*' -o build/coverage.info
+    genhtml -o build/cov_html build/coverage.info
+    tar -czf build/cov_html.tar.gz -C build cov_html
+    rm coverage.tar.gz
+fi
+
 #Generate xml test file to XML_ABS_PATH
-generate_xml "${XML_ABS_PATH}" "${test_xml}"
+generate_xml "${XML_ABS_PATH}"
 
 echo ""
 echo -e $test_list