blob: dfdb704a3d9bc5cc02007c689e6b083722483898 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
*
* Licensed under both the 3-Clause BSD License and the GPLv2, found in the
* LICENSE and LICENSE.GPL-2.0 files, respectively, in the root directory.
*
* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
*/
#include "faults.h"
#include <signal.h>
#include <iostream>
// Tests that a SIGSEGV is successfully caught and the handler runs.
bool TestHandlesSigsegv() {
bool pass = true;
bool ran_body = false;
bool saw_fault = RunWithFaultHandler(SIGSEGV, [&]() {
ran_body = true;
raise(SIGSEGV);
});
if (!ran_body) {
std::cerr << "Didn't run expected function" << std::endl;
pass = false;
}
if (!saw_fault) {
std::cerr << "Didn't see expected fault" << std::endl;
pass = false;
}
return pass;
}
// Test that the handler doesn't run when no fault occurs.
bool TestNoFault() {
bool pass = true;
bool ran_body = false;
bool saw_fault = RunWithFaultHandler(SIGSEGV, [&]() {
ran_body = true;
});
if (!ran_body) {
std::cerr << "Didn't run expected function" << std::endl;
pass = false;
}
if (saw_fault) {
std::cerr << "Saw unexpected fault" << std::endl;
pass = false;
}
return pass;
}
int main(int argc, char* argv[]) {
bool pass = true;
// Run this test twice to check we reset signal masks correctly.
pass = pass && TestHandlesSigsegv();
pass = pass && TestHandlesSigsegv();
pass = pass && TestNoFault();
std::cout << (pass ? "pass" : "fail") << std::endl;
return !pass;
}