Skip to content

Commit

Permalink
Fix Bazel Coverage with C++ to work with Remote Execution
Browse files Browse the repository at this point in the history
Adds missing coverage files: bazelbuild#13193

Closes bazelbuild#13232.

PiperOrigin-RevId: 367176195
  • Loading branch information
finn-ball authored and philwo committed Apr 19, 2021
1 parent d2b9428 commit 616dc26
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,7 @@ private static Spawn createCoveragePostProcessingSpawn(
action.getLcovMergerRunfilesSupplier(),
/* filesetMappings= */ ImmutableMap.of(),
/* inputs= */ NestedSetBuilder.<ActionInput>compileOrder()
.addAll(action.getInputs().toList())
.addAll(expandedCoverageDir)
.add(action.getCollectCoverageScript())
.add(action.getCoverageDirectoryTreeArtifact())
Expand Down
126 changes: 125 additions & 1 deletion src/test/shell/bazel/remote/remote_execution_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2387,7 +2387,7 @@ EOF
# because the coverage post-processing tool escaped the sandbox to find its own
# runfiles. The error we would see here without the flag would be "Cannot find
# runfiles". See #4685.
function test_rbe_coverage_produces_report() {
function test_java_rbe_coverage_produces_report() {
mkdir -p java/factorial

JAVA_TOOLCHAIN="@bazel_tools//tools/jdk:toolchain"
Expand Down Expand Up @@ -2477,4 +2477,128 @@ end_of_record"
assert_equals "$expected_result" "$(cat bazel-testlogs/java/factorial/fact-test/coverage.dat)"
}

# Runs coverage with `cc_test` and RE then checks the coverage file is returned.
# Older versions of gcov are not supported with bazel coverage and so will be skipped.
# See the above `test_java_rbe_coverage_produces_report` for more information.
function test_cc_rbe_coverage_produces_report() {
if [[ "$PLATFORM" == "darwin" ]]; then
# TODO(b/37355380): This test is disabled due to RemoteWorker not supporting
# setting SDKROOT and DEVELOPER_DIR appropriately, as is required of
# action executors in order to select the appropriate Xcode toolchain.
return 0
fi

# Check to see if intermediate files are supported, otherwise skip.
gcov --help | grep "\-i," || return 0

local test_dir="a/cc/coverage_test"
mkdir -p $test_dir

cat > "$test_dir"/BUILD <<'EOF'
package(default_visibility = ["//visibility:public"])
cc_library(
name = "hello-lib",
srcs = ["hello-lib.cc"],
hdrs = ["hello-lib.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [":hello-lib"],
)
cc_test(
name = "hello-test",
srcs = ["hello-world.cc"],
deps = [":hello-lib"],
)
EOF

cat > "$test_dir"/hello-lib.cc <<'EOF'
#include "hello-lib.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
namespace hello {
HelloLib::HelloLib(const string& greeting) : greeting_(new string(greeting)) {
}
void HelloLib::greet(const string& thing) {
cout << *greeting_ << " " << thing << endl;
}
} // namespace hello
EOF

cat > "$test_dir"/hello-lib.h <<'EOF'
#ifndef HELLO_LIB_H_
#define HELLO_LIB_H_
#include <string>
#include <memory>
namespace hello {
class HelloLib {
public:
explicit HelloLib(const std::string &greeting);
void greet(const std::string &thing);
private:
std::unique_ptr<const std::string> greeting_;
};
} // namespace hello
#endif // HELLO_LIB_H_
EOF

cat > "$test_dir"/hello-world.cc <<'EOF'
#include "hello-lib.h"
#include <string>
using hello::HelloLib;
using std::string;
int main(int argc, char** argv) {
HelloLib lib("Hello");
string thing = "world";
if (argc > 1) {
thing = argv[1];
}
lib.greet(thing);
return 0;
}
EOF

bazel coverage \
--test_output=all \
--experimental_fetch_all_coverage_outputs \
--experimental_split_coverage_postprocessing \
--spawn_strategy=remote \
--remote_executor=grpc://localhost:${worker_port} \
//"$test_dir":hello-test >& $TEST_log \
|| fail "Failed to run coverage for cc_test"

# Different gcov versions generate different outputs.
# Simply check if this is empty or not.
if [[ ! -s bazel-testlogs/a/cc/coverage_test/hello-test/coverage.dat ]]; then
echo "Coverage is empty. Failing now."
return 1
fi
}

run_suite "Remote execution and remote cache tests"

0 comments on commit 616dc26

Please sign in to comment.