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_