20 #include <gtest/gtest.h>
24 std::string
env(
const char* n) {
const char* v = getenv(n);
return v ? v :
""; }
25 std::string
cctlib_root() { std::string r =
env(
"CCTLIB_ROOT");
return r.empty() ?
"../.." : r; }
28 int run_pin(
const std::string& tool,
const std::vector<std::string>& args) {
29 std::string pin =
pin_root() +
"/pin";
30 std::vector<char*> argv;
31 argv.push_back(
const_cast<char*
>(pin.c_str()));
32 argv.push_back(
const_cast<char*
>(
"-t"));
33 argv.push_back(
const_cast<char*
>(tool.c_str()));
34 argv.push_back(
const_cast<char*
>(
"--"));
35 for (
auto&
a : args) argv.push_back(
const_cast<char*
>(
a.c_str()));
36 argv.push_back(
nullptr);
38 if (pid < 0)
return -1;
40 int devnull = open(
"/dev/null", O_WRONLY);
41 if (devnull >= 0) { dup2(devnull, 1); dup2(devnull, 2); close(devnull); }
42 setenv(
"OMP_NUM_THREADS",
"2", 1);
43 execv(pin.c_str(), argv.data());
47 if (waitpid(pid, &
status, 0) < 0)
return -1;
59 tool_ = root_ +
"/clients/obj-intel64/omp_datarace_client.so";
60 ASSERT_EQ(0, access(tool_.c_str(), F_OK)) << tool_ <<
" missing";
61 ASSERT_EQ(0, chdir(root_.c_str())) <<
"chdir failed";
67 EXPECT_EQ(0,
run_pin(tool_, {
"/bin/ls"}));
74 EXPECT_EQ(0,
run_pin(tool_, {root_ +
"/tests/gtest/obj/apps/omp_race_tp_simple"}));
79 EXPECT_EQ(0,
run_pin(tool_, {root_ +
"/tests/gtest/obj/apps/omp_race_tn_critical"}));
85 GTEST_SKIP() <<
"omp_datarace_client race detection is not fully wired";
88 GTEST_SKIP() <<
"omp_datarace_client race detection is not fully wired";
TEST_F(OmpRaceIntegration, DISABLED_TrueNegativeReportsNoRace)
std::string env(const char *n)
int run_pin(const std::string &tool, const std::vector< std::string > &args)
std::string cctlib_root()