From ef849507a2aac1a334a94e98087872b1bb3cf49d Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Thu, 13 Jul 2023 15:50:17 +0200
Subject: [PATCH] [nix] add coverage in nix tests

---
 nix/default-config-tests.nix |  9 ++++++---
 nix/external-plugin-ci.sh    |  7 ++++++-
 nix/frama-c.nix              | 19 ++++++++++++-------
 nix/mk_tests.nix             | 32 ++++++++++++++++++++++++--------
 nix/pkgs.nix                 | 12 ++++++++++--
 nix/ts-api.nix               |  6 +++++-
 6 files changed, 63 insertions(+), 22 deletions(-)

diff --git a/nix/default-config-tests.nix b/nix/default-config-tests.nix
index 04f0b1bdb3d..9fcdfbf151e 100644
--- a/nix/default-config-tests.nix
+++ b/nix/default-config-tests.nix
@@ -1,7 +1,10 @@
-{ mk_tests } :
+{ mk_tests, frama-c-nocover } :
 
-mk_tests {
-  tests-name = "default-config-tests";
+let mk_tests_distrib = mk_tests.override {
+  frama-c = frama-c-nocover ;
+}; in
+mk_tests_distrib {
+  tests-name = "src-distrib-tests";
   tests-command = ''
     dune exec -- frama-c-ptests -never-disabled tests src/plugins/*/tests
     dune build -j1 --display short @ptests_config
diff --git a/nix/external-plugin-ci.sh b/nix/external-plugin-ci.sh
index e63d692dd76..fc1bc183927 100755
--- a/nix/external-plugin-ci.sh
+++ b/nix/external-plugin-ci.sh
@@ -45,6 +45,11 @@ fi
 # Normalize version for Nix
 OCAML=${OCAML/./_}
 
+OUTOPT="--no-out-link"
+if [ ! -z ${OUT+x} ]; then
+  OUTOPT="-o $(pwd)/$OUT"
+fi
+
 DEFAULT=${DEFAULT:-master}
 
 # prints
@@ -118,7 +123,7 @@ if [[ -f "./nix/dependencies" ]]; then
 fi
 
 # run the build
-nix-build --no-out-link "./nix/pkgs.nix" $OPTS -A ocaml-ng.ocamlPackages_$OCAML."$plugin"
+nix-build $OUTOPT "./nix/pkgs.nix" $OPTS -A ocaml-ng.ocamlPackages_$OCAML."$plugin"
 
 cd "$fc_dir"
 
diff --git a/nix/frama-c.nix b/nix/frama-c.nix
index 4be82fb950a..5dcbb81b27d 100644
--- a/nix/frama-c.nix
+++ b/nix/frama-c.nix
@@ -11,6 +11,7 @@
 , findlib
 # Frama-C build
 , apron
+, bisect_ppx
 , camlzip
 , camomile
 , dune_3
@@ -46,6 +47,7 @@
 , python3
 , python3Packages
 , yq
+, cover ? true
 , release_mode ? false
 }:
 
@@ -71,6 +73,7 @@ stdenvNoCC.mkDerivation rec {
 
   buildInputs = [
     apron
+    bisect_ppx
     camlzip
     camomile
     dune_3
@@ -105,8 +108,6 @@ stdenvNoCC.mkDerivation rec {
     dos2unix
     doxygen
     python3
-    python3Packages.pyaml
-    yq
   ];
 
   outputs = [ "out" "build_dir" ];
@@ -121,11 +122,15 @@ stdenvNoCC.mkDerivation rec {
   enableParallelBuilding = false;
   dune_opt = if release_mode then "--release" else "" ;
 
-  buildPhase = ''
-    dune build -j2 --display short --error-reporting=twice $release_mode @install
-    make tools/ptests/ptests.exe
-    make tools/ptests/wtests.exe
-  '';
+  buildPhase = (if cover then ''
+      export DUNE_WORKSPACE="dev/dune-workspace.cover"
+    '' else "") +
+    ''
+      dune build -j2 --display short --error-reporting=twice $dune_opt @install
+
+      make tools/ptests/ptests.exe
+      make tools/ptests/wtests.exe
+    '';
 
   installFlags = [
     "PREFIX=$(out)"
diff --git a/nix/mk_tests.nix b/nix/mk_tests.nix
index d56dc7155dc..458ef9320ac 100644
--- a/nix/mk_tests.nix
+++ b/nix/mk_tests.nix
@@ -33,6 +33,7 @@
 { tests-name
 , tests-command
 , has-wp-proofs ? false
+, cover ? true
 } :
 
 stdenvNoCC.mkDerivation {
@@ -68,14 +69,28 @@ stdenvNoCC.mkDerivation {
     else "" ;
 
   preBuild =
-    if has-wp-proofs
+    (if has-wp-proofs
+     then ''
+         mkdir home
+         HOME=$(pwd)/home
+         why3 config detect
+         export FRAMAC_WP_CACHE=offline
+         export FRAMAC_WP_CACHEDIR=$wp_cache
+     ''
+     else "") +
+    (if cover
+     then ''
+         mkdir coverage
+         export DUNE_WORKSPACE="dev/dune-workspace.cover"
+         export BISECT_FILE="$(pwd)/coverage/bisect-"
+     ''
+     else "");
+
+  postBuild =
+    if cover
     then ''
-        mkdir home
-        HOME=$(pwd)/home
-        why3 config detect
-        export FRAMAC_WP_CACHE=offline
-        export FRAMAC_WP_CACHEDIR=$wp_cache
-      ''
+      bisect-ppx-report cobertura --coverage-path=coverage coverage.xml
+    ''
     else "" ;
 
   buildPhase = ''
@@ -87,6 +102,7 @@ stdenvNoCC.mkDerivation {
 
   # No installation required
   installPhase = ''
-    touch $out
+    mkdir $out
+    cp -r coverage.xml $out
   '';
 }
diff --git a/nix/pkgs.nix b/nix/pkgs.nix
index 8f08f15e2ed..a386bb99cb8 100644
--- a/nix/pkgs.nix
+++ b/nix/pkgs.nix
@@ -23,11 +23,16 @@ let
 
     # Builds
     frama-c = oself.callPackage ./frama-c.nix {};
+    frama-c-no-cover = oself.callPackage ./frama-c.nix { cover = false ; };
     frama-c-hdrck = oself.callPackage ./frama-c-hdrck.nix {};
     frama-c-lint = oself.callPackage ./frama-c-lint.nix {};
 
     # Tests
-    default-config-tests = oself.callPackage ./default-config-tests.nix {};
+    default-config-tests = oself.callPackage ./default-config-tests.nix {
+      frama-c-nocover = oself.frama-c.override {
+        cover = false ;
+      } ;
+    };
     e-acsl-tests = oself.callPackage ./e-acsl-tests.nix { config = ""; };
     e-acsl-dev-tests = oself.callPackage ./e-acsl-tests.nix { config = "dev"; };
     eva-default-tests = oself.callPackage ./eva-tests.nix { config = ""; };
@@ -52,7 +57,10 @@ let
     api-doc = oself.callPackage ./api-doc.nix {};
     manuals = oself.callPackage ./manuals.nix {};
     src-distrib-tests = oself.callPackage ./src-distrib-tests.nix {
-      frama-c-release = oself.frama-c.override { release_mode = true ; } ;
+      frama-c-release = oself.frama-c.override {
+        release_mode = true ;
+        cover = false ;
+      } ;
     };
   };
   overlay = self: super: {
diff --git a/nix/ts-api.nix b/nix/ts-api.nix
index cda9f980c8d..064a4207d09 100644
--- a/nix/ts-api.nix
+++ b/nix/ts-api.nix
@@ -28,11 +28,15 @@ stdenv.mkDerivation rec {
   '';
 
   buildPhase = ''
+    mkdir coverage
+    export BISECT_FILE="$(pwd)/coverage/bisect-"
     make -C ivette check-api
+    bisect-ppx-report cobertura --coverage-path=coverage coverage.xml
   '';
 
   # No installation required
   installPhase = ''
-    touch $out
+    mkdir $out
+    cp -r coverage.xml $out
   '';
 }
-- 
GitLab