From 15b1f03983f718f19af3d34a28c2c64e34c643d2 Mon Sep 17 00:00:00 2001 From: Abdessattar Sassi <457645+abdes@users.noreply.github.com> Date: Sun, 6 Mar 2022 16:18:53 +0400 Subject: [PATCH] chore: remove stale directory from old version --- contract/.gitignore | 2 - contract/CMakeLists.txt | 149 --------- contract/README.md | 30 -- contract/config.cmake.in | 7 - contract/config.pc.in | 11 - contract/doc/_static/favicon.ico | Bin 178091 -> 0 bytes contract/doc/_static/logo.png | Bin 34593 -> 0 bytes contract/doc/api.rst | 25 -- contract/doc/api/contract.rst | 129 -------- contract/doc/conf.py.in | 131 -------- contract/doc/index.rst | 48 --- contract/doc/license.rst | 14 - contract/doc/version.rst | 14 - contract/include/contract/contract.h | 334 -------------------- contract/include/contract/ut/framework.h | 128 -------- contract/include/contract/ut/gtest.h | 95 ------ contract/src/contract.cpp | 79 ----- contract/src/contract_ut.cpp | 82 ----- contract/test/CMakeLists.txt | 126 -------- contract/test/contract_handlers_test.cpp | 91 ------ contract/test/contracts_audit_test.cpp | 98 ------ contract/test/contracts_default_test.cpp | 98 ------ contract/test/contracts_honored_test.cpp | 79 ----- contract/test/contracts_off_test.cpp | 98 ------ contract/test/main.cpp | 13 - contract/test/test_helper.cpp | 43 --- contract/test/test_helper.h | 26 -- contract/test/ut/CMakeLists.txt | 51 --- contract/test/ut/contract_ut_gtest_test.cpp | 117 ------- 29 files changed, 2118 deletions(-) delete mode 100644 contract/.gitignore delete mode 100644 contract/CMakeLists.txt delete mode 100644 contract/README.md delete mode 100644 contract/config.cmake.in delete mode 100644 contract/config.pc.in delete mode 100644 contract/doc/_static/favicon.ico delete mode 100644 contract/doc/_static/logo.png delete mode 100644 contract/doc/api.rst delete mode 100644 contract/doc/api/contract.rst delete mode 100644 contract/doc/conf.py.in delete mode 100644 contract/doc/index.rst delete mode 100644 contract/doc/license.rst delete mode 100644 contract/doc/version.rst delete mode 100644 contract/include/contract/contract.h delete mode 100644 contract/include/contract/ut/framework.h delete mode 100644 contract/include/contract/ut/gtest.h delete mode 100644 contract/src/contract.cpp delete mode 100644 contract/src/contract_ut.cpp delete mode 100644 contract/test/CMakeLists.txt delete mode 100644 contract/test/contract_handlers_test.cpp delete mode 100644 contract/test/contracts_audit_test.cpp delete mode 100644 contract/test/contracts_default_test.cpp delete mode 100644 contract/test/contracts_honored_test.cpp delete mode 100644 contract/test/contracts_off_test.cpp delete mode 100644 contract/test/main.cpp delete mode 100644 contract/test/test_helper.cpp delete mode 100644 contract/test/test_helper.h delete mode 100644 contract/test/ut/CMakeLists.txt delete mode 100644 contract/test/ut/contract_ut_gtest_test.cpp diff --git a/contract/.gitignore b/contract/.gitignore deleted file mode 100644 index 3f650c5..0000000 --- a/contract/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Generated files inside source tree -doc/conf.py diff --git a/contract/CMakeLists.txt b/contract/CMakeLists.txt deleted file mode 100644 index 61ed479..0000000 --- a/contract/CMakeLists.txt +++ /dev/null @@ -1,149 +0,0 @@ -# ===-----------------------------------------------------------------------===# -# Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -# copy at https://opensource.org/licenses/BSD-3-Clause). -# SPDX-License-Identifier: BSD-3-Clause -# ===-----------------------------------------------------------------------===# - -# ------------------------------------------------------------------------------ -# Meta information about the this module -# ------------------------------------------------------------------------------ - -asap_declare_module( - MODULE_NAME - "contract" - DESCRIPTION - "Contract checking API" - GITHUB_REPO - "https://github.com/abdes/asap" - AUTHOR_MAINTAINER - "Abdessattar Sassi" - VERSION_MAJOR - "1" - VERSION_MINOR - "0" - VERSION_PATCH - "0") - -# ============================================================================== -# Build instructions -# ============================================================================== - -# ------------------------------------------------------------------------------ -# Main module target -# ------------------------------------------------------------------------------ - -# Hardcode `asap` in the module name as we do not want this prefix to change -# with the forked project name. -set(MODULE_TARGET_NAME "asap_${META_MODULE_NAME}") - -asap_add_library( - ${MODULE_TARGET_NAME} - STATIC - SHARED - WARNING - SOURCES - "include/contract/contract.h" - "include/contract/ut/gtest.h" - "include/contract/ut/framework.h" - # Sources - "src/contract.cpp" - "src/contract_ut.cpp") - -target_link_libraries(${MODULE_TARGET_NAME} PUBLIC asap::common) - -target_include_directories( - ${MODULE_TARGET_NAME} - PUBLIC $ - $ - $ - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -target_compile_features(${MODULE_TARGET_NAME} PUBLIC cxx_std_17) - -# common comes directly from asap and is usually kept as is. It is more -# convenient to simply use it as asap::common -add_library(asap::${META_MODULE_NAME} ALIAS ${MODULE_TARGET_NAME}) - -# Add support for (optional) code quality tools -asap_add_sanitizers(${MODULE_TARGET_NAME}) - -# Generate module config files for cmake and pkgconfig -#asap_create_module_config_files() - -# ------------------------------------------------------------------------------ -# Tests -# ------------------------------------------------------------------------------ - -if(ASAP_BUILD_TESTS) - add_subdirectory(test) -endif() - -# ------------------------------------------------------------------------------ -# API Documentation -# ------------------------------------------------------------------------------ - -asap_with_doxygen( - MODULE_NAME - ${MODULE_TARGET_NAME} - VERSION - ${META_MODULE_VERSION} - TITLE - "\"Contract checking API\"" - BRIEF - "\"Provides macros and implementation for the contract checking API.\"" - INPUT_PATH - "${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include") - -asap_with_sphinx(${MODULE_TARGET_NAME}) - -# ============================================================================== -# Deployment instructions -# ============================================================================== - -set(TARGETS_EXPORT_NAME "${MODULE_TARGET_NAME}Targets") -set(runtime "${MODULE_TARGET_NAME}_runtime") -set(dev "${MODULE_TARGET_NAME}_dev") - -# Library -install( - TARGETS ${MODULE_TARGET_NAME} - EXPORT "${TARGETS_EXPORT_NAME}" - COMPONENT dev - RUNTIME DESTINATION ${ASAP_INSTALL_BIN} COMPONENT ${runtime} - LIBRARY DESTINATION ${ASAP_INSTALL_SHARED} COMPONENT ${runtime} - ARCHIVE DESTINATION ${ASAP_INSTALL_LIB} COMPONENT ${dev}) - -# Header files -install( - DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/${META_MODULE_NAME} - DESTINATION ${ASAP_INSTALL_INCLUDE} - COMPONENT ${dev} - FILES_MATCHING - PATTERN "*.h") - -# Contract library Header files -install( - DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/contract - DESTINATION ${ASAP_INSTALL_INCLUDE} - COMPONENT ${dev} - FILES_MATCHING - PATTERN "*.h") - -# Generated header files -install( - DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/${META_MODULE_NAME} - DESTINATION ${ASAP_INSTALL_INCLUDE} - COMPONENT ${dev}) - -# Target config -install( - EXPORT ${TARGETS_EXPORT_NAME} - NAMESPACE ${META_PROJECT_NAME}:: - DESTINATION ${ASAP_INSTALL_CMAKE}/${META_MODULE_NAME} - COMPONENT ${dev}) - -# Package configuration files -install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET_NAME}ConfigVersion.cmake - DESTINATION ${ASAP_INSTALL_CMAKE}/${META_MODULE_NAME}) diff --git a/contract/README.md b/contract/README.md deleted file mode 100644 index 0cdf2d3..0000000 --- a/contract/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Common submodule for the asap project - -See the asap project on [GitHub](https://github.com/abdes/asap) for a functional -minimal starter project that uses this submodule. - -This submodule is not intended to be used alone. Instead, refer to the asap -project for the recommended container to fully leverage this submodule and add -other libraries/executables/etc... to the top level project. - -Functionality offered by this submodule includes: - - cmake build helpers for the end-to-end lifecycle in 'cmake' subdirectory - - assertions - - logging using spdlog - - unit testing using Catch2 - - documentation using restructured text with - [sphinx](http://www.sphinx-doc.org/en/master/) - - API documentation using [doxygen](http://www.doxygen.org), translated to - reST using [breathe](https://breathe.readthedocs.io/en/latest/) - -## Getting the code - -Refer to the asap project. - -## Building - -Refer to the asap project. - -## Using - -Refer to the documentation generated from doxygen or doxygen+sphinx. diff --git a/contract/config.cmake.in b/contract/config.cmake.in deleted file mode 100644 index 745e77d..0000000 --- a/contract/config.cmake.in +++ /dev/null @@ -1,7 +0,0 @@ -set(@MODULE_TARGET_NAME@_VERSION @META_MODULE_VERSION@) - -@PACKAGE_INIT@ - -include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") - -check_required_components(@MODULE_TARGET_NAME@) diff --git a/contract/config.pc.in b/contract/config.pc.in deleted file mode 100644 index 7bbd13b..0000000 --- a/contract/config.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@ASAP_INSTALL_PREFIX_FULL_PATH@ -libdir=${prefix}/@ASAP_INSTALL_LIB@ -includedir=${prefix}/@ASAP_INSTALL_INCLUDE@ - -Name: @MODULE_TARGET_NAME@ -URL: @META_MODULE_GITHUB_REPO@ -Description: @META_MODULE_DESCRIPTION@ -Version: @META_MODULE_VERSION@ -Requires: Microsoft.GSL -Cflags: -I${includedir} -Libs: -L${libdir} @MODULE_LINK_LIBS@ diff --git a/contract/doc/_static/favicon.ico b/contract/doc/_static/favicon.ico deleted file mode 100644 index e2da7c884008a26f52634b2c5e2b3ade92a4705a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178091 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

p68&-iW3^<;yK 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 Xz};O&0NL{Rp92(S)!tW0e+u~z;o@TU diff --git a/contract/doc/_static/logo.png b/contract/doc/_static/logo.png deleted file mode 100644 index 4ca2442366da0413a602034a62330c08407e9e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34593 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 diff --git a/contract/doc/api.rst b/contract/doc/api.rst deleted file mode 100644 index 9be6643..0000000 --- a/contract/doc/api.rst +++ /dev/null @@ -1,25 +0,0 @@ -.. Structure conventions - # with overline, for parts - * with overline, for chapters - = for sections - - for subsections - ^ for sub-subsections - " for paragraphs - -************* -API reference -************* - -.. toctree:: - :maxdepth: 2 - :hidden: - - Contract checking - -This module offers the following APIs: - -:doc:`Contract checking ` -======================================= - *preconditions, post-conditions and assertions helper macros to implement - contract checking in C++ while waiting for it to become part of the nex C++ - standard.* diff --git a/contract/doc/api/contract.rst b/contract/doc/api/contract.rst deleted file mode 100644 index 559b6a6..0000000 --- a/contract/doc/api/contract.rst +++ /dev/null @@ -1,129 +0,0 @@ -.. Structure conventions - # with overline, for parts - * with overline, for chapters - = for sections - - for subsections - ^ for sub-subsections - " for paragraphs - -***************** -Contract checking -***************** - -Contracts are usually expressed in the form of preconditions, post-conditions -and assertions. Some programming languages have built-in support for contracts. -So far, the closest in C++ is assertions. But assertions are not expressive and -are not consistent. This simple API is intended at offering some rudimentary -support of contract programming in the form of preconditions, post-conditions -and assertions with three levels of contract enforcement at build time: `off`, -`default` and `audit`, while waiting for it to become part of the C++ language -in a near future. - -Contract checking macros -======================== - -There are three contract checking modes that can be set at build time by -defining the appropriate symbol. Each mode has a specific behavior for the -contract checking at runtime as described in the table below: - -.. list-table:: - :header-rows: 1 - :widths: 15 30 55 - - * - Build mode - - Symbol to be defined - - Behavior - - * - OFF - - ASAP_CONTRACT_OFF - - None of the conditions are enforced. - - * - DEFAULT - - ASAP_CONTRACT_DEFAULT - - Default mode conditions are enforced and execution will abort if the - contract is not honored. Audit mode conditions are ignored. - - * - AUDIT - - ASAP_CONTRACT_AUDIT - - All conditions are enforced and execution will abort if the contract is - not honored. - -Default mode macros -------------------- - -.. doxygendefine:: ASAP_EXPECT - -.. doxygendefine:: ASAP_ENSURE - -.. doxygendefine:: ASAP_ASSERT - -Audit mode macros -------------------- - -.. doxygendefine:: ASAP_EXPECT_AUDIT - -.. doxygendefine:: ASAP_ENSURE_AUDIT - -.. doxygendefine:: ASAP_ASSERT_AUDIT - -Violation Handler -================= - -There is a single violation handler in the system. Its implementation, however, -can be switched at runtime to install a custom handler. - -.. doxygenfunction:: GetViolationHandler - -.. doxygenclass:: asap::contract::ViolationHandler - :members: - -Unit testing contracts -====================== - -Testing contracts is tricky as violations often result in the program execution -being abruptly terminated rendering it quite difficult to test without death -test support by the testing framework. - -To simplify this situation, you can use the special macros for testing contracts -without death tests. - -.. doxygendefine:: CHECK_VIOLATES_CONTRACT - -.. doxygendefine:: EXPECT_VIOLATES_CONTRACT - -.. doxygendefine:: ASSERT_VIOLATES_CONTRACT - -Example -------- - -.. code-block:: c++ - - // Some function to be tested in some .cpp file - auto TestExpectDefault(const int *ptr) -> int { - ASAP_EXPECT(ptr); - return *ptr; - } - -.. code-block:: c++ - - #include "contract/ut/framework.h" - #include "contract/ut/gtest.h" - - #include - - TEST(GoogleTestDeathMacros, DefaultModeExpectDeath) { - CHECK_VIOLATES_CONTRACT(testing::TestExpectDefault(nullptr)); - } - - auto main(int argc, char **argv) -> int { - asap::contract::PrepareForTesting(); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); - } - -Limitations ------------ - -The mechanism that allows contract checks to be tested during unit tests is -implemented with setjmp and longjmp. It uses global variables to save the stack -environment during the setjmp/longjmp which is not thread safe. diff --git a/contract/doc/conf.py.in b/contract/doc/conf.py.in deleted file mode 100644 index 11c57a5..0000000 --- a/contract/doc/conf.py.in +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = u'asap/@META_MODULE_NAME@' -copyright = u'2022, The Authors' - -# The short X.Y version -version = u'@META_MODULE_VERSION@' - -rst_prolog = """ -.. |version| replace:: {0} -""".format(version) - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.viewcode', - 'sphinx-prompt', - 'sphinx_copybutton', - 'breathe', -] - -# Setup the breathe extension -breathe_projects = { - "asap_@META_MODULE_NAME@": "@DOXYGEN_BUILD_DIR@/asap_@META_MODULE_NAME@/xml" -} -breathe_default_project = "asap_@META_MODULE_NAME@" - -# Tell sphinx what the primary language being documented is. -primary_domain = 'cpp' - -# Tell sphinx what the pygments highlight language should be. -highlight_language = 'cpp' - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, so -# a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. This pattern also affects -# html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".sphinx"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_book_theme' - -html_title = u'Module: contract' -html_logo = "_static/logo.png" -html_favicon = "_static/favicon.ico" - -# If this is not None, a ‘Last updated on:’ timestamp is inserted at every page -# bottom, using the given strftime() format. The empty string is equivalent to -# '%b %d, %Y' (or a locale-dependent equivalent). -html_last_updated_fmt = None - -html_theme_options = { - "path_to_docs": "docs", - "repository_url": '@META_GITHUB_REPO@', - "use_repository_button": True, - "use_issues_button": True, - "use_edit_page_button": False, - "use_download_button": True, - "use_fullscreen_button": True, - # We don't want the default navigation bar footer to be displayed on every - # page. Mention of the book theme will be added in the home page. - "extra_navbar": "" -} - -# -- Extension configuration ------------------------------------------------- - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True diff --git a/contract/doc/index.rst b/contract/doc/index.rst deleted file mode 100644 index 8981da7..0000000 --- a/contract/doc/index.rst +++ /dev/null @@ -1,48 +0,0 @@ -############################# -ASAP contract's documentation -############################# - -.. toctree:: - :maxdepth: 2 - :hidden: - - API - License - Version - -Welcome! This is the documentation for the *contract* module, part of the *asap* -project. This is an extra module, delivered separately from the *common* -module to make its use optional. It provides a lightweight implementation of -contract checking in C++ in the form of preconditions, post-conditions -and assertions macros. Hopefully, in a near future, this would become a -standard feature of C++. - -Alternative libraries and references -==================================== - -- `Contract Checking in C++: A (long-term) Road Map - `_. - -- `libcontract `_ library to support - contract programming in C++11. - -- `Boost.Contract - `_ - implements contract programming (a.k.a., Design by Contract or DbC) [1] for - the C++ programming language.. - -- `N3753 `_, - "Centralized Defensive-Programming Support for Narrow Contracts" proposed for - C++14 Standard. - -- `N1962 `_, - "Proposal to add Contract Programming to C++ (revision 4)" (not adopted for - C++11 Standard). - -Parts of the documentation -========================== - -:doc:`API reference ` --------------------------- -*check this out to see the documentation of classes, macros, etc. offered by -this module* diff --git a/contract/doc/license.rst b/contract/doc/license.rst deleted file mode 100644 index 6a2eab4..0000000 --- a/contract/doc/license.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. Structure conventions - # with overline, for parts - * with overline, for chapters - = for sections - - for subsections - ^ for sub-subsections - " for paragraphs - -******* -License -******* - -.. include:: ../../LICENSE - diff --git a/contract/doc/version.rst b/contract/doc/version.rst deleted file mode 100644 index bd1c930..0000000 --- a/contract/doc/version.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. Structure conventions - # with overline, for parts - * with overline, for chapters - = for sections - - for subsections - ^ for sub-subsections - " for paragraphs - -******* -Version -******* - -|version| - diff --git a/contract/include/contract/contract.h b/contract/include/contract/contract.h deleted file mode 100644 index 2c8e546..0000000 --- a/contract/include/contract/contract.h +++ /dev/null @@ -1,334 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -// clang-format off -/*! - * \file - * - * \brief Types and and macros used for contract checking. - * - * Behavior of the contract checking macros can be changed by setting the - * contract checking build mode to one of the values: `OFF`, `DEFAULT` or - * `AUDIT` by defining the corresponding symbol as per the table below: - * - * Build Mode | Symbol to be defined | Behavior - * ---------- | --------------------- | -------- - * OFF | ASAP_CONTRACT_OFF | None of the conditions are enforced. - * DEFAULT | ASAP_CONTRACT_DEFAULT | Default mode conditions are enforced and execution will abort if the contract is not honored. Audit mode conditions are ignored. - * AUDIT | ASAP_CONTRACT_AUDIT | All conditions are enforced and execution will abort if the contract is not honored. - */ -// clang-format on - -#pragma once - -#include - -#include -#include - -// ----------------------------------------------------------------------------- -// Types used to implement the contract checking macros/apis -// ----------------------------------------------------------------------------- - -/// Contract checking namespace. -namespace asap::contract { - -/// Encapsulates the information related to a contract violation. -struct ASAP_CONTRACT_API Violation { - /// The name of the source file in which the violation occurred. - const char *file; - /// The line number at which the violation occurred. - size_t line; - /// The function name inside which the contract violation occurred. - const char *function; - /// The type of the violation (`precondition`, `postcondition` or - /// `assertion`). - const char *type; - /// The expression that specifies the predicate of the contract. - const char *condition; -}; - -/*! - * \brief Interface for a violation handler which can switch its implementation - * at runtime. - * - * We expect to have a single violation handler instance in the system, although - * its implementation can be changed at runtime. Therefore, the interface - * clearly deletes the copy constructors and assignment operators. - * - * \see GetViolationHandler - */ -class ASAP_CONTRACT_API ViolationHandler { -public: - /// A wrapper using std::function around violation handler implementation - /// functions. - using WrapperType = std::function; - - /// Constructor. - ViolationHandler() = default; - - /// Destructor. - virtual ~ViolationHandler(); - - /// Copy constructor (deleted). - ViolationHandler(const ViolationHandler &) = delete; - - /// Move constructor (default) - ViolationHandler(ViolationHandler &&) = default; - - /// Copy assignment operator (deleted) - auto operator=(const ViolationHandler &) -> ViolationHandler & = delete; - - /// Move assignment operator (default) - auto operator=(ViolationHandler &&) -> ViolationHandler & = default; - - /*! - * \brief Handle a contract violation. - * - * This method is called when a contract violation occurs. The information - * related to the violation is provided by the `violation` parameter. - * - * \note This function *may* never return. - * - * \param violation violation details. Will never be null and is allocated on - * the stack. - */ - virtual void HandleViolation(const Violation *violation) = 0; - - /*! - * \brief Swap the existing violation handler implementation with the give - * one. - * - * \param other_handler at the call time this holds the new violation handler - * implementation function. Upon return, it will hold the old violation - * handler function. - */ - virtual void SwapHandler(WrapperType &other_handler) = 0; -}; - -/*! - * \brief Obtain the single instance of the violation handler. - * - * \note This function is very lightweight and can be called as often as - * required. It is preferred to exclusively call it every time the violation - * handler is needed instead of storing the returned reference. - * - * \return a reference to the violation handler. - */ -ASAP_CONTRACT_API auto GetViolationHandler() -> ViolationHandler &; - -} // namespace asap::contract - -// NOLINTBEGIN(cppcoreguidelines-macro-usage) - -// ----------------------------------------------------------------------------- -// Public contract checking macros -// ----------------------------------------------------------------------------- - -// --- Default mode macros -// ----------------------------------------------------------------------------- - -/*! - * \brief Defines a precondition. - * - * A precondition describes the function's expectation of its arguments and/or - * the state of other objects upon entry into the function and is usually placed - * at the start of a function body. - * - * \note The prediction is ignored if the contract checking build mode is `OFF`. - * - * \param cond an expression, that specifies the predicate of the contract. - */ -#define ASAP_EXPECT(cond) \ - INTERNAL_ASAP_CONTRACT_CREATE_EXPECT_( \ - INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_, cond) - -/*! - * Defines a postcondition. - * - * A postcondition is a condition that a function should ensure for the return - * value and/or the state of objects upon exit from the function and is usually - * placed immediately before returning control to the caller of the function. - * - * \note The postcondition is ignored if the contract checking build mode is - * `OFF`. - * - * \param cond an expression, that specifies the predicate of the contract. - */ -#define ASAP_ENSURE(cond) \ - INTERNAL_ASAP_CONTRACT_CREATE_ENSURE_( \ - INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_, cond) - -/*! - * \brief Defines an assertion. - * - * An assertion is a condition that should be satisfied where it appears in a - * function body and can be placed anywhere within the body of a function. - * - * \note The assertion is ignored if the contract checking build mode is `OFF`. - * - * \param cond an expression, that specifies the predicate of the contract. - */ -#define ASAP_ASSERT(cond) \ - INTERNAL_ASAP_CONTRACT_CREATE_ASSERT_( \ - INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_, cond) - -// --- Audit mode macros -// ----------------------------------------------------------------------------- - -/*! - * \brief Defines a precondition for the `AUDIT` contract checking mode. - * - * A precondition describes the function's expectation of its arguments and/or - * the state of other objects upon entry into the function and is usually placed - * at the start of a function body. - * - * \note The precondition is enforced only if the contract checking build mode - * is `AUDIT`. - * - * \param cond an expression, that specifies the predicate of the contract. - */ -#define ASAP_EXPECT_AUDIT(cond) \ - INTERNAL_ASAP_CONTRACT_CREATE_EXPECT_( \ - INTERNAL_ASAP_CONTRACT_MODE_AUDIT_, cond) - -/*! - * \brief Defines a postcondition for the `AUDIT` contract checking mode. - * - * A postcondition is a condition that a function should ensure for the return - * value and/or the state of objects upon exit from the function and is usually - * placed immediately before returning control to the caller of the function. - * - * \note The postcondition is enforced only if the contract checking build mode - * is `AUDIT`. - * - * \param cond an expression, that specifies the predicate of the contract. - */ -#define ASAP_ENSURE_AUDIT(cond) \ - INTERNAL_ASAP_CONTRACT_CREATE_ENSURE_( \ - INTERNAL_ASAP_CONTRACT_MODE_AUDIT_, cond) - -/*! - * \brief Defines an assertion for the `AUDIT` contract checking mode. - * - * An assertion is a condition that should be satisfied where it appears in a - * function body and can be placed anywhere within the body of a function. - * - * \note The assertion is enforced only if the contract checking build mode is - * `AUDIT`. - * - * \param cond an expression, that specifies the predicate of the contract. - */ -#define ASAP_ASSERT_AUDIT(cond) \ - INTERNAL_ASAP_CONTRACT_CREATE_ASSERT_( \ - INTERNAL_ASAP_CONTRACT_MODE_AUDIT_, cond) - -// ----------------------------------------------------------------------------- -// Internal macros -// ----------------------------------------------------------------------------- - -// Exclude internal macros from doxygen documentation -#if !defined(DOXYGEN_DOCUMENTATION_BUILD) - -/* Helper macros */ -#define INTERNAL_ASAP_CONTRACT_CREATE_EXPECT_(check, cond) \ - check(INTERNAL_ASAP_CONTRACT_TYPE_EXPECT_, cond) - -#define INTERNAL_ASAP_CONTRACT_CREATE_ENSURE_(check, cond) \ - check(INTERNAL_ASAP_CONTRACT_TYPE_ENSURE_, cond) - -#define INTERNAL_ASAP_CONTRACT_CREATE_ASSERT_(check, cond) \ - check(INTERNAL_ASAP_CONTRACT_TYPE_ASSERT_, cond) - -/* Contract names */ -#define INTERNAL_ASAP_CONTRACT_TYPE_EXPECT_ "precondition" -#define INTERNAL_ASAP_CONTRACT_TYPE_ENSURE_ "postcondition" -#define INTERNAL_ASAP_CONTRACT_TYPE_ASSERT_ "assertion" - -#if defined(__clang__) -#if __has_builtin(__builtin_unreachable) -#define INTERNAL_ASAP_CONTRACT_HAVE_BUILTIN_UNREACHABLE 1 -#endif -#elif defined(__GNUC__) -#if __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) -#define INTERNAL_ASAP_CONTRACT_HAVE_BUILTIN_UNREACHABLE 1 -#endif -#endif - -#if defined(_MSVC_VER) -#define INTERNAL_ASAP_CONTRACT_HAVE_BUILTIN_ASSUME 1 -#endif - -/* Contract modes */ -#define INTERNAL_ASAP_CONTRACT_IGNORE_(type, cond) (void)sizeof((cond) ? 1 : 0) - -#define INTERNAL_ASAP_CONTRACT_CHECK_NEVER_CONTINUE_(type, cond) \ - do { \ - if (!(cond)) { \ - INTERNAL_ASAP_CONTRACT_HANDLE_VIOLATION_(type, cond); \ - abort(); \ - } \ - } while (0) - -/* Create violation handler call */ -#define INTERNAL_ASAP_CONTRACT_HANDLE_VIOLATION_(type, cond) \ - do { \ - const struct asap::contract::Violation violation = { \ - __FILE__, __LINE__, static_cast(__func__), type, #cond}; \ - asap::contract::GetViolationHandler().HandleViolation(&violation); \ - } while (0) - -/* Build configuration options */ -#if defined ASAP_CONTRACT_OFF -#if defined ASAP_CONTRACT_DEFAULT -#error At most one of ASAP_CONTRACT_OFF, ASAP_CONTRACT_DEFAULT, ASAP_CONTRACT_AUDIT must be specified -#endif -#define INTERNAL_ASAP_CONTRACT_BUILD_ INTERNAL_ASAP_CONTRACT_BUILD_MODE_OFF_ -#elif defined ASAP_CONTRACT_DEFAULT -#if defined ASAP_CONTRACT_AUDIT -#error At most one of ASAP_CONTRACT_OFF, ASAP_CONTRACT_DEFAULT, ASAP_CONTRACT_AUDIT must be specified -#endif -#define INTERNAL_ASAP_CONTRACT_BUILD_ INTERNAL_ASAP_CONTRACT_BUILD_MODE_DEFAULT_ -#elif defined ASAP_CONTRACT_AUDIT -#define INTERNAL_ASAP_CONTRACT_BUILD_ INTERNAL_ASAP_CONTRACT_BUILD_MODE_AUDIT_ -#else /* Default build */ -#define INTERNAL_ASAP_CONTRACT_BUILD_ INTERNAL_ASAP_CONTRACT_BUILD_MODE_DEFAULT_ -#endif - -#define INTERNAL_ASAP_CONTRACT_BUILD_MODE_OFF_ 0 -#define INTERNAL_ASAP_CONTRACT_BUILD_MODE_DEFAULT_ 1 -#define INTERNAL_ASAP_CONTRACT_BUILD_MODE_AUDIT_ 2 - -/* Standard build configurations */ -#if INTERNAL_ASAP_CONTRACT_BUILD_ == INTERNAL_ASAP_CONTRACT_BUILD_MODE_OFF_ -#define INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_ INTERNAL_ASAP_CONTRACT_IGNORE_ -#define INTERNAL_ASAP_CONTRACT_MODE_AUDIT_ INTERNAL_ASAP_CONTRACT_IGNORE_ -#elif INTERNAL_ASAP_CONTRACT_BUILD_ == \ - INTERNAL_ASAP_CONTRACT_BUILD_MODE_DEFAULT_ -#define INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_ \ - INTERNAL_ASAP_CONTRACT_CHECK_NEVER_CONTINUE_ -#define INTERNAL_ASAP_CONTRACT_MODE_AUDIT_ INTERNAL_ASAP_CONTRACT_IGNORE_ -#elif INTERNAL_ASAP_CONTRACT_BUILD_ == INTERNAL_ASAP_CONTRACT_BUILD_MODE_AUDIT_ -#define INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_ \ - INTERNAL_ASAP_CONTRACT_CHECK_NEVER_CONTINUE_ -#define INTERNAL_ASAP_CONTRACT_MODE_AUDIT_ \ - INTERNAL_ASAP_CONTRACT_CHECK_NEVER_CONTINUE_ -#endif - -/* Options to override standard build configurations */ -#if defined ASAP_CONTRACT_MODE_DEFAULT -#undef INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_ -#define INTERNAL_ASAP_CONTRACT_MODE_DEFAULT_ ASAP_CONTRACT_MODE_DEFAULT -#endif - -#if defined ASAP_CONTRACT_MODE_AUDIT -#undef INTERNAL_ASAP_CONTRACT_MODE_AUDIT_ -#define INTERNAL_ASAP_CONTRACT_MODE_AUDIT_ ASAP_CONTRACT_MODE_AUDIT -#endif - -#endif // DOXYGEN_DOCUMENTATION_BUILD - -// NOLINTEND(cppcoreguidelines-macro-usage) diff --git a/contract/include/contract/ut/framework.h b/contract/include/contract/ut/framework.h deleted file mode 100644 index f6571de..0000000 --- a/contract/include/contract/ut/framework.h +++ /dev/null @@ -1,128 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -/*! - * \file - * - * \brief Declaration for the unit testing support for contract checking. - */ - -#pragma once - -#include - -#include -#include -#include - -namespace asap::contract { - -/// Verbosity level of the test violation handler. -enum class Verbosity { - /// Do not print anything - QUIET = 0, - /// Print the same information as if the default handler were running. - VERBOSE -}; - -/*! - * \brief Set the verbosity level of the test violation handler. - * - * \param verbosity a value of Verbosity::QUIET will not produce any output, - * while a value of Verbosity::VERBOSE will produce the same output than the - * default handler. - */ -void ASAP_CONTRACT_API SetVerbosity(enum Verbosity verbosity); - -/*! - * \brief Prepare the violation handler for testing. - * - * This function replaces the default violation handler with a special purpose - * handler that allows to test the contract checking assertions without the need - * for sophisticated death test features from the unit testing framework. - * - * Here is an example of its usage with the Google Test framework: - * - * ``` - * auto main(int argc, char **argv) -> int { - * asap::contract::PrepareForTesting(); - * ::testing::InitGoogleTest(&argc, argv); - * return RUN_ALL_TESTS(); - * } - * ``` - * - * \see CHECK_VIOLATES_CONTRACT - * \see EXPECT_VIOLATES_CONTRACT - * \see ASSERT_VIOLATES_CONTRACT - */ -void ASAP_CONTRACT_API PrepareForTesting(); - -namespace details { -/// Push a contract check for nested violation checks. -void ASAP_CONTRACT_API ContractCheckPush(); -/// Pop a contract check for nested violation checks. -void ASAP_CONTRACT_API ContractCheckPop(); - -/// Stack environment saved/restored with the setjmp/longjmp used to handle -/// contract violations during testing. -// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -extern ASAP_CONTRACT_API jmp_buf jmp_env; - -} // namespace details - -} // namespace asap::contract - -#if !defined(DOXYGEN_DOCUMENTATION_BUILD) - -// NOLINTBEGIN(cppcoreguidelines-macro-usage) -#define ASAP_CONTRACT_UT_DO_CHECK_VIOLATION_(call, check, expected, msg) \ - do { \ - jmp_buf old_jmp_buf; \ - int violation_detected = 0; \ - asap::contract::details::ContractCheckPush(); \ - /* preserve any existing setjmp environment before the macro was called */ \ - memcpy(static_cast(old_jmp_buf), \ - static_cast(asap::contract::details::jmp_env), \ - sizeof(old_jmp_buf)); \ - /* Save stack environment for restore using the longjmp call in the test \ - * handler. */ \ - /* Returns 0 after saving the stack environment. If setjmp returns because \ - * of a longjmp, */ \ - /* it returns the value argument of longjmp, or if the value argument of \ - * longjmp is 0, */ \ - /* setjmp returns 1. There's no error return. */ \ - if (!setjmp(&asap::contract::details::jmp_env[0])) { \ - call; \ - /* This will never be reached if a violation occurs. The handler will \ - * call longjmp with a non-zero return value, causing the other branch \ - * after setjmp to be */ \ - violation_detected = 0; \ - } else { \ - /* This branch is executed when longjmp from the handler returns a \ - * non-zero value indicating a violation has occurred. */ \ - violation_detected = 1; \ - } \ - check(violation_detected == (expected), msg); \ - /* restore saved setjmp environment before the macro was called */ \ - memcpy(static_cast(asap::contract::details::jmp_env), \ - static_cast(old_jmp_buf), sizeof(old_jmp_buf)); \ - asap::contract::details::ContractCheckPop(); \ - } while (0) - -#if defined(_MSC_VER) -#define ASAP_CONTRACT_UT_CHECK_VIOLATION_(call, check) \ - __pragma(warning(push)) __pragma(warning(disable : 4611)) \ - ASAP_CONTRACT_UT_DO_CHECK_VIOLATION_(call, check, 1, \ - "'" #call ";' does not violate any contract") __pragma(warning(pop)) -#else -#define ASAP_CONTRACT_UT_CHECK_VIOLATION_(call, check) \ - ASAP_CONTRACT_UT_DO_CHECK_VIOLATION_( \ - call, check, 1, "'" #call ";' does not violate any contract") -#endif - -#endif // DOXYGEN_DOCUMENTATION_BUILD - -// NOLINTEND(cppcoreguidelines-macro-usage) diff --git a/contract/include/contract/ut/gtest.h b/contract/include/contract/ut/gtest.h deleted file mode 100644 index 4d4ddd4..0000000 --- a/contract/include/contract/ut/gtest.h +++ /dev/null @@ -1,95 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -/*! - * \file - * - * \brief Macros used with Google Test unit testing framework to test contract - * checking assertions without the need for death tests. - * - * To use, include the following call in your test main: - * ``` - * auto main(int argc, char **argv) -> int { - * asap::contract::PrepareForTesting(); - * ::testing::InitGoogleTest(&argc, argv); - * return RUN_ALL_TESTS(); - * } - * ``` - */ - -#pragma once - -#include - -#include - -// NOLINTBEGIN(cppcoreguidelines-macro-usage) - -// ------------------------------------------------------------------------------------------------- -// Public test macros -// ------------------------------------------------------------------------------------------------- - -/*! - * \brief An alias for ASSERT_VIOLATES_CONTRACT(), checks that the statement - * produces a contract violation and if not, the test is immediately terminated. - * - * If the statement does not produce a violation contract, execution is aborted. - * - * \note The implementation of this macro is not thread safe. - * - * \param call the statement to test. - * - * \see ASSERT_VIOLATES_CONTRACT - * \see EXPECT_VIOLATES_CONTRACT - */ -#define CHECK_VIOLATES_CONTRACT(call) ASSERT_VIOLATES_CONTRACT(call) - -/*! - * \brief Assert that the statement produces a contract violation. If the - * statement does not produce a contract violation contract, the test is - * immediately terminated. - * - * Use ASSERT_VIOLATES_CONTRACT when the condition must hold - if it doesn't the - * test stops right there. Use this when the remainder of the test doesn't have - * semantic meaning without this condition holding. - * - * \note The implementation of this macro is not thread safe. - * - * \param call the statement to test. - * - * \see EXPECT_VIOLATES_CONTRACT - */ -#define ASSERT_VIOLATES_CONTRACT(call) \ - ASAP_CONTRACT_UT_CHECK_VIOLATION_(call, ASAP_INTERNAL_FATAL_CHECK) - -/*! - * \brief Expect the statement to produce a contract violation. If the statement - * does not produce a contract, execution still continues. - * - * Use EXPECT when the condition should hold, but in cases where it doesn't we - * can still get value out of continuing the test. The test will still - * ultimately fail at the end, though. - * - * \note The implementation of this macro is not thread safe. - * - * \param call the statement to test. - * - * \see ASSERT_VIOLATES_CONTRACT - */ -#define EXPECT_VIOLATES_CONTRACT(call) \ - ASAP_CONTRACT_UT_CHECK_VIOLATION_(call, ASAP_INTERNAL_NON_FATAL_CHECK) - -// ------------------------------------------------------------------------------------------------- -// Internal macros -// ------------------------------------------------------------------------------------------------- - -// Exclude internal macros from doxygen documentation -#if !defined(DOXYGEN_DOCUMENTATION_BUILD) -#define ASAP_INTERNAL_FATAL_CHECK(cond, msg) ASSERT_TRUE(cond) << (msg); -#define ASAP_INTERNAL_NON_FATAL_CHECK(cond, msg) EXPECT_TRUE(cond) << (msg); -#endif // DOXYGEN_DOCUMENTATION_BUILD - -// NOLINTEND(cppcoreguidelines-macro-usage) diff --git a/contract/src/contract.cpp b/contract/src/contract.cpp deleted file mode 100644 index 1ccec38..0000000 --- a/contract/src/contract.cpp +++ /dev/null @@ -1,79 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -/*! - * \file - * - * \brief Implementation details for the contract checking API. - */ - -#include "contract/contract.h" - -#include - -#include -#include -#include - -namespace asap::contract { - -// ----------------------------------------------------------------------------- -// Unit Testing stuff -// ----------------------------------------------------------------------------- - -namespace { - -void PrintViolation(const Violation *violation) { - std::cerr << violation->file << ":" << violation->line << ": in " - << violation->function << ": " << violation->type << " '" - << violation->condition << "' violated" << std::endl; -} - -[[noreturn]] void DefaultViolationHandler(const Violation *violation) { - PrintViolation(violation); - abort(); -} - -} // namespace - -// Internal implementation of the singleton violation handler. -class ViolationHandler_impl : public ViolationHandler { -public: - static inline auto instance() -> ViolationHandler & { - ASAP_DIAGNOSTIC_PUSH -#if defined(ASAP_CLANG_VERSION) - ASAP_PRAGMA(clang diagnostic ignored "-Wexit-time-destructors") -#endif - static ViolationHandler_impl instance_; - ASAP_DIAGNOSTIC_POP - return instance_; - } - - void HandleViolation(const Violation *violation) override; - void SwapHandler(WrapperType &other_handler) override; - -private: - ViolationHandler_impl() = default; - - WrapperType handler = WrapperType{DefaultViolationHandler}; -}; - -void ViolationHandler_impl::HandleViolation(const Violation *violation) { - assert(violation != nullptr); // NOLINT - handler(violation); -} - -void ViolationHandler_impl::SwapHandler(WrapperType &other_handler) { - other_handler.swap(handler); -} - -auto GetViolationHandler() -> ViolationHandler & { - return ViolationHandler_impl::instance(); -} - -ViolationHandler::~ViolationHandler() = default; - -} // namespace asap::contract diff --git a/contract/src/contract_ut.cpp b/contract/src/contract_ut.cpp deleted file mode 100644 index 440aef5..0000000 --- a/contract/src/contract_ut.cpp +++ /dev/null @@ -1,82 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -/*! - * \file - * - * \brief Implementation details for the contract checking API. - */ - -#include "contract/contract.h" -#include "contract/ut/framework.h" - -#include -#include - -namespace asap::contract { - -// ----------------------------------------------------------------------------- -// Unit Testing stuff -// ----------------------------------------------------------------------------- - -namespace { - -void PrintViolation(const Violation *violation) { - std::cerr << violation->file << ":" << violation->line << ": in " - << violation->function << ": " << violation->type << " '" - << violation->condition << "' violated" << std::endl; -} - -// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -int contract_check_active = 0; - -// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -Verbosity verbosity_level = Verbosity::QUIET; - -[[noreturn]] void TestViolationHandler(const Violation *violation) { - if (contract_check_active == 0) { - std::cerr << "Unexpected contract violation:" << std::endl; - PrintViolation(violation); - abort(); - } - - if (verbosity_level == Verbosity::VERBOSE) { - PrintViolation(violation); - } - - // Restore calling environment and jump back to setjmp. Return - // -1 so that setjmp will return false for conditional test. - // NOLINTNEXTLINE - longjmp(details::jmp_env, 1); -} - -} // namespace - -namespace details { - -// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -jmp_buf jmp_env; - -void ContractCheckPush() { - contract_check_active++; -} - -void ContractCheckPop() { - contract_check_active--; -} - -} // namespace details - -void SetVerbosity(Verbosity verbosity) { - verbosity_level = verbosity; -} - -void PrepareForTesting() { - auto test_handler = ViolationHandler::WrapperType{TestViolationHandler}; - GetViolationHandler().SwapHandler(test_handler); -} - -} // namespace asap::contract diff --git a/contract/test/CMakeLists.txt b/contract/test/CMakeLists.txt deleted file mode 100644 index d9664a0..0000000 --- a/contract/test/CMakeLists.txt +++ /dev/null @@ -1,126 +0,0 @@ -# ===-----------------------------------------------------------------------===# -# Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -# copy at https://opensource.org/licenses/BSD-3-Clause). -# SPDX-License-Identifier: BSD-3-Clause -# ===-----------------------------------------------------------------------===# - -# ============================================================================== -# Build instructions -# ============================================================================== - -# If running with google sanitizers, skill all these targets as they are abort -# and segmentation fault tests that do not make sense to run under sanitizers -if(ASAP_WITH_GOOGLE_ASAN - OR ASAP_WITH_GOOGLE_UBSAN - OR ASAP_WITH_GOOGLE_TSAN) - return() -endif() - -function(_remove_contract_mode target) - get_target_property(defs ${target} COMPILE_DEFINITIONS) - list(REMOVE_ITEM defs ASAP_CONTRACT_DEFAULT ASAP_CONTRACT_AUDIT - ASAP_CONTRACT_OFF) - set_property(TARGET ${target} PROPERTY COMPILE_DEFINITIONS ${defs}) -endfunction() - -# ------------------------------------------------------------------------------ -# Default mode tests -# ------------------------------------------------------------------------------ - -set(target_name ${MODULE_TARGET_NAME}_contract_default_test) - -asap_add_test( - ${target_name} - UNIT_TEST - VALGRIND_MEMCHECK - SRCS - # headers - "test_helper.h" - # sources - "contracts_default_test.cpp" - "contract_handlers_test.cpp" - "contracts_honored_test.cpp" - "test_helper.cpp" - "main.cpp" - LINK - asap::common - asap::contract - gtest - gmock - COMMENT - "Contract unit tests in DEFAULT build mode") - -# Remove any existing contract mode compiler definition and force the mode to -# DEFAULT for this target. -_remove_contract_mode(${target_name}) -target_compile_definitions(${target_name} PRIVATE ASAP_CONTRACT_DEFAULT) - -gtest_discover_tests(${target_name}) - -# ------------------------------------------------------------------------------ -# OFF mode tests -# ------------------------------------------------------------------------------ - -set(target_name ${MODULE_TARGET_NAME}_contract_off_test) - -asap_add_test( - ${target_name} - UNIT_TEST - VALGRIND_MEMCHECK - SRCS - # headers - "test_helper.h" - # sources - "contracts_off_test.cpp" - "contracts_honored_test.cpp" - "test_helper.cpp" - "main.cpp" - LINK - asap::common - asap::contract - gtest - gmock - COMMENT - "Contract unit tests in OFF build mode") - -# Remove any existing contract mode compiler definition and force the mode to -# OFF for this target. -_remove_contract_mode(${target_name}) -target_compile_definitions(${target_name} PRIVATE ASAP_CONTRACT_OFF) - -gtest_discover_tests(${target_name}) - -# ------------------------------------------------------------------------------ -# Audit mode tests -# ------------------------------------------------------------------------------ - -set(target_name ${MODULE_TARGET_NAME}_contract_audit_test) - -asap_add_test( - ${target_name} - UNIT_TEST - VALGRIND_MEMCHECK - SRCS - # headers - "test_helper.h" - # sources - "contracts_audit_test.cpp" - "contracts_honored_test.cpp" - "test_helper.cpp" - "main.cpp" - LINK - asap::common - asap::contract - gtest - gmock - COMMENT - "Contract unit tests in AUDIT build mode") - -# Remove any existing contract mode compiler definition and force the mode to -# AUDIT for this target. -_remove_contract_mode(${target_name}) -target_compile_definitions(${target_name} PRIVATE ASAP_CONTRACT_AUDIT) - -gtest_discover_tests(${target_name}) - -add_subdirectory(ut) diff --git a/contract/test/contract_handlers_test.cpp b/contract/test/contract_handlers_test.cpp deleted file mode 100644 index 5adaec0..0000000 --- a/contract/test/contract_handlers_test.cpp +++ /dev/null @@ -1,91 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include - -#include - -#include -#include -#include -#include - -// Disable compiler and linter warnings originating from the unit test framework -// and for which we cannot do anything. Additionally, every TEST or TEST_X macro -// usage must be preceded by a '// NOLINTNEXTLINE'. -ASAP_DIAGNOSTIC_PUSH -#if defined(__clang__) && ASAP_HAS_WARNING("-Wused-but-marked-unused") -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wunused-member-function" -#endif -// NOLINTBEGIN(used-but-marked-unused) - -using ::testing::IsFalse; -using ::testing::IsNull; -using ::testing::IsTrue; -using ::testing::NotNull; - -namespace asap::contract { -namespace { - -/// The signature of functions which can be used as violation handler -/// implementation. -using FunctionType = void (*)(const Violation *); - -// NOLINTNEXTLINE -TEST(DefaultHandler, IsDefined) { - ViolationHandler::WrapperType dummy_handler; - auto &default_handler = GetViolationHandler(); - - default_handler.SwapHandler(dummy_handler); - auto *handler_function = dummy_handler.target(); - ASSERT_THAT(handler_function, NotNull()); - - // Restore the handler - default_handler.SwapHandler(dummy_handler); - handler_function = dummy_handler.target(); - ASSERT_THAT(handler_function, IsNull()); -} - -// NOLINTNEXTLINE -TEST(DefaultHandlerDeathTest, AbortOnViolation) { - auto &default_handler = GetViolationHandler(); - - const struct asap::contract::Violation violation = { - __FILE__, __LINE__, "my_function", "precondition", "1 == 2"}; - - // We don't want to be too stringent on what is printed when a contract - // violation is being handled. We just require that the output contains the - // word violated. NOLINTNEXTLINE - ASSERT_DEATH(default_handler.HandleViolation(&violation), "violated"); -} - -// NOLINTNEXTLINE -TEST(CustomHandler, HandleViolationCallsRegisteredHandler) { - ::testing::MockFunction violation_handler_mock{}; - auto function_mock = violation_handler_mock.AsStdFunction(); - auto &default_handler = GetViolationHandler(); - default_handler.SwapHandler(function_mock); - auto *handler_function = function_mock.target(); - ASSERT_THAT(handler_function, NotNull()); - - const asap::contract::Violation violation = { - __FILE__, __LINE__, "my_function", "precondition", "1 == 2"}; - - EXPECT_CALL(violation_handler_mock, Call(&violation)).Times(1); - default_handler.HandleViolation(&violation); - - default_handler.SwapHandler(function_mock); - handler_function = function_mock.target(); - ASSERT_THAT(handler_function, IsNull()); -} - -} // namespace -} // namespace asap::contract - -// NOLINTEND(used-but-marked-unused) -ASAP_DIAGNOSTIC_POP diff --git a/contract/test/contracts_audit_test.cpp b/contract/test/contracts_audit_test.cpp deleted file mode 100644 index cda4d3c..0000000 --- a/contract/test/contracts_audit_test.cpp +++ /dev/null @@ -1,98 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include "test_helper.h" - -#include "common/compilers.h" -#include "common/platform.h" - -#include - -// Disable compiler and linter warnings originating from the unit test framework -// and for which we cannot do anything. Additionally, every TEST or TEST_X macro -// usage must be preceded by a '// NOLINTNEXTLINE'. -ASAP_DIAGNOSTIC_PUSH -#if defined(__clang__) && ASAP_HAS_WARNING("-Wused-but-marked-unused") -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wunused-member-function" -#endif -// NOLINTBEGIN(used-but-marked-unused) - -namespace asap::contract { -namespace { - -// NOLINTNEXTLINE -TEST(AuditModeContractViolations, ExpectDefaultWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestExpectDefault(nullptr), - ::testing::KilledBySignal(SIGABRT), ".*"); -#else - ASSERT_DEATH(testing::TestExpectDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(AuditModeContractViolations, EnsureDefaultWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestEnsureDefault(nullptr), - ::testing::KilledBySignal(SIGABRT), ".*"); -#else - ASSERT_DEATH(testing::TestEnsureDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(AuditModeContractViolations, AssertDefaultWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestAssertDefault(nullptr), - ::testing::KilledBySignal(SIGABRT), ".*"); -#else - ASSERT_DEATH(testing::TestAssertDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(AuditModeContractViolations, ExpectAuditWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestExpectAudit(nullptr), - ::testing::KilledBySignal(SIGABRT), ".*"); -#else - ASSERT_DEATH(testing::TestExpectAudit(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(AuditModeContractViolations, EnsureAuditWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestEnsureAudit(nullptr), - ::testing::KilledBySignal(SIGABRT), ".*"); -#else - ASSERT_DEATH(testing::TestEnsureAudit(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(AuditModeContractViolations, AssertAuditWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestAssertAudit(nullptr), - ::testing::KilledBySignal(SIGABRT), ".*"); -#else - ASSERT_DEATH(testing::TestAssertAudit(nullptr), ""); -#endif -} - -} // namespace -} // namespace asap::contract - -// NOLINTEND(used-but-marked-unused) -ASAP_DIAGNOSTIC_POP diff --git a/contract/test/contracts_default_test.cpp b/contract/test/contracts_default_test.cpp deleted file mode 100644 index dc2b43f..0000000 --- a/contract/test/contracts_default_test.cpp +++ /dev/null @@ -1,98 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include "test_helper.h" - -#include "common/compilers.h" -#include "common/platform.h" - -#include - -// Disable compiler and linter warnings originating from the unit test framework -// and for which we cannot do anything. Additionally, every TEST or TEST_X macro -// usage must be preceded by a '// NOLINTNEXTLINE'. -ASAP_DIAGNOSTIC_PUSH -#if defined(__clang__) && ASAP_HAS_WARNING("-Wused-but-marked-unused") -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wunused-member-function" -#endif -// NOLINTBEGIN(used-but-marked-unused) - -namespace asap::contract { -namespace { - -// NOLINTNEXTLINE -TEST(DefaultModeContractViolations, ExpectDefaultWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestExpectDefault(nullptr), - ::testing::KilledBySignal(SIGABRT), "precondition.*violated"); -#else - ASSERT_DEATH(testing::TestExpectDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(DefaultModeContractViolations, EnsureDefaultWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestEnsureDefault(nullptr), - ::testing::KilledBySignal(SIGABRT), "postcondition.*violated"); -#else - ASSERT_DEATH(testing::TestEnsureDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(DefaultModeContractViolations, AssertDefaultWillAbort) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestAssertDefault(nullptr), - ::testing::KilledBySignal(SIGABRT), "assertion.*violated"); -#else - ASSERT_DEATH(testing::TestAssertDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(DefaultModeContractViolations, ExpectAuditWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestExpectAudit(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestExpectAudit(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(DefaultModeContractViolations, EnsureAuditWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestEnsureAudit(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestEnsureAudit(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(DefaultModeContractViolations, AssertAuditWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestAssertAudit(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestAssertAudit(nullptr), ""); -#endif -} - -} // namespace -} // namespace asap::contract - -// NOLINTEND(used-but-marked-unused) -ASAP_DIAGNOSTIC_POP diff --git a/contract/test/contracts_honored_test.cpp b/contract/test/contracts_honored_test.cpp deleted file mode 100644 index 967b4c4..0000000 --- a/contract/test/contracts_honored_test.cpp +++ /dev/null @@ -1,79 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include "test_helper.h" - -#include "common/compilers.h" - -#include - -// Disable compiler and linter warnings originating from the unit test framework -// and for which we cannot do anything. Additionally, every TEST or TEST_X macro -// usage must be preceded by a '// NOLINTNEXTLINE'. -ASAP_DIAGNOSTIC_PUSH -#if defined(__clang__) && ASAP_HAS_WARNING("-Wused-but-marked-unused") -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wunused-member-function" -#endif -// NOLINTBEGIN(used-but-marked-unused) - -namespace asap::contract { -namespace { - -// NOLINTBEGIN(cppcoreguidelines-macro-usage) -#if defined(ASAP_CONTRACT_DEFAULT) -#define INTERNAL_ACT_TESTSUITE_NAME DefaultModeContrcatsHonored -#elif defined(ASAP_CONTRACT_OFF) -#define INTERNAL_ACT_TESTSUITE_NAME OffModeContrcatsHonored -#elif defined(ASAP_CONTRACT_AUDIT) -#define INTERNAL_ACT_TESTSUITE_NAME AuditModeContrcatsHonored -#else -#define INTERNAL_ACT_TESTSUITE_NAME ContrcatsHonored -#endif -// NOLINTEND(cppcoreguidelines-macro-usage) - -// NOLINTNEXTLINE -TEST(INTERNAL_ACT_TESTSUITE_NAME, Expect) { - static int value = 1; - testing::TestExpectDefault(&value); -} - -// NOLINTNEXTLINE -TEST(INTERNAL_ACT_TESTSUITE_NAME, Ensure) { - static int value = 1; - testing::TestEnsureDefault(&value); -} - -// NOLINTNEXTLINE -TEST(INTERNAL_ACT_TESTSUITE_NAME, Assert) { - static int value = 1; - testing::TestAssertDefault(&value); -} - -// NOLINTNEXTLINE -TEST(INTERNAL_ACT_TESTSUITE_NAME, ExpectAudit) { - static int value = 1; - testing::TestExpectAudit(&value); -} - -// NOLINTNEXTLINE -TEST(INTERNAL_ACT_TESTSUITE_NAME, EnsureAudit) { - static int value = 1; - testing::TestEnsureAudit(&value); -} - -// NOLINTNEXTLINE -TEST(INTERNAL_ACT_TESTSUITE_NAME, AssertAudit) { - static int value = 1; - testing::TestAssertAudit(&value); -} - -} // namespace -} // namespace asap::contract - -// NOLINTEND(used-but-marked-unused) -ASAP_DIAGNOSTIC_POP diff --git a/contract/test/contracts_off_test.cpp b/contract/test/contracts_off_test.cpp deleted file mode 100644 index 66a421a..0000000 --- a/contract/test/contracts_off_test.cpp +++ /dev/null @@ -1,98 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include "test_helper.h" - -#include "common/compilers.h" -#include "common/platform.h" - -#include - -// Disable compiler and linter warnings originating from the unit test framework -// and for which we cannot do anything. Additionally, every TEST or TEST_X macro -// usage must be preceded by a '// NOLINTNEXTLINE'. -ASAP_DIAGNOSTIC_PUSH -#if defined(__clang__) && ASAP_HAS_WARNING("-Wused-but-marked-unused") -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wunused-member-function" -#endif -// NOLINTBEGIN(used-but-marked-unused) - -namespace asap::contract { -namespace { - -// NOLINTNEXTLINE -TEST(OffModeContractViolations, ExpectDefaultWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestExpectDefault(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestExpectDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(OffModeContractViolations, EnsureDefaultWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestEnsureDefault(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestEnsureDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(OffModeContractViolations, AssertDefaultWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestAssertDefault(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestAssertDefault(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(OffModeContractViolations, ExpectAuditWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestExpectAudit(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestExpectAudit(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(OffModeContractViolations, EnsureAuditWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestEnsureAudit(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestEnsureAudit(nullptr), ""); -#endif -} - -// NOLINTNEXTLINE -TEST(OffModeContractViolations, AssertAuditWillSegFault) { -#if !defined(ASAP_WINDOWS) - // NOLINTNEXTLINE - ASSERT_EXIT(testing::TestAssertAudit(nullptr), - ::testing::KilledBySignal(SIGSEGV), ".*"); -#else - ASSERT_DEATH(testing::TestAssertAudit(nullptr), ""); -#endif -} - -} // namespace -} // namespace asap::contract - -// NOLINTEND(used-but-marked-unused) -ASAP_DIAGNOSTIC_POP diff --git a/contract/test/main.cpp b/contract/test/main.cpp deleted file mode 100644 index 885f1bd..0000000 --- a/contract/test/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include - -auto main(int argc, char *argv[]) -> int { - testing::InitGoogleTest(&argc, argv); - testing::InitGoogleMock(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/contract/test/test_helper.cpp b/contract/test/test_helper.cpp deleted file mode 100644 index 15b49d3..0000000 --- a/contract/test/test_helper.cpp +++ /dev/null @@ -1,43 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include "../include/contract/contract.h" - -#include "test_helper.h" - -namespace asap::contract::testing { - -auto TestExpectDefault(const int *ptr) -> int { - ASAP_EXPECT(ptr); - return *ptr; -} - -auto TestEnsureDefault(const int *ptr) -> int { - ASAP_ENSURE(ptr); - return *ptr; -} - -auto TestAssertDefault(const int *ptr) -> int { - ASAP_ASSERT(ptr); - return *ptr; -} - -auto TestExpectAudit(const int *ptr) -> int { - ASAP_EXPECT_AUDIT(ptr); - return *ptr; -} - -auto TestEnsureAudit(const int *ptr) -> int { - ASAP_ENSURE_AUDIT(ptr); - return *ptr; -} - -auto TestAssertAudit(const int *ptr) -> int { - ASAP_ASSERT_AUDIT(ptr); - return *ptr; -} - -} // namespace asap::contract::testing diff --git a/contract/test/test_helper.h b/contract/test/test_helper.h deleted file mode 100644 index 7b892b8..0000000 --- a/contract/test/test_helper.h +++ /dev/null @@ -1,26 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#pragma once - -namespace asap::contract::testing { - -/* - * The test functions are placed in their own translation unit so that the - * compiler cannot optimize away the contract checks. Furthermore, the compiler - * cannot remove code that would be unreachable because off contract checks that - * are violated. - */ - -auto TestExpectDefault(const int *ptr) -> int; -auto TestEnsureDefault(const int *ptr) -> int; -auto TestAssertDefault(const int *ptr) -> int; - -auto TestExpectAudit(const int *ptr) -> int; -auto TestEnsureAudit(const int *ptr) -> int; -auto TestAssertAudit(const int *ptr) -> int; - -} // namespace asap::contract::testing diff --git a/contract/test/ut/CMakeLists.txt b/contract/test/ut/CMakeLists.txt deleted file mode 100644 index 0157ef4..0000000 --- a/contract/test/ut/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -# ===-----------------------------------------------------------------------===# -# Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -# copy at https://opensource.org/licenses/BSD-3-Clause). -# SPDX-License-Identifier: BSD-3-Clause -# ===-----------------------------------------------------------------------===# - -# ============================================================================== -# Build instructions -# ============================================================================== - -# If running with google sanitizers, skill all these targets as they are abort -# and segmentation fault tests that do not make sense to run under sanitizers -if(ASAP_WITH_GOOGLE_ASAN - OR ASAP_WITH_GOOGLE_UBSAN - OR ASAP_WITH_GOOGLE_TSAN) - return() -endif() - -function(_remove_contract_mode target) - get_target_property(defs ${target} COMPILE_DEFINITIONS) - list(REMOVE_ITEM defs ASAP_CONTRACT_DEFAULT ASAP_CONTRACT_AUDIT - ASAP_CONTRACT_OFF) - set_property(TARGET ${target} PROPERTY COMPILE_DEFINITIONS ${defs}) -endfunction() - -# ------------------------------------------------------------------------------ -# Unit Test Macros -# ------------------------------------------------------------------------------ - -set(target_name ${MODULE_TARGET_NAME}_contract_ut_test) - -asap_add_test( - ${target_name} - UNIT_TEST - VALGRIND_MEMCHECK - SRCS - "contract_ut_gtest_test.cpp" - LINK - asap::common - asap::contract - gtest - gmock - COMMENT - "Contract unit test macros tests") - -# Remove any existing contract mode compiler definition and force the mode to -# DEFAULT for this target. -_remove_contract_mode(${target_name}) -target_compile_definitions(${target_name} PRIVATE ASAP_CONTRACT_DEFAULT) - -gtest_discover_tests(${target_name}) diff --git a/contract/test/ut/contract_ut_gtest_test.cpp b/contract/test/ut/contract_ut_gtest_test.cpp deleted file mode 100644 index cc7b914..0000000 --- a/contract/test/ut/contract_ut_gtest_test.cpp +++ /dev/null @@ -1,117 +0,0 @@ -//===----------------------------------------------------------------------===// -// Distributed under the 3-Clause BSD License. See accompanying file LICENSE or -// copy at https://opensource.org/licenses/BSD-3-Clause). -// SPDX-License-Identifier: BSD-3-Clause -//===----------------------------------------------------------------------===// - -#include -#include - -#include -#include - -#include -#include -#include - -// Disable compiler and linter warnings originating from the unit test framework -// and for which we cannot do anything. Additionally, every TEST or TEST_X macro -// usage must be preceded by a '// NOLINTNEXTLINE'. -ASAP_DIAGNOSTIC_PUSH -#if defined(__clang__) && ASAP_HAS_WARNING("-Wused-but-marked-unused") -#pragma clang diagnostic ignored "-Wused-but-marked-unused" -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wunused-member-function" -#endif -// NOLINTBEGIN(used-but-marked-unused) - -namespace asap::contract { -namespace { - -auto TestExpectDefault(const int *ptr) -> int { - ASAP_EXPECT(ptr); - return *ptr; -} - -auto TestEnsureDefault(const int *ptr) -> int { - ASAP_ENSURE(ptr); - return *ptr; -} - -auto TestAssertDefault(const int *ptr) -> int { - ASAP_ASSERT(ptr); - return *ptr; -} - -// NOLINTNEXTLINE -TEST(GoogleTestDeathMacros, DefaultModeExpectDeath) { - CHECK_VIOLATES_CONTRACT(TestExpectDefault(nullptr)); -} - -// NOLINTNEXTLINE -TEST(GoogleTestDeathMacros, DefaultModeEnsureDeath) { - CHECK_VIOLATES_CONTRACT(TestEnsureDefault(nullptr)); -} - -// NOLINTNEXTLINE -TEST(GoogleTestDeathMacros, DefaultModeAssertDeath) { - CHECK_VIOLATES_CONTRACT(TestAssertDefault(nullptr)); -} - -void NestedViolator(int *ptr) { - CHECK_VIOLATES_CONTRACT(TestAssertDefault(ptr)); - TestEnsureDefault(nullptr); -} -void Violator(int *ptr) { - CHECK_VIOLATES_CONTRACT(TestAssertDefault(ptr)); - CHECK_VIOLATES_CONTRACT(NestedViolator(ptr)); - TestExpectDefault(nullptr); -} - -// NOLINTNEXTLINE -TEST(GoogleTestDeathMacros, NestedChecks) { - CHECK_VIOLATES_CONTRACT(Violator(nullptr)); -} - -// NOLINTNEXTLINE -TEST(GoogleTestDeathMacros, VerboseTestPrintsViolationInfo) { - class ErrorOutputRedirect { - public: - explicit ErrorOutputRedirect(std::streambuf *new_buffer) - : old(std::cerr.rdbuf(new_buffer)) { - } - - ErrorOutputRedirect(const ErrorOutputRedirect &) = delete; - ErrorOutputRedirect(const ErrorOutputRedirect &&) = delete; - auto operator=(const ErrorOutputRedirect &) - -> ErrorOutputRedirect & = delete; - auto operator=(const ErrorOutputRedirect &&) - -> ErrorOutputRedirect & = delete; - - ~ErrorOutputRedirect() { - std::cerr.rdbuf(old); - } - - private: - std::streambuf *old; - }; - - std::stringstream buffer; - ErrorOutputRedirect output(buffer.rdbuf()); - SetVerbosity(Verbosity::VERBOSE); - CHECK_VIOLATES_CONTRACT(TestExpectDefault(nullptr)); - auto text = buffer.str(); - EXPECT_THAT(text, ::testing::ContainsRegex("violated")); -} - -} // namespace -} // namespace asap::contract - -auto main(int argc, char **argv) -> int { - asap::contract::PrepareForTesting(); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - -// NOLINTEND(used-but-marked-unused) -ASAP_DIAGNOSTIC_POP