#[macro_export]
macro_rules! inject_return {
($ret:expr) => {{
const NAME: &str = concat!(file!(), ":", line!(), ":", column!());
let mut branch = $crate::Branch::Skip;
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state
&& state.enabled
{
branch = state.tree.visit(NAME);
}
});
match branch {
$crate::Branch::Activate => {
return $ret;
}
$crate::Branch::Skip => {}
}
}};
($name:expr, $ret:expr) => {{
let mut branch = $crate::Branch::Skip;
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state
&& state.enabled
{
branch = state.tree.visit($name);
}
});
match branch {
$crate::Branch::Activate => {
return $ret;
}
$crate::Branch::Skip => {}
}
}};
}
#[macro_export]
macro_rules! inject_return_io_error {
() => {{
const NAME: &str = concat!(file!(), ":", line!(), ":", column!());
$crate::inject_return!(NAME, Err(std::io::Error::other(NAME)));
}};
($name:literal) => {{
$crate::inject_return!($name, Err(std::io::Error::other($name)));
}};
}
#[macro_export]
macro_rules! inject_override {
($input:expr, $ret:expr) => {{
const NAME: &str = concat!(file!(), ":", line!(), ":", column!());
let mut branch = $crate::Branch::Skip;
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state
&& state.enabled
{
branch = state.tree.visit(NAME);
}
});
match branch {
$crate::Branch::Activate => $ret,
$crate::Branch::Skip => $input,
}
}};
($input:expr, $name:expr, $ret:expr) => {{
let mut branch = $crate::Branch::Skip;
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state
&& state.enabled
{
branch = state.tree.visit($name);
}
});
match branch {
$crate::Branch::Activate => $ret,
$crate::Branch::Skip => $input,
}
}};
}
#[macro_export]
macro_rules! inject_override_io_error {
($input:expr) => {{
const NAME: &str = concat!(file!(), ":", line!(), ":", column!());
$crate::inject_override!($input, NAME, Err(std::io::Error::other(NAME)))
}};
($input:expr, $name:expr) => {{ $crate::inject_override!($input, $name, Err(std::io::Error::other($name))) }};
}
#[macro_export]
macro_rules! inject_override_with_side_effect {
($input:expr, $ret:expr) => {{
const NAME: &str = concat!(file!(), ":", line!(), ":", column!());
let mut branch = $crate::Branch::Skip;
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state
&& state.enabled
{
branch = state.tree.visit(NAME);
}
});
let res = $input;
match branch {
$crate::Branch::Activate => $ret,
$crate::Branch::Skip => res,
}
}};
($input:expr, $name:expr, $ret:expr) => {{
let mut branch = $crate::Branch::Skip;
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state
&& state.enabled
{
branch = state.tree.visit($name);
}
});
let res = $input;
match branch {
$crate::Branch::Activate => $ret,
$crate::Branch::Skip => res,
}
}};
}
#[macro_export]
macro_rules! inject_override_with_side_effect_io_error {
($input:expr) => {{
const NAME: &str = concat!(file!(), ":", line!(), ":", column!());
$crate::inject_override_with_side_effect!($input, NAME, Err(std::io::Error::other(NAME)))
}};
($input:expr, $name:expr) => {{ $crate::inject_override_with_side_effect!($input, $name, Err(std::io::Error::other($name))) }};
}
#[macro_export]
macro_rules! enable_failpoints {
(true) => {{
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state {
state.enabled = true;
}
});
}};
(false) => {{
$crate::__private::FAILPOINTS.with_borrow_mut(|state| {
if let Some(state) = state {
state.enabled = false;
}
});
}};
}