From 0c80404e1140b19576505c3cf4416cad56400d29 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Sun, 20 Feb 2022 23:05:50 +0100 Subject: Added code coverage to tests with zig build test -Dtest-coverage --- .gitignore | 1 + build.zig | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/.gitignore b/.gitignore index 4c82b07..6380ab0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +kcov-output/ zig-cache zig-out diff --git a/build.zig b/build.zig index 556896e..799aebb 100644 --- a/build.zig +++ b/build.zig @@ -22,6 +22,8 @@ pub fn build(b: *std.build.Builder) void { run_cmd.addArgs(args); } + const coverage = b.option(bool, "test-coverage", "Generate test coverage") orelse false; + const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); @@ -29,6 +31,25 @@ pub fn build(b: *std.build.Builder) void { exe_tests.setTarget(target); exe_tests.setBuildMode(mode); + // Code coverage with kcov, we need an allocator for the setup + var general_purpose_allocator = std.heap.GeneralPurposeAllocator(.{}){}; + defer _ = general_purpose_allocator.deinit(); + const gpa = general_purpose_allocator.allocator(); + // We want to exclude the $HOME/.zig path + const home = std.process.getEnvVarOwned(gpa, "HOME") catch ""; + defer gpa.free(home); + const exclude = std.fmt.allocPrint(gpa, "--exclude-path={s}/.zig/", .{home}) catch ""; + defer gpa.free(exclude); + if (coverage) { + exe_tests.setExecCmd(&[_]?[]const u8{ + "kcov", + exclude, + //"--path-strip-level=3", // any kcov flags can be specified here + "kcov-output", // output dir for kcov + null, // to get zig to use the --test-cmd-bin flag + }); + } + const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&exe_tests.step); } -- cgit v1.2.3