Program Listing for File fault_injection.h
↰ Return to documentation for file (include/rcutils/testing/fault_injection.h
)
// Copyright 2020 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef RCUTILS__TESTING__FAULT_INJECTION_H_
#define RCUTILS__TESTING__FAULT_INJECTION_H_
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
#include "rcutils/macros.h"
#include "rcutils/visibility_control.h"
#ifdef __cplusplus
extern "C"
{
#endif
#define RCUTILS_FAULT_INJECTION_NEVER_FAIL -1
#define RCUTILS_FAULT_INJECTION_FAIL_NOW 0
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
bool
rcutils_fault_injection_is_test_complete(void);
RCUTILS_PUBLIC
void
rcutils_fault_injection_set_count(int_least64_t count);
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
int_least64_t
rcutils_fault_injection_get_count(void);
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
int_least64_t
_rcutils_fault_injection_maybe_fail(void);
#define RCUTILS_FAULT_INJECTION_MAYBE_RETURN_ERROR(return_value_on_error) \
if (RCUTILS_FAULT_INJECTION_FAIL_NOW == _rcutils_fault_injection_maybe_fail()) { \
printf( \
"%s:%d Injecting fault and returning " #return_value_on_error "\n", __FILE__, __LINE__); \
return return_value_on_error; \
}
#define RCUTILS_FAULT_INJECTION_MAYBE_FAIL(failure_code) \
if (RCUTILS_FAULT_INJECTION_FAIL_NOW == _rcutils_fault_injection_maybe_fail()) { \
printf( \
"%s:%d Injecting fault and executing " #failure_code "\n", __FILE__, __LINE__); \
failure_code; \
}
#define RCUTILS_FAULT_INJECTION_TEST(code) \
do { \
int fault_injection_count = 0; \
do { \
rcutils_fault_injection_set_count(fault_injection_count++); \
code; \
} while (!rcutils_fault_injection_is_test_complete()); \
rcutils_fault_injection_set_count(RCUTILS_FAULT_INJECTION_NEVER_FAIL); \
} while (0)
#define RCUTILS_NO_FAULT_INJECTION(code) \
do { \
int64_t no_fault_injection_count = rcutils_fault_injection_get_count(); \
rcutils_fault_injection_set_count(RCUTILS_FAULT_INJECTION_NEVER_FAIL); \
code; \
rcutils_fault_injection_set_count(no_fault_injection_count); \
} while (0)
#ifdef __cplusplus
}
#endif
#endif // RCUTILS__TESTING__FAULT_INJECTION_H_