From fcb55257beede8e5882f20e04de5537341b90acb Mon Sep 17 00:00:00 2001
From: 0152la <al2510@imperial.ac.uk>
Date: Mon, 2 Aug 2021 20:01:41 +0100
Subject: [PATCH] Improve coverage CI script (#5451)

* Due to the long duration of the CI execution, execute it at a set time
  daily (currently 11 UTC / 4 PDT)
* Use `Ninja` to build instead of Makefile, due to better compilation
  time
* Execute all the available Z3 tests and examples: `test-z3 -a`,
  `z3test` regression suites (`smt2`, `smt2-debug`, and `smt2-extra`),
  `z3test` coverage tests, and the 4 provided examples
* Upload `gcovr` report as an artifact associated with the CI run

TODOs:
* Fix `gcovr` emitting an empty report
* Potentially take the artifact and upload it somewhere accessible

Co-authored-by: Andrei Lascu <andrei.lascu10@imperial.ac.uk>
---
 .github/workflows/coverage.yml | 82 ++++++++++++++++++++++++++++------
 1 file changed, 69 insertions(+), 13 deletions(-)

diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 85639bd95..e5b19bebd 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -1,34 +1,90 @@
 name: Code Coverage
 
 on:
-  push:
-    branches: [ master ]
-  pull_request:
-    branches: [ master ]
+  #push:
+    #branches: [ master ]
+  schedule:
+    - cron: "0 11 * * *"
 
 env:
   BUILD_TYPE: Debug
+  CMAKE_GENERATOR: Ninja
 
 jobs:
   build:
     runs-on: ubuntu-latest
 
+    env:
+      CC: clang
+      CXX: clang++
+
     steps:
     - uses: actions/checkout@v2
 
-    - name: Configure CMake
-      run: CXXFLAGS=--coverage LDFLAGS=-lgcov CC=clang CXX=clang++ cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INSTALL_PREFIX=./install 
+    - name: Setup
+      run: |
+        sudo apt-get remove -y --purge man-db
+        sudo apt-get update -y
+        sudo apt-get install -y gcovr ninja-build
 
-    - name: Build
+    ## Building
+    - name: Configure CMake Z3
+      run: CFLAGS=="--coverage" CXXFLAGS="--coverage" LDFLAGS="-lgcov" cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INSTALL_PREFIX=./install
+
+    - name: Build Z3
       # Build your program with the given configuration
       run: cmake --build ${{github.workspace}}/build --target install --config ${{env.BUILD_TYPE}}
 
+    - name: Build test-z3
+      run: cmake --build ${{github.workspace}}/build --target test-z3 --config ${{env.BUILD_TYPE}}
+
+    - name: Build examples
+      run: |
+        cmake --build ${{github.workspace}}/build --target c_example
+        cmake --build ${{github.workspace}}/build --target cpp_example
+        cmake --build ${{github.workspace}}/build --target z3_tptp5
+        cmake --build ${{github.workspace}}/build --target c_maxsat_example
+
     - name: Clone z3test
       run: git clone https://github.com/z3prover/z3test z3test
-    
+
+    ## Testing
+    - name: Run test-z3
+      run: |
+        cd ${{github.workspace}}/build
+        ./test-z3 -a
+        cd -
+
+    - name: Run examples
+      run: |
+        ${{github.workspace}}/build/examples/c_example_build_dir/c_example
+        ${{github.workspace}}/build/examples/cpp_example_build_dir/cpp_example
+        ${{github.workspace}}/build/examples/tptp_build_dir/z3_tptp5 --help
+        ${{github.workspace}}/build/examples/c_maxsat_example_build_dir/c_maxsat_example ${{github.workspace}}/examples/maxsat/ex.smt
+
     - name: Run regressions
-      run: python z3test/scripts/test_benchmarks.py build/z3 z3test/regressions/smt2    
-      
-    - name: Run coverage
-      run: python z3test/scripts/test_coverage_tests.py ./install z3test/coverage/cpp    
-      
+      run: |
+        python z3test/scripts/test_benchmarks.py build/z3 z3test/regressions/smt2
+        python z3test/scripts/test_benchmarks.py build/z3 z3test/regressions/smt2-debug
+        python z3test/scripts/test_benchmarks.py build/z3 z3test/regressions/smt2-extra
+
+    - name: Run coverage tests
+      run: python z3test/scripts/test_coverage_tests.py ./install z3test/coverage/cpp
+
+    ## Artifact
+    - name: Gather coverage
+      run: |
+        cd ${{github.workspace}}
+        gcovr
+        #gcovr --html -o coverage.html .
+        cd -
+
+    - name: Get date
+      id: date
+      run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
+
+    - uses: actions/upload-artifact@v2
+      with:
+        name: coverage-${{steps.date.outputs.date}}
+        path: coverage.html
+        retention-days: 10