pax_global_header00006660000000000000000000000064145567430260014526gustar00rootroot0000000000000052 comment=42751eb9560ca08228aa451fb7aaf4aa0d0ab097 cmocka_extensions-cmocka_extensions-0.50.0/000077500000000000000000000000001455674302600210365ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/.clang-format000066400000000000000000000003331455674302600234100ustar00rootroot00000000000000BasedOnStyle: Google IndentWidth: 4 ColumnLimit: 120 UseTab: Never AllowShortFunctionsOnASingleLine: Empty DerivePointerAlignment: false PointerAlignment: Right UseTab: Never IndentWidth: 4 AlignConsecutiveMacros: true cmocka_extensions-cmocka_extensions-0.50.0/.clang-tidy000066400000000000000000000016241455674302600230750ustar00rootroot00000000000000Checks: ' -*, readability-identifier-naming, cert-env33-c,cert-err34-c,cert-flp30-c, bugprone-suspicious-string-compare, bugprone-macro-parentheses, misc-non-copyable-objects, clang-analyzer-core.uninitialized.*, clang-analyzer-unix.Malloc, clang-analyzer-unix.MismatchedDeallocator, -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling ' WarningsAsErrors: '*' CheckOptions: - { key: readability-identifier-naming.TypedefCase, value: CamelCase } - { key: readability-identifier-naming.TypedefPrefix, value: cmocka } - { key: readability-identifier-naming.TypedefSuffix, value: _t } - { key: readability-identifier-naming.TypedefIgnoredRegexp, value: '^_.+' } - { key: readability-identifier-naming.ParameterIgnoredRegexp, value: '^_.+' }cmocka_extensions-cmocka_extensions-0.50.0/.githooks/000077500000000000000000000000001455674302600227435ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/.githooks/pre-commit000077500000000000000000000013261455674302600247470ustar00rootroot00000000000000#!/bin/sh CLANG_TIDY_DIFF="" if [ -x /usr/share/clang/clang-tidy-diff.py ]; then CLANG_TIDY_DIFF="/usr/share/clang/clang-tidy-diff.py" fi if [ -x /usr/lib/llvm-*/share/clang/clang-tidy-diff.py ]; then CLANG_TIDY_DIFF="/usr/lib/llvm-*/share/clang/clang-tidy-diff.py" fi if [ "x$CLANG_TIDY_DIFF" = "x" ]; then echo "No clang-tidy-diff.py found, skipp pre commit checks" exit 0 fi RESULT=$(git diff --staged | ${CLANG_TIDY_DIFF} -p 1 2> /dev/null) echo $RESULT | grep "warning: " if [ $? -eq 0 ]; then echo "There are some coding style issues:" echo "$RESULT" exec < /dev/tty read -p "Commit anyway? (y/N): " ANSWER case $ANSWER in [Yy]* ) echo "Continue with linting errors..."; break;; * ) exit 1; esac fi cmocka_extensions-cmocka_extensions-0.50.0/.gitignore000066400000000000000000000004001455674302600230200ustar00rootroot00000000000000# eclipse project files and folders .profile .cprofile .settings .asciidoctorconfig.adoc compile_commands.json # Temporary folders for building and/or testing __pycache__ _build _demo b bld build build-* r release ci/sshconfig *.swp compile_commands.json cmocka_extensions-cmocka_extensions-0.50.0/CMakeLists.txt000066400000000000000000000010711455674302600235750ustar00rootroot00000000000000# SPDX-License-Identifier: MIT cmake_minimum_required(VERSION 3.21) include(cmake/project.cmake) project(cmocka_extensions LANGUAGES C VERSION ${CMOCKA_EXTENSIONS_VERSION}) list(APPEND CMAKE_PREFIX_PATH "${INSTALL_DIR}/usr/local/lib/cmake") project_set_environment() project_set_version_variables() project_add_documentation_target( TITLE "BaseOS Cmocka_extensions Documentation" MARKDOWN ${CMAKE_SOURCE_DIR}/documentation/documentation.md ) add_subdirectory(src) add_subdirectory(examples) if(PACKAGING) include(cmake/Packing.cmake) endif(PACKAGING) cmocka_extensions-cmocka_extensions-0.50.0/Jenkinsfile000066400000000000000000000103061455674302600232220ustar00rootroot00000000000000import jenkins.* import jenkins.model.* import hudson.* import hudson.model.* def ASMCOV_URI node { ASMCOV_URI = '' script { def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials( com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl.class, Jenkins.instance, null, null ); def jenkins_asmcov_uri = creds.findResult { it.id == 'jenkins_asmcov_uri' ? it : null } if(jenkins_asmcov_uri) { println(jenkins_asmcov_uri.id + ": " +jenkins_asmcov_uri.username + ": " + jenkins_asmcov_uri.password) ASMCOV_URI=jenkins_asmcov_uri.password } } } properties([gitLabConnection('GitLab')]) pipeline { options { gitlabBuilds(builds: ["cmocka_extensions", "build debug", "build release", "lint sources", "documentation"]) buildDiscarder(logRotator(numToKeepStr: env.BRANCH_NAME == "master"? "1000": env.BRANCH_NAME == "integration"?"1000":"3")) } agent { dockerfile { filename './ci/Dockerfile' reuseNode true additionalBuildArgs "--build-arg USER=jenkins \ --build-arg UID=\$(id -u) --build-arg GID=\$(id -g) --build-arg ASMCOV_URI=${ASMCOV_URI}" args '--privileged --userns=keep-id' label "podman" } } stages { stage('debug') { steps{ sh 'ls -lah' sh 'env' sh 'gcc --version' sh 'cmake --version' updateGitlabCommitStatus name: 'cmocka_extensions', state: 'running' } } stage('Build') { steps { parallel( debug: { gitlabCommitStatus("build debug") { sh '''#!/bin/bash -xe ./ci/build.sh --ci Debug ''' } }, release: { gitlabCommitStatus("build release") { sh '''#!/bin/bash -xe ./ci/build.sh --ci Release ''' } } ) } } stage('Lint sources') { steps{ gitlabCommitStatus("lint sources") { sh '''#!/bin/bash -xe export UNUSED_SOURCES="\ " ./ci/code_lint.py --ci --result-dir=build/Release/result/lint_results ./ci/checklicense.sh ''' } } post { always { archiveArtifacts artifacts: "build/Release/result/lint_results/**", fingerprint: true } } } stage('Build documentation') { steps{ gitlabCommitStatus("documentation") { sh './ci/build_doc.sh' } } post { success { archiveArtifacts artifacts: "build/Debug/doc/**, documentation/monitor.md", fingerprint: true } } } } post { changed { script { def jobName = env.JOB_NAME.tokenize('/') as String[]; def projectName = jobName[0]; def title = '[' + projectName + '] ' def message = ''; if (currentBuild.currentResult == 'FAILURE') { title += 'Pipeline for ' + env.BRANCH_NAME + ' has failed'; message = 'Hi, sorry but the pipeline is broken. See ' + env.BUILD_URL + ' for details.' } if(currentBuild.currentResult == 'SUCCESS') { title += 'Pipeline for ' + env.BRANCH_NAME + ' is now stable again'; message = 'Hi, the pipeline is now stable again. See ' + env.BUILD_URL + ' for details.' } emailext subject: title, body: message, recipientProviders: [ [$class: 'CulpritsRecipientProvider'], [$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider'] ], replyTo: '$DEFAULT_REPLYTO', to: '$DEFAULT_RECIPIENTS' } } success { updateGitlabCommitStatus name: 'cmocka_extensions', state: 'success' } failure { updateGitlabCommitStatus name: 'cmocka_extensions', state: 'failed' } always { cleanWs(cleanWhenNotBuilt: false, deleteDirs: true, disableDeferredWipeout: true, notFailBuild: true, patterns: [[pattern: '.gitignore', type: 'INCLUDE'], [pattern: '.trace', type: 'INCLUDE']]) } } } cmocka_extensions-cmocka_extensions-0.50.0/LICENSE000066400000000000000000000021131455674302600220400ustar00rootroot00000000000000MIT License Copyright (c) [2023] [emlix GmbH, Elektrobit Automotive GmbH] Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. cmocka_extensions-cmocka_extensions-0.50.0/README.md000066400000000000000000000061411455674302600223170ustar00rootroot00000000000000# cmocka_extensions A collection of mocking related code extensions for cmocka used by [elos](https://github.com/Elektrobit/elos/) and other projects. See [the documentation](documentation/documentation.md) for more details and [examples](examples) on how to use it. ## Building cmocka_extensions uses CMake for building: ```bash cmake -B ./build . make -C ./build all make -C ./build install ``` or use the CI hooks ```bash ./ci/build.sh [Release] ``` ### Workspace setup 1. Please run the following git commands after cloning the repository: ```bash git config core.hooksPath .githooks ``` to set the commit message template and to setup the project specific git hooks. 2. Usually it is a good idea to create a symlink to the compilation database created by cmake in the build directory. Run therefore: ``` ln -s build/Debug/cmake/compile_commands.json ``` or ``` ln -s build/Release/cmake/compile_commands.json ``` ## running the examples the examples also get build with ```bash ./ci/build.sh [Release] ``` and can be run with ```bash ./ci/examples-run.sh ``` or found in ``` build/ └── / ├── ... └── examples/ ├── ... └── test/ ├── ... ├── extref/ │ ├── ... │ ├── wrap/ │ │ ├── ... │ │ └── wrap_extref_example │ └── weak/ │ ├── ... │ └── weak_extref_example └── selfref/ ├── ... └── weak_selfref_example ``` ## Folders ### ci Scripts to be used by CI pipelines to build , run various tests and checks. ### documentation More detailed documentation of the mocked functions. ### src Contains the actual productive sources. #### src/cmocka_extensions Contains code. # License MIT License Copyright (c) [2023] [emlix GmbH, Elektrobit Automotive GmbH] The full text of the license can be found in the [LICENSE](LICENSE) file in the repository root directory. ## Powered by EB elos is powered by elektrobit automotive gmbh. Elektrobit is an automotive software company and developer of embedded software products for ECU, AUTOSAR, automated driving, connected vehicles and UX. elos isan integrated part of EB corbos Linux – built on Ubuntu is an open-source operating system for high-performance computing, leveraging the rich functionality of Linux while meeting security and industry regulations. ## Maintainers * Wolfgang Gehrhardt wolfgang.gehrhardt@emlix.com [@gehwolf](https://github.com/gehwolf) * Thomas Brinker thomas.brinker@emlix.com [@ThomasBrinker](https://github.com/ThomasBrinker) ## Credits * Andreas Schickedanz * Andreas Zdziarstek * Anja Lehwess-Litzmann * Annika Schmitt * Anton Hillerband * Benedikt Braunger * Christian Steiger * Daniel Glöckner * Fabian Godehardt * Friedrich Schwedler * Joerg Vehlow * Maryniuk Bogdan * Rainer Müller * Sabrina Otto * Thomas Brinker * Vignesh Jayaraman * Wolfgang Gehrhardt cmocka_extensions-cmocka_extensions-0.50.0/ci/000077500000000000000000000000001455674302600214315ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/ci/Dockerfile000066400000000000000000000046061455674302600234310ustar00rootroot00000000000000FROM ubuntu:jammy ARG USER=ci ARG UID=1000 ARG GID=1000 ARG ASMCOV_URI="not available" ARG CAPSTONE_VERSION=4.0.2 ARG TABVIEW_VERSION=1.9 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get install -y \ binutils-dev \ build-essential \ clang-format \ clang-tidy \ cmake \ curl \ gdb \ git \ libcmocka-dev \ libcsv-dev \ libiberty-dev \ linux-tools-generic \ locales \ ninja-build \ pandoc \ pandoc-plantuml-filter \ pkg-config \ python-is-python3 \ python3-pip \ python3-venv \ sudo \ wget \ zlib1g-dev \ && rm -rf /var/lib/apt/lists/* \ && rm /usr/bin/perf \ && find /usr/lib/linux-tools -name "perf" -executable -exec ln -s {} /usr/bin/perf \; RUN locale-gen en_US.UTF-8 \ && locale-gen de_DE.UTF-8 \ && groupadd -g $GID -o ci \ && useradd -m -u $UID -g $GID -o -s /bin/bash $USER \ && echo "$USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers RUN git clone --depth 1 --branch $CAPSTONE_VERSION https://github.com/aquynh/capstone.git RUN cd capstone/ \ && ./make.sh \ && sudo ./make.sh install RUN if [ "${ASMCOV_URI}" != "not available" ]; then git clone --depth 1 ${ASMCOV_URI} -b 'integration' \ && cmake -B build asmcov \ && make -C build \ && make -C build install; \ fi RUN git clone --depth 1 --branch $TABVIEW_VERSION https://gitlab.com/esr/tapview.git RUN cd tapview \ && sed -i '/$(INSTALL) -m 644 $(MANPAGES)/d' Makefile\ && make install DESTDIR=/ prefix=usr USER $USER ENV LC_ALL=en_US.UTF-8 ENV DOCKERBUILD=1 RUN python -m venv /home/$USER/.venv \ && . /home/$USER/.venv/bin/activate \ && python -m pip install \ beautifulsoup4 \ sphinx \ sphinx-c-autodoc \ sphinx-copybutton \ sphinx-favicon \ sphinxcontrib-programoutput # install sphinx-c-autodoc dependedncies RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc \ && echo "\n\ # for llvm 16 packages\n\ deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main\n\ deb-src http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main\n\ " | sudo tee /etc/apt/sources.list \ && sudo apt-get update \ && sudo apt-get install -y libclang1-16 \ && sudo ln -s /usr/lib/x86_64-linux-gnu/libclang-16.so.1 /usr/lib/libclang-16.so ENV SPHINX_VENV="/home/$USER/.venv/" ENV LOG4C_RCPATH="/base/elos/src/demo/elos_log4c_demo" WORKDIR /build CMD /bin/bash cmocka_extensions-cmocka_extensions-0.50.0/ci/build.sh000077500000000000000000000043501455674302600230710ustar00rootroot00000000000000#!/bin/bash set -e -u CMD_PATH=$(realpath "$(dirname "$0")") BASE_DIR=${CMD_PATH%/*} CMAKE_PARAM=${CMAKE_PARAM:-""} NINJA_PARAM=${NINJA_PARAM:-"-j$(nproc)"} PARAM="" OPTION_CI=0 OPTION_CLEAN=0 OPTION_VERBOSE=0 OPTION_PACKAGE=0 for element in "$@"; do case $element in --ci) OPTION_CI=1 ;; --clean|-c) OPTION_CLEAN=1 ;; --verbose|-v) OPTION_VERBOSE=1 ;; --package) OPTION_PACKAGE=1 ;; -*) echo "error: unknown option: $1"; exit 1 ;; *) PARAM="$PARAM $element" ;; esac done set -- $PARAM if [ $# -gt 1 ]; then echo "error: only one build-type allowed" exit 1 elif [ $OPTION_CI -eq 1 ]; then if [ $# -eq 0 ]; then echo "error: build-type must be explicitely set in CI mode" exit 1 fi CMAKE_PARAM="-DENABLE_CI=1" OPTION_CLEAN=1 OPTION_VERBOSE=1 fi BUILD_TYPE="${1:-Debug}" if [ $OPTION_PACKAGE -eq 1 ]; then CMAKE_PARAM="${CMAKE_PARAM} -D PACKAGING=true" BUILD_TYPE=Release OPTION_CLEAN=1 fi BUILD_DIR="$BASE_DIR/build/$BUILD_TYPE" RESULT_DIR="$BUILD_DIR/result" DIST_DIR="$BUILD_DIR/dist" CMAKE_BUILD_DIR="$BUILD_DIR/cmake" export LOCAL_INSTALL_DIR=${LOCAL_INSTALL_DIR:-"$DIST_DIR"} CMAKE_PARAM="${CMAKE_PARAM} -D INSTALL_DIR=${LOCAL_INSTALL_DIR}" DEP_BUILD_PARAM="" if [ $OPTION_CLEAN -eq 1 ]; then DEP_BUILD_PARAM="$DEP_BUILD_PARAM -c" if [ -e "$BUILD_DIR" ]; then echo "Removing $BUILD_DIR ..." rm -rf "$BUILD_DIR" fi fi if [ $OPTION_VERBOSE -eq 1 ]; then DEP_BUILD_PARAM="$DEP_BUILD_PARAM -v" NINJA_PARAM="$NINJA_PARAM -v" fi echo -e "\n#### Building $(basename "$BASE_DIR") ($BUILD_TYPE) ####" mkdir -p "$RESULT_DIR" "$DIST_DIR" if [ ! -e "$CMAKE_BUILD_DIR/build.ninja" ]; then cmake -B "$CMAKE_BUILD_DIR" "$BASE_DIR" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" -G Ninja $CMAKE_PARAM fi DESTDIR="$LOCAL_INSTALL_DIR" \ ninja -C "$CMAKE_BUILD_DIR" $NINJA_PARAM all install 2>&1 | tee "$RESULT_DIR/build_log.txt" re=${PIPESTATUS[0]} "$BASE_DIR/ci/check_build_log.py" "$RESULT_DIR/build_log.txt" # add an empty compile_commands.json file to satisfy the code_lint script if [ ! -f "$CMAKE_BUILD_DIR/compile_commands.json" ]; then echo [] > "$CMAKE_BUILD_DIR/compile_commands.json" fi exit "$re" cmocka_extensions-cmocka_extensions-0.50.0/ci/build_doc.sh000077500000000000000000000012551455674302600237170ustar00rootroot00000000000000#!/bin/bash CMD_PATH=$(cd "$(dirname "$0")" && pwd) BASE_DIR=${CMD_PATH%/*} BUILD_TYPE="${1:-Debug}" BUILD_DIR="$BASE_DIR/build/$BUILD_TYPE/" CMAKE_BUILD_DIR="$BUILD_DIR/cmake" echo -e "\n#################" echo -e "##\tBuild $BUILD_TYPE" echo -e "#################\n" LOCAL_INSTALL_DIR=${LOCAL_INSTALL_DIR:-"$BUILD_DIR/dist"} export cmocka_mocks_DIR="$LOCAL_INSTALL_DIR/usr/local/lib/cmake/cmocka_mocks/" export cmocka_extensions_DIR="$LOCAL_INSTALL_DIR/usr/local/lib/cmake/cmocka_extensions" cmake -B "$CMAKE_BUILD_DIR" "$BASE_DIR" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" -G Ninja ninja -v -C "$CMAKE_BUILD_DIR" -j$(nproc) cmocka_extensions_doc mv "$CMAKE_BUILD_DIR/doc" "$BUILD_DIR" cmocka_extensions-cmocka_extensions-0.50.0/ci/check_build_log.py000077500000000000000000000015231455674302600251040ustar00rootroot00000000000000#!/usr/bin/env python3 """ Checks build log for warnings and errors and displays a summary of them. """ import sys print("#################################") summary_lines = [] count_errors = 0 count_warnings = 0 f = open(sys.argv[1], "r") lines = f.readlines() f.close() state_collect = False for line in lines: if "warning:" in line: state_collect = True count_warnings += 1 summary_lines.append(line) elif "error:" in line: state_collect = True count_errors += 1 summary_lines.append(line) elif state_collect: if line[0] == " " or line[0] == "\t": summary_lines.append(line) else: state_collect = False for line in summary_lines: print(line.strip()) print("Build finished with %i errors and %i warnings" % (count_errors, count_warnings)) cmocka_extensions-cmocka_extensions-0.50.0/ci/checklicense.sh000077500000000000000000000025431455674302600244140ustar00rootroot00000000000000#!/bin/bash CMD_PATH=$(cd "$(dirname "$0")" && pwd) BASE_DIR=${CMD_PATH%/*} BUILD_DIR="$BASE_DIR/build/Debug" LICENSE_RESULT_DIR="${LINT_RESULT_DIR-${BUILD_DIR}/result/checklicense_results}" LICENSE="MIT" FINDINGS_LOGS="$LICENSE_RESULT_DIR/findings.log" function check_for_license { local SEARCH_PATH="$1" local SEARCH_PATTERN="$2" local LICENSE_HEADER="$3" local FINDINGS=0 for i in $(find "$SEARCH_PATH" -type f -name "$SEARCH_PATTERN" -not -path "$BASE_DIR/build*/*"); do local FIRST_LINE FIRST_LINE="$(head -n1 "$i")" if ! echo "$FIRST_LINE" | grep -Eqs "$LICENSE_HEADER" ; then echo "invalid header in $i expected:" | tee -a "$FINDINGS_LOGS" echo -e "$LICENSE_HEADER\nbut found\n$FIRST_LINE\n" | tee -a "$FINDINGS_LOGS" ((FINDINGS++)) fi done return $FINDINGS } mkdir -p "$LICENSE_RESULT_DIR" FINDINGS=0 check_for_license "$BASE_DIR" "*.h" "// SPDX-License-Identifier: $LICENSE" ((FINDINGS+=$?)) check_for_license "$BASE_DIR" "*.c" "// SPDX-License-Identifier: $LICENSE" ((FINDINGS+=$?)) check_for_license "$BASE_DIR" "CMakeLists.txt" "# SPDX-License-Identifier: $LICENSE" ((FINDINGS+=$?)) if [ $FINDINGS -eq 0 ]; then echo "LICENSE OK" | tee -a "$FINDINGS_LOGS" else echo "LICENSE CHECK FAILED ($FINDINGS issues)" | tee -a "$FINDINGS_LOGS" fi exit $FINDINGS cmocka_extensions-cmocka_extensions-0.50.0/ci/clean.sh000077500000000000000000000003141455674302600230500ustar00rootroot00000000000000#!/bin/sh -eu CMD_PATH=$(cd "$(dirname "$0")" && pwd) BASE_DIR=${CMD_PATH%/*} echo "remove build directories" rm -rf \ "$BASE_DIR/build" \ "$BASE_DIR/doc/build" \ "$BASE_DIR/doc/source/generated" cmocka_extensions-cmocka_extensions-0.50.0/ci/code_lint.py000077500000000000000000000546471455674302600237660ustar00rootroot00000000000000#!/usr/bin/env python3 """ Checks or fixes sources with clang-format """ import os import re import sys import glob import json import argparse import itertools import shutil import subprocess as sp def get_env(key, default=None): """ Gets the environment variable or a default value """ result = os.getenv(key, default) if result is None or result == "": result = default return result def test(error_code): """ Returns TEST SUCCESS or TEST FAILED based on the system code """ result = "TEST FAILED" if error_code == os.EX_OK: result = "TEST SUCCESS" return result def flatten_list(l): """ Returns a flattened list """ # https://stackoverflow.com/questions/952914/how-do-i-make-a-flat-list-out-of-a-list-of-lists return [item for sublist in l for item in sublist] def log_line(log_fh, line): """ Prints the given line to stdout and writes it to a file """ print(line) if log_fh: log_fh.write(line + "\n") def collect_sources_all(path_list): """ Collects all available sources (c and h files) in the given directory lists """ source_set = set() for path in path_list: for root, _, files in os.walk(path): for file in files: if file.endswith(".c") or file.endswith(".h"): source_set.add(os.path.abspath(os.path.join(root, file))) return source_set def prepare_compile_commands(cfg): """ Copy and adapt an existing compile_copmmands.json in a way that allows clang-tidy to run without errors due to gcc specific flags which clang does not understand """ print("Preparing compile_commands.json ..") ccj_src = os.path.join(cfg["build_dir"], 'compile_commands.json') ccj_dst = os.path.join(cfg["result_dir"], 'compile_commands.json') shutil.copyfile(ccj_src, ccj_dst) with open(ccj_dst, 'r+', encoding="utf-8") as json_fh: json_data = json.loads(json_fh.read()) json_fh.seek(0) json_fh.truncate() for i, _ in enumerate(json_data): if "command" in json_data[i]: cmd = json_data[i]["command"] cmd = cmd.replace("-fanalyzer ", "") json_data[i]["command"] = cmd json.dump(json_data, json_fh, indent=2) cfg["tidy_dir"] = cfg["result_dir"] def collect_sources_used(build_dir, json_file=None): """ Collects all available sources (c and h files) in the given compile_commands.json file """ source_set = set() json_dict_list = None if json_file is None: json_file = os.path.join(build_dir, 'compile_commands.json') with open(json_file, 'r', encoding="utf-8") as json_fh: json_dict_list = json.loads(json_fh.read()) inc_def_re = re.compile('(?:-I[^ ]+)|(?:-isystem [^ ]+)|(?:-D[^ ]+)') for json_dict in json_dict_list: source = json_dict["file"] idparam = [x.group(0) for x in inc_def_re.finditer(json_dict["command"])] idparam = ' '.join(idparam).split(" ") cc = json_dict["command"].split(" ")[0] command = [cc, '-MM', source, *idparam] output = sp.run(command, stdout=sp.PIPE, check=True) results = output.stdout.decode("utf-8").split() results = [ os.path.abspath(x) for x in results if x.endswith(".c") or x.endswith(".h") ] # Remove generated files like version.c from the list results = [ x for x in results if os.path.relpath(x, build_dir).startswith("..") ] source_set.update(results) return source_set def collect_sources_diff(base_dir, target_branch): """ Selects all sources (c and h files) that were modified and/or added between this branch and the target """ source_set = set() cwd = os.getcwd() os.chdir(base_dir) command = ["git", "rev-parse", "--show-toplevel"] output = sp.run(command, stdout=sp.PIPE, check=True) git_dir = output.stdout.decode("utf-8").strip() os.chdir(git_dir) command = ["git", "diff", "--name-status", target_branch] output = sp.run(command, stdout=sp.PIPE, check=True) if len(output.stdout) == 0: return source_set results = output.stdout.decode("utf-8").split("\n") results = [ x[2:] for x in results if x.startswith("M") or x.startswith("A") ] results = [ os.path.abspath(x) for x in results if x.endswith(".c") or x.endswith(".h") ] # Remove sources outside of base_dir results = [ x for x in results if not os.path.relpath(x, base_dir).startswith("..") ] source_set.update(results) os.chdir(cwd) return source_set def collect_sources_list_from_env(env_var, no_match_msg="Globs that don't match anything:"): """ Collect a list of sources from a list of globs in an enviroment variable. And print all the globs not matching any files. """ source_list = [] not_necessary = [] for x in get_env(env_var, "").split(" "): if len(x) <= 1: continue paths = glob.glob(x) if len(paths) == 0: not_necessary.append(x) else: source_list.append(paths) source_set = { os.path.abspath(x) for x in flatten_list(source_list) } if len(not_necessary) != 0: print(no_match_msg) for x in sorted(not_necessary): print(f" {x}") print("") return source_set def collect_sources_ignored(cfg): """ Collects ignored sources """ return collect_sources_list_from_env("IGNORE_SOURCES", "Not existing IGNORE_SOURCES globs:") def collect_sources_intentional_unused(cfg): """ Collect sources that are not used but shouldn't be ignored """ return collect_sources_list_from_env("UNUSED_SOURCES", "UNUSED_SOURCES globs not matcing anything:") def collect_sources(cfg): """ Collects all sources necessary for testing """ source_set = {} ignored_set = collect_sources_ignored(cfg) if "show_sources" not in cfg["steps"]: print("Linting with the following settings:") print(f"BASE_DIR = {cfg['base_dir']}") print(f"BUILD_DIR = {cfg['build_dir']}") print(f"LINT_RESULT_DIR = {cfg['result_dir']}") print("") if len(ignored_set) > 0: print("Ignored sources:") for source in sorted(ignored_set): print(f" {source}") print("") print("Collecting sources...") step_unused = sum([True for x in cfg["steps"] if x.endswith("unused")]) if cfg["collect_mode"] == "diff": branch = "integration" source_set["diff"] = collect_sources_diff(cfg["base_dir"], branch) source_set["diff"] -= ignored_set if cfg["collect_mode"] == "used" or step_unused: source_set["used"] = collect_sources_used(cfg['build_dir']) source_set["used"] -= ignored_set if cfg["collect_mode"] == "all" or step_unused: folders = [os.path.join(cfg['base_dir'], x) for x in ["src", "test"]] source_set["all"] = collect_sources_all(folders) source_set["all"] -= ignored_set source_set["intentionally_unused"] = collect_sources_intentional_unused( cfg) source_set["default"] = source_set[cfg["collect_mode"]] step_tidy = sum([True for x in cfg["steps"] if x.endswith("tidy")]) if step_tidy: mock_path = os.path.join(cfg["base_dir"], "test", "utest", "mocks") source_set["tidy"] = [ x for x in source_set["default"] if x.startswith(mock_path) is False] return source_set def show_sources(cfg, source_set): """ Simply prints a list of selectes sources """ sources = sorted(source_set[cfg["collect_mode"]]) for source in sources: print(source) return os.EX_OK def check_unused(cfg, source_set): """ Checks for unused files """ result = os.EX_OK state = "SUCCESS" log_file = os.path.join(cfg["result_dir"], "results_check_unused.txt") with open(log_file, 'w', encoding='utf-8') as log_fh: log_line(log_fh, "check_unused: Searching for unused files...") source_set_unused = source_set["all"].difference(source_set["used"]) source_set_known_unused = source_set_unused.intersection( source_set["intentionally_unused"]) source_set_unused -= source_set["intentionally_unused"] unused_file_count = len(source_set_unused) should_be_unused = source_set["used"].intersection( source_set["intentionally_unused"]) if unused_file_count > 0: log_line(log_fh, "Unused sources:") for file in sorted(list(source_set_unused)): log_line(log_fh, " " + file) log_line(log_fh, "") result = os.EX_DATAERR state = "FAILED" if len(source_set_known_unused) > 0: log_line(log_fh, f"Known and expected unused sources:") for source in sorted(source_set_known_unused): log_line(log_fh, f" {source}") log_line(log_fh, f"") if len(should_be_unused) > 0: log_line(log_fh, f"Specified as not used sources that are in use:") for source in sorted(should_be_unused): log_line(log_fh, f" {source}") log_line(log_fh, f"") result = os.EX_DATAERR state = "FAILED" log_line(log_fh, f"check_unused: TEST {state}; " + f"Found {unused_file_count} unused files!") return result def check_format(cfg, source_set): """ Checks the given set of sources with clang-format """ result = os.EX_SOFTWARE log_file = os.path.join(cfg["result_dir"], "results_check_format.txt") dump_file = os.path.join(cfg["result_dir"], "output_clang_format.txt") sources = source_set[cfg["collect_mode"]] error_lines = 0 with open(log_file, 'w', encoding='utf-8') as log_fh, \ open(dump_file, 'bw') as dump_fh: log_line(log_fh, "check_format: Verify formatting with clang-format..") if len(sources) == 0: log_line(log_fh, "check_format: TEST SKIPPED; No sources found.") return os.EX_OK log_fh.write("---- clang-format output start ---\n") params = ["--dry-run", "-Werror"] command = ["clang-format", *params, *sources] with sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT) as proc: buffer = "" while True: byte = proc.stdout.read(1) if byte: dump_fh.write(byte) buffer += byte.decode("utf-8") if buffer[-1] == '\n': if buffer.find(": error:") >= 0: error_lines += 1 result = os.EX_DATAERR log_line(log_fh, buffer) buffer = "" else: break result = proc.wait() log_fh.write("---- clang-format output stop ---\n") log_line(log_fh, f"check_format: {test(result)}; " + f"Found {error_lines} errors " + f"in {len(sources)} scanned files.") return result def check_tidy(cfg, source_set): """ Format the given set of sources with clang-format """ result = os.EX_OK log_file = os.path.join(cfg["result_dir"], "results_check_tidy.txt") dump_file = os.path.join(cfg["result_dir"], "output_clang_tidy.txt") sources = source_set["tidy"] error_lines = 0 with open(log_file, "w", encoding="utf-8") as log_fh, \ open(dump_file, "bw") as dump_fh: log_line(log_fh, "check_tidy: Verify formatting with clang-tidy..") if len(sources) == 0: log_line(log_fh, "check_tidy: TEST SKIPPED; No sources found.") return result log_fh.write("---- clang-tidy output start ---\n") command_params = [ "--extra-arg-before=-Wno-error=unknown-warning-option", "-p", cfg["tidy_dir"] ] command = ["clang-tidy", *command_params, *sources] with sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT) as proc: buffer = "" while True: byte = proc.stdout.read(1) if byte: dump_fh.write(byte) buffer += byte.decode("utf-8") if buffer[-1] == '\n': if buffer.find("warnings generated.") >= 0: pass elif buffer.find(": error:") >= 0: log_line(log_fh, buffer) error_lines += 1 result = os.EX_DATAERR else: log_line(log_fh, buffer) buffer = "" else: break result = proc.wait() log_fh.write("---- clang-tidy output stop ---\n") log_line(log_fh, f"check_tidy: {test(result)}; " + f"Found {error_lines} errors " + f"in {len(sources)} scanned files.") return result def fix_unused(cfg, source_set): """ Checks for unused files """ del cfg result = os.EX_OK source_set_unused = source_set["all"].difference(source_set["used"]) unused_file_count = len(source_set_unused) if unused_file_count > 0: print("fix_unused: Removing files...") for file in sorted(list(source_set_unused)): print(" " + file) os.unlink(file) print() print(f"fix_unused: Removed {unused_file_count} files.") else: print("fix_unused: No unused files found to remove.") return result def fix_format(cfg, source_set): """ Format the given set of sources with clang-format """ result = os.EX_SOFTWARE sources = source_set[cfg["collect_mode"]] command = ["clang-format", "-i", *sources] print("fix_format: Try to fix formatting in sources") if len(sources) == 0: print("fix_format: TEST SKIPPED; No sources found.") return os.EX_OK with sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT) as proc: while True: byte = proc.stdout.read(1) if byte: sys.stdout.buffer.write(byte) sys.stdout.flush() else: break result = proc.wait() print(f"fix_format: {len(sources)} files were formatted.") return result def fix_tidy(cfg, source_set): """ Format the given set of sources with clang-tidy """ result = os.EX_SOFTWARE sources = source_set["tidy"] command_params = [ "--fix-errors", "--extra-arg=-Wno-error=unknown-warning-option", "--warnings-as-errors=-*", "-p", cfg["tidy_dir"] ] command = ["clang-tidy", *command_params, *sources] print("fix_tidy: Try to fix formatting in sources") if len(sources) == 0: print("fix_tidy: TEST SKIPPED; No sources found.") return os.EX_OK with sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT) as proc: buffer = "" while True: byte = proc.stdout.read(1) if byte: buffer += byte.decode("utf-8") if buffer[-1] == '\n': if buffer.find("warnings generated.") < 0: print(buffer) buffer = "" else: break result = proc.wait() print(f"fix_tidy: {len(sources)} files were formatted.") return result def parameter_process_steps(args, cfg): """ Sets the steps to be executed """ cfg["steps"] = set() steps_def = [["format", "f"], ["tidy", "t"]] steps_all = [["unused", "u"], *steps_def] steps = [*steps_all, ["all", "a"]] if args.ci: cfg["steps"].update([f"check_{x[0]}" for x in steps_all]) return cfg if args.show: cfg["steps"].add("show_sources") return cfg modes = {"check": args.check, "fix": args.fix} active_modes = [x[0] for x in modes.items() if x[1] is not None] for key in active_modes: if len(modes[key]) == 0: cfg["steps"].update([f"{key}_{s[0]}" for s in steps_def]) continue for value in modes[key]: found = False for step in steps: if value in step: cfg["steps"].add(f"{key}_{step[0]}") found = True break if not found: values = ", ".join(itertools.chain(*steps)) print(f"{sys.argv[0]}: error: " + f"Unknown value '{value}', valid values are: {values}") sys.exit(os.EX_USAGE) if f"{key}_all" in cfg["steps"]: cfg["steps"].remove(f"{key}_all") cfg["steps"].update([f"{key}_{s[0]}" for s in steps_all]) return cfg def parameter_process_directories(args, cfg): """ Processes parameters and environment to set used directories """ cfg["base_dir"] = args.base_dir if cfg["base_dir"] is None: default = os.path.join(os.path.dirname(sys.argv[0]), '..') cfg["base_dir"] = get_env("BASE_DIR", default) cfg["base_dir"] = os.path.abspath(cfg["base_dir"]) if os.path.exists(cfg["base_dir"]) is False: print(f"{sys.argv[0]}: error: " + f"BASE_DIR path '{cfg['base_dir']}' does not exist!") sys.exit(os.EX_OSFILE) cfg["build_dir"] = args.build_dir if cfg["build_dir"] is None: default = os.path.join(cfg["base_dir"], 'build', 'Debug', 'cmake') if args.ci: default = os.path.join( cfg["base_dir"], 'build', 'Release', "cmake") cfg["build_dir"] = get_env("BUILD_DIR", default) cfg["build_dir"] = os.path.abspath(cfg["build_dir"]) if os.path.exists(cfg["build_dir"]) is False: print(f"{sys.argv[0]}: error: " + f"BUILD_DIR path '{cfg['build_dir']}' does not exist!") sys.exit(os.EX_OSFILE) cfg["result_dir"] = args.result_dir if cfg["result_dir"] is None: default = os.path.join(cfg["build_dir"], 'lint_results') cfg["result_dir"] = get_env("LINT_RESULT_DIR", default) cfg["result_dir"] = os.path.abspath(cfg["result_dir"]) cfg["tidy_dir"] = cfg["result_dir"] if os.path.exists(cfg["result_dir"]) is False: os.mkdir(cfg["result_dir"]) return cfg def parameter_process(args, cfg): """ Sets the default values for unset parameters and a few other things """ if args.ci: cfg["ci"] = True cfg["collect_mode"] = "all" else: cfg["ci"] = False mode = {0: "diff", 1: "all", 2: "diff", 4: "used"} cfg["collect_mode"] = mode[ int(args.select_all) << 0 | int(args.select_diff) << 1 | int(args.select_used) << 2 ] cfg = parameter_process_steps(args, cfg) cfg = parameter_process_directories(args, cfg) return cfg def parameter_parse(): """ Parses command line arguments """ parser = argparse.ArgumentParser( description="Tool for checking and fixing source formatting") grp_mode = parser.add_mutually_exclusive_group(required=True) grp_mode.add_argument( "-c", "--check", nargs="*", help="Checks sources (unused sources, " + "clang-format, clang-tidy) and shows errors.") grp_mode.add_argument( "-f", "--fix", nargs="*", help="Try to fix sources (remove unused files," + " format with clang-format and clang-tidy). " + " MAY DAMAGE FILES, be sure to commit everything beforehand.") grp_mode.add_argument( "-s", "--show", action="store_true", help="Prints a list of selected sources") grp_mode.add_argument( "--ci", action="store_true", help="Special mode intended for use in " + "continuous integration, uses all tests and " + "./build/Release as build-dir per default.") grp_select = parser.add_mutually_exclusive_group(required=False) grp_select.add_argument( "-d", "--select-diff", action="store_true", help="Selects sources based on git branch " + "differences compare to the 'integration' branch (default)") grp_select.add_argument( "-u", "--select-used", action="store_true", help="Selects sources based on compile_commands.json" + "(only uses compiled files, slow)") grp_select.add_argument( "-a", "--select-all", action="store_true", help="Selects all sources in src and test") parser.add_argument( "--base-dir", help="Base directory (e.g. ./) to use; " + "Can also be set with 'export BASE_DIR'") parser.add_argument( "--build-dir", help="Build directory (e.g. ./build) to use; " + "Can also be set with 'export BUILD_DIR'") parser.add_argument( "--result-dir", help="Result directory " + "(e.g. ./build/lint_result) to use; " + "Can also be set with 'export LINT_RESULT_DIR'") args = parser.parse_args() return args def execute_steps(cfg, source_set): """ Runs every specified step and returns an appropriate success/error code """ result = os.EX_OK results = [] function = dict(x for x in globals().items() if callable(x[1])) for step in cfg["steps"]: if step not in function: raise Exception(f"No function exists for step '{step}'!") result = function[step](cfg, source_set) results.append(result) info = None failures = len([x for x in results if x != os.EX_OK]) if failures > 0: result = os.EX_DATAERR info = f"FAILED; {failures} of {len(results)} steps failed!" else: info = f"SUCCESS; {len(results) - failures} " +\ f"of {len(results)} steps executed successfully." if "show_sources" not in cfg["steps"]: print(info) return result def main(): """ Main function, called during command line operation """ args = parameter_parse() cfg = parameter_process(args, {}) source_set = collect_sources(cfg) if len(source_set) == 0: print("No sources found." + " Perhaps try --select-json or --select-all? (see --help)") sys.exit(os.EX_NOINPUT) if "check_tidy" in cfg["steps"] or "fix_tidy" in cfg["steps"]: prepare_compile_commands(cfg) result = execute_steps(cfg, source_set) sys.exit(result) if __name__ == "__main__": main() cmocka_extensions-cmocka_extensions-0.50.0/ci/docker-run.sh000077500000000000000000000020031455674302600240340ustar00rootroot00000000000000#!/bin/sh -e # # create and run docker build env # CMD_PATH=$(cd "$(dirname "$0")" && pwd) BASE_DIR=${CMD_PATH%/*} PROJECT=cmocka-extensios IMAGE_NAME="${PROJECT}-build" if [ -f "${HOME}/.ssh/asmcov_token" ]; then echo "Loading asmcov token from ${HOME}/.ssh/asmcov_token." . "${HOME}/.ssh/asmcov_token" fi echo "==> create docker image" cd "$BASE_DIR/ci" docker build \ --build-arg UID=$(id -u) --build-arg GID=$(id -g) \ --build-arg ASMCOV_URI="${ASMCOV_URI-not available}" \ --tag ${IMAGE_NAME} -f Dockerfile . echo "==> run $PROJECT build container" if ! [ -e "$BASE_DIR"/ci/sshconfig ]; then { echo "Host *" echo " User $(id -u -n)" } > "$BASE_DIR"/ci/sshconfig fi if [ "$SSH_AUTH_SOCK" ]; then SSH_AGENT_SOCK=$(readlink -f "$SSH_AUTH_SOCK") SSH_AGENT_OPTS="-v $SSH_AGENT_SOCK:/run/ssh-agent -e SSH_AUTH_SOCK=/run/ssh-agent" fi docker run --rm -it $SSH_AGENT_OPTS \ -v "$BASE_DIR":/base \ -w /base \ --privileged \ --device=/dev/kmsg \ $IMAGE_NAME "$@" cmocka_extensions-cmocka_extensions-0.50.0/ci/examples-run.sh000077500000000000000000000010661455674302600244130ustar00rootroot00000000000000#!/bin/sh -e set -e -u CMD_PATH=$(realpath "$(dirname "$0")") BASE_DIR=${CMD_PATH%/*} if [ $# -gt 1 ]; then echo "error: only one build-type allowed" exit 1 fi BUILD_TYPE="${1:-Debug}" echo "===> Weak Extref Example" "${BASE_DIR}/build/${BUILD_TYPE}/cmake/examples/test/utest/extref/weak/weak_extref_example" echo "===> Wrap Extref Example" "${BASE_DIR}/build/${BUILD_TYPE}/cmake/examples/test/utest/extref/wrap/wrap_extref_example" echo "===> Weak Selfref Example" "${BASE_DIR}/build/${BUILD_TYPE}/cmake/examples/test/utest/selfref/weak_selfref_example" cmocka_extensions-cmocka_extensions-0.50.0/ci/package.sh000077500000000000000000000003551455674302600233660ustar00rootroot00000000000000#!/bin/bash set -e -u -o pipefail CMD_PATH=$(realpath "$(dirname "$0")") BASE_DIR=${CMD_PATH%/*} BUILD_TYPE="${1:-Release}" BUILD_DIR="$BASE_DIR/build/$BUILD_TYPE" CMAKE_BUILD_DIR="$BUILD_DIR/cmake" cd "$CMAKE_BUILD_DIR" cpack -G DEB cmocka_extensions-cmocka_extensions-0.50.0/cmake/000077500000000000000000000000001455674302600221165ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/cmake/Packing.cmake000066400000000000000000000030241455674302600244730ustar00rootroot00000000000000# SPDX-License-Identifier: MIT # these are cache variables, so they could be overwritten with -D, set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) # which is useful in case of packing only selected components instead of the whole thing set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Extensions to cmocka for elos, safu and samconf") set(CPACK_PACKAGE_VENDOR "emlix") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME}) SET(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_SOURCE_DIR}/build/packages") # https://unix.stackexchange.com/a/11552/254512 set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) set(CPACK_PACKAGE_CONTACT "info@emlix.com") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Anton Hillebrand") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md") # package name for deb. If set, then instead of some-application-0.9.2-Linux.deb # you'll get some-application_0.9.2_amd64.deb (note the underscores too) set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) # that is if you want every group to have its own package, # although the same will happen if this is not set (so it defaults to ONE_PER_GROUP) # and CPACK_DEB_COMPONENT_INSTALL is set to YES set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE) # without this you won't be able to pack only specified component set(CPACK_DEB_COMPONENT_INSTALL YES) include(CPack) cmocka_extensions-cmocka_extensions-0.50.0/cmake/index.rst000066400000000000000000000002301455674302600237520ustar00rootroot00000000000000CMake options ============= ENABLE_ASAN=[on|off] -------------------- default: on Control if cmocka_extensions should be build with address sanitizer cmocka_extensions-cmocka_extensions-0.50.0/cmake/project.cmake000066400000000000000000000077041455674302600245760ustar00rootroot00000000000000# SPDX-License-Identifier: MIT set(CMOCKA_EXTENSIONS_VERSION 0.50.0) # Attention: Aside from the version, as many things as possible in this file # should be put into functions, as this solves potential issues with commands # being run before "project()" gets called in the including CMakeLists.txt. # It also does not force the usage of everything at once which can be useful, # should we need to do things different in one of the projects in the future. macro(project_set_environment) set(CMAKE_C_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_C_FLAGS_DEBUG "") set(CMAKE_C_FLAGS_RELEASE "") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(GNUInstallDirs) option(UNIT_TESTS "Build unit tests" ON) option(ENABLE_ANALYZER "Build with -fanalyzer" ON) option(ENABLE_CI "Use CI mode for building" OFF) option(INSTALL_UNIT_TESTS "Install unit tests" ON) option(ENABLE_ASAN "Link with ASAN" ON) add_compile_options( -Wshadow -Wall -Wextra -pedantic -D_DEFAULT_SOURCE ) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug") endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") if (ENABLE_ASAN) link_libraries(asan) add_compile_options(-fsanitize=address) endif() add_compile_options( -Og -g3 -DDEBUG -fno-omit-frame-pointer $,-fanalyzer,> $,-Wno-analyzer-malloc-leak,> ) elseif(CMAKE_BUILD_TYPE STREQUAL "Release") add_compile_options(-O3 -DNDEBUG -g $,-Werror,>) elseif(CMAKE_BUILD_TYPE STREQUAL "Profiling") add_compile_options(-O3 -DNDEBUG -g -fno-omit-frame-pointer) elseif(CMAKE_BUILD_TYPE STREQUAL "Tsan") link_libraries(tsan) add_compile_options( -Og -g3 -DDEBUG -fsanitize=thread -fno-omit-frame-pointer $,-fanalyzer,> $,-Wno-analyzer-malloc-leak,> ) endif() endmacro() find_package(Git REQUIRED) function(project_set_version_variables) if(ARGN) cmake_parse_arguments(PSVV "" "NAME" "" ${ARGN}) set(prj_name ${PSVV_NAME}) else() set(prj_name ${PROJECT_NAME}) endif() string(TOUPPER ${prj_name} prefix) set(ver_major_name "${prefix}_VERSION_MAJOR") set(ver_minor_name "${prefix}_VERSION_MINOR") set(ver_micro_name "${prefix}_VERSION_MICRO") set(ver_git_name "${prefix}_VERSION_GIT") set(ver_pkg "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(${ver_major_name} ${PROJECT_VERSION_MAJOR} PARENT_SCOPE) set(${ver_minor_name} ${PROJECT_VERSION_MINOR} PARENT_SCOPE) set(${ver_micro_name} ${PROJECT_VERSION_PATCH} PARENT_SCOPE) set(PKG_VERSION ${ver_pkg} PARENT_SCOPE) execute_process( COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE exit_code OUTPUT_VARIABLE git_output OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT exit_code EQUAL 0) message(WARNING "failed to retrive git short commit hash") set(git_output "none") endif() set(${ver_git_name} ${git_output} PARENT_SCOPE) message(STATUS "-- Set version for ${prj_name}: ${ver_pkg}.${git_output}") endfunction() function(project_add_documentation_target) if (TARGET cmocka_extensions_doc) return() endif () cmake_parse_arguments(PARAM "" "MARKDOWN;TITLE" "" ${ARGN}) find_program(PLANTUML NAMES plantuml) find_program(PANDOC NAMES pandoc) add_custom_target( cmocka_extensions_doc mkdir -p ${CMAKE_BINARY_DIR}/doc/images && ${PLANTUML} ${CMAKE_SOURCE_DIR}/documentation/images/*.plantuml && ${PANDOC} -s --from gfm --to html --filter pandoc-plantuml -o ${CMAKE_BINARY_DIR}/doc/${PROJECT_NAME}_doc.html --css style.css ${PARAM_MARKDOWN} --metadata title='${PARAM_TITLE}' && cmake -E copy_if_different ${CMAKE_SOURCE_DIR}/documentation/style.css doc/ && cmake -E copy_if_different ${CMAKE_SOURCE_DIR}/documentation/images/*.png doc/images/ ) endfunction() cmocka_extensions-cmocka_extensions-0.50.0/doc/000077500000000000000000000000001455674302600216035ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/doc/source/000077500000000000000000000000001455674302600231035ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/doc/source/_static/000077500000000000000000000000001455674302600245315ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/doc/source/_static/eb-logo.png000066400000000000000000000415521455674302600265720ustar00rootroot00000000000000PNG  IHDR~[BPLTEjEtRNS9KZjz{iXG5"$3+?^w[= 8ShyoE. /Uԫ0-R׹}: pܳbuL7qOY(I2xWѕMDfcgs#|e \t<)4, ;~V@m*J>&v`TCͶB Qk1ɿ]nAdPH!a%ؼ6r'N_FlvΗ?IDATxg`U'HG"-H^H>"M@( J$$ tޛHUz l%&[瞙y73{$Xtϐ1S,Y==000(G#G!!y_c*ʽRK^pŒ)^p'Kbē%3*]l垊,_bҭAUZ-sgjd;k Sn4lĽZ4nҴ@Gk*ehXP8J6mo׾C*ѣ;v޹s]WOKL5ݚD<߭{UzP>s~ܑR+e`Ώ<+d24*q#JkýzUѸ ѹtY Gv`4wtqyc093nܱqo@*{ķR;ӏ$Ԕ!q!"d:M;-"ėg?{!g㸃VŠȉ:3Sf߇1ZqЕ*f(&w9Ԩܜ|OS[8˞ L𮑅vSff:n1 =`3/q!jqKBভsʒ˸5+v"ת܂eMwuqC|O.YZnӰܲ0|nIW~8;z|M& ,[?9EsTS+Klsx`.SGo#O/ :UǽjngPȫ^܋'͠2Qs_Tvk6n;5>RWl D;t31CNlkzJO}Of:s8)Ο~)T ɽ\#!;ԏ)V#TyKͺbJmԲAPEq`tr!y/ofreW h}Z*GyNo1Tq/ՐڟU#d&PPYWjL⿧kBPm㦓2j*_m)HA'i`֒oQ2 ͏DM?LPNWip  @wI~Bɮ@WˑN#?u`?wTF`.1xÎ+xXƒ]R~M~jUR,]/JəCB]HȧCMo~eS%wwr3|0=6Yx<^#Ns{I/>?}i@mgVeeMScwɀ|$QkG#|5H3fP}/apuFvJ6L9Wӊ"c O|߮Qw2cs,&/ ֧*:,+i>o} $.i}NWr6Fd3A&A_,Bo=}(]sJŀzo-%ioƧG}^؂8կG[buC.-vPtnWAC3 !Q(= m~Yuf+.Y8Z,KsB$j?E;"F(R?'0G9pctgb}$ ElF8v[e]hWQcWØf^j~%y^lC_KrSoґo\V? hƈy/.UQVj\`}߃#"4CbU?,bG *#̾GnEu]PᘇX+W7ĈDz[ʑmH8#uK  $hDQˆ] }R%DktAp^ӳ>ۍzifVyA!e#'")9?IzJŗդ(T7QE ]ZQޗV˯{VLߙ=(|;><ǭ$g2-Zn_4 ||dS=hS9Ms.a/<@GP«'->;Ƃg[EB]!׀PW7>F'TbfRZ[b FW޾&Dw-!!Sq:+4 qcn*OlE+WZ}T\~;[?R:t2$uLIo`gm7S\ e/$`=󈷹sœ7bKP cA Uz: v|w(fMve-$aJ]Ev5ޚT[9ZnzdY" R/)ozz;|4lG ݅;@+%zKz1OoqK$T?h=mANa%jCw pZ_I6h?TA Z):'p!ʟ厃Tr Z[ ! ňuCJ aw [ !4LjU;.2רaHWJsWF(HaaAU@"8 j")LSer(p#k ,ن_8wF@j]TB:unyPVc@(@eTTr QsAm>wԁz:-@ŕrA*ƥnРֺy{RҢ0ʠr#Pqz\p#VE{Ÿp A`IJέ>q*Rba5ʠr#u⎃y\jS2LnuD-FyqP]ŭB0Z玃p" CnyDpU8hhk)ZQG(jweIQ" jѮtP#Qʭ@T?ѿ#da./m^T .zZ/@*b e0J2(n}#UK8HHooJT[. 2RaQ{3 6배`V#p6@7 S?ˏp+DmP/ h배l>BjG밭A,۠2ReQ-=A=dذTF4lzTTL=0JpkDmPte7nȱ GSA=rGFMJj^zM8V۠e4ډ9ajADLCҎ=fМku"6'P%riUJWn PaJYvlPdsDmPTPӴ!&1d=RO0 i7 gPEnh (-qB5޵0 JQ:nGq­)A݃d+3\[+Rlg? *YK4uKx4>naU)ĭ%ADW-[A݂1cA㖋۠] T?i3Рrn ꎿ`މ/~ HN S 0t00%4n ꆷpxiҠ'j4-`{LI! *֌ ۠i3ў&5|l4 ㌓,EgpFm4| M5ӜtU~MM@ߴ~s *ImP'weY8ȭ ۠N`S5NK"x}.pK6C>Ia\D]-{6zbOt7 a>ݰV?{xZ-6}:G2[H,Aq $+Kr_7|ZͽleS.O(vCoX6h m;ml&>%mMpCMi`4 pQ8u> Wa4QxǣK qWd~º=p݇+ #ZE Z|TzcȺwzw"?/XР]f=pwCTMrt6}gA{^^FȉL*"8ΰ_t}ßM0gk[X3'}w2c ]_fA0`4ũs}F._dZ7*Zɩ 6]^dddmoo`6tIHH8tD1K4{hl̟-t;"Nw՟VhC=Tt>bh +ݗT5ik ̾nСeM,Y Țǡ&o> ԟX5$d 98)ǘנ cm(ؠr'14rK!tRS󜦓UV?-nQ;μGG̓6; sm1h靫aѠ3Ag ʂe?%i:w`4oV%eЊqka>nǿܡ) zp& "gҫ|蠬I$AlHd3QIMJ|ПTy,wFЍAk9J݈@mȵuCī6Vuʟt: 2S厒?G 7T+'QM?%8Q'Ov3A7 B)I6rGJ2V [ SY1q$iEܺ`O:e#t%^KiD. f2 , z[ Ϸ;=[,ɠM5.XɠUMY*ZC~Wz(*{VIy,ct35ʚg#ǣIAp끡C[728l09mJ"Y="(N>mkiP.Ҡ&ߪwb2|;;` +H#ҠE,t w4Sy5,,ّ;VujЛܢ ,U)`;wD($ܠ6nU%"{$+0^mDJ'0 =BXQY;D*VZls+eb Z/j ܟ`}'?+eREmP\nm~̟PTdij/wtH\Y1T@Tܗ TRdy-I돷"csjt`0t)[#,9%;**6%aPXnh͜1Q1Ye+4Jrs/pAQq\AA?r+%]/~@ `2$$ߡͽKρ f9uSS$۠ i=ی),-$۠ 넷Ke/R|g-#۠N)}yyv3EcԙelSm=cԅYqmx3EIE5u%mE:> xxOMG}-AS06Ox=Q|[n =VEܗDOo6hf7,z۠np Ś篴SwRvuGQ| 䖌 ۠n)Ok7dl%yOr FmP 5P{ûȲAhuPYW>[.:lz .زS!A=1icEd"v 1Я'\>Z-%A=ՑCȷwlz E\$]-)A= 袍GZsf6gGh}ee#FϹ;GF>TR Ԓ;i qsDJLĀ}ux8l ?qDLF'Rz<Wy%t;w44ZaϷQ/qKD o q1g4 y`+IR1OwDTeuD?,g3>RpA0m<Г*8st}qq5ᖇP3߸ cN}:Ib08HU;24)[z qB06L@H/ŨnȏHr[iՂ;:pqS{ 6U Ҫ4w tdj|xdqK#F NqBNnw@ 7Ͳx$ @rTn3gFAbP%I%H_!OFk;2$ww$DV*enQpmH(y RU3U+ay(~厄y\w)&N<+w$ $#5(-}6 U-7BGnMeP+OT(]' Ԟ[AAt+w$ʄF-E`},2sGBJJCOA#DeQ= )A*} [ApGB@*?tw(T[BQr"0Tqzhܢ56hGf?>}*._z48aSyǥ<>or-/lpJ;($d~̨;NyM^^2~@3#x ޔ^j$ suLLWmL \wBgF*(,ĿFCw^aౣ?!((vnnU<0Ls)Y`cY4Dy(j>/q-R2PyO*> -bW">}ne=qhPBbO6[US[T uj㻃^RBus_"&iO<ɕo({x֕f* 2%Q:ض2ވWJIay3Đ]mt?ʷ°}D}6К f _e@dgW҄j 9O6[A='tIξF?!{EjbECכEсכ̐ZZ']ΜW T][Oa[ Ԡ̲p3d@J%@S3@rD<1OI)Ȕ.h*^;P8_~.ٹaхrvوBp=ss_4ATrw\,ڿ/`gL~9G)uyi>`?ɻxQ  (DA%Zz0c题$Vc*B{^ϡDwbuO!ܶ|>XzfBB_H[Y@MqKY`d,;"BګJ͞3܂ߜiլρ 3/压q M>喅-v[ʋR$ Ҳq,-$L$K'Ej%88gK'?O{\7 L#>ø=Fu-K J ^ƴ H>Hv4eGsOrKb~+qcr;O11qUMsfVKܮSEY߷/ 0dS3>o,n+CNQӊkkVLҗ֦nh 9?Qȱe绹bĐ97-.+m3=`gڑ1ܪ=y[|2XzZL^И[df'qwft}Ӥbw6C`}C-#h} U[(v gCŘ?%Bs#؄t(o*<y[4ɶ G̘F,1QǺ#nFJuZU+XC ܢroeKDpn1 0O=>_<0 }?K![/p כ3u" BiuFޤy%Bb.F=m1 ܣBJ8nV,D>Y)` to be able to use it in this test. And then the relevant library from that package needs to be included with `::` in the `LIBRARIES` section of the call to `create_unit_test`. To use the `create_unit_test` cmake function `unit_test.cmake` needs to be included somewhere in the cmake files. The parameters of `crate_unit_test` are: - `NAME`: The name for the unit test binary - `SOURCES`: The list of sources for this test. - `INCLUDES`: A list of additional include directories - `LIBRARIES`: The libraries to use. The order is important for wreak mocking libraries. - `DEFINITIONS`: Additional compile definitions. #### example `elos/test/utest/elosd/eventlogging/JsonBackend/elosJsonBackendPersist/CMakeLists.txt`

find_package(safu)

create_unit_test(
  NAME
  test_jsonBackend_elosJsonBackendPersist_utest
  SOURCES
    case_exterr_eventSerialize.c
    case_exterr_writeExactly.c
    case_success.c
    elosJsonBackendPersist_utest.c
  LIBRARIES
    elosd_lib_static_weak
    mock_elos_common_static
    safu::mock_safu
)
First `find_package(safu)` is needed to bring the safu mocks into the tests. And then the specific library `safu::mock_safu` to include the mocking definitions. ### Setup Test-Case The mocking header need to be included `#include <[mock_package]/[mock_library].h>`. And before the mock is used mocking needs to be activated by call to the macro `MOCK_FUNC_AFTER_CALL(, 0)` or something equivalent (detailed description in [conditonal mocking](#conditional-mocking-api)). Then `expect_value(...)` and all the other cmocka functions can be used normally with the function name `__wrap_` for the mocked version of the function and `__real_` for the original. #### Example (normal mocking) ```c #include [...] void elosTestElosJsonBackendPersistExterrWriteExactly(void **state) { elosTestState_t *testState = *state; MOCK_FUNC_AFTER_CALL(safuWriteExactly, 0); expect_value(__wrap_safuWriteExactly, fd, 0); expect_string(__wrap_safuWriteExactly, buf, testState->expectedString); expect_value(__wrap_safuWriteExactly, len, strlen(testState->expectedString)); will_return(__wrap_safuWriteExactly, -1); safuResultE_t reult = testState->backend->persist(testState->backend, &testState->event); assert_int_equal(result, SAFU_RESULT_FAILED); } ``` The safu mocks `safu/mock_safu.h` are included for the header with `__wrap_safuWriteExactly` and `__real_safuWriteExactly`. And mocking for `safuWriteExactly` is activated with `MOCK_FUNC_AFTER_CALL(safuWriteExactly, 0)` after that all the usual cmocka functions are used with `__wrap_safuWriteExactly`. #### Example (with function overloading) ```c #include [...] typedef struct mockData { ssize_t totalBytesWritten; ssize_t functionCalls; } mockData_t; ssize_t _customWriteExactly(UNUSED int fd, UNUSED const void *buf, size_t len) { ssize_t result = len; MOCK_FUNC_DATA_NEW(mockData, mockData_t, safuWriteExactly); mockData->totalBytesWritten += len; mockData->functionCalls += 1; return len; } void elosTestElosJsonBackendPersistExterrWriteExactly(void **state) { elosTestState_t *testState = *state; mockData_t mockData = {0}; safuResultE_t result; MOCK_FUNC_ALWAYS_WITH(safuWriteExactly, _customWriteExactly, &mockData); result = testState->backend->persist(testState->backend, &testState->event); assert_int_equal(result, SAFU_RESULT_FAILED); assert_int_equal(mockData->totalBytesWritten, 42); assert_int_equal(mockData->functionCalls, 4); MOCK_FUNC_NEVER(safuWriteExactly); } ``` Fundamentally works the same as with normal mocking, but here we can define a custom function that is called by the mocking library instead of the normal cmocka based parameter checks. This has a few key advantages in certain situations, like more dynamic error injection (e.g. fail if an Event has a certain combination of values), simulation of more complex function calls (e.g. state changes, return values depending on parameters and so on), or, like in the example above, simply collect data from the calls to compare against expected values after the test case ran its course. The syntax of the call is either of the following: - `MOCK_FUNC_ALWAYS_WITH(, , <&mockData>);` - `MOCK_FUNC_AFTER_CALL_WITH(, , , <&mockData>);` To access the mockData (which can be any variable type) within the overloaded function: - `MOCK_FUNC_DATA_NEW(, , );` Note that mockData is optional for the function overloading, it can be set to NULL in the MOCK_FUNC_ calls if it isn't needed. ## Use weak Mocking ### Setup CMake The `_static_weak` version of the library needs to be included and the `mock__static` mock definitions. #### Example `elos/test/utest/elosd/eventlogging/JsonBackend/elosJsonBackendPersist/CMakeLists.txt`

find_package(safu)

create_unit_test(
  NAME
  test_jsonBackend_elosJsonBackendPersist_utest
  SOURCES
    case_exterr_eventSerialize.c
    case_exterr_writeExactly.c
    case_success.c
    elosJsonBackendPersist_utest.c
  LIBRARIES
    elosd_lib_static_weak
    mock_elos_common_static
    safu::mock_safu
)
First the `_weak` version of the `elosd_lib_static` library needs to be used so that the mock library `mock_elos_common_static` can override the relevant calls. ### Setup test case The mocking header for the specific function that should be mocked need to bee included (`#include "mock_[specific header].h"`). And before the mock is used mocking needs to be activated by a call to the macro `MOCK_FUNC_AFTER_CALL(, 0)` or something equivalent (detailed description in [conditonal mocking](#conditional-mocking-api)). Then all cmocka functions can be used with the original function name. If in some instance the original function needs to be called this is possible by calling `__real_`. #### Example ```c #include "mock_event.h" [...] void elosTestElosJsonBackendPersistExterrEventSerialize(void **state) { elosTestState_t *testState = *state; MOCK_FUNC_AFTER_CALL(elosEventSerialize, 0); expect_value(elosEventSerialize, ptr, &testState->event); will_return(elosEventSerialize, NULL); safuResultE_t result = testState->backend->persist(testState->backend, &testState->event); assert_int_equal(result, SAFU_RESULT_FAILED); } ``` The elos event mock header (`mock_event.h`) are included for the mock definition of `elosEventSerialize`. And mocking of `elosEventSerialize` is activated with `MOCK_FUNC_AFTER_CALL(elosEventSerialize, 0)`. After that the usual cmocka functions are used with `elosEventSerialize`. ## Conditional mocking API In addition to the test functionalities from [cmocka](https://api.cmocka.org/) in `cmocka_extensions` are some definitions to make creating and running the unit tests a bit easier. ### Setup unit tests - `TEST_CASE_FUNC_PROTOTYPES()`: Generates prototypes for the test case function as well as the setup and teardown functions. - `void (void **state)` - `int Setup(void **state)` - `int Teardown(void **state)` - `TEST_CASE()`: Wrapper to call `cmocka_unit_test_setup_teardown(...)` with the functions initialized by `TEST_CASE_FUNC_PROTOTYPES(...)`. Used to add a unit test with setup and teardown to a test suite. - `TEST_SUITE_FUNC_PROTOTYPES()`: Generates prototypes for setup and teardown functions for the test suite. - `RUN_TEST_SUITE(, )`: Takes an Array of test cases, like defined with `TEST_CASE(...)` and runs them with setup and teardown functions like the once defined in `TEST_SUITE_FUNC_PROTOTYPES(...)`. - `SKIP(fmt, ...)`: Skip running this test with a provided skip message for the test log. - `TEST(method)`: Name of the test for the test log. - `SHOULD(fmt, ...)`: Description what the test should do, for the test log. - `PARAM(fmt, ...)`: Parameter description for the test log. Useful for tests which are run with a multitude of configurations to see which of them specifically failles. ### Enable mocking for a function call - `MOCK_FUNC_AFTER_CALL(, N)`: Mock after `N` calls to the original function (no mocking at -1, and alway mocks at -2). - `MOCK_FUNC_ENABLE()`: Mock the next calls to the function. Is an alias for `MOCK_FUNC_AFTER_CALL(, 0)` - `MOCK_FUNC_ALWAYS()`: Mock all subsequent calls to the function. Is an alias for `MOCK_FUNC_AFTER_CALL(, -2)` - `MOCK_FUNC_DISABLE()`: Disable mocking for the function again (needed after `MOCKI_FUNC_ALWAYS()`). Is an alias for `MOCK_FUNC_AFTER_CALL(, -1)` - `MOCK_FUNC_NEVER()`: The same as `MOCK_FUNC_DISABLE()` ### Mock call - `will_set_errno(, )`: For functions which might set `errno` to set a specific value in the mock call. - `will_return_and_set_errno(, , )`: For functions which might set `errno` to set it to a specific value in the mock call and specify a return value. - `will_return_success(, )`: Sets the return value to 0 and set the value of the return pointer parameter to the ``. For functions that are mocked in a way that first set the return value, and then, only if that indicates success set the return pointer from the parameter to the intended ``. - `will_return_error(__mockf)`: Alias for `will_return(__mockf, -1)`. Sets the return value to -1 and the function most likely then is set to skip setting a return parameter pointer and immediately return. - `will_set_parameter(METHOD, PARAM_NAME, VALUE)`: Alias for the cmocka function `will_return(METHOD, VALUE)` to indicate return value in parameter pointer need to be in correct order. ### Miscellaneous helper functions/macros - `UNUSED`: Alias for `__attribute__((unused))` - `ARRAY_SIZE(array)`: Macro to get the size of an Array - `void assert_non_null_msg(void *ptr, const char *msg)` - `void assert_double_equal(const double left, const double right, const double epsilon)` assert if two `double` values are within epsilon difference of each other. # Create a mock library ## Setup CMake ### make a weak version of the library Include the cmake file `weak_library.cmake` wich defines the function `create_weak_library` that takes a static library and generates a static_weak library. Needs the script `create_weak_library.sh` to be somewhere reachable. Looks for it at `${PROJECT_SOURCE_DIR}/test/tools/create_weak_library.sh` per default. Parameter of `create_weak_library`: - `FROM`: The name of the library to make weak. Needs to be a static library - `TO`: The output name for the week library to be generated. Defaults to `_weak` - `HELPER_SCRIPT`: The path to `create_weak_library.sh`. Necessary when the script can't be found in its default location. - `WEAKEN_DEPENDENCIES`: A list of dependencies that will be replaced by there weak version. ### create the mock library Include the cmake file `create_mock_lib.cmake` wich defines the function `create_mock_lib` that takes the mocking code, some build options and dependencies and generates a static mock library utilising weak mocking and a shared mock library using wrap mocking. Parameters of `create_mock_lib`: - `NAME`: The name for the dynamic mock library the static library is `_static` - `SOURCES`: The list of source files to compile to the mock library. - `INCLUDES`: A list of include directories to be included `PUBLIC` - `INCLUDES_DYNAMIC`: A list of include directories only used for the dynamic library (currently unused) - `INCLUDES_STATIC`: A list of include directories only used for the static library (currently unused) - `LIBRARIES`: A list of libraries to be used with the static weak mock library as well as the dynamic wrap mock library. - `LIBRARIES_DYNAMIC`: A list of libraries only to be used with the dynamic wrap mock library. - `LIBRARIES_STATIC`: A list of libraries only to be used with the static weak mock library. - `DEFINITIONS`: A list of `PRIVATE` compile definitions for both the static weak and the dynamic wrap target. - `DEFINITIONS_DYNAMIC`: A list of `PRIVATE` compile definitions only for the dynamic wrap target. - `DEFINITIONS_STATIC`: A list of `PRIVATE` compile definitions only for both the static weak and the dynamic wrap target. - `WRAP_FLAG`: The compile flag to compile with wrap definitions. - `WRAPS`: A list of all functions that should be linked with `--wrap`. Only used for dynamic libraries. - `NO_DYNAMIC_LIBRARY`: Do not generate a shared object (.so) for the mock library. Use this for testing project components that are used only internally. An example of this can be found in `cmocka_examples/test/utest/mocks/extref_dependency/CMakeList.txt` ## Write mock header file `cmocka_extensions/mock_extensions.h` needs to be included. And one of `cmocka_extensions/mock_func_wrap.h` or `cmocka_extensions/mock_func_weak.h` need to be included depending on a compile time definition. ```c #ifdef #include #else #include #endif ``` And then the macro `MOCK_FUNC_PROTOTYPE(, , )` should be used to generate the header code for mocking that function. ### Example Found in `cmocka_examples/test/utest/mocks/extref_dependency/mock_extref_dependency.h` ```c #ifndef _MOCK_EXAMPLE_EXTREF_DEPENDENCY_H #define _MOCK_EXAMPLE_EXTREF_DEPENDENCY_H #include #ifdef MOCK_EXAMPLE_EXTREF_DEPENDENCY_FUNC_LINKER_WRAPPING #include #else #include #endif #include "dependency.h" MOCK_FUNC_PROTOTYPE(dependency, int, int a, int b) #endif /* _MOCK_EXAMPLE_EXTREF_DEPENDENCY_H */ ``` ## Write mock source Use `MOCK_FUNC_BODY(, , )` followed by the body for the mock function. In the function body the macro `MOCK_GET_TYPE()` should be used to get details about the current mode the mocking is in. This can be one of the following: - `CMOCKA_MOCK_ENABLED_WITH_FUNC`: mocking with a manually defined mock function is active. - `CMOCKA_MOCK_ENABLED`: normal cmocka based mocking with `check_expected()` and `mock_type()`. - `CMOCKA_MOCK_DISABLED`: no mocking, call the normal function. To call the original the macro `MOCK_FUNC_REAL()` can be used, for the manually defined mock function use `MOCK_FUNC_WITH()` instead Inside the active mock part of the function the cmock way of handling parameters and return values should be used. ### Example Found in `cmocka_examples/test/utest/mocks/extref_dependency/mock_extref_dependency.c` ```c #include "mock_extref_dependency.h" #include #include #include MOCK_FUNC_BODY(functionToMock, int, int a, int b) { int result; switch (MOCK_GET_TYPE(functionToMock)) { case CMOCKA_MOCK_ENABLED_WITH_FUNC: result = MOCK_FUNC_WITH(functionToMock)(a, b); break; case CMOCKA_MOCK_ENABLED: check_expected(a); check_expected(b); result = mock_type(safuResultE_t); break; default: result = MOCK_FUNC_REAL(functionToMock)(a, b); break; } return result; } ``` Set errno in function call ```C will_return_and_set_errno(, ); ``` # Generate weak library ![Weak Library Creation](images/weak_mocking_library.png "Weak Library Creation") An exact copy of the libraries object file is created with `objcopy`, with just a symbol alias, with the prefix `__real`, for all global symbols added. Then in a second step all the original global symbols are marked as weak, so they will be replaced if in the linking step there is another definition of that symbol, instead of throwing an error. The symbol table of the original library: ``` 000000000000004a T dependency 0000000000000000 T function U printf U puts ``` and the symbol table of the weak version of the library: ``` 000000000000004a W dependency 0000000000000000 W function 000000000000004a T __real_dependency 0000000000000000 T __real_function U printf U puts ``` ## Self referencing Library ![Base Setup](images/scenario_selfref.png "Base Setup") To handle the conflict of `dependencyFunc()` with the mocked version of it `objcopy` is used to turn all symbols in the library into weak symbols so the mocked version can override it. In the example source this is done with `make selfref_weak.o` for the object file, `make libseflref_static.a` for a static library and `make libseflref_shared.so` for a shared library. | Scenario | LibFunction | mockLibDependency | Resulting Mock Test | | :------: | :----------: | :---------------: | :-----------------: | | [A](#scenario-a) | Static | Shared | doesn't work | | [B](#scenario-b) | Static | Object | Works | | [C](#scenario-c) | Static | Static | doesn't work | | [D](#scenario-d) | Shared | Shared | doesn't work | | [E](#scenario-e) | Shared | Object | Works | | [F](#scenario-f) | Shared | Static | doesn't work | All of the scenarios use the weak version of the library, as to not have a conflict between the original and the mocked dependency. The working scenarios are [Scenario B](#scenario-b) for a binary statically linked with the library, and [Scenario E](#scenario-e) for a binary linked with a shared library. ### Scenario A statically links the library and dynamically links the mocked library. Build with: `make scenario_a` ![Scenario A](images/scenario_a.png "Scenario A") The resulting symbol table of the test binary:

000000000000037c r __abi_tag
0000000000004020 B __bss_start
0000000000004020 b completed.0
                 w __cxa_finalize@GLIBC_2.2.5
0000000000004010 D __data_start
0000000000004010 W data_start
00000000000011be W dependency
0000000000001090 t deregister_tm_clones
0000000000001100 t __do_global_dtors_aux
0000000000003dd8 d __do_global_dtors_aux_fini_array_entry
0000000000004018 D __dso_handle
0000000000003de0 d _DYNAMIC
0000000000004020 D _edata
0000000000004028 B _end
0000000000001228 T _fini
0000000000001140 t frame_dummy
0000000000003dd0 d __frame_dummy_init_array_entry
00000000000021a0 r __FRAME_END__
0000000000001174 W function
00000000000011be T __real_dependency
0000000000001174 T __real_function
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000207c r __GNU_EH_FRAME_HDR
0000000000001000 T _init
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34
0000000000001149 T main
                 U printf@GLIBC_2.2.5
                 U puts@GLIBC_2.2.5
00000000000010c0 t register_tm_clones
0000000000001060 T _start
0000000000004020 D __TMC_END__
shows that only the weak functions are part of the binary and not the mocked versions. This doesn't work, because all needed symbols (`function()` and `dependency()`) are already linked from the static library so the dynamic loader has no reason to search for them. ### Scenario B Statically links the library and directly links the object file of the mocked library. Build with: `make scenario_b` ![Scenario B](images/scenario_b.png "Scenario B") The resulting symbol table of the test binary:

000000000000037c r __abi_tag
0000000000004020 B __bss_start
0000000000004020 b completed.0
                 w __cxa_finalize@GLIBC_2.2.5
0000000000004010 D __data_start
0000000000004010 W data_start
0000000000001174 T dependency
0000000000001090 t deregister_tm_clones
0000000000001100 t __do_global_dtors_aux
0000000000003dd8 d __do_global_dtors_aux_fini_array_entry
0000000000004018 D __dso_handle
0000000000003de0 d _DYNAMIC
0000000000004020 D _edata
0000000000004028 B _end
000000000000128c T _fini
0000000000001140 t frame_dummy
0000000000003dd0 d __frame_dummy_init_array_entry
0000000000002218 r __FRAME_END__
00000000000011d9 W function
0000000000001223 T __real_dependency
00000000000011d9 T __real_function
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
00000000000020cc r __GNU_EH_FRAME_HDR
0000000000001000 T _init
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34
0000000000001149 T main
                 U printf@GLIBC_2.2.5
                 U puts@GLIBC_2.2.5
00000000000010c0 t register_tm_clones
0000000000001060 T _start
the weak `dependency()` is replaced by the mocked version in this binary. This correctly mocks `dependency()`. ### Scenario C Statically links both the library and the mocked library. Build with: `make scenario_c` ![Scenario C](images/scenario_c.png "Scenario C") The resulting symbol table of the test binary:

000000000000037c r __abi_tag
0000000000004020 B __bss_start
0000000000004020 b completed.0
                 w __cxa_finalize@GLIBC_2.2.5
0000000000004010 D __data_start
0000000000004010 W data_start
00000000000011be W dependency
0000000000001090 t deregister_tm_clones
0000000000001100 t __do_global_dtors_aux
0000000000003dd8 d __do_global_dtors_aux_fini_array_entry
0000000000004018 D __dso_handle
0000000000003de0 d _DYNAMIC
0000000000004020 D _edata
0000000000004028 B _end
0000000000001228 T _fini
0000000000001140 t frame_dummy
0000000000003dd0 d __frame_dummy_init_array_entry
00000000000021a0 r __FRAME_END__
0000000000001174 W function
00000000000011be T __real_dependency
0000000000001174 T __real_function
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000207c r __GNU_EH_FRAME_HDR
0000000000001000 T _init
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34
0000000000001149 T main
                 U printf@GLIBC_2.2.5
                 U puts@GLIBC_2.2.5
00000000000010c0 t register_tm_clones
0000000000001060 T _start
0000000000004020 D __TMC_END__
shows that only the weak functions are included in the binary and not the mocked versions. This doesn't work, because `dependency()` is not called in `main()` and therefore doesn't need to be linked when linking `mockLibFunction.a` first. If `libFunction_weak.a`, where `dependency()` is called, is linked first, the definition is also found there and only still *undefined* symbols are looked up and linked. A workaround that makes this link the original `function()` from `libFunction_weak.a` and the mocked `dependency()` from `mockLibFunction.a` is to call the link step with `-u dependency` so that and then link `mockLibFunction.a` first, so there is an undefined symbol for `dependency()` from the start which get linked from `mockLibFunction.a` before it could come from `libFunction_weak.a`. ### Scenario D Dynamically links both the library and the mocked library Build with: `make scenario_d` ![Scenario D](images/scenario_d.png "Scenario D") The resulting symbol table of the test binary:

000000000000037c r __abi_tag
0000000000004020 B __bss_start
0000000000004020 b completed.0
                 w __cxa_finalize@GLIBC_2.2.5
0000000000004010 D __data_start
0000000000004010 W data_start
0000000000001090 t deregister_tm_clones
0000000000001100 t __do_global_dtors_aux
0000000000003dc8 d __do_global_dtors_aux_fini_array_entry
0000000000004018 D __dso_handle
0000000000003dd0 d _DYNAMIC
0000000000004020 D _edata
0000000000004028 B _end
0000000000001174 T _fini
0000000000001140 t frame_dummy
0000000000003dc0 d __frame_dummy_init_array_entry
00000000000020e0 r __FRAME_END__
                 U function
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000200c r __GNU_EH_FRAME_HDR
0000000000001000 T _init
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34
0000000000001149 T main
                 U printf@GLIBC_2.2.5
00000000000010c0 t register_tm_clones
0000000000001060 T _start
0000000000004020 D __TMC_END__
shows that only weak `function()` is present as a symbol and `dependency()` is loaded with the shared library. Because `dependency()` is not called by the test code the linker doesn't link it so the mocked library is not considered necessary. This doesn't work, because `dependency()` is not called in `utestDoSomething` which makes it unnecessary to link `mockLibFunction.so`. A workaround to get `mockLibFunction.so` linked, which makes the dynamic linker choose it's `dependency()` over the weak version, is to link with `--no-as-needet` so everything is linked not just libraries that are strictly needed. With conditional mocking this might just work out of the box because there `function()`, which is called, is also defined in `mockLibFunction.so`. ### Scenario E Dynamically links the library and directly links the object file of the mocked library. Build with: `make scenario_e` ![Scenario E](images/scenario_e.png "Scenario E") The resulting symbol table of the test binary:

000000000000037c r __abi_tag
0000000000004028 B __bss_start
0000000000004028 b completed.0
                 w __cxa_finalize@GLIBC_2.2.5
0000000000004018 D __data_start
0000000000004018 W data_start
0000000000001184 T dependency
00000000000010a0 t deregister_tm_clones
0000000000001110 t __do_global_dtors_aux
0000000000003dc8 d __do_global_dtors_aux_fini_array_entry
0000000000004020 D __dso_handle
0000000000003dd0 d _DYNAMIC
0000000000004028 D _edata
0000000000004030 B _end
00000000000011ec T _fini
0000000000001150 t frame_dummy
0000000000003dc0 d __frame_dummy_init_array_entry
0000000000002158 r __FRAME_END__
                 U function
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000205c r __GNU_EH_FRAME_HDR
0000000000001000 T _init
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34
0000000000001159 T main
                 U printf@GLIBC_2.2.5
                 U puts@GLIBC_2.2.5
00000000000010d0 t register_tm_clones
0000000000001070 T _start
0000000000004028 D __TMC_END__
the undefined `dependency()` is replaced by the mocked version. This correctly mocks `dependency()`. ### Scenario F Dynamically links the library and statically links the mocked library. Build with: `make scenario_f` ![Scenario F](images/scenario_f.png "Scenario F") The resulting symbol table of the test binary:

00000000000037c r __abi_tag
0000000000004020 B __bss_start
0000000000004020 b completed.0
                 w __cxa_finalize@GLIBC_2.2.5
0000000000004010 D __data_start
0000000000004010 W data_start
0000000000001090 t deregister_tm_clones
0000000000001100 t __do_global_dtors_aux
0000000000003dc8 d __do_global_dtors_aux_fini_array_entry
0000000000004018 D __dso_handle
0000000000003dd0 d _DYNAMIC
0000000000004020 D _edata
0000000000004028 B _end
0000000000001174 T _fini
0000000000001140 t frame_dummy
0000000000003dc0 d __frame_dummy_init_array_entry
00000000000020e0 r __FRAME_END__
                 U function
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000200c r __GNU_EH_FRAME_HDR
0000000000001000 T _init
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U __libc_start_main@GLIBC_2.34
0000000000001149 T main
                 U printf@GLIBC_2.2.5
00000000000010c0 t register_tm_clones
0000000000001060 T _start
0000000000004020 D __TMC_END__
shows that only weak `function()` is present as a symbol and `dependency()` is only needed within the shared library, and therefore not linked from the mocked library. This doesn't work, because `dependency()` is not called and therefore not linked from `mockLibFunction.a`, only at runtime is seen that it's needed and then the weak version from `libFunction_weak.so` is used. A workaround to make it link `dependency()` from `mockLibFunction.a` is to force the linker to add the symbol with `-u dependency` then it's linked from `mockLibFunction.a` which overrides the weak version from `libFunction_weak.so`. In this case wee could even use the original `libFunction.so` because no symbols from a shared library are loaded if there already defined. ## Extern referencing Library ![Base Setup](images/scenario_extref.png "Base Setup") From all possible combinations to link them results this table: | LibFunction | LibDependency [weak] | mockLibDependency | Resulting Mock Test | | :-------: | :----------------: | :---------------: | :---: | | Object | Object | Object | Works | | Object | Static | Object | Works | | Object | Shared | Object | Works | | Static | Object | Object | Works | | Static | Static | Object | Works | | Static | Shared | Object | Works | | Shared | Object | Object | Works | | Shared | Static | Object | Works | | Shared | Shared | Object | Works | | Object | Object | Static | Works, with right linker order | | Object | Static | Static | Works, with right linker order | | Object | Shared | Static | Works, with right linker order | | Static | Object | Static | Works, with right linker order | | Static | Static | Static | Works, with right linker order | | Static | Shared | Static | Works, with right linker order | | Shared | Object | Static | Works, with right linker order | | Shared | Static | Static | Works, with right linker order | | Shared | Shared | Static | Works, with right linker order | | Object | Object | Shared | doesn't work | | Object | Static | Shared | Works with right linker order | | Object | Shared | Shared | Works, with right linker order | | Static | Object | Shared | doesn't work | | Static | Static | Shared | Works, with right linker order | | Static | Shared | Shared | Works, with right linker order | | Shared | Object | Shared | doesn't work | | Shared | Static | Shared | Works, with right linker order | | Shared | Shared | Shared | Works, with right linker order | So it is not possible to link the object file `LibDependency.o` with the shared library `mockLibDependency.so` but every other possibility gives a working mock. But in all cases where `mockLibDependency` is not linked as an object file but a static or shared library, the link order is relevant, and it only gives a correctly mocked binary if `mockLibDependency` comes before `LibDependency` in the link order. # Wrap Mocking With wrap mocking the linker is called with the option `--wrap=`. Which replaces all *undefined* references to `` with `__wrap_` and makes all calls to `__real_` resolve to ``. ## Self referencing Library ![Base Setup](images/scenario_selfref_wrap.png "Base Setup") It is not possible to mock the function `dependency()` with the wrap mechanism in a self referencing library. Because all references are already *defined* before the linker is involved. ## Extern referencing Library ![Base Setup](images/scenario_extref_wrap.png "Base Setup") All combinations of static and dynamic linking of `libFunction`, `libDependency` and `mockLibDependency` with the unit test code, except for cases with `libFunction.so`, result in a working mock setup `dependency()`. When linking with `libFunction.so` running the unit test fails with *symbol lookup error:* `undefined symbol: dependency`. To make that work `libFunction.o` can be linked to a shared library with `gcc -Wl,--wrap=dependency libFunction.o -o libFunction_wrap.so` where the calls to `dependency()` are already replaced by calls to `__wrap_dependency()`. | LibFunction | LibDependency [weak] | mockLibDependency | Resulting Mock Test | | :-------: | :----------------: | :---------------: | :---: | | Object | Object | Object | Works | | Object | Static | Object | Works | | Object | Shared | Object | Works | | Static | Object | Object | Works | | Static | Static | Object | Works | | Static | Shared | Object | Works | | Shared | Object | Object | Error: `undefined symbol: dependency` | | Shared | Static | Object | Error: `undefined symbol: dependency` | | Shared | Shared | Object | Error: `undefined symbol: dependency` | | Shared [Wrap] | Object | Object | Works | | Shared [Wrap] | Static | Object | Works | | Shared [Wrap] | Shared | Object | Works | | Object | Object | Static | Works | | Object | Static | Static | Works | | Object | Shared | Static | Works | | Static | Object | Static | Works | | Static | Static | Static | Works | | Static | Shared | Static | Works | | Shared | Object | Static | Error: `undefined symbol: dependency` | | Shared | Static | Static | Error: `undefined symbol: dependency` | | Shared | Shared | Static | Error: `undefined symbol: dependency` | | Shared [Wrap] | Object | Static | Works | | Shared [Wrap] | Static | Static | Works | | Shared [Wrap] | Shared | Static | Works | | Object | Object | Shared | Works | | Object | Static | Shared | Works | | Object | Shared | Shared | Works | | Static | Object | Shared | Works | | Static | Static | Shared | Works | | Static | Shared | Shared | Works | | Shared | Object | Shared | Error: `undefined symbol: dependency` | | Shared | Static | Shared | Error: `undefined symbol: dependency` | | Shared | Shared | Shared | Error: `undefined symbol: dependency` | | Shared [Wrap] | Object | Shared | Works | | Shared [Wrap] | Static | Shared | Works | | Shared [Wrap] | Shared | Shared | Works | cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/000077500000000000000000000000001455674302600251545ustar00rootroot00000000000000cmocka_extensions_components.plantuml000066400000000000000000000000531455674302600346320ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/documentation/images@startuml node cmocka_extensions @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_a.plantuml000066400000000000000000000040001455674302600310270ustar00rootroot00000000000000@startuml skinparam linetype polyline object "libFunction.c" as libFunc_c { function() dependency() } object "libFunction.o" as libFunc_o { function() dependency() } /' object "libFunction.so" as libFunc_so { function() dependency() } '/ object "libFunction.a" as libFunc_a { function() dependency() } object "utestDoSomething.c" as utestDoSome_c { testDoSomething() } object "utestDoSomething.o" as utestDoSome_o { testDoSomething() } object "utestDoSomething" as utestDoSome_bin { testDoSomething() function() 'dependency() 'dependency() // mocked } object "mockLibFunction.c" as mockLibFunc_c { dependency() // mocked } object "mockLibFunction.o" as mockLibFunc_o { dependency() // mocked } object "mockLibFunction.so" as mockLibFunc_so { dependency() // mocked } /' object "mockLibFunction.a" as mockLibFunc_a { dependency() // mocked } '/ libFunc_c .> libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile 'libFunc_o --> libFunc_so : link to shared object libFunc_o --> libFunc_a : link to static object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile mockLibFunc_o --> mockLibFunc_so : link to shared object 'mockLibFunc_o --> mockLibFunc_a : link to static object libFunc_a -> utestDoSome_bin : link ""function()"" to test mockLibFunc_so -> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a 'libFunc_o -[hidden]-> libFunc_so 'utestDoSome_c -[hidden]-> utestDoSome_o 'utestDoSome_o -[hidden]-> utestDoSome_bin libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o 'libFunc_so -[hidden]> libFunc_a libFunc_a -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibFunc_so 'mockLibFunc_so -[hidden]> mockLibFunc_a @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_a.png000066400000000000000000000701641455674302600277750ustar00rootroot00000000000000PNG  IHDRj?1p;IDATx^ \UǯC #"C΢eiN(=̗>},gOy$^i9#l**"Nm>ι}Y{}kugkzŘx }#H@.@rG -}L}YI_ڠGJL!rg8}hBN/̙}{D ?F-S#%LfI {>@h4}4L9jRX%QQQ PHh=}by56$,}gϞ0 ޽}N2} fB#b QEϿخeaofR}Na~ы=PX VhD > Ysa dKYbz5ZxiOO?>qjܜ(Rk$%ȑՙ ޸X℥+z/_2Иv L)Ӿ`(\+ ] >vI0y省lui#=zresb)Sj:O>ӳKn2F(\}f&}޸Xd$><+Vٳ'**+VH_ X]vkt2sLƺD;bYnq.KZbc ŘA@|F}˦X̙jUbZF(oc夤PG\vUBFj֬,j{"۸Xd${J5k{n^/\ Vf J+1gfYR[`Z5%+ ] bˢ> ?~ob*88V6"քƥ{UUz"1vc~"Z*U*--ZrV\٥K^rժUJDY*H1,8%u-uP"[{1@pl+GFn?V,-))o%m۬S`"EdU>ڋE@b1o,tx'[>}xP Yitŋsww'JpB5`@W77ҥKzy5߹s*"FEou1,8%u-uXgu+RHw z1R< ךuWcB/{qsNZ8Vo)S'&֭5nsƌ$^"~%ťǏDxCf&|޸X/{ <>Zٮ ʚ>}z˕+7p$߽{wƍׯfٺRqӋޤ† ֭ФI@ϯYfK_{N/TgЧ]]]+V8x`_&5jԸtXàQfM^k%BVLr.`pufZCy{/[k-FÃ;v,"XEdZYn6e=rWf-Z+MÆ ߢūNNXb5n}RkJ-ǔg˧GGk*Vj\=Xp|&Z+GNYO~巐x|+cו+WʒѣGw-..֭[]vꫯ^ 8Rgh*~!;L">3ĴiCWw/W&w_%)V+̜9{wOVVZpdIGk!{.kӦ9GWRf ٮ.tdtК5+SH>2WH0&G\jF˗iz{{*U ::mk׎Qӱcٴo~ҤIL?c OOON3dMi&Tɓ7oOnԦʧL}=N|UVLʶ-㹳XaєN@{?O<0{"byxxB_~eVZ*%mׯ_,HHjI5&(2elt5k ce)R=}:;O]F VV:.C)}$vGn{GGܿ.FgzcY9wnc߾6/] P,++-8жt$bO:Ç,Dd&M3K*Ёk50wmuNZr2qs.]¦gUŘN4hiRaSegϞe3gԪUk׮- +yi(<"}A$hѢLN7uٺu+SruempaSI_xq!m!՗(QB;88qe~/^P&=r9sEzק[azV\U6)1bk6T>n8If\-ʖӦM{T+_|͚56Jmg^רQP&b f ܦZTbYe% Qd6iL\)%Aǹ?ܖl7{CeY|2sL[X?ZxZa=n}Q,6miy%7سgٺl+Je>o:عsWRJR~}WۋlYҮ uśI=^ʕQ^(.qI.5&*¬\Ⲓ~%RN”bf&#b Ph> +1|$y 欬?ƀT 3ʏ '[" lH#z  V<+bˊpL8s죩:Z E_ukWL/¦gXCO (uit v!V<+bˊt8n7/ug {dΜ1UVX~Р^; {Sи#V< }Ԗq_WJ+;gcE͋-I@gde;lo!Yi.Mgѱk[HO?ޣdz5JwMMH|v9pSNMZ#w4/ z^9@CzgW;::pt@B ^ 4>9s?aX2ejoᇕ~|#hhkq9KD:ve:<4?Ha$Hs KXw+r ]WM{r )J)GSyСeLڔQ vaQzXQb ,ֳgrss&Y;_F BEzD_f 7-"/mbׯ?{y6Wg?Q" G[xXh^ hJ ~ʻ(ZL kx _''ٺu i(53g¤ܴiyJLeT A=}䆣u}<3o@D; `G-Gww[P7Bș5o#%;M6Xh}լYCF{˙}T!5zy@/.bS(FFDU?V],bŖ ѻs)8ck~P>:Od^zIlK$7"Z5C 3m:3%}2c[omyqlJxã22=t?k M7UXI~N]r}Ɨ_$.XKr)8c/tC7=\w?bQ|x?>4_9ƱrbÇSv3TӒ>߫WADڙFFDU5J8X{{₵$Wp.`1JϻL^4_Dŋ<=,ꫵ]IӇUPVl&LN\[^uV.GP˔\RI,5MRbk4rJ:[op+(V7lXٹԩCFNDU3 mLN}b ^!KW–UVGS~ 6 ++V*oѻ}gɒI &Ո$`ΰw׮QK'K?# b Q["۾]ۏͼ8wx̫P qjӦeSSRnSFuHST_~q2兎%XYKÆP[l)_ǫA*ӱm[ Ņreu[@I} 2 U uR0g-9{ݟc 6dd9-ҳg{8k׮O4^A#4IjYb:W?͡G1x@-u+3%Ż/_>H?_X ^MӔt9Aݿ Ҿq셿q)j3M' X ~R0˹c 6R&GǴ.uР^{lɻ)_T pCsLT %7gҏ#Ȃ<h=}ΖŊ-[q~M>{-"Od1QrR̭ |;#_lᇇ{s,%'кt,LVS8'wשSqeiߤzQ#k#b+(tb/1I/ذdNֆ+[2WVG!2Y7c޽dɤ?,.Ez8qYΐ֭ (m0,qYVgY.~X ?N,w$ ߇n(RO$FJK@(x=.]Z.]Ҕ9{0*1cgv kr=5bÆ)GZM^IOp5˗/3n'Tݬ1:Jz>zR4eH6»6Bla\-nu..V6ս{ ~#.Ez8qYΰ'ORH?# b 1ז:=4_WW G, Hj~o֯56 rB'ŠW ?Φ`g-sW GKDjX$飱a~ыUAaX1l@k1rG0p&4gGY5hz{!W  (>b]J}a^G{@ ""~`` :d&6';93E+66? *b Q[y @7:dݿƬP^kw١sDgݻwo! H%Hҩ=:dS![|k:;tLJHH"GwJ3rYc|&Cand)DoXtvљ󕚚ʟEl~c]x1f("+H|ԻZ * -})>r7eN*|[eJ@פ~XHKbBCC}}}8+-Z[֓j.;Nn5Ec!.:k+u !cO ~DUp]nRs!`7D{~*^ ">My!\ |;H&B\tįuk51vZE] ~DXذ7y- dwlcwc̊-xm ?Vxc~1z>y- Ϙ^j( }/FO>4J*ZQ=}a$ }/FOF^^ +]ヿZ>ax-  XGbqwAwkyeۻo ~1zGXk磀y-ȁQ=}ިߟ.Z@wy-ȁQ=}'| +Bk@=oZ@8x-ȁQ=} ^ۼ'v}c>^ r }/FO7r-u{' GbqciZ@JK_&+=r }/FO7H|k'앭}x-(Q=}\:3%rύ {Hu[3x- ۩ y-(Q=}+&#',k@#.Vbg,6vM&07L 8`bǮ0d1v=|=>Ƚ =p( .__]]`OJX؆;  `bvcpʖzZ \Nm/1gf;q#`cx-Gb11Cw9ad4`gz@_>2 t9m8:`e!r~A7ިA߾Xf;k '>quMfaVj G@y-G'ýn'8o ԅ }/H幱ao{Qs3?#]+>O8oڽd!Zc\309cM >>aq;Z飥z8?N ǐ<#r,~A &}R{0~#=!iK힘cq4ZヿxH;ɿy-XG1/'$ r]}[k2>y'nQ EN[k2>c`uݼ,~Ah Ç/Z uHOH:5{1gfwl@_>Z[[WyH~ţk`1H G+#'oç}O$1gdZtHl|kb>6A]33R@*b\^ Q }is}Yi']K}<=@^ Q }-wor}ğ3&r}=o0ge7wtIrGw4%NuJs}.mXV/cVrh?cq巐@_yjuEVx;a"ovX9w|~?@&>r{AXp$_5lKJXhԴ2Q?vDji@5Ց#i 4ǂl>5nѺon z~EA>&)<=XN˿-dBi`NoSm>ڜΞ_ޡi[[=>2@Gi [BrV<^L .^@®wl2H>^]Vaf@ }F|늵 aXu/%ln,@qvo~E[l=/|3o rNAcC)O @㺢-p.7飭H9 k/o#ei{ZF~8Cz~%Z:foPS_lȑ :w|T!5{x?a3>ڊ7X%= BVjں-Ģ-6븵~mB7,l+~1h̾" ?F_6)Wy`}ɶ,loo۫}@ },}ll> K^?M~rG#|X_- 4G[>L5v,,}Ј؄Mn/:}`S`T #Hm%飴 #5ȳpYqua={Qy]-YS'>+BG{u*tę]-?^Wűӥ% Hmm G>bs>fo`` e7[ةH*3c’Q\X`l͚ '5g []Ȋ4ТūO3}zULGa\#))GGGTMŢT>|r CCCcbboPSodz(UT0 3Q}JG[c7oNBɓ? dKѣ+O2Uי~aM/] ukא!7B&um$743ŢT><+Vٳ'**uʩhM0 -G[۲cdV>sf}ZUJY9))ѱ+׮]UP5+ =Z6. }hG0 -G[D ?W/^ dKSkBҽ**=R]N>BH)v? +gr뤹׵9 }*-Mpl+GFn?V,))o%m۬Sc"Ed *5. }ٯBxb.}}ZiNh ͹t^^w\,H*Q[]~"Wg (U .A/FjgZnbV0ŅΝ[w;uj)~PZUקLx8::[vָ3xrGrB*6?MzbR]N>ʊ칶PdNZy{/[k-FÃ;v,'v'r{%oq&"뤲J]JZQ@> ߖ^5jT._ exOh񪓓C5V.mۤ4bܸOTqT¢ErQUH>~|tĈ]]Ξhz<}&M">3ĴiCWw/Wnw_%^-[W(09sD4;dIGk!{.kӦ9ЭZu@]џdtК5+pYX~4{E%J!] tJmΙ3FT(m!cBŷ .vo^%\{y5]Ft~;owdr.WPfǷmeQQA*tC<|xpɒIzOVnҤ>3P꿴3_ n7wtԒkRb+*q>r e:繸 Q*Bŷ .vo^)qzod常]/\Vu7k׶6"|xb~*bޕ+W,S~ޥLݞq>s=\ijRJvUvFk5QCYFb8{*2?4رUbL(`!l#Hmo\ORъ+JB)R2t\Nj[$[ۤ;urݣFo׮ewUm(PO'Q83Fb8#Ⲓk(-A7|)fBAqiǗTR]N@> ̦ [ߎM%$;q _^+W6K3  ,[{lʖR'$,YQ^|ٲRջ*x(#08*qF%e%א]j]v?RڔTcB" Hmmرuyn.9c:v|4[[EL߽gx/ SXRٺ. ۥ4;;v,z;{ǎض$qY]nJ &uLxs}+u^,F@רY\CvV )H4&,$bV<{8ے_4\}JX7+Ogf7+dٴiM0}@kut,ѸǞ=?5eSXQ/y? G0;~^^K*I^ݪn/eK*oJ &z+WF>>_x^b1rF%Ⱥt(c5u#63a!cBŷ .vo8,ӵJD~4{qF bV `/ݺ+&fW_RKG#Wg F Hm|[Ip FSkŊ %}[-G[Vgbҽ 飭PIgѱ{Ĺ[HO?ޣdz[wMMI1GĎG#Wg# HmJjby(ի_t u81rAh+TG8 yK{͡CX ))01H({!Z^Aт9 }Jm VٳG9]e^|"W="¯YNN͛–6Rbן=vm_+){S: ݏF` hA@> fi _''ٺu i(53gʫܴiyJL:Od^zIlK$7"ᤍZ53 KN%GD=<Ϙ1,#eoxxx>RtPM4+*qFXc¹s_~`-է56rAh+,:V.;ؽz$Ҍ-1);HTTaiGNի o"LDS 0gɏ[1&,^<~O\S9 }1MԛDŋ<=,ꫵ]IӇUPVl&LN\[^uVλ[eJ.) _QӦ uwwXڵMYr]]׭^7igJ rv.3ufp^Q3'NJmIC i/ِ%+pla*P\_{5?++V*o1&Β%ALqLĝa]*KN~G飭Pmʩ6m/[65%-?5jT4J嗉l"g,.S^X/] 6ͲeK~dF Rm^(.+W(73~!s&Ms,l4+Jq܍ ϜN֝W–ٳ=kקs A4IW2Yb:ݍ?͡G91rAh+|brqMQӕW;cJ؛@bcqYQ:^vs{v/53=?=/^+]7/G#WdYa69 p!%ڳgsN1J* b'=4+Pҹy|)8ҏ̉G[bV+liqvo*^JݿשSⲒxHҾI;#.#_飦0`4{E)0g;ԝI/ذdNֆ+[2W!2Y7c1aɒI~Y\p4q![PܰaYH?2'F HmoEv8ZErr+vo*^::K֥K4ec>kD eg]/7Z:`Fu^lذVp<%3}N+)nРfeƍ5+JqGN''ugSd#(k#!RnŊlS=& uoH'.KɵUǑ~dN@> %pXV,9c?_7klF#WgxȃV---m %ߖ2jZ\nMC4(v?81rAh+|[:K:ˤiqy7SѠh 飭PmL.l/~AߔN=Db+3Z#"n1Yߖ2gZ\ ?ΦO Ѹi-G+cʊ~$wM-qWiqyxcF` hG@>ZGQO[\彝>hClA?&O1aL-\iOk'Z9[2f_^d_h4'a7q略Mu$ HKƣA[ Ny#/(ݧb"""RdYkd^iG D'NYll,"035[5y H'{J@z~u3wsFs{>*G\aaa_Ϭ7xA'N,:ewO$FqƯYucy0`AkEN]RF.Yzo G%1TH~444tٹzZ;N&:Yt u #fZaR2^]mװ ‡ o<$FqD)DS[nۋt4ɢSʟH4>?kǜw4n,@/JM-8u1Hh7;GGʭGL@ }T$%Vom-u{vܽ %S|V}3sXoJ OeJ:΁{~k 9^ 4G􌛁vP+w[`__yҁ~~dZ.\R7<5wS{~~eYHfr oWt0J}z~k d$>P2_^*8 "DyUaێk|P+#^ G9~ױ#& GYY À+%o5˼h#IWL%Zo ?]`; ҁ~8H^ fk1Pvuvp#]S}s.?5v!|sKx-6H=> 7{y *g&9m)|sfϑSZm9}L^黹v߼[,#b WZ7ѿ}kќС^_:S8[rɉ!_Z@w@U( ܻjIMy @;y-?O]j_^ =)W~ Mn1 y-䛴 yZm>=|*Sov9#X߻֖üzIewU[=P6y U9p^ `Kޏ.\@)}4gd `1y}})`v6xX$k=y-0H䏯~փ[lɶW>` b FcF+n5(RS_/xto(BjHkfYehw:^{|912\Ik\ZĐy-0JSVrFP l͠h^ 4&GnN̽ӼPYW9+5xp7Za 9}|tکU91h̔mx-X*v@N~'RƧOX -vFy-X yC4^JA 4H\RGbM^ J)\Y?+;1舄1[=Z{|vI^ mGsf֭-:ױho77w5y-*Jo8r]->%K~__?J^ ̔m?$ХsĨ3[B38/|l^ N ]aoVZ:o'7zk^ iZ%cڃGQ?oHg|6o91+0,rgx-*M;>ob0~^8x-XDZw*u@7}35UϚQsy-XsVYI>LcN H䴥g&ʖp- u;&ZqlWZnO @:JK~̥9~ wO%=؅[vb؂o}zг5j @:ފVX؎fcy#|X1eRPE@.@qϸk~;Yr2G V;(2Α\ SY>rXA@dƕ_Y1eRPE@.@1j٫Yr2G V;(2Α\ SYyM+W6hɩEgΜ N8>wsD0Mjjȑ#\]]@b{ݻ7nX~5kr]Ja *c=bbbSNmժ $$eӦML)7};Ȧ}&MeP,ްaCJJ˔\;5ڻwǏ)j>O?56g̘y常!CmJH3*L2Eгו+WJ`޽{ll,oNW l'|wX >{,+nQ!$rrr2~t&T${ʩϞ=ʔSn.˨Z_.V| t7ʜYvmBQ >22Rg .r||/ʲGT:s ٹ*Jޔۘ*}F1\`zYfFTTTʕa@^]->f 5J1DbTR#cR:hS\ʢ> 6oFW WVm2ٹN:[neJǏwС\rl+&k&l+RǨ%=+Ѐc}`-ZeuBaWOO$-HVwv7YĘrr[Xf`iӦzeffۗI &z|pXY}JnhA$6(+?Bbl)vYrPC+ SY>޸qYf +J:I7ovssc\;TqŊߧ?#M(uZ8w+V"111,F\(/ ٹ*JP brt[ϨX8{IFի˾h /2g>}CMJnhPbR,J '22PsKO9dz+>XH3g0\\\?~~'L }FO>>e˖15*H7n|7nw^ٲe ^xZjPHOO7n\*Uh,^)(u̔= F˗S" YYY''M1P(wIRg)Hg(y%1ALn(ׯ jzs {UFMJnhP#C:`aPWpLf͚tF'}6"#זYxq^ N(땞l7ZzZ &@X?~\-sF&Aw?+"PHs^'䁂I9>/ҢEx-z +=g˛<`2WNpZ &@P#GyZ x^ G~Nm>[E`<T+p[ @{7}<;㷃={Q-u`bnlqe>fo]Q_kPR_4O~G"n͵{e;Sm[wy-VHC_Sul_lÎ&>ukq:%wt͠vk6>f~^ 4uGty-@<]GC( ‡͊ɟa-C]q巐cO`} x-VKG7슨Çk6\]ȿ&Z1>{V|^ 𽞃y-VNc D%g&k6q`^ 6c{~kI͡94о`3t8J1`/ g3/kU͡swO#lFԥg&kapCrxA̙YByO8) ʯN@K0}|";4KDZ}Byg{ؘGwkmHzk(Njkͬվ\~~?9~ky|-NCޡ9#7h􄤍;&B͵{%^!J ^iؐ?kyH`/p?쬟yx1v1`[3S*w}{Iaxz7x%dǼhHΡ×mS@cy뱏m,1~­mo?`((mxt*&c¹/ggG6uǗtyE&+fKֽnc6 (~ pTab 6IsJyW붳u:Pړ>|~7w67(w okw~6bh&(\l>2xuE\W冒tȾ5ySxúo2 (yoy 'κ?O]xnra Bdž#]\!a!#=!e;?L-z$߸ҙeQ?WnX#EAbIKT'>nC)uZuRIID>B˫ڄ-{la7GP)qș-{hޡ IJw}[=;E./GucY/E)(T1GHw8} oQAW +n9ޱ͕e!]x.zg.t׽*t{Zk#Y%ETzP)̙YKw5|xa bl\4"\tGO #\$D,{pW҈s#A+&HM&S;vЈ؄ JNlIN+bKkmQZZY֬۸={uݻCŕT$?CZD]yɵ*ܺknnΥKjsbUDU>WF>l賮xIwZc&_^G>bsvZL__@EDDr_ WRpٜ,- oe˖:~|X~v=|xpǎE:4XEdj#Db%},[feg2ÆIM=V6b j:99hL~|Aժ9QHJё#3hSq\^˗)S楞=߹Wjc"r:}0T\ɬybڴի+Wzn~׮5nX~W{ Lfѽ'++KɒRCP]hצMs(I%?Zu@] 'R(}d&\`4Xy{H{ɗc7oNBɓ? dKѣ+2eV^gӇyz6t)֭]C|%ԁ׷olҤKFu99ȟ>|??EhtZb={/PRB۷WXBc+b#z{{wUҥ̙3]Jfg<::w5?WTa?>zƾ}ߑm+UPm7F0**H\QŞ1th.Y2ROrVnҤ>3P꿴~*Zd &Lw[ݼS\LOr3-"9%u-u\@=@ Qi&*NzBdV>sf}ZUJY9))ѱ+׮]UP5+ =Z6$tRU7"d+ %r4`4klݼV?$%%9;;_pA *$''Eŕ#{xT?~#+zJ\y_]MMA*^++ bޕ+W,S~ޥLݞq>sS@qDR]S"k@\LOl%?%6ǵnkG=@ Qi&T*NʅEg )qԚиtJOd;Cfʕ6eSXQ9!BRJZaa7ʕ+tk@ZEz*DՕ̒(lrzʓh@ELo흝ԩSm˖dr.ce%$>~Q۵kn/>lY]~J?1ΌI~))o%mۤ#]dUڋ/v޾1"dy,B?^塊@~>Qu%;p#^WlVg2Y.7ٞE, KtTB YOsrK+ZRXU"C}S:Tb1R< ךuϭL>~ ;K:wn}ԩ(iV^2epbnI[6gx!w]\ xOw:th6a§ꍋtݸ'%(d;oEW,V\٠A''-Z9s38q℻ܹs٦yzsڰaCݺu4iB#Uk֬Yҥ=<<~W IIIkŊ,٤|\F.]k}֬YfwCjjȑ#TkTʚ>}z˕+7p@<޽qƎ_flܢJfewF9ch`rcV%wQJ+U [~ҥ`6]JB;=xpΝcl u{JevU)-p1GExk;E^yi 6B?) 쌌'V˞NpBMVTi :|jբu֧! $% τXRHvȣ)q(DA+0!J[B)L0VT!- *Of|@!y+ٰ{νs]|gߵ>^uYdT:AN6&&f޼y"yER=oIM, F5Fb]mB|KCftJGzy4{A7gf1` ŋSl~hرwFDtOKK.)Y.j\͝VW_%W/::} GJ9[gOQJJR׮p JOշEȐ@ӧOIN$//fvM*EP=3g9s:7n/**elpn͞=Ƃ6 >''gԩ.\&OpBR|G8 wX$O;tRSIAAAvv'|_<# , ~U̚5Tk SjU7ï]; s255 $32޽WT14<cv砊,*NǏg^J%RPizw#\K]K<0AiA9wZVr҂ Hs_9 O`/N}X1-^T\Qhh4#aaa7pݽ{wRVKQkhhN =25 1R_WW7}!CTWWJb-M>Oahl|;;{SO(LlxU Cf)9;J'g'Ћ~I;T}K&,TcĂkbkU蝏)a]gU:u%$<&[)т Hs_9 O`/n0 W?S^j+kyp##:~ĢcgC+_+hkGHY/f |{h$%%E \={KVd׮}:1Os̠Xbm2Umƫj&6jbyN8AǏ͹M- TNF^zECշD *m`&c0ᔴʴJaUb U.6+Y%zJUg)}RGw(L",IxFZ755˗gϞ9sǎ kjj 脰'`]V ,[ :ujN΍߶WKJ3i$8yĉ}YF&/24Z8aR?mڴ#GkҶVbmmixU C<}Vשj/Y)欑Q47Pސ[yRCͷԦ&,x>Iӡ@s[T%HBP)dy#REF:/ߗlٲopF :thEEP<ܺu+4&fzXP{,PC*OeCpt)˘!QDAAATTUw}:?VmBׯFDDddd[~Ν#F9r{'mkhJw&Mܦr}\ c\+SBSrU CvhN~ET6 "7vс@X?qکQGpyq07|;i=C(ZUUO^gp8; @GtӨ#۾󃊞YUwU[)9rKo7iۻe,ƎWƋטy1`!|\0h^իO"i2P1|D :6V>"*L YQN&-?n^YBvX7O -[/Ad"DZW %K  떚bż(O}?:bЊ 9xGdDӴ G$}8!}p ݔB"Vw+͔)HPCQ6G>Z21bkn>p&_xᗢ" uٹtS a6|$=Ȃ!.!w}~z3]Sn]iCy}ѣGDt3&^Tһws7w=O;nuaGvgff~睃?`3,_>/6=c0Җ9r,%%Ek:t'e+!!l n{ }⹉'vbbn˛Kd4mj#"Hr>N c+t-ߢ_}_a)X֮}Z32.ln>a1* B5@QG^fa„7~uC&2/C2ąa,Z?Q9oC`QQ/@!{_5-=7d8UyQ^}5NxӴEŝwC|Kn Sxa`@6Y a1.Ub# tӨ#>УGq]eKرwBGm}(Zѣ'YE18ύ;N|ӴUyn ;*wa 1!!փ_+6fGX?a22 G.U2eʄ6[Gi~׿:Ú۸1"'LkjJ軏5{?Ai Dc⹉'ÖUހ<}A>iz_AÒ5UҏUֻ7cYٯɋM9. CCÜGo-+ V#[_ޝ7Wض=#41%Nя@kFX1&u֕y-ZӎӇtmA*1زxn!z }{nlhji" Ò5Uҏ=fi8qbl_t&,3nmQGGr𥗞?{6Z."`x5{Ұ~3?/Z nrGE7:)4:ޞLORWW*~zK6håw1M &zd@U2\5IZ :LKK&oN_^7hPGY6lX( mf 1{29ӟ~Mx9rKH7# MhJ!Z."ؠq>ÊI#M@e@^%%X0YHlv4ԩ,!f3Ɣ,OII"7列nrG>FaДB\DA|4 TdxL`9]$`3gƾ}zb||,[`u'veN ܳ#^Gy>5}Fa o'r!4b2$pe28wOWee&, 6,}K;,fNĪ!~ݱcurKH7#׆kYFa o'r!EG󺞘`xd軏RMjZqIZ/׫d99gixɯ-cb& d#GYx9%{ܑkG۵MzS _h`xw_)w^RKY@ر߳Ml(0w!]*42֎L@l=,hq (DE4 WBܑQa$B2jUi6@eJAF.6JnB\DA|H7#᣸H܅dv-/QG)i$Z."ؠw>NܑQa$B2gtӨ#lʔ_h` ;nrGfGq Z^M*S"68AN" \&?QAq;2>!bOK۵E\V) "h`q>H%qk"_L G" W+ו-YyQ>!,Y:ʚF~ M\"0wJ 1Ajjj-Y"4%-̀^[[ sp]t@fДB\D0 f{}}}MM>cCte~wltӆ) @Srr M.]1Jcc)cC[ @>"UEahJ"Z.@|Ú xE|ܸ!)9h?#Mo##lC@ ~.| R`=f)9h/S_G 4%'-@ ]p~{@Srr_Ѕ_ G 4%'-@ ]@ @p@ a>"@ ,UICMpIENDB`cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_b.plantuml000066400000000000000000000026631455674302600310450ustar00rootroot00000000000000@startuml skinparam linetype polyline object "libFunction.c" as libFunc_c { function() dependency() } object "libFunction.o" as libFunc_o { function() dependency() } object "libFunction.a" as libFunc_a { function() dependency() } libFunc_c .> libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_a : link to static object object "utestDoSomething.c" as utestDoSome_c { testDoSomething() } object "utestDoSomething.o" as utestDoSome_o { testDoSomething() } object "utestDoSomething" as utestDoSome_bin { testDoSomething() function() 'dependency() dependency() // mocked } utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary object "mockLibFunction.c" as mockLibFunc_c { dependency() // mocked } object "mockLibFunction.o" as mockLibFunc_o { dependency() // mocked } mockLibFunc_c --> mockLibFunc_o : compile libFunc_a -> utestDoSome_bin : link ""function()"" to test mockLibFunc_o -> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a mockLibFunc_c -[hidden]-> mockLibFunc_o libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libFunc_a -[hidden]> utestDoSome_bin @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_b.png000066400000000000000000000673151455674302600300020ustar00rootroot00000000000000PNG  IHDRJwnIDATx^\bDcFc v3g{G#3&Q,XE bC1w{y>ơ{i^" XZ  R0AARAAKAA,{A0AAR㞼g/BBADAq|{k:ʣQBADA=W|x?ĸAApZNR{c܃  JǀGԨUHsaaaqqqiiiCADΔ$a%֠Bf%=> =;Ǐ\,B&"1$HK/eWge^^^DGG'&&RWQ%)P"hČt!JlڴuIFSJ<=nݴj*]yEΛ7Q#;;;k8 *>7u(JWDgL[B@]=D..:=z{AH,X5e Xd`۷,\8[~ɒIo HJ:2aGҕ@ w/ť_IWQB VBsر8ɟ֫W. Qk l2ƸH8bƿ)MY`..:zTI`\ӬYNχ*VIgdYYU&g*iڴ>(o`|<%{:utQZ222_Waݺu333J#"()E|OY}l׸ӅE<@>c#Hde$TDg+Cm\lDK&x"J()lsssi(Yg۶m ŏ|oNkSP"b&Pӧ>6e[3]ꌆVt3W#阘,lq/22H:)[uآE#1Lr%ED&)Y))?#Z1bZk$$BBŽ[b 6#Fpa[p1cYרQյYTFBo\;}cS뼥dEYӱJNfqz>D<@*>c$Jӕ-ޭ[ OO?փ:\hͭ[e766Ho/]L0X ,X5?xL}ji:5E{\H,\P>5yn݈G*IԦAz.7_AnUfr Sn=ͤE<@Eu|ܹ}K?~j<2!U. ]jziP;t.hEIøCna vUrJfHyS M7:oL}jX5cbbJ ~WDb;}.E W53_IKx6+zIy3(F4ix ̳˗'(nѢEpp0QRemXR;WXQ0 X}ʕGpUJ;/#~ .r2:Nڵ$|qc{5k{7D̳+V impׯ_fG=ɓJ~rW[6Up%@ #ih!U-[/K'\y+P$wJA4k,RTTb6buBZ$A$A]%Mgt!-]n(濂5L|%k%LA=ͤE<@Eu,ʕlRb-V #TYeâa8 (K‹H~ZZ{ jqtt$i$5C5N!|= AJϟ#k-Z4:p! Id$%i{xGڞ X^ 1h Fq6[/KeBrr25(2[PՊ=d'o޼+8X X@ 8{h6Z {WP*XmBZ^0-濂)Ϛ9d͸`lVɯDP/BV4=IXJpB(qK@AVNOHx{սz7""͍ tDDiccMb6,4tuɒ%w>|8g@Yrk֬i׮]XX44hXPPWdjMV'>}:ы _~EkD&Q{زAlq"QkRS!C\HZ/iiժYIO!ktSP@=:^֭ۢEn߾ c{e9s=={;w.ѻ;;;dz+W{X ͛׷o_n-i:5E{\^Ӈ[$aOa KԡUz)^ξBZ^0-濂 i޼?Neb5ofEO3i9#H\ǒ}Y*UF?ڵkVڱcGb[YYuDQV-ΓmXi~w*Wo۷3,;w"իW"Ԯ// /__2==/)ps6!Su`6eLl"pժz ,÷%8,Kˋy3,u"$Kl'#ڐzѣ3gf/TMP0n}O߾zsʕ+]tkժt.wʔ)@M^^ٳ7nHyhŋ_0''nWԩӴiSjX\M4"gp–' % P*զAzhLkRPp[-ј|6+zIy!,7V$}KC潔'91_,[zvzӿ3NeÂk|;[EyoU$XVSL !01ŋgd<|xkիA\2l;J0-~\Y!%_}5vMkY{[/uwH ,BZ]_AJA ӢELc ڬi&-:zT,1;Ӯ%R5SS/SFJ:;|YNSXL<0ӅE<@V3Ai a#f-h/SFfܘ&$pu:EOE=/s~dzap}&(u a@ǪQDSFVѠmzuƍ-4HX?Ÿ) `·ۡ$:BOmڔLt%u]Ay 79^b%3{ͧ{~nmGV)tav9XUeא9x9!kcI){|Z ߅A%@E)"1!)Wm׽z׺B"zƚ~1bz {쬩/:|ٱÝ{U6$ȯEnOp3{ -j鍛 d%+w4ZA~ڱ3Jp0m@ýR>!iX2N"+!~*1!xރӅETXo1^Xm Ї@̊SJX?Ÿ) p?E9;z{^jt"$u9 aC3glfDnݺ83>Cd J&lcJ&tb$ NJqbĚuƍs>C~XbЧ`u{#biD쉞e=<s 8qٹcjVoܹmYdRݺf1K…]-[:47CTk.^<^:v0Wkװ޽Gmlcbm4hb#ExZq?{A ym}1@``/fCy5K칆U&d}maaTf ]ۯӵGy|~tN_ƐȑA~[~#E.B~qbbĦ YWr6`/fCy5K2ą%N>p`ѣ sK\??tN_pO%p7U|9`ܣpw۪[ѡ{xϋ{2oq {_q=Nw9E E/ܱnb ^!&=>GN4ImdF54ya!75b;^ِ{!A^g)#}I5nc6iu6:u PcOMM_p֒C/:灒=i%Fٸkun1Ȼ|O{kL;®8(mK I @)-){/ු1` 8lK>YY缼L$f6Ͷm ?ד=0p{R| etA|;W!Q ֳf*M0#..ȡkoGvZTRMfkæٶ[,bzZnZNٳZ9m1!HY#6]%);ܒ+5{[#hIzL\鹄J1ׯO=?N_Tc v5h`3؏~dT\nz2vWx^,>uM97u"D( o&L+MZ=;)kJ3]٨]nn9vmre?!9˧%EE7H{v|9˻aTw]#5DTSXhޮ] PVsC4Ӆ8uժU%5q|]bQZt!+6WԧReDԄSMX?Ÿ118]]t=ivF9k 2c>"OĜEn"t"HӅE}'߰Y 1 =!::S]3cgh2ށ>JLL{ALm?? KBlG/!@GDD@=XwMgݻiށ>z1݋b6]/{BZoa% i~ccO;n+U ;GS_iiit/"I0tqwOAYJgXbp#Ғtp', ѹ>y(!!!Nuz V@@AOAн &ŵh79}%aq`܃'a"_d:h{̵v޻NO^tF /AA}5\ӳ AdIĸe'zM.ɥ3+rZ[6CpϔOZAG5G|7* ~^Ɉn\NgbD5>v1EDf,`OsS_$Rq8{ZA 'Nm?\ ro ~Jg PIܓz1Aqݨ'gZA-%C%qKfgi= sy˳7ZAdGg ;;wOk1'g9"bn϶߳ܒG_tȓt Rf~ It 鋾6}k'nn6"b8/["b&R/\#tb { s<31'OLk1i):1U=@gG/H~F־.yit %#!)[¶`:)j{`% H95{>Gi- &$;IPkFDmqpyI+h- rkscZALEӴ7G^uBg @qOֽSBu<#YO:؋Bg Cq5KZA cMk)c sOr:)5{2$}jt:AC׋]Kk)KnFş+ >[l+ER_ vAk)3 9??=iWo/ʡ3ֿi= eCL(Υ3#ڸ8=仸uAJE˯Ek).\,:1j{:GRN/" ]5ܧitbT'\'%xMAVξ=sS_[5@㞔?~Mwv;;BeN32@qp'i- z'sh- 1O?i tR6?>AN~N¼|:Aґr,϶_ktRf?y8hGDo;&hZ H)xr.Ư^_|%'\'ZA?.|3E<|ϮR:)c,":zCg . j6"R"o?Q:){," _Z C۴Aɼ0 $XJSS`^fFc)QQ֚tDDY$:w8ZkBqDq>3ak598ۆS{~?=Ȳ>|uze<3^ϟ7o^F֯_O999SN-$alذm۶VVVmڴ ݲeK-TҥKk^ ̠MZ[[O4)77S%K8::֮]{رD "58mA!3=$, cYqⵙf[|.]|֭ &% ^z/eDf` ݽznnnGP $.\驄۷SSSG=m4GYپZ9ї86|}YA➌;ɾu=O͛7r xի$ ͚5#i4II eff! Y"qΌ+/N%_N)))7&iǺ 4hqtF1Aܿ]uB)TMKpHܠ>tq.Uã|D rڊ'HA$CưwA㞴?YcJhѢAAF⇐%i-%Zl@"gҮ%4rqDvhH cqpzq5Ι3'kϞ=ΝKb:D߾}?Y-Xz5FjfffDD+"7,I ty/'AB㞧Wsٳg7h~ƍD=eb =9mԡxQ}&Mԩ&J]ɩjժ;v#%zſ4:s̿  cqp~ 5(D<<uӿi@AMRHmgn=H˽:)"[(WHCT6`^YI #(ǡ}r.0!AX9ZぃQ+gG͋՗ tDF]r40-AXywL#Z7"v-~? DfXtR iIʑpZ $y^ٓzX, Il3aq˗ ۂOHk8Nb"'A͇\@d=@A] Jƪ]Z0r92vV:+/ED[H9Y;::1,ʁ;m:AI[4(=sb D`SD,HWmbh gGyud$$Ńov ց~MS?7Ȥ3D90>k DE` sr|v& 5P .E 'zMҝ@= )$,nn7箭~vww]+="Mdz}_p(g fFaОρyGǣTN㠓&4=?}|wxuYybflU/_qˌ=¤?_b=U?ּqBq/nθkȈP;[npP`܃ dN8ɹͧM) jgn!mGrk:K)VDωa܃ <{uy܋BvW (5;ۃ3{JZ&r@'G p'|Asj෴)Sr3y¶Fn*㞼g/2\kz9Kt!H|kz8; {G~C3QO. +/"0DӮ%FoP(yt2dR]B=Vx+z>8ʂ_i#1w#3pm i 2P|s}ʇ'Qr f@=׻-K 8g Y@ɞ"Z@@Tj/%7=Y( j>{-lT궷Zs?UڸGԨUHsaaaqqqiiQ1O6z `JA͸K{|z;v,""BǏq202;;Tz絮gs' CU29Tv䵟v GB#/]ByyyBH_AD QqtG4lT~bݺMַ9i҈p@8[֭VZK7/_!y5jdggg g!T%N֐C"V/$6}֭%$$W%d``~ZV2QՌ.zs↍ʰWw?  rvPz w/Y2ٹ͛IIG&LHt?+"V/$ٽ`%=>>>ǎ "K6Dq{ptA7lTe=11{Iʕ=͚5|Rl%ِtFFUen޼!xFMs-RV|GHlY蒃(nب ˊ{^WUT 6r6WX% +{FDAL,C`ehj\QܰQ\cb򟲰!#餤#lma=ʕ4{f#V9_E#=Ep)*V`3bD vE(3fu\];>1Mem$e!CPUbVi,Nχ5(Pr QܰQەӧ+U [[.~&>>ͭ[uti[{lljsxΜ/5:={v;Kz|GHlAzͅPwɵjUɖK]O|C6dm"M5(nA FWEYbK,-6*òuf6iRNwQ/_ͪUjs [ugѠ} fʕk-unʔOlmdAX|XY`ܣh$ Ottt]رn#ʪ2;r "˖M4șVfi~)i{84VAt.ٰɓ 6UpNhMև9Ȝ`)QI.]#vY 6\j_?)- 6*Cq% :s=_kOO=`ڴDA=?A~eÛ7֭Eb{ ?m%'x}Rk<%5ѥգk.Ćր566}}+r r{T(TFb`MӔڵ$|qc{5k{7D̳+V iepׯ_fG=ɓ;c~rW6Up#@ #ih!U-g#xJkKG׈] 2&<|;_ɚq r{T(TFb`MӔ ʃʕDܭZ[lѢсnIZ^”Ӧi{)bn*{5 %ag#xJkK+e AYSJ֌KVat` >=_EqFe(>j%!S)o*" -[:޾'RXZ,5O2ąMK VJڞ X~ѥ~ZnhR4oU nEL1AR(Lb V]Cxv$A{eIyy7oePd%CRSO=zt|̱|𶴽*?-~l:q{{}^( LbtiE,ZI)Xb4r=7V ~BR.LER; ίY󝓓#XvoѾVV;tp:vl`YM1*hĈ/Ξ%፮W"Æ޹,mLm*W&ChW_ ]F&=3lp:@Lj dtǎ׬.= G+p5@5G :(.9↍ʰ<@keU{BH@SjJyb6DqKa288eﹸ2ܹ-yD9;ްa6Fk|שSJ>3[ %Fz`+]#lDqҿS #l`Ч`7lT]~ p<<=.@Sbr8}_7!]tFۗ~. lvj|+Wrrr\tR~甬=`oƾ}AɄu|Lr8_]ň57'%} XqFe61so>(AR4b=% 5Ϝ9šu̳/ ړ5()g$'5EIiIZXq>0)Xc q Jl 8qٹcjVoܹmYdRݺf1K…]-[:4K7CT_!nTxDz_ծ]zٶ6B#"viںE|q8_]DΟj۶9 6` b6TWY6[Z5!K* 5kp~a~7'8HavC#GE~mq؏ q Jш lٽ{-[eg;pvZzj:ih*4K̀IF_Vu/bfP!\!!_{"_`ۨP!/J;ȢuflDq&6 b$\+9RϚBS~8ю2.ΟDz cn!?/6* :,5QB+:wpQWȊ1?Rn[L͌FmTc({/˒Y҉J͛I_~/ivSu#{ }#EqFe`Sr1b:7&$TFl`~4hG#PnK'Q$Rר\.E۵kQJ6m3|6Ͷ ɷC ׺u:ujΞi$'5ѥkI \pnI ە=`í$i=kJQlARR\BØ1ׯO=?͎y1 4a?2_7lT=%#֬scANh"99?-OkeZ)G'HXgFvPz<+{ ↍Pgîgk1 AR4DSZ]d EqVeƸN]jnIEqFe3aҳ5ژ`S)"7Q蒃(nب u=ZzvF9 t*E#1Q&5]r θ]KϮ(gcNh$6DqKa2klL0TЩ ^ nI>U*Kkr]I!Y*EqFe3GщŠ J =J l| G|DAFe`cє{MG'Xo/6]}Ơgύyyy%$$Н*d:YˎAiEAFeXnܣbG5DGGC:O#ZL鎔%r] Gqj^;B}w|FttttǏ鎔%2]Lvn:PQP0Q p aaaԈo/* &,貴4#eFW{lOgXJ6*@qY6&$*#Y@5Tw0'&$$ĩ_vw* &,貜#eG吓{]ΰ8lT1?Y9kZ E%qi@tD[vc'ETĵvœ\:AL =4<`Oi- &Hci-REGz.ZAJ϶_muB2&x"@sqUpZ 18?qEQ8ٹƪ]t {%Et ɨCZDעZ1Kb'zM maÀ7b[`O 2 1˅x\qEx\quQ&C/-D`ܣ/?NNk1\ i;" $+bn0ы|6xZ(ܼ}y} 2HJg GcݿJ>Nk1 QF=@%q>dfZALJ9Ik3՞}h=({tUk?jEG청G~QGg BG .hP[*@DVdM/3 [7594[ҜTؔ:+(s: K'VAJɑ_$6e+F S")a*T ۶mkݺuժUtrW D3uT;;;[[[H!ߞp:XYYjjΝ/qưaԩSf!C<~ϟ7o^F HaP7mzҤI$ ,YXvcfdz5{Fy"ȱN :M)Q1WEĆ>G˿4"Qp 7onРArwk.޽koosN#ƍ5އ:)u7K3/ 6lжm[Pmڴ ݲeK-T\v ;:IRnT@իb\\\ϟ%ܴwl#G%UOv?ɓKA3pҥηnJNN0a߆ 0… 9=Ixxx޾};55uӦM#z3r"Bܺ=ÆJذy/(1 4(11¿~/g?#!8&(^zu77xrأGb&/s uRnZ`fS+%^ +XUMp󡮕Xtj1#Tb=$ 1)_n^DDD mp7pwB`=?аaõk޻w4#iʌ;l޼9w XàNדI:%%q$-xFO )Ov-~uL0WREĆΫӿ>#jsթS'rW~}$#o5OJzWAAzElnaO*MPfS+%?u +XU" 0ZAC1B*F:! V?k,~.`*U %iH!?񻵵u-'22gϞkSBA3^A5I܌P|y<#<Dω|O5a^I8/.r3VZlYPP7);TNM-FBŔ,>D+VPrD!U|)h\{(3N#5 j%i0`GaVMHH i>g b6r._:)*"6 G}Fk#"姇}Ok=Xt^ԡX-'&111Tb6bujDR^<J$!V|;#лG}l{fmllA ̙3o(ܮ͝0hР .@ oooOT=0,|}}a"6lʌӻ;;;A }%ӧI^ I333#""܈^TDrn 댦Jذy/(6P7(7JOpӳ茿`O!6_ u(/sIźi޼yeI؈թJ {Kp^%K0.QժUŋmTGZ83)S 9$[YYuDIsp^{QFk׮˛={v `GCvT+"b^ӿ> eϞ=p럟Om:A@!m>_@ˏK#wN_l r׏uyytD] $01bCٹ~d|Kxw} 001&0p:A-,'aJA0)sS6Yt %+FMYIwc] 2Tg΃<A[3g13"wpY9[9ff¸ >I:+6A"017Vw8" i[3#fwϭN/~$,=>[QoAǤ$t E[Xx?%{G m z]=.z rh#AԼq7ią| \h %p ]#"[VbQ$ M={2ȏO_PJAʎA~vM}]ShI)Sȯ`>{̃0zo O?zm| F$Ef¶P{*wc;:.#o2|YVwW5fhkx01'E7&'H CV>]Fju'gbِw (f JNRHOT~Cr 5|(|GOh4҈B➃?o KLLLKK; Ad=0'7u{Ό_x/z*H@u>§qOi"+88،…]lJ3κFjEئ6zC=> =;hD`c ځru{C|t.{u5S nD;>Vꑑ;R|ݻc<zІ=;6Fge^^^DGG'&& 2S@fj1%H=_ /^<ѡvcǺ!#GסUV.XKYlʠA$}nQvvֶ֐CVŋRp h dN ڞ<1l`S==nݴj*]y6?NڴiufRluV}Cq) 35@a bhW9>>ӓG6m4ݳ秬sG'X:y3nZ$=o޸^޽w/ť_=e'qqpG<y|&Oy1k?]nhݺE̝e<8ҧOWgxzz;v,..0 "Mڵ$|qc{nv͚ D03lŊHi11{Ief4b׫YQC0!mx䄶 ?]r%b ~IIGH:##ʪ2e&f ȏ *S 1SkJPV-!Hx// ʃʕD.5[ht/eÛ7lljt*^ pȷII9:m=ޑB0-~馲WCZ &6a܃({LL&?a J,Tmƭ\BpKb(_a$tZt};-N0*0p`Y5'BboZ=iK7;d!>A =@b2FZ_z) "Mݺp3nn=QmcS}٪U3zz4$oK49*++=u˒:"o +ɚ3 nNϞ!}ІS9s-m/bl*{&Cho_\߃ {LL͟nuf]uIFSJ7k=o޸FB,9J$VΗ} s/5_{bY78cU&0>arZs׬,;vl緊h +:8;I,q C`4bDwsgiʔOS8T0`i[*ILUJ8$r$d53FT쌓EVbɮTB?3I,dDp\z{MCNQ;.?Mdz7.8{\ߟK~u|6MZSO 럟-q6 t2n=wa2jӒ$N5ML^…')9q:hIIthjoWQ}.sZMEr=Z :{F7o'x:_A ztsΞt&7~9sȽXC8ሦukօƾt({|p"{g?(>Uתaђ&+V?Ѫ1Rr"nw77}=h_2I#FL0Fr8qDtt&v~ 6oܸqg)))opիW~~o Ryi;sàS:x`[ rgS6odHkkk^^^lllHHO믿xbFFƒ%KX~0>C^_~xBSL?eHCҾo[x1돊"LbܹS=Xygkfխ{͓(랞l{H+6)~jEѕ)%YG,`mQ@@ks֮2d)Ct- @B2UM< ^ 02y:[Oe˖d {{{;U u~Ze&+0N׏vb+4ݳaf]ɓGzxI[x&yNܖSRF?}aH_ݠфmo /tǎߪkSfP2˗WVn9rHh=99 ClU=Ev!xMֆ 4 n>?Ҋ&QL48KJ?妦OTg-d79yDAc4 9oѢ9r *-}Uˍ&6С}|ykSXk///"?UǍiEEKwoԠM>mg+0NI'K3qogv2V+Dx qlY9ah+ -#!ti?%鑑7令n47m&-F?~_>{0thejfW?G)L},1NI=}2]tcDAk[\Hr ə9WTlJN6RP$%e$~ϴi||Z@X?3߈:Y\c,u`m_vgєw^uD gŊE3讻|zR4$Jguu$%5r} ĨTڤHZFܷ=˗ϣԳy ++=zvlh,1NK{zk=zo[}3&~ "xMK)`o_M@ii1N@xB())T l tgjWo{)Ei֭{WmCVHX\cH)ns,6/)=VUs {"HUܱ {@ƍYo^`S{@?Ss^^^D\HnǏ FK,1N 5H l td6!nN~~쳝$}{MHuu: \E'zri6 t2uu: \E'zri6 t2u7N*Z倵~]i!xML CML Rd+=ܐ:D{zNi6 t2hb5LN*:{`i6 t2h&LN*:{`i6 t2h&LN*>+'N544L<990Ǐu|ȓ|J3><=Z5dHӻ}N44/)=VG-e0u2i.))Cp*M ά_#Sv-5>[; uWщ&6 t25!I`޽ۿ܇|r#3"=Li=>},HUt f!xMLjFH-e#5–0GjYjKE.d ޹s))lN*:M6LH̥rFc:=ӷﭧprzzjpp`m{ȇ?ԇgFIE.d. ٴ)m[ \E'暉3߱4ԩ݃E ̥rFcF2ikb׮UMs X: gcio_LfKG6 dj;: B#S V4,`Qiܹmؐ-6ќIhwO A}6~А?pCV l thejR'ph2Xh#]vG:7og7/#۴)/!!]j^`S{@+SÐ:hEFFЉ ISw,zȪ!xML CM RaCMݝf fwk؛ŤŐ[yy 5mG=d@XԵkPF1XhxebC4uwb[}m11֮}A=U tL 2N`-cĴ.֘KYSKlt76 U1;v߼lUҕ2`V\ bSɥt)=VSQQo߾ҍvЙS__/5x{`&t)=VS]]MaϞ=t٠sBgOCC|pM PYYI b߾};:tN||p*nb(J6j(5TWWWTT|٠sBgϕ+WT t+j~e٠sBgOKK|p*e(Jv`WBK[ҥw"{TGvP lt:;bL`/{v TGvP t:;bL`/{vՑc{tz wDdIENDB`cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_c.plantuml000066400000000000000000000040441455674302600310410ustar00rootroot00000000000000@startuml skinparam linetype polyline object "libFunction.c" as libFunc_c { function() dependency() } object "libFunction.o" as libFunc_o { function() dependency() } /' object "libFunction.so" as libFunc_so { function() dependency() } '/ object "libFunction.a" as libFunc_a { function() dependency() } object "utestDoSomething.c" as utestDoSome_c { testDoSomething() } object "utestDoSomething.o" as utestDoSome_o { testDoSomething() } object "utestDoSomething" as utestDoSome_bin { testDoSomething() function() dependency() 'dependency() // mocked } object "mockLibFunction.c" as mockLibFunc_c { dependency() // mocked } object "mockLibFunction.o" as mockLibFunc_o { dependency() // mocked } /' object "mockLibFunction.so" as mockLibFunc_so { dependency() // mocked } '/ object "mockLibFunction.a" as mockLibFunc_a { dependency() // mocked } libFunc_c .> libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile 'libFunc_o --> libFunc_so : link to shared object libFunc_o --> libFunc_a : link to static object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile 'mockLibFunc_o --> mockLibFunc_so : link to shared object mockLibFunc_o --> mockLibFunc_a : link to static object libFunc_a -> utestDoSome_bin : link ""function()"" to test mockLibFunc_a -> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a 'libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o 'libFunc_so -[hidden]> libFunc_a libFunc_a -[hidden]> utestDoSome_bin 'utestDoSome_bin -[hidden]> mockLibFunc_so utestDoSome_bin -[hidden]> mockLibFunc_a 'mockLibFunc_so -[hidden]> mockLibFunc_a @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_c.png000066400000000000000000000701011455674302600277660ustar00rootroot00000000000000PNG  IHDRcJopIDATx^xE/= RB k_B ^|/  -DB !@zG$@ J $z2%77~={fv9gnv W2E 2E 2E 2E 2E 2ŬJֽPt)R>jj 2S9P @Lr#0D`s )L|5)nnaLL̑#GΝ;} #5Zl۸L1lbPTTccc)Yy&^L>B# `LQE/دea1BBB"""(Y+sYR{ (O\'N[Ւ6B)+ŸbzK*5RNU'TK"{ )Sl޼mx~HKK򊏏+ibŊb Q v5' QYR{`ڶ5%+.z 6D}Ks>*<|Tps+V6"քƥ{UUz"1~bauu˔)kmu%Ktڕ=V\t)~Dֿ)90NgI]Kl쁳[+ nש1lra Na'WISB׮mm֯_CH"*e"{ )Sػwy}_ӧ~!+#BZxbUx*^7__eKزe&"FEosqgq:KZbcu`EZdJ4]^jZmJ >ʅ,.t2{OSoJnĉ<؛ݽ{[ikԩO^p!ZǍ{_xO}_~zbLEaW$Sʧ0Mnn)Sjժ9`4߶m[&M4h|rٺRqӋڤի}Y77M 6͛7/[/"spz:>G}SRA ;6)]:uZbs 633xm`<\ZK,;5ټy>y&"U'Ja&qCTؔ,]??O65ڳgϢEׯOUVgΜaf#F%m2}vvkͿ7o&+:tJ*fz!CTPnݺc(Ir@//C P_dIÆ =<b4M~ܹ*t!Cܻg eOVnڴ3P꿴K Y/KWn&eY&Q`.rpCTؔӓ9vX-mR6#l cԩS|ĉurz'g'*USԔeS3l4=y ɓ'ު~j++ێҷ J{,A%V-p4%Mf{{{FD|'Vr XD8Q.+V۩8v'}yA$hѢLG^^^߰aSruempaSI_xq\!m!՗*UJǻqP~gϞrM&Pj9[k֬ի̞KeLOWx1VVz=1hPU++L~](RCܺӜw/.*tfR]]j@P(Wfe!,|(0UKF)YrU1JG6)XYbբr̘1bR0lڤloUY۴⸬m*}KZTbGSPO-|*UX*VJ̈́*&2NeGˊF^Ek{9)fu|}}&WH1I. tt?-p&%d7k%=3EjժJeh]FR(+JBWDС*W~뿗mʹ'++M$%eȑ۶mn/>lY]~J?P1LQ_\8WBpdnqU W5L٧eW\WRӧOɓ'0l$-V^vӊn*}KCYJ0+8䡲1R3 ۸T)nDVCMd/0AY8a]Cakv9Fbz2Vyi*_iF?7Ij]NZInn\tl__/ٺ\ [XY\,{JvWB i3|(0"ѺuI&#\x0d=@*F}x ƍSl߾_~􁁁 7𒒒(W;w,Su@FMӓO;u$Ub ܦenS[zZTbYe%TUFHjLXD8a"+6yY|zE?y̙ѬYk2^xݽI&;v`ʠ OF`/pȑM*Ug]f`Y7/_NUʔ)CUI!!!իW/Z1><@`#ݤ^bEa(0D$3?С%i(8,GELr劲uYYYϟbSKi?7o7v=Mn+/U馴mRDŽ;w=E}k w8qDV4h@w-lR2|p< /5++kرt?F̂ ZQ'OXtwWB:uP \m4}]6ULxDŞM+ ܦZTbYe% Qd6iL.VIqB-oK~Kѕo7/8lg!5v6mXK.5 3I99fϯY6k02r&ӯY Ϻjoe(V(}tmOϲkW UDq}ky0&t5Qf2nލZz&o_eA0tͰ㯧_8R(To*&W)S 3(z:&`#_~~4p: vmkb|/%6ť2y 8t v!V8]t?"y#eXWn<X/ 3g~ZOJ|[x"uU_$ l;Ir/=bEADy?1>W~-H˰&OŚ{,S,OŢ֔oDp1*S>cwRoH,o!+`ϞOß66L1 Vxlj*DD//,r{zEaM&I$ `L׋1 P,˖ 8Døs "QX՞g/ąa*аԩLŚzLT,?װe,OLaʢ-_H'1b׵J섡2E27x2hSj3EG/ HL‰ `L',ֳ3f"Y1,YBU?r$yFn-Z<ϖ\6RR˗>żtip#)>p^ _@4%zH"bEA8YaL!3}6̭Rś4ΜڞܬYٳ?`/dQŋ -P6F)ґgM%oF/ j">kV )2E*/u!ɀB*P&ۈ֞)r#϶)㮎x-~ю(*F(XOQˢ `LJ R7gBșh"II[͚5?,eg޼y#Fx㵽{3STy"=3nw z)iD#F.VPaN} XA߰ F)eǎQXx19j{ueO}F_@/gg `LB71t++3tp7;fP +?xwŔ~IT\q{RDD#XIaN]lr޽` qVROLX8]MF^==?]]]aS4g*1d$6ϞoV?Qo%2ehŊf1=W >}Rʕ+ b'=4P~n)8ҏ,13EPlز mycM$ܟfe_ǻ_VF=:>h탧9J~!/]81]Fa3f㜌cb): )J+ر|M[L8ҲoΈb={HZx E Xam#uL 6,o̕IH~',lzv٦w/\8w; bN\F03da\xW0}GDAbĆ-;oryZvbi"}2ѵzʃY%OHղeK0 fbSٮ%Kps Plܸ[FFEV2;,t-ކ TPnY3Nj0Ju>«uR4彧H6{6Bla\-n}mޞSئw^yƈ bN\F03+UOGc@X0a۲\>Sl7`E9oZ"-//\D22|'to"D!c VHLLplSݻĉUFDA8tt:IW,]WUQ{h3_"0*~jb{OqMs/H2V81SC{x W)JI#t5orv )JNXXDS"uU_$@p1'SN5NG2gVDi䥞NgOG^[t)A):ﱱ4V5̉L ZYΟz:Gt|ݼy? Z-:  ݛҩԘNbw ʷ'tvљ󕚚ʟEbE8m~xxnQey[q.qBObb9gpx5^/C ,`+ ʾn9]fYA΍݇#+uJsvVAey[O51hiKFRPMhWxed(ww@91Ǔ,SϞ?zu ƭ&l=[7tx-?:8ɷsVTk5f#qHד7wywܥͼg8y+v@Ga}46wi8nG3E'45/k5fcpphx-pa߿&|dmiGq|Sx-p 㓝p+`M(s98 Z)Zo>IZ;XpQ5_J! SM=v`ðG.pK~L6I=k?qþGpa^Q Suuzps}1wKd;y?~[\ rcm>Q S 2蓄"kcr6sOx-pauL团n%統OQ SUnb `Fz"4ÙK~6GLV]N>߉w8Z()ZCh tۛ{Z%k@h  a ŕ;x-pX  c.?8^(\[/HŐ 65wy^kg\[/V`tڪݜ+╫~% c.XZ ^(\[fgg?Fc222FA*&P??ިQ={,Z~nnnZ:s`FMթSkСOWm>͝2eJZ<== X1@?L2Ek`ةS_p!99yl :\ɣ]v&L`zjݺu#c[eʔ޽{BBl۶`FկA' zp;wȑL`OQ`e+L%^z'Nv}ɩSX֭[i]viIw)))5kde,};q?VFr ]b=z+@, 5M*W 4M"-X1@\qhG2Ek`/#M*>}ius%&&2Va >WVx)Z'$$_7nDKW&:w^ԩ} 0k,:ݻ3=a > ?EʈWN5KlVVرcUVr ]=>|OTi+QnӔ7 v*T 7 sh֬ڵk 0h_/>64g+L7s9g/嵶*_Y.`ρNKW/p}j.^k;_5 0hm>05hܜ@?r;F;kAh l?dk@2@ᵛ8d֓SDw瓓y膇p a^ S,퍑^ם yw\|r^ ڀneW?ӖǂLlc}wIQ5\P4 2EGoh>')2:_y-h;77yǂLі\YcmGFy8w;f3Mʶ؝Cy-p,mL}Ưߎ$[Z r>cy-p,BRoQވ>#; Kֹz֗l.,Xsp78d"]}h sn ƩbWLѾ\۰7LǪu@$,c^ NYX S;Y~]GʶX~ 73kmnww8aq'LA$oUAdOL__x-8JM8-f}8;%^wzߏZX):)YEA7[^ Nb_38dNZ=R<!~8J]GDr2F}Q5cZ4}sbVsv3JM;)ucWg•θ{8{֔kkA|U#rp81]ǒv1)vO^ 2EMu_cǏSO';pwGU37+[?^ 2E q5r*]~:;QXą3["`Wvun%y~E8d"ֽРS273kMviDؑi>6(.l%-j ;ŀx-8ssW kAQ%Qw~H[y;Õ;Xs#M+''|br>5_#;ߒc,"bǬ{x#97wsoW[Agg gLQ_J0tWn^>G_؇1+gN]-Z.;%XW 2E=`6;eіkʶoZ[ݣ|fR~؎w"*vJ\t]?~4QgLQfe>pE|]Unda%_Wvᵛ ?EdNeg]RʈL`obN +/QTr}'(M\f`8 d-ibdeWxE /+Aq9ܫ_s4~zw+~-2EI=ZehVWVX_6.O2?K2EmuqL.m;C8%G?s?wt -K!KLq ?Ehh =(p#S8]>V06گ,z]^p %C³CT/;r+OnlM]XYYeF S,S9PX⿛L\^nř:ov`;+Aҕ  2Em2EJEx7]Uwd`.Ցb*6 ?EcA-T2Eɔ2M-9rȹs璒RSN^Epڇ>@e~7p,% #5Zl۸L1lbPTTccc)Yy& jt%}Y+X(el *GjIJEZ0YKGbLQ[\ STѨ /k9_a1BBB"""(YTo\,Ju9aʯfP}sМ^P9 fPP1R A-T<\6SS,RsAŢTe4 EŋRŻOVᄆ{u*[t@@-[Hml"ҮJmT6̠.u GRHw z1RkͶb2Em:w~ة[~qAMH޽5ns')^-~OSMƽ/kؾ}/@q^.'?3nm+_˥ұcQKNzޞ͛ DdD1 *XjY?UR^rbLQ[x42}]j (8V?~]) -[(S4^c8ʖ/PW)-pԓ?|ӳlUF(Q\jy)WC%za(95i`#63a}dB]\ u8J$["oeAт) Sp%1:F>ߵk[I ,7 hAC)j xpr#3g~ZOJ|[x#b\-b2EmWxӗP1]beAт) S*}@by YY{|J)q%SHt=ހ˂P1F A-T2E__/8,˳C,[(د ;K )bb.s˂P1R A-T2E,27x2hSj01L({r!Z7 hAC)j %7 +#}}HVJT%K*rՏ m޼[ϳuTTO1/]?": Ѡ`F bLQ[x8L"=}߆ sT& e3g~*)+7kpb2EmX\6aP(Lر0J/6Gzgʶm?^xv͚ u"6։&ڛ 1ހˢj) [7,>^feqVRO!klLQ[X8VvT u*'W6(49{`޽)3\œ?։3։&ڛ 1ހˢj) [7,,X0~C\S) SxkNDٳJv?߿4S XL0f>jtn֤<V58y*U+Ub7&|YkI& 7}^IQ^^&Ml4R ,JС矯';i!=%${%Σ-lYe M fխ[̙|B߾/\8A\ĤʤOVnU篤G91R A-<bS9@kM-oܸ>iʔ)O $X\ݽ+K綟?5th ˗ ZɌ2ky%JUVns9}Ӧ ksf6ho6x.R!'c3hl8e5:zKv[' Ν[+.ʤO`Hp{.K?#sbLQ[(y8^rrŁn[MRؓ֗- ]+;bcqYLQ:]u{z%3ߧs}: sq)2M,oeQ 5Rhy#>>}+WNzh.I rݺ9lSq#dB";(m"6ls u*'W<9W_WqbgNSSm+ر|MWL<eiߤzLLQS͆oeQ 5~'h 6,o̕5:H~',lzv٦zXXp»v"=, }\glÆ*Wa8ҏ̉b2Emb6N''$DwjٲMy QbSrlWɒ%ҹ7VQQQc@ZM:^la:*;}nD{!pYB {NxNѦFxOQFh-lŭA38x T m޼1X {j|SǑ~dNC)j %젴ذ|T u\~ ݬ56l\„^5|33c٦zX 'V #dBåӬSLVP1)\S>g/kM 0ހRPL&w1R A-<\:J:ˤ9kxɅhP 0ހ˂P1R A-<\:J:ˤ9kVNB4(oeAт) SJ.f%eϜ5+^tr!7 hAC)jd=\:J:ˤ9kVfgѝ\۴\4ix.CaH1&0^۰7+t-q>x)М5+$("DG\1b2E'są^[֗߿CxRPf&Y3@u]qLv[9/} y[ / ~ȟT~CX(Kcd!ssVnno;KLK#GP#""(k+Jd5DN$Dmj|^O C):ܬ쫑lMcYlLQI )Rccc#Ѝf mߕo . :Mtݼy?h J Stwy{.!o2E%1XHwyŌٮa, [Y[:~@'N,:e@%Hϫb2E(v|MEqr´@)ZDΣK+:[1y ; V8=7#v@RjH GPH)#o ?Zp 2EyyϽoi<}LQ; SOyWO<[N]@|)jdOy_=/s( \[OF잛ǂLQ;z~_$\'p)j2?[b"@; S.)m.3 "@; S)ez1 Lyh d"b62 o>` 'LQ;6S|:PPQEv@)>Ly .3V _~{sԹx-8d bnF[ww?vs1 ǝQ<42ELvCC{uq7<-ggZp*^3Gɷ|lcw{_/{*]q2̬+wpπsXw-l)jdwψig!K6)$H.9l)jg߉.dS~ѵ{sd`?%42EL17+jĮ==>]S>&[ "+u~v\xGװm]\+nNM6@)fܼ{nMދĄ.&AQSֽ3EsvNR{}|_l?l6Nf@)xّ]02~:oW{ù̼LQ;8:S̺{[Z [IG?@)r{5qɛss}G)y-h dљ"=>>T9dq-)@kuU:Ts>Os)|ZPPH bhEwO% 8l~X؎fcm0$ZA+UZTX؎fc ZLm=mmkh"RWe@_h!Rba;Ym,Pk0 Jϓdɒ zxxjĉCT2k,)`#FP6m۶5iݽA˗/,ٳg{UBrʽ[7oޔ5 ǏQz޼yL)FcשSkСrssLRV-OO1 >(4-qU1ɤe/\ZjEyVXĥK*W|=A!NT- ACj&noJTzDiԱȆ={&&&g4iR֭ޑL)utJڵ0ax/ի=zt̙}2%NƍwC 6>56N…mJH5*L8QгBPPP@@ŋܹӿ#G2-<тrU%*&_oR*ޣG'?.i&Z7߰2h!RYTLؔvQXM)Q%J)MP9X9==RxA?w\?eR})V[u2W>gΜ˗ʷZZ5VV:ldQ O<)ֳ_||<+ԬYe)`h*J7)}F1®͛ ΝZ* -D f 0 *^3FW W͍Vm2˫~6l`JoӔGbd̈́MqeQgrFѢE^\( rK\U)?o *n}dds=ӷo_~zB$D){1S~M):0 V+WPF<}t@"EěJɸ[חmrP۷oUΝ;B83AOHQpiV&]]YY E >UQ uW7)}F%'7jժ%VVh!R1CR0RoXqoRR}ӦM07n~JKSzqaJW\)vhLDDD !!W^B83AOJo(uZܹ3{SN7Xa֬YT۽{w="=h*JW7)}F%PRϜ`[, AJHu瞠OؠAɓ'eGPPP3:ÇɃ 'Dxx /ޤI;v0%i(QFsP;vljh0-X)(u̔7v*TS( ???f͚]eu)ZA UMJQߥGYjݠgggszmB$)E#e v:999ŋ`ax7CBBx- RYcdZ¬%l |:~|煅r- S"h&VZ;He )ZJ;8:S +:']Qcx @ Si8{ca^ Zvptxj/G?kȨ٧Z3[17؟Ո]|k@K S9kdܸ8wXa)jGgĞ.nG?9k@3 SNYA 8}}vv(̀LQ;8!SL=]'8?m{4̀LQ;8!S$V^ pWGVk@3 S{y-QVD^ vpNd90`kx-hd9k7#*v:8bk@ S޽s 8?#}Z2#Nk"vO&2Ť=;; GWvpZ}?}uGCH ^X^ vpZHl{u`ү\lwA)sy-Qx-8dߏnno^ pO~z~:7+[ NvpfhYS> =~!\^uOQfuSD9 SE*^ p7ݳQ9ե۲28də١Z}xxfOSͦߊ9(;li SNSO'FkvƮp mt)obX֛ SNU=pE"JW -bm7~"+V彽M SI~6)M[`{3@)t'zsQ~]dq3m)3Yl8d ë7ěoW`ɥӉkʵOU)nl 42EL1rJi$ {I*lhgKe 3)[xzoߊ9gLQ;8!S$:sr3hY]\F +\n42EL;Hˈ Fa6y?+VlM!Yw_9<"hGm!Yga)jeęh(,jK*ٚʫi+4arcWZ"Lx3"8gfāNyB}7|{}23 8Q⿛L\LX89S4nk=peW}e͇!N>7\U~؉e 3E"~ztɿ'-$UJX黅111G9w\RRRj_| _hUWY2_@؁xS@)>[7gMvE[am` 3quMy/^J>}:>BZk׶^7__eKزe&"FE_ abĠ۷RxM͝g[Wyd &>yTeD8>Stք ? +j]̠r]"̤hm`<\ZK,;5ټy~ͥ66ٮIXt̴J9ğ0XWOZ4_|gQ,D=SMS@|}_m?UbyV?~`-/_HҮ] >d6m^>s֊+! sޞ 'P9l?Yi@ҮuJN8u93%/KWn&eLqW3(S  ۾}sk<أ]oG_~7p8͕3(APw%i$uL8+''oY2+W3{.mmDv3=}_XN'Of֭tAzWZ\gB闺=֭g{rR%R]vm++Ÿ̔ c+2"䤟CMO^OF)@(R3(APq%w2EJ+JB)R2C!={*W~뿗m?nn%>|d*Цؒ$%eȑ۶mn/>lY]~J_1وL}TM跶rW*ñ&SbV ךmW̠Bŕy)NZZ +_UɔN͞{ŋՙEGyG`షjJŒtiwu{!dJW練)-pxgL8,Lҗc5F]_x_ fPJ$[8q&$DwVޞNfCd=zŅ<|2ʕ+emfe<>5*l׸q o/?`z*o<Ν7n=z@6/fRe*ݔMbxO'т5k2Eqat[Un>8Fdg5n5jzQ׈LѫW]G˕{歷5Rjc JP@T\ɜd$  jF#˗/#l=s?Zd٬YșLfM /<^I]r*Y޲eA@@2eJS&GNc)/PW)-pԓ?|ӳlUF(Q\l"p5XssJf6SС+HWqեj2e磮]:x;ꍨ͔m\,קkmzw6|\ uW)`M*Ud u&tu4,įJ{”/J[ڐԒg hA4 F&턂҉o/jIX^u#@FTޣm\ISTo.g Jkh޼mx~HKK򊏏+ibŊb~Qq% '&h'symKajI]KlmkִH`yQaN(;#RZ]ڈ^t.Ys7Ywk䵏}bE"Pt3gȁ8QBy -mHajI]Kl쁳@a>VVLrKRHw z1RkͶKfQe _й=N^(4SDN= )*MdnxS zh?WΛm) K,iذGVN8:tJ*fb#֋vիW?nnnM6*؄6o޼lٲ~~~`ꌴ>ǧRJ wlR>.Qvϋ5 >ԩkC!##cĈtt*kT͝2eJZ<== @gm۶5iݽA˗/[P+A4"yc[;yi5ڳgϢEׯO>B9s) ț7o.wqX*55u۶m,S;1cH;kݴt9s旕8j~nnԩSϜ9駟Nzh,?== .ЩxR6,ڟ):KGx涸:y͑?*$&&9~8ۼ;Y1݅x✜Nm֬YSu3P˧Of-^26ָ%}ِMϞ~M۱8KZX4>ǭ] k%_Om._)vA[/ű* "ufCg:JSSSrLrĎȖ4uD߿YzРA]3pȑ yPzCxY?eHUxMCC[D,V#,JMu21S'^t:[etmR^vEyMnKZcH@7<'Ӵn!j$r͛)S-UL|nSW^Dh "4{ OדYXZN~-/N<9cƌeggWWWIc=&ׯ_UU˗5bLSNe~Ur^HνJjj*O=UhĉO?PK/DU(vO6b}uzzip0֐j^SIwmҦ.((9~ԩ:?=)TE]Fk\c{ロgQ%MiqZZ;ӺmPSv6X/Ŷ*dK0H'gn(哙>|… ,$ U'F?lذ͛7 ׯ*TE +++߿.]vDxG}4 J&/˨d+SRRx',crr2 T),,իolOMˡM[^ @MuWWQ]ؗ.]ˣoqO\R%vΛ;aRRҠAk[WFצAU3Xg iA,!mZ%]k@70Ŵn!HXӧ9jRRl[B۟)"`SQ@bɒ%cILbXd͉nYY,7Z{w{$GdѣrrF[ݻm{H"8e={ְ2޼! {QE78 L|;2@27dO=$87kM`~wu4hn,DJJŋ u*>֖Hnk6={n#F ,'VM.ޛnt}^LN9oس}uD-aҹz)ax]/DnGþ )]OYpy %ڑ˟4]WM0F )?:pϐRg.b'v}<˗垢(z!0LD=SSTC&az R~u 9+ x)뙋h07Ŗ;ju-OlS,/-{0W)^9qq_cjȤ0L/$CO}Je$ו͖̋-,9ÇgX+Wj[BZwժb˰Q{f;ê߿wTןQG=dI~<Oj(S1SO<@7 O4OǮ@FL9Fxn*A 3 h,]OQ QC؉r ?:T$^Ŗ]_IKa悠a@*?Y棆3@~u$Iݕ-A#^,)ڑw& +fʁp`s*uܬqeWR h0Eay|)3  d3+ x)\4.2ۖ(t{|,OYYYeeeuu'ъ-o@XXL%>^IKa SWWG֭[Y)y:4 4 SfWR Х^SSC|eee Q8{ libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_so : link to shared object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile mockLibFunc_o --> mockLibFunc_so : link to shared object libFunc_so --> utestDoSome_bin : link ""function()"" to test mockLibFunc_so --> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o 'libFunc_o -[hidden]-> libFunc_a libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibFunc_c -[hidden]-> mockLibFunc_o 'mockLibFunc_o -[hidden]-> mockLibFunc_a mockLibFunc_o -[hidden]-> mockLibFunc_so libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libFunc_so -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibFunc_so @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_d.png000066400000000000000000000677101455674302600300030ustar00rootroot00000000000000PNG  IHDR>?joIDATx^xUCBBM*KE"( ~b(X=R iJUB(!@ BOHBrqnvssN\6l{PEzuImLRqH,,u0u.n~~~qqqo^fM:,|1z-kbiQ v>W'9~ UL&N6uӧ7#pP'LoҤ&R#zB=m\,;-nm۶ݵko222ϝ;'6f5233F}(r(FO]}|́ik֔\aqIcQ}I0R>R-%9Wn[X$`⑭>/VΜ{]!edD0=))Lٴi=ͰRJ:ubKq{txÇ׀xP Yizte˖qww0U8u1oq0b0ZdJj,".F`pq%I#[} ]2{֭{OIwiCLJQ9k֣G.^ ?RMH'~&<֥KI>Wo\lݑXHZnIR0y ̜9AժU2dHFFڵUVNNN͛7_nl]PE^nqgyѱu4__߶mV\?98PAruuYСCw:(hذ FV z WmеcȪU+=NZK,ݺ;vprrXj;RDH}L"]gE7DM?T9٥K>s8p`ʕM6޾}g2ѣGQB̞7yz,Y"ɔcǎ/Xrsrr^zƍSO&9Pg(G!W_zu-*T@n~eQ?JJyh 7YzbU8@!uA} A,^ZaJPv RoW3m9>7_!xTZ'yyzz^tݻ 3f תU,Ȍ\]Y)\-E$w߽|rzz_yf_h}4Ѿ>+KZǎۧO䤤޽{̮_MϴQg`"=?،4pV!}תSy kd ٳGۉJ +Vtoq-uu݅SH]޽+le*HСN5MS \W YjFŋizyyUT >>mvؑQѵkktyʔ)>k֬N:Qu aÆ mߐ@fTԩSׯOԦãj RMV~۔>5x݈ʶrTZ+\#Д"Tv aBrߊ ¸IĐ>V  ;xڮW>t}cS.;f27J-<<<SRRׯuRtU󡤮"lB()[Zӵudd$ӥHgHcHaÆLW/C)u#vR7.9<=LJܹwР^c bvZ4bc7l]n…52]ia.`UiÇHM=|JF|[7gJvUvA:LyϞ_Aҽ\L\ 30T9!*lFA*©$ӠMJ/Ma S9sOnܸ1ӛ4i"[px]J=-sԦã'gUFW֊V 9w(;;GbBلASҥK3{TT]\:;;7m444>RZRd/[lĐϐ˗//t_exGBgrTAan Ξk1..ʕmnff*[ ӕ] n5Ty{R>O}{jX/xR]]->,1J^N=eRJp]1Bd ePQ I@AtqtTRNjJ=Z:PQjtު34bL6SZ+\#Д"TvS 6ȑ5bMPF uA}٭i(ܽ_T)Yf*t[lqssc\]#A2Scy !=zT\$pJZ{]7J4ht2T)Po5*q47qvʔ)MB!~]e:;Wiڴ֭6r.Z]c رxRջ*=J&1MQ_ +^"ˠP5t׍ I׮]kҤɜ9sRXp`((I?u[譊T:JLQjrAe)XWP(e=~Q&(KHFdJ=TJbݑX3 2QWذ;?.}x ̦ {UuO0.Xk׮4yWHddd>}o߾ǏY)jbFaS _~3gfdd\rw8Oas…-[NR5tP[:uBBBƇֈ1c5nr!IǎJe(7ޠ"j"TcuRf\EZIAATHB77gٺ5;3]U,ii*VtRBVWzWMms׭ȕ:t>}:¥Kh@ O6 U1[؜8q[.]&M^^^:u>ŕHInjN >-ZãB mڴ b7o~Zj{nf7o^ժUHG/ݺu?36m8OuJJ ǧnݺK#FLOO] !6GIm5x b&Ge:VZ7-?ۮ]_" ͆G!Of۷ST]DRVV ٺܣ.皩 +RZXMKwqㆼn+JtSp1Y=}M_Jp]fӧOoߞByt <2(TŨoaQFB &˖-jQB1cCfggV5jD-pPQjӡpiÆ Jƒ*L6/SMZNT Bpu ]Y m8! J +-wY|C!jn#tsG[{,gnR?uJa4:?…{x4 6mZgM3NN[]C!eʔnn'Nl@aaΝ<=UT=/_UόR]7 I=wUܰay>TY+uV2kr}2WK+EjQCØQI>VԇB{K;ġ4]Aol30EI "# ̄=n4ӄO>_P UL& ;YQ i G>ZWPA\|IIa [==}GR}D)T3 L]n _޹OgWWbNVCaۜ߷d{ꕛ{Sǵf_||" U (M4vwȿvC{şk?mC|KW6{3Xyy1bpdynj-M޹WHAv UL%͙SyG [=گ ۉ6>% )o!+«tv~"oX\@E4>k7wT )y$P3wEtM,kz ?A ǒ= DâLg-fr鸑ySxZOfb5[ .5DS7Fqۛo+N mJ}J@pQ vgm`3(u\aAIR7`Ν;͙dt\\h߶mP]ˑԬY\u%,P0nwĤV`iT)Y*ϺaX$PrNxB6hBCҲ}۴ip/eo-[FhWKXC+Lu[~_,z\@#P l0լX$`-?..ur*/^/Mȁ4R({PQuㆂivz{@D;nZ,.kѢԍsk9]7JwڴitJ.mgey\,Mi(s4}._4z\XNɢ$Y.zP|Lk b–-} *&ˤnĞH7oRveoe˖ac~ b((я(md͚YZXaj֡w?3Y۞ h0z~q(|r ffTv?0yg6m'u0Nfhd f UDi8A.&l莍\~-b*1SpV1 hVBi>%L/_,Cwݎwѡ?? fP E:#Ig0qgXu?bTǑ~dAb@V" ~\/[awޖw?7k@).SkZrzV[kٲ)Y*UZYSNTe.1U+F NڶmSOڵk [=9{c>Y.4T58kFi-{l` >-;j߾?{~t%..H>#Ig0+)g5mTԣUqYC{>[oʿSO]#j/[~g^1j}(Ņxʠ+B(S˫׮HJ"bg.&]v-]岒ÓҾqel4c2K%,V1kFiɅl` >N֧Գ^s,YwݔժUC۝t &}%%|[,bҏ#ȂX$`ԍ;R&l1l(W|K=Gy[̌

|~:l{;7oݝ XJq!^7/uxaΙsrRxMϓ'<8#ͤJnҾI;#vv׍fLᮛFր b6a ?a+i`]a2so 6=?9;eѽ|>!V"ݝX`\g-4t1x7}G*&nRoi֝m$Aߍ:4+ rry+BBn:>>WW+WPp05jT5k̊ʕ{[a*]vM3W˖M=lJnҾIW|씆hѨz*&|FuY.UQ+t"NJ^ Zc uoX\@ER`Јh|@X̹:~so=KVm9yY}gvePGDD$$$gPsŚ}޽&HK\4> h+uUAФm=Vۅ#:St1\vؤ:?{o% E˓Rn@{dd$ 6loxBg):_n"\s5/" B˓Rn@e\DDD5=yMCg):_iiiYc2nAٵm_D˓YR^}+d).h.HHH='|$j١sDgWvv60?+Ν<фVe@-OfI X)a?M[V3[wxt X!&Nīcoڼ5gEYK|˽-.+W#uVGԍ:gͣ/"|ZLYUx/\j'ު 4Y <to>HS1u3fuVh}Uhy1< 6[/֏S83-lև_lh܇7j-/6@ fKjȾy@;38-6/6S7s,l֓ Uhy1R m>Jbȁ ^'/)ˀ`ʹ ؟u[5 %fƊ y+@{e<8Տ! _l 3nOዔ#1̻G>w?/6mn [|: !M;d h]~Yqmn (]X5j.o}5oh]m$^aWfv'X[ }y+@$xo u: 4{`?w,MLS2`fvEgIMiЗ,MJoE3ϡ-E%7? Л |~9,GAnމoy3y'}5E~6+~Eo;^_c!-6aG}T huy+@? s6U{>__6S&0HRo87sζ܏ʗ{6SI7oo,I{Tϗ;6S=#RvEV~h5PRg0}nˀcۮWu 1d߼'.n{n`sS2l5u;gx+@8; (/ pཕ/l3u{'/V2 03Y)w:2Df1 loApݷ &qANO*"mKV@Q5OH>`6rFͥ#@Ol3u fPqE~["mnodݸ[EqW|wV[+f궹zל  CgM\`^n`m)/or;ԎVy+$o?T7~#mngV*13Vv!oosso_f궡˺ P%x+Mj>mvQp !eڴiS͛yҥw4h̘1fA`>_Tr֤IӧOsEt]rSiƍN#;))陙Iq%l&TWs1=%%~L@ p0/`*l9ustt/*6BLF&)ADҥ͂| ԭiӦ]뤼IJll,өiuAi֬YBB 80yyyu)>>^HĉG t2i$fW n=zG w.~"S,X@;p̌ӧY80N0N:jZl+5jk!7Bt(\ӰaիSԉqJAAE<<<*TЦM f@ p0/`*l9u3\`K p0/`*l|#B0LmoDF| mA`>_Tf_s 2Neݸ[K -=.^ϗ86|ΩLˆ/0 1p3cEAn_@<2y@w|5?Pl9u#\1_n_msV@XIԍqy@7N_R+Ը}>ΛQ \kñԍȺqB}8={ (o`0 1m+ẑ'qc1yb\k7x+c_s'Ї4yh PvCby+cw#1x?]EF๶qw˟V@1m> lop4u#r?Ɍn>Ɨ` 6{|Xѽx+c#)`pݷ 5_׼`,;~r' op=u#rS#? i7eW$_RT7n`*_ցA9:|v9k}4bOבALRMˈbvH>)aG23M▿y+ԍ'yap %Q#m[0n2<֠oJQ {"+]oCMvop)Pp>X| 윣C:=w 0ϽWV iG>7Fe $j/qV [$m=\gfeO<o‰`8H"Cnm|Çi | po9=+x+ ruۅY9b{g^-`c> Л؟O|opFԈ'6 =M;g\J9`SaP ߱sx+ t}߅!ˈ')vr=`/oǥB<`8H݌$+h58EeCx?lkwrsxߝ`8H݊]E8o(.Ft @WP{tw&( މ8YCȾy7G̞j9`$H݌ 7Α3WuH_ux{%= ns'memI uH Weo]䝇n+ʑ!3yWa>;{6iO[L6yySvkހ-A:7Э'g!lP$i taOU]n=)H' yWa޻cO+~.o3er']t;m.}QX\!xڏ`GS6nF[ s]WƊyv=X@fw R/?6ƥ?6~){s}K=z<zv$f QC Yx'a7Br׹Hlʾ,Ny-Xu5n=b aԍ28D,)}ɡd'_ _![5^:?=_ ! u3 H Kݶ<""":::...111-D`K?*R7 ;'ȭƧ;Q`H CMH=H56.,u6/888<<<22[nGz.9`=ޤE-XcY7dH L]KQ a#uSۋ/kHaۚ}||({NLL ĊXv`A>XYx\F1 ; []ڈ-UؾN1{nɓW͙<F!y:BꍋE.',u[=kժUGDD$$$G`zW_h8ZC&n<`q[׮/]SdKׯK[N6C}:p!8))lذ$:p6ΝNzbQ K6LK_xxx\ܣ_LJ ' qBF X8H CeMbb62iƍv1\-i#1=##ɩ<ӛ4+IHFP-qOdR]NphMG d 0T&iFʃHc9AY;&4.-UqVlǔrTY8ZBfU b u3 Clr&lV(##IIaָͦMIﺕ*UJYΙRbQ R7#PN*"{'ʖ-2`@KpBsnnΕ+Wls2IDU䂅8Z1BdǕ(XE]hZ3mX8H Ce"G2{֭{OIwiCLJQ9k֣g.^ ?RMH'~&<֥KI>Wo\lW R7#PN*";~3CA^^#Vt:i-t~avXJCBc qq!cȎ7YzbĂAf*4q(\aڰaիPv%^)~_WؼyCoָM0:u\kժtf;w }J>xpxԨ\]%ERbR]Np)̞lƌ WVyȐ>3{XZpr*O#jZ/ٺdQ}vb[\KݟvAsww R8ԭw ٮʮ.ҁz2t軴FjSk)t1CmΟ(ީ aLv.f#PN*Ng;wk̘AN9/jn8 ٺ 5jTe_eqqA*X| }#G֭3K*Z|Xd&Mgׯ eY&J FP "GYVYťZ@b#SAR7P8\F>fLON_u]+W6"yl2LWzƑv1t軵k׬R?I?= z^.JvUv5:P(ye:kVX0µJ9Ҕβj~rQ&(x@f* ԇi .S4 QT)ǎEsMml]n.]\1ȕ))ƌԱcku.duwUz4'}c#y`k]b],+֧tL[Z5d6ss^*Hie1;v,{w͛ǍQJtSp1Y=}MyJ JgYv>Ec.-(4rOP u3wA0Ny18?…{x4 6mZgM3NN[]C!eʔnn'Nl@aeΝ<=UT9|9T_ +_UxSpԓ/|Z ֞7oSO+u^,*!#;ĺY]/Ԣlpa(F Jn2qع érSrp-т ,R7ġ$f#p*zz曏F@hA a`P`8̟m:5kVw p-т ,R7ġ$f#x$,[` @hA ans|T^TDrsU}vMOI R7a bEnY2ĂAf*3zEtM,kz ?B JK R7#x|  AZ d 0TR7-Fqۛo+N mJ}JLphM0µBF X8H CipܹcܜI֯I{}ʕ{JUm ۵{G[H͚կ^}|ʕmߘoA0phP0µBF X8H Ce`)XthBCҲ}m#۴ip/eo-[Fh-"f#PN F@hA aL-?..ur*/~I4u#HBGFpQN F@hA aLBE~R7έ]w(QKL)vhӦҥ([mm7_;xpY7kDe8نEI4Z ǘb–-8 Έ0T&a_{"m޼Jɓ~-[m;+|({FG?ڝ5kfaUpGA/_ãY#ߩʮ]?4^xMI@5N4Z TBF:u1aE+>3b u3 }&P5uTF2dgL%fK\Eُ?WϤVV>?xIuiߤb;F_]7M-akaV<~#Kd}8]ϖ9{ɰaܹ-T˗ObE,݉uis!7}G`q!ٱn1aEo2TF2ċCzzr GQFYFpά\54qlѱܳ6^&uR]7ri-U^e„ϨNc u@)dY4~dz#ӡY7ud-swrq=m{/Y2^E;. a3qoG9A,Xn4qEvDLr 3J7Nc uڠ8!cW-''mo<}_hJ a(M%9e;VPA0pOq(|Ԧe˦i F(NX0u]W(<^fX8H Ci.ɑ.qM D2ZĂAfJtItَo2BF4 p-т ,R7P8Krvg}`6Ѡ`k`qF#tItَo2BF:IҶR &pc-!cсX8HB_-"wMqUb&#$! FeAhG [&aq{\\)1䀯n_߄rSobgٿa,\nq\&) i(JM2NO#~/:7=ޣirirq$nц}=D(ql-uJ޺Gϻ}0\\K <<:pȧ37UkvFKӵ13Vh o :%-ڍ3^+4yg۳6+(9SjtO` :E-?+{{wsc~y [`!/u,r5(or8`"2ݠXJ` :-+ιk=7pKwx=&'/DZO r=MU=|:h`XG=~q{,vSS,K+C3x9xb쏫x+,R/,ujrpڽqD,ZItE|0qSUψw~Nb_ϯ"X>uKxeu K7,[]` :űXꖟuieH_=fA鋼BeP @t `MŪ}.hЃ۞@WP` :(WmmXvv|=`/o :60{Vso׾_oП=ug!F }Oבm/VqtRŽ=LN=wB􍙾"J2$ yo :0YFW$I;nSUC= '7~D&H]=9~IPa?{@nZuxp鯐]~ķ bxމ81ۿ/f|`UD @ta@ /fqX!5{?w/At RtV{?|_}#^qzGD$j۽cOn{[6;w˸D&u˹{?ׇ.82xpۅQ#VhՈwye¿nVhסo(w@tm98ɢg1) cE]DQ2;2h/9b"sZ(T̎ ڋx/>J]U(%g%;(2E:艩QǠ\$m }BQE@JTc^ r.Ӷf{ VޤAEb-ĻUTZYLՎ: "1mkQELի[hQB۟>}s8v옻 ئP*,٣Gvsssuu%6]vjɩy֭cF?իWRo}A|:u*U6 fΜ٠Ajժ 2$## >7nxҥB?(,YҨQ#gg#FPS)J;˛)m۶.H\\\ڵZa/1*CW)mh-*pv:Ǐ*:::IMq)#**.)6mʌJ8zh.]UPH2e4tGhVRY}v* k̊❫5L b OجYҗ`6CaoU 1|Z 2GLjz5J̑u] -[MP wܡ9ݻJI6!!AlaPXӵQ39 uAzS Buw(\apӂJJQ)zҲeAO)kG !#sb711Nٳ> 'NSN&M>o߾ǏLkZQ4hꌏ߿R,X@dffFFFӇ'OܣG?U,޽LQکWNs @ UQiA%j OϨBqŊZa=RZ91 V{g̘S!ͫZFCpԨQ"SJl޼^prrjժݻQ[n8yꩧիh"iTQB6m1;CV^.&-[&;XPaÆTƜx Sv;a„:uP(N;PZwRN *QSdx*}F=߿iӦyyyZa=RZ9.l/[,o@ ދ[o[(&64HLѣG3hĻq=~`{ : R7O/]IРAf (&64Hk(D&uXcJ8.% ^˾u(:_=A rhց5{$m 6GgbgsSwP{Ԉ9Xԍ}|wBp7uy|2.'fmm?fƊ$D>u#F tyo_-vwveN pHLԨ.=_2{y̏bFP`C\g@An^bȁ&lyqx0jv6![+(m<|9ۋV@HHbKwB*j =,{Czekƞ#0#Nfn;2$/@Q4;= ]~_f8(y! 0)969MU=}89i[OY{x"HXey+&,M;{y;Zs;/x0-674LjL|{/c7G%M'[Dݐp_ܞ1YFdG~f2oª-S-X]AAÇMT@mڍv)S7?6{/ wI~hs'ͯ|'$/]\slϛ2]:u٣t1_k.{.T8իԭw ٮoԓCߥDS x&5R)a"?Ư|]>֮OFvb i-USOݺv}ڵ$L []H~/]B3iC;txgѩS † {OJWn#ܹ)_7.ZjޠXa\=..? Pxzzn߾f͚z:˫wbK^f϶;b&g;wg;wk̘A.;dBUFU+_ϨQ+.z`)>[n/läI$ݻ5DkkZS}c,_@eɺ/j))rT^HHӧ7#pPr'LoҤ&R#ty-j{"۸Xu]+WJ T(Qm۶vCFFsFڬQFffhb&ghpf''կ_#YM&ʖ-t1O:ڵkV|Hݟvq]/^|9iWeW|Xdc2z5DkkZS}cL_Ӷ}'USETS+1.NYvָMjMh\Zَ;CU6uo TYR~`8Ѭ^W^ۚ5kx?+#CC씣)S(Uevّ& ]\11k̘A;VBVWzWGCɁz":ƹ1ZTKW #cD}XcZ :1ƤUSExS+1I9sfV|-N)]3q#F YD,tssfJ EknFc{=:ÿkUSaQ!#ܰo֬K[ՙp#Y)dxy|LģXI_ Y]]6 Yw݊DORSWs`*aD"P|L+A'5*ŲAhZ3mJ8VlbGٳnݻ,~EZCM~0>>OָY=vbY7jB(v83ᱛ.]Nzb{߾|ꜾjժޠXL5իWhѢB ۷?}4p1ww M'E^Ohƍ<󌣣c֭i>m۶\ǟ)spv:###㫯ruuYСCw:(hذ FB?}=z|L3g6hРZjC 3]ZjԼw6UY `0!BHB0 \T@Ł U"0@$@Pl? 0:q?af9q}PU]U///=9nUuW}o͛7d699/ 584Ilj2WR@MGs￿ҥOy~uwnʲ7UqS,pcY7pPG5k gZRRҧ~ZPP6;vNk׮-X|իW>ITv_r 0` m"ӑ 3`f͢ PΞ%Yo`1Hl(bCmv>L+[.׳͚,zi顲y}b&6# 隘[XDۼr2#czLL/YA*W*ُIv?s${AAÆ%CVZO< 833cʢvE*Eh?vS>}{I}^^\B;׌ӧX"֧O8~ΝKeO>;7F~Ę1c.\~Jdgg}ח.]z'̙C꣣!`*MF*Ńd6ׯ͝4SRڕCMddN{V:iiwvGN.WӱdeJ۲bۄ=y)=ztה޹s F9 `#_}4 9u|^tijj*4s9s&QTv+sHXd:> OG¢EŸ(fIћ`JF,\[C.u%2wAH'ܭ젴oP#«t1̼?xR +·JRc GV΅a C%eKV !OG㱱, ةFC/Hf5IHH.\'}B,{(M)pbs$[|KP֏8p nb:<؞MpO,M#G*MڋqM)z3,\ֈkbkhӥpYF]psJm wYxҢpn5łXNa"\sF;P``iD'AAApصkWRKtN8A? F$evh w! WUU|DDD\\\yy9hbgp55便 "*8xe MىSL\d:>l }R6M,7S '[#vQ;C.{U.Uv[ԁJQm wYxҢpn5ܹX7YyOǂ8@! O[C=DRŸm*fQޛ`iM ٳ{k |[$ YZ[n5qY=ŋ54hРCqs$44pIUEEE} `auuuO?tTPMOuMp^4*""&^dggѮ͞=WPK(4qF^^^BBBHHHJJʻKw1taÆ}Gm&(qrիp[krAey}}=ܤqЃ-ӑi4eB }R6M,z3,x2MAZ;~||߈r5B4Ko[(yC=݈]-[}#~WNAs*^HMQn. ̙U3mJw1'Ңpną\>Vs<{sſ4&Q/,,",O@XQF |+FwW?xEp9Dd KvpFVIX⧠-9t>;k1'\Z[nĵ[p֣9DDݳ=9cf1#DZ"# ZQӍO4 ΐeW"x æo3n뭩[ܻHېI󃶘<&(t[ m^=8yrocO N %mKS2%_)LhbLixU-%`dm!r}Gq(bn{Gp .7+6eĀQ0HGA,[UdFXe. .u!Qȇu]:tPI>x'Έ ş~"/۳"@Aq`zEޢ- @(9 FW@PMQ uC͖R]Cd꫿DGG_o?6eXQ;w;nP_QP'~YwŊ9{Gp+]t [FH zCțNz ?{{3gzbv7cY7FNؕҭ[w My'iK9|8>?)&6hP? *bJT/~ۢ.|G`}[.3++7%% 53s&Sg s>(m.XЭB-߼|yy>x|AN΋/#唔s_fv؉ؤ8AӍ/2LY=zXAA&キ*99jBCQ-,ؗ_ΚfXXhQѫ250֞=;w>}z3\kd#:wx1(JۊZ7t~Pf?{g/^i@\w. N7N{k#ݺ7¦MY#G !yL4("nQm'D59N]ˌtTmE&tfu Ѭwf tm{n1"ɴ F߿Դ/^v)62j 2ٛ" r┉rEE!}M4GM qLMD,3lY"ȷnFnw) a5Uߊ{g6:'¢5*t+.~<.p-0LO[BX媪"fӇ՞N6n\귌3/D;¡01FN*/Fuh"ȰKgq.]:sm߾"99k.IIJKsej%eqDfe|Gxӡyq kF?ztG~lWb(,*kQB7 P#k+npxFYqh alk_z lWb(,*kQ; .F41V咓㪪O[Uxp> 2Mܡ>}Hng* 2KL%O޸Q5`@̱c;N6nݺl̠3ٝ!w^G=O|-P1bƽ% x8!kE0thA8"hP8147h-bI3V.bH 784q A{wGĎ۷h0;񐵢uG. ݴ(-t#g&hP8xVxgFӳnCu3ա}ŞV*@.\0*GaFWg ñe1☘^+W(xZѺ#n vCmb3~4^mV0o}J%Tg_luGއnb҄Xa vCab䦍%iXh1UJfLAE܆XUD`hc'Zw}&&MF@ihA8&8GKhLmb1UJfLAE܆hݑ4!&V''nPXY n=AE܆hݑ4!&V''nPXs"nC|PPML+N7p(L9g[[xA+Gqݑa/ [(> |.~0g /6Aq(Q ݌@Aإ&+AE*"zîe,0/ !RmpGEEE555tZ7tsG&AELuu5;w@q (4@t0tG&AE ꕕpΗnC,, , ,ŋzaKAM!ƋZ8۫+**"t,nbQY!&AE /^$`9`Q`i`zY Pl z:hb4^A&tc3Pkm7_a^88l@XMYƋ фn,EEE &"41Ƌ aud M "pln'1y2^Q&xq86B7L,A94^A #KEhbNAc#tCAA AA ! m+<3CRIENDB`cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_e.plantuml000066400000000000000000000030171455674302600310420ustar00rootroot00000000000000@startuml skinparam linetype polyline object "libFunction.c" as libFunc_c { function() dependency() } object "libFunction.o" as libFunc_o { function() dependency() } object "libFunction.so" as libFunc_so { function() dependency() } object "utestDoSomething.c" as utestDoSome_c { testDoSomething() } object "utestDoSomething.o" as utestDoSome_o { testDoSomething() } object "utestDoSomething" as utestDoSome_bin { testDoSomething() function() 'dependency() dependency() // mocked } object "mockLibFunction.c" as mockLibFunc_c { dependency() // mocked } object "mockLibFunction.o" as mockLibFunc_o { dependency() // mocked } libFunc_c .> libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_so : link to shared object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile libFunc_so --> utestDoSome_bin : link ""function()"" to test mockLibFunc_o --> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibFunc_c -[hidden]-> mockLibFunc_o libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libFunc_so -[hidden]> utestDoSome_bin @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_e.png000066400000000000000000000666351455674302600300110ustar00rootroot00000000000000PNG  IHDR*J}<mdIDATx^ \Uoj +"ZfY`RjjieZڿwLr\@P\-ErGqceq:p/r<><9gΝ9Ϲ\+b 8A`U~X_VUA`U+DBd%^ wLO(5ʍ0+zܿB7,|E Gnq I}~"~ B-*,>oyxxxTTTLLL|||rr2w (Tz:Y,۸WPPЮ]"""(y&wM(,% 灢_*uR|- KV@XTTT||AI0]eБMNS7n\GjI驩ᎎޤI]UJ4jT[ DqIڴi[CjjSttHիWOKK-JP@4%vD`FbL]c|ײ)E/?U4"Ps.mDN KKUUz"1qRL9AVX1##ZxVZխ[7ޚիyP '!f5%2ĝ1u)Jj`X3_y*CG8yb̙L?}z7'iurRSÙ*mlڴG'xBY/YIVxNo}?ׯo*A"H[Lҵj9U84SJܹLcvUbsΘ%_s(tQ)QHCkͲ^~p ؉Wؽ_]"JZ}Mr066gָYnɺx1X|KsU!;OpWm&M޸.#N~:ӯ^̜9AUV|xj7nL=ƦR@trr1bU7o^|yԧNb"WZ6]AdcM֨^d7_eu1s| Pŋ5lXZʔJ<߮s;4k{5nl&LN5/]:C=Һ5CLTj\l'tHve_ei˹HyzPȯO|^^^.]snj5k֤Ç45ߟ>RZRIJ߾}/_2}W_}-ZD9駟>,iM@j;vlϞ=w70~43E"j!T"WaD0{v37hPjJf U+7Grkx&gի#ӕVxq-uuV-g* OIuݺ.{d/Uٵƅ:POK;mԨ6*GfR"e36(ĂlpbY/^AYbE X١CFC.]өS)S0Y:vH)v &IQSN_Z>ReXy)ӦM+ԿwH¼}^ʶrTZ+ta(,ʔSv 1Bc_ ]=Oeسt:w>WrݝE}5 l ܄ʓׯuRsU󑤮"lB3 )㡋KnDDӥHgHHaÆLW/C)"/߾wnc dvJׯ.ΞԿ[u Wt5o"]lWT] ޽˗OmK͘R]]k,>,& yׯ Y&.R6)NpTؔ .U!o=Pi&¦0)Μ9SN5nܘM4~0}.U86zHM[>5CGMCލ(Oz/_vSZ+ta(,ʔSv Z\5 `TPMбg)̸Lع>r/L4wD*U### ɩiӦ!!!ՕՒZM%{2ed }^\9)tt2(K=ϟ8)58wnCׯt]+W6"vLLWv1thڵkTԀoSNOukOnX/W`R]]k,>,1J@N=eR"")CiI*Fi/&E" P-JƏ/6*kCGMe{ne tZT CaQ#Zqj99Zl T)S:,t:x 3<-[M.bLߓOp}CGMrBoUe7_M*T ՕSvrn"۸(nD֮CM/qb<`5cC Ztf?H\oqX`A.]h={2{^4)ԬYyJGA2վ+3gLMMrJ߾}S\pa˖-é6 :TVNl5b̘1t}ұc2~Jx뭷Z4WyI/Jg\EZINNdpBWW'ٺ49w;1]:R,+TpTBVWzWMmW̛v۷o?}tK.јƞlpbG9qDޯΝ;O4===;v+)>> J=˚5‹Hao+9ȋ;^m{mӖKϽ SO_,փR1D&yqƊytQRO* &_s EKzxL'6>eϨDST. T~tQyL߹sǸ:[}?O )[I"W=*ʷM;m,{5]Z{ە+\\ n}Ngqu_<JAњe6_.JP2~*<MȨ-6-PHZB_>؍[7_𛔔20Fʔ)-@atG-ߣ /%JP@4%8 V>jY2~eg/ťKǥ9PE e`;6_i~C&VPҨDS /^恢_j9,iѢoskY_l;n| -\M6-dW2R:x}Vgl;8AҀvP q)YD;˓s S"O7>L \mҧ:e(Jn-/J׉)Sm;詧--8DFPFi۝իgidc範cRe@7‰rʺ55kDVVR (REiM<9cP.1'ł-gn_X)zLH/nSt+gߜN3:4p%@4UD} qʟQ 1gm"Av*%$%.*lY44k֐{ٸqs6|"Au:N_ΰ74goSGŢyQ"=[oΦ|V>ady?2oG%(đV[jٲ)Y*V믓YS^X.яf*U*|F NڶmɓOڵk X9K/5cl.^'N?xp;ı#ե}vF/_<9W?.a ؑF% p-s:taөS˗OC"ĺt:Cn!!i۰anǑ~deU&I;K,P` JHRd-P n^T!LT^e֬3+*[IntE0M@-[6up(ۢE㠠JnؑҾI#J6oިZ&|Js<9W?.a vŎp4* ~p&Ӎl=$))ٹLڃu_dXtwb]:}qa_W˼y_K?#E/ͦ_0I ~4x]jv}*%_O_;61AaW~K\--Oϴ ls ~AýsȈ`MN+Ʀ_҅]0I~2޷ջѯ̫IGcl O1~ѲeSvWD/.a̙.J0]/ nk<`l%]h ]`ժ Dz:%gymF`K(Dk"SmNtQ⢗yK@UL>wٖz#&JAњ()F(60]e06.4.F0gՆ~:|=8JAњ)VE^c/Bb~Vm*z98`A=o. ,֟.Y2~#$bҪ S% ÂAӅFD󀍤_b^˞ɼrco$=KVi9yX[Uh+WS8PlXmX=||j RK_6,H#**N}@@EnY5ɺjy Ag):_Y*toU찦hy_I@H_A'="">]Q?~uV#:Stn޼ɟEBqL~R{-<(At E睮w?м/o!93E+99?XO!W4p\؎|y@> ]^VRb(bt˱7>tvљ󕞞ΟEsGvt_`mΗ4>ȧ_YAl~[$a:=,~§_U-zU<)|;۷\{Xb/`.[#+/ nƾ|9|%&<<<((gZɝj-/dҕ4oh݈OgeOˀQKolS-ު4c85ӖV6m->O jWL1,5|@ Y0G p7mͻ|!//5mj/d|2APf眝2 j͚ʡ9o_ 1;]Pr\ʧ{vo "jW /r {JqJ68{Eי,AhOn:[VA}oї2`h4܏kx+4 % .W tyr2`h4<,APky/!nn=˗@n P#@ITg䨹~~h} P 0ܜ2< LÌ㣽꾓_ _;^t'2&^ʝy+/81} MNW`yҮ&7o9g!bTbM|ln {uo=OuZL2n'oօ,A¶}o0g2~\{` 7,ne9Y|h1qfgV%]1ē,AV-޽~/@ӯz,Aڨ1 x+l(ċ/J2ӯ+>;OKpjꯧ-3:9qݮo/@-_1G[ |x+$?06_ZLN_x+D|:+ͼP$bpK_*ZL9u` ?oȃ 2 CᏧyoKy+mis2@ןݿr,AhOn:[Ƒu?[}4_h1 }S<1b"g.VآEXiӦڵ;wFM5jiĈSrrrfΜ٠AU<85k-$G_LGKk֬Y;vxbbbaØ~.]өS)S0; ݻ3HOOϊ+366mvAp!eڴiS/]tΝ35/L [`:X M_M49u9]"9sTڸqcMHH`zZZmRxt! O>-)nnnLOJJ_>5/Lѳ;[`)4~988<|߅2BL&)b TRA|`7k5Rh:jڴI7I9{,өiuAyg̀$S5Rh:رcll'N޹sI&16I`eڵ`EEZZZDDDϞ=]$w?#jt9a„:uԬYsٲeQFC6 kL6lXZ5 NYh[[nyff@ 0?|g,5Rh:*@|`6>[j95:(>_ X j-u|=P| 0[g:oDgXs_Dӯ߈ZfC19b1`ZLRb<o<~1b p8=㷜, `99~\CEQƗ͹VOnE<~c?ѝȂ\,EK;[g_Re83~/5]:1~INz_0ܬlj qyu_Ԕ_N`:H9w\H~/ݨ[87h|vωqK~[0}_kvo-ĵdX̬MQƗ`ЗNZ y)"2n'0yKnŗ[y?;2ȑ?[0_?57+_0Q_ͧJz/.9w[0]_DG;#awqcq Oge&eG>y` y5b$ αsR3bLu/8 +,q ; {|6},own X`F1^ĝ2aw V72T*Pd=#7Ą~e^kcN!np"),2sR %5-~N@W`uɼ{Q~E:k~ӯ?#>ŏ)}eJH>gy/oiޭb{H~;^A l'ǭJ:}Ad>>99?GN߽{/Bȑ01K*X|Xd&M_Aҵ+\L:ωBUehq^ʲ񠠅U才N A 'O{F%.08[s61=11~L[eo\&ۈfZڡ2eJ3]EС}k׮QSM9?֭=?r (_Uم"@CYG+TUVE(-qj99Zl $OJ\(}apvb(] O_f?v̇.ߝ*7mZo֟dr.9;WezvƌءK]JWh(9PO Q87G+TUV¹JDi8"n"۸hTR]k~?#D,ȈOD;Aa=/Dg\EZINNdpBWW'ٺܗwtc쓓W/ޅJ* tLdSW5iRFKZ XJ{L JOT#rKtKB_QG&Ofիcd]SUfuٺ̣. +RZKKwqƋ_b]]nJn:&/R9WU8b].gS2MI,g1`a;(Q1:ǿ%oŲs9?GħݢyRa=/D7;…߸5 ֭giGrZl]C>K_7OE;w.swo[b>uוiWMmRO>U+5lXkO+u}} \s!֕qe<4\Oƌbn,l%=_Js= ӞA\XS(|HWbhiA5f_:) U --ƌ 'O{qa?:u\jԨg 7qAZZ}$OL=X"e --ƌ̙c9.M[<ڻw^:Ҧ:ˎaqё%T1#z3ү=x1>˚5›.Ha/+AeDz}-R҂kH"Hү=^?p`IMu=MBCK 1c? *?0]lgDn<l'\(6mZ/жFjԨvjmWlsq)x,iϨDkP҂kH KĊEMK;V-gPj5ײOcz.&% L2eJ -"ig)WbhiA5f_E~eg/ťīǥ9PE e`;6_P D_ט~=!U9$d1%O}+_[۶ϊd+>~ءuKNmoڴi!HQZF(mdYXJ* o\nn fUT~yE7 zF/CDkEMD_481[.t0=~bRbҧ:kHJRn)NR\Hqf<))\IwOϤf+WHK;t{u:M)hgm Uʼn9H],raٲCXJLRg}$Ol\D;P>,3g^Mpf?g0]SrF_f;)nkrQںuOyժ\\~Mnű="bM*O>hLACɱc>>D|cTJ>IJ>y4e4 5knɉlܸιs  |"AuK3: TǑ~dkH ygBÝG#[V_XnoݻU`Y>^{&]DFҏ#bט~Ai(ŅxKm?.5k<&vCY..]] ~Nj[A,_+]K_cR}ʕ;ڲQaIOZ`XgKna5pҕmٲmJ?#E_c~@%#k)`˖]gB^ nW5e9qN&%]ܧޔā#ե}vF/~dAJC+,>Hv%C>nd˜-f'6}9:aa)~!V"ݝXx3dÆrGŢ1c? XB$O{F).yccu{R |r3QzYFpάl'uҲeS-Z4 Z&.t%_Nd捪U@K $9Yq |Z ? `h _z]VIѼ=x6H,Ɂ>UP< p@k wo➙H!7džlMb\ySy+D{;/kY`]NM1y/ƣ@eR.^ ty kj(q=χ{/e㣽x+D|: +`^ /˰{sWx+K 19  ?Ҭo{Jqmx6&H,sx 'x=`l#`h_撓ˉ|$iAKx62H/@Svo =@ 2}.bcNx{vx,HekRx++.7';# m]~-oIr/Z闹s`4L#b3E@!i>:j ^m2ӂScS~uHB_:;2i/JJvLE!i>J]U!WSlkf?ՐRgFbv1i/&9e[FBUTƩɿl Ԙ%_%П"T0~@ XuLڋI΅bրm,B*Eѿ_m2ӂScS~(BPE%sXYjU˗/߮]S -8;vVZ ,`B=Ņ3ZjجYk2RΟ?ߧOjժU\w߽y|:u<3s TZu322N7ntRbLK,iԨӈ#)feeM<^z&p GIi-\i]1"Ƞ_}ݺuN\rf͚,'gd|}Y:S-Zؿ+6m@;w) dxJĘYWGM/{_vԏRkc,JH@Z]KPPG}ݻw\\ӧo^(0шҥ˵|:u4eq)f 6<|&3RZl{:r!Czg^^^.]snjSN\~Gv)Y]iӦ v(t֬Y;vxbbbaøZh$$*J[)r7Fg4&oN_$9Jm*%٣WʶrTZ 1ܱR:Gb*&ZbPB}a4ʑŋr'""Y8GW'gΜa:](QnE]zUlTꀘde:_|Y(rssfzRRRNGv)ӧv(I&E쮁( lo)4>oӦ ]6 iۖ LJ( KSqb̬ԦXREدl;JG)JFX)#1\v-{jd1(>3Ej0~|/R_32"##zɩiӦ!!!̨ԁGvܹjժ|J.-8 ́QT)f#4+Fdg1;5s4\mL1A\]aȨ |gjZ.G …M1Q:8ҦP;U'Eu6 cIş)fnS(1E5N᪘k %6_v29sحWd Fl6:@-x{{߾}&;wg,'0ٳ?5hS39 uAzS #@H3!UQ .rUvzI˖-AbLC Q:*rJCvݩ81fUQjӠ0Te7_M\NrȜB`Eo||<ٳg}h&&N(_'M$-W^Ǐ\A͚5Q4PhnӧR,X@EDDٓ'O!1b(]vzzzvؑ:,-;P.,Yu_Om&!~6H =rϷӥbuIu)$~ݨ|1?>~6闅yp߃{u5r !(&:"^Зǭܒ!i#p/@_ *rsgoQJu`Ersr],^vwg;~/xQEIbQZ{Hj\‰qKkx}sM{`}gЅZثC83xȼn?\i={v˪=qذ6Uu?wީ#l@o"bU^:~Y.,Y!_y/Xmr@[ |3=}6WIrs_NX'QHF|.x6~<sy }*ϪdImlV[n_Yh|']{//YݾٟxIx-j€]|glBGx6~iU!/4+0A;^xKfN=@lֹ1scC& ?#w{(Ae_dN>:ꐜ `EFgEκW`?p }/&˽~$ ݂ɉ޿teybLj,7.?o|qmܬ[hJg LȽ6U}D4=ˮsnHq{-z>򆊝&ܫJ磟'{(xT|TwC `9FtJhW]pvx?ޯ ~w7Urj YGYxדW}oμ{=#^;3]#y/?m/]ޢ?>x)E$, e]mGoo<<3BJPn ȓ*dgni^<E|(Xszפ_s )A(0_n9})S1! M@ۚHXDRnqH Jn__|~xt6궧kflҙ.$/#`0H~m<<<<***&&&>>>9Wy 0̬~a? 3|󖅻;`i~pu )SV-~<~| ' uwuuT{۝;I},"ҮJ}T Kyڵ+""27o' U~p鏠| //?{[e)`<tE32(9JG˛o;vPbb{wXڹsED',Z=~O@@e`QQQ @_2n'.ĭ_`nªx 8=wab`<*l~b0{v37hPjJLI9졡?jXYkx&gի#><{vSo6/\^ 'OK^FҩS)S>g7xqԨcb6+.w˧P6rLfAҮҥ-M6}87%Ivwtz7u._v튉yN * `0v7mbzbbh5^…\MʹCeʔfzFO'7tС}k׮QSM9?֭=Br2KpGruPS~b 7ZMx !~QQt)'~Oޝ*7mZo֟dr.9;WeC H m=IƌءK]JWh(9PORǔ)_" "#u(pY"OSQ 1RSÙ* oQn<ҥ-Lrr":BsvbүYbIN_xRջ*lJn~k X,&͗khSTTB}Mr066ghwvzFmty,9fuYG/\b7SV4q½\;4ic;wݸ{ܸo񢺿l%֕/UT6c½_ /HePnz,^<5*/= []ڈ%oOHk/uY.]~/?a! xR,ܹݽmŊ(=ua_JR]7 I=V԰am/O>YF&/`~ˠ Hk׶2ului#˗fѱckFOH6}FTa6.bJ rb NM }5jlA,GOOݻ-ݺu={آkTB bq0=a9* pǩS7jI]ԤI]UJ܆"۸Xd׋)5ȉ3៬EP(ԁѦM0ުRSSFڬ^zZT% /@ݽW_}$u5;x`55P(* DB>IKUIKUUz"1bJ rb ndRhϊ+fddVad7̪Uu[[z5o"U̩H5 ʪX8'ha}Z:JeNέf^iL/ReZasf$2ehEڥ9ӽT]Yݳsw90{1<yσ)) }z )tfmP ^fĥ9$2C/]nfnpURn@IAr-6 o+)מ?~޽Rݻw'''XmrBDZCFDD;ٰaøq㢣_}U^BǏ뮻Νu/vAAtrq ---<@bb" yf.K,IMMӧmFo>f̘ȌuYu 1(D[UT -_߾C .1E椤$%zER$ K-tJ @ ??K.TTTmٲUqt5fΜ7455ю.bV_XX8r;v͙3tge4Z;}ロ:uYn 2:xGrm}+[?'O?eH] .͛ꓒ,677ӥ={6TO~x; /U/86 R, +#%''WWWKTg`cȝ2mvP XY_~BE;_|{4h)C꒞Ο?r<+ߟÇy˓J_ ĺ ^AMp6R3:*.\(~:-, Cև577GDDn riW8i푕]H]ۅ!CTVVJd]" 2x`5JA|!W j~;xe˖ $Tg O:|YwD.O>?>ɵh'ϼE)55ue좋Fw('VgB @"ooCrB#~3ج |N_IVAA~}i)9lS͍roq&T bbH.R^`/`{y 0؄ fmTanхXH,ֳ A6@ bb6^Q ŝ'/00 bbBrq `6pYٛ.-6!\_ 6kA$ޤtan 1bFfY $IG& 38pL]?FfЭ w98&I2iRVTTQwZ7O)^Fʽr8M4PKkk͠A)uuy38p. FfЭ YYËHI8qLqq~swy.3sH$6^Fʽr8}uM޸)*|ѫS& 38p. FfЭ <|3IQQ!uTmddffͫ.-< A6,*IEE ξ8_J}ml#,/wXZlqlӛ.-%›I.5F#~3V߾꫊k͎jI ?Em_mpdE:rd{\\5kMoR0BL oVG>kr} H ,t_ NtӜ7ZsR6I $:/ |_|[Sru^`/`'kNiѮ}[ Տ:U[t!0%Ϟ=eժvc4IAZ MW\yF橪*///))Y @.]RA0 2(/`/`Z6oLb .](\tK @_]D__<4UWWӔT^^^ lKD.]GʗE`/`Fjkk% E.ڱcK @nRAC6ѣ'[хEEt얮%̀nO`# $w  H. mt3 e _@rqWi `ҖA0~x .2F˖IENDB`cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_extref.plantuml000066400000000000000000000056051455674302600321200ustar00rootroot00000000000000@startuml skinparam linetype polyline object "libDependency.c" as libDep_c { dependency() } object "libDependency.o" as libDep_o { dependency() } object "libDependency.so" as libDep_so { dependency() } object "libDependency.a" as libDep_a { dependency() } object "libFunction.c" as libFunc_c { function() } object "libFunction.o" as libFunc_o { function() } object "libFunction.so" as libFunc_so { function() } object "libFunction.a" as libFunc_a { function() } object "utestDoSomething.c" as utestDoSome_c { testDoSomething() } object "utestDoSomething.o" as utestDoSome_o { testDoSomething() } object "utestDoSomething" as utestDoSome_bin { testDoSomething() function() dependency() dependency() // mocked } object "mockLibDependency.c" as mockLibDep_c { dependency() // mocked } object "mockLibDependency.o" as mockLibDep_o { dependency() // mocked } object "mockLibDependency.so" as mockLibDep_so { dependency() // mocked } object "mockLibDependency.a" as mockLibDep_a { dependency() // mocked } ' # Order the elements libDep_c -[hidden]-> libDep_o libDep_o -[hidden]-> libDep_a libDep_o -[hidden]-> libDep_so libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibDep_c -[hidden]-> mockLibDep_o mockLibDep_o -[hidden]-> mockLibDep_a mockLibDep_o -[hidden]-> mockLibDep_so libDep_c -[hidden]> libFunc_c libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibDep_c libDep_o -[hidden]> libFunc_o libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibDep_o libDep_so -[hidden]> libDep_a 'libDep_so -[hidden]> libFunc_so 'libDep_so -[hidden]> libFunc_a libDep_a -[hidden]> libFunc_so 'libDep_a -[hidden]> libFunc_a libFunc_so -[hidden]> libFunc_a 'libFunc_so -[hidden]> utestDoSome_bin libFunc_a -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibDep_so 'utestDoSome_bin -[hidden]> mockLibDep_a mockLibDep_so -[hidden]> mockLibDep_a ' # The Links between the objects/source files/binaries 'libFunc_c .> libDep_c : depends on ""dependency()"" libDep_c <. libFunc_c : depends on ""dependency()"" utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibDep_c : uses mocked dependencies libDep_c --> libDep_o : compile libDep_o --> libDep_so : link to shared object libDep_o --> libDep_a : link to static object libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_so : link to shared object libFunc_o --> libFunc_a : link to static object utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibDep_c --> mockLibDep_o : compile mockLibDep_o --> mockLibDep_so : link to shared object mockLibDep_o --> mockLibDep_a : link to static object 'libFunc_a --> utestDoSome_bin : link ""function()"" to test 'mockLibDep_so --> utestDoSome_bin : link mocked dependencies to test @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_extref.png000066400000000000000000001150731455674302600310510ustar00rootroot00000000000000PNG  IHDR\@Ϲ IDATx^xU#)!"P.Rk(H)"CHHB:N J%ޖ$xn;e{ΓΙ3wwl\)qap(8)X, N 'E=0ZD`g m$ t`|bD(`H].Mav{# 4:2(h҅reYxlnsf0h)MΫIhqiӦuEܹӅ<iKm%iomVlY ψf,ِȒc-Z7? ]89m>q8.WL06_Z ƚW>QIIInnnB'm)S&99YH[l+I{ӤI]v^ 3lH~K$M 1'RD!WR6ћ魅\6gYhhhdddLLL||Gط2>hr^MNDZsά7իW^kp0i#[xtk;*Ѥ{VQɏ,9֒{yjZY魅NO%'D!W@\G XѽOǏǨcr-ʸ3ivPPPHHHxx8;woeh5kr^MND~G+V`OӧJGgcjm Ioؼe9_`fb娗.˻R1;v,M(mkQɏ,9֒{yCELRSb'֦;\ 2'+Ź@IӦ}_dG׊T0je\Z=zW@@xm!==}Ȑ!KUŋ8;;ӳzJ0`@RR秀EլYmСg Vz嗋-ڬYӧOs~ڵQF 4Xv-?/_\rTM/w"!}ٲe˔)3{lYYYSNQ5?OL|0g C ƟK!~Æ u-RHƍy8d=w&M^zߜ7ܾ};Ws[sm?66qGk 6=~5+[%"J,!Q_ϦݒEPp^w}G& 4yhԽ%9۴jk߾وomDclVgq0]ߔTdji{W(aÆX|y:uWӀu9.Ln?~|ժUi |\رc+V7oʍBbt|z\mf;K[ȃIjMҩ[^dr-OH$57r% GլYͭС}˜ΦO֭[kulʔ!իW,U&&RJ!~Jϗ_Y( ү:!C.]Vʋ[bm=GǏ;ZQSL۷ws{)5[!ܦ!]qkըi+VǾ 2L8]vׯ_vZ6m]=<<.]t~ >SOPaҤIfwNx͛7rPН-M9АO^˅0a;1ctƍ?f͢ӱ꧟~@ tf{}e6?畬g4_5_d se___4ב|*]!mIKE0O)\97*ЦrBHl˿gr sd(t[G 7y#Fp2!u_rФ{dhnw{ &vQ4f4cgQO+AQt j^Ŋkƹto@#]* ldS%c6Z2hPo:)e93+(+ JBZ.\9mڴŋSox"٪U+.Ln:uj֭p:oppƍ9\ \!r1ruy>`m= WI6%( s*d5BTܹ“KF^Lyg>"ԀPΕBvo_ '~pDjʳf hzb{{<|x?wos&D& j Or\M&|KshoQvySr{m[ԥ{\7!b(\'$$$&&}dU֙3gӧ] ͛ժUGEE\Y!gLsw~.w*U=իWM15k7@DBjԨ_j-z4+ߺujժ\x*Ԯ]l"ԀPΕBT|oZΒ*T+ׯ_9|j*(WOi+'%t _ϩS>|Kv*gV-NAz{y rRR~u EH;:2t4hЀn{˿)?/JnMѣGx֭t?٥KlZ=-lJ*Œ`H6LDGIr`dˡ %=gW^-䶊zE=7H&իWrФ{DC ǎyuͭD:U7o̦pԓüݼk~Z5VB,~妊\pxYGqOr$ 1 JBj68_ ڵkkמ9s&k!#W#w\m %( a,SU=+) 3`R[> %RX8sƏ+GEm[Ԝ6=peRK{RܤzNC? #6}_~ٕ%wc_Ǐر#L˳s޼yI4͖ûv)СģB,G+/OXWul_ׯ^hzyƹU)u 7?xom=c|]r9z T0TpCrrI8*zt0}tN:,[I[|S>͚JjРʕژMI̚5dcNlذOʕg*_&\wo|ez07뺺nԨ~HɫǺȌzr}xǎ%M/F7zy\E9^ط%r7?V).0ԒoYKffEiH.$%,SGm-%ɓsN!0E&ȩ^*xN&&N \iWcnӯ~![h*/gŦjJjun*K tonK~C7kPVh7ΐ.0:h+ <_nk׶wYh+΃k[j`[@;;Vֹ,I`'нձ~4!ag\f?8)+ 26mg8CgGF\Oq.%eIcy[{#ط[un)5vItoul_*W.Wl{h)}G){CB_Sv6҅3OO  +ϝEJܢWZf?/҂\H!IcmcI<)Sg-߳  2EJ]תyۻ۴X_vVI.XgѦN@6aTr8e- ?rSR\ 3#EtuxlnʶsY`A~np -iO%Y}rV_ȯ$i,нb0@|cَ'][_4z҅cqpG4 f KtQ ɜ\V~-j2y򄜈Dd#!mI{*o{?.w|: y(_pDm ,H"fCі./7w'X0"X0s=xu 7M_$7#ɗZ_yݛ;+t Q x&9,5{5!]8!, Lj|Zk]Oі>[`]H[XIVSo)c]H{0A*\m(fc[~ri9 a ĸ`Q Wk̥[Z$o ;iK$[Jp[toXq{@*ӏ7vka ĸ`QX+OmXsFpnZӦ8F}_v:): Ҟ9'WW5Gcн{L?r3+}G){SL,]X/k͆5k(m^UVqp\fʹTMq<ѹ%i/vV˛f#OH1PVuQaK. P~Sffsk7߬Z͘ƈ,4dNqؔ){;.xˏ͆5ٳժUleV 2E0;xp9Wmc7/ .PiM'$(to><1СC+ƌUPfŊ)ɇOٳ8 o&nLL?r3Aq@( 8eafd?@XY* ʐO  \95}:P\̂#oٲ53GQ;ףG.w.9k R6BN&͏p~e!E_OHVyB%$5/^?S 4B4thFɒŽfȅQTsmݺ JJi #"96n`1`X .,hK%&&PXM9ӗx_ҳ^9+##~0E +i>MH᜼suyF9_?͟$cNly⣄DGpy!!KM:l7/r6 =ɍ+0S4'-"Y~ I:tofʹf^y\qLMq)vfq#F1ab2C~fKbH(ݘ  BcN'>5Cڴi)~9lC>1.X0r2cH-Z|d&G1\撌a̔6}EfI6xG>>3۴im~{ʒZib_@+mbE-[,9JNM4D?$-54eJ+W) zy<铒rkMBm7FXS(Mᐪ8҅QLt-'O',  f^%ÐO  \*].^ ܹK/sŔ#h/ZIure kfeB n^jJOns?ʪ!Iu{qJoĈ/XTE9WyBBvQ(SԩC`n /<qik)R䅆 k͗  AXM,.a?<|/פ!u̘pfKNG2߿ˢEO',*W.7g/#~0E +-1 ]Yjpn3#hnUVG67t tս`iiaso$7t@~҅&yx|b\(` +Enҭ!ȏ I[h.Z7tePМ Ltue' ?f֐V@ڒI:F1(h҅q@!% t нbP 1E\iWCZiK${Š89Hc'˕sf`67_@ mI$to4a ĸ`QpfWCi+$itнeP 3#E0ζY3iWFӻݻp~c:嫐J(#$ 6vwVbPI#E>tI奋^zviʺt4j/zAŮOF4:1'lo#Q'].<>ecَ)PC=| 9E'(;լࠄ}yz⟬CE`w., tzz؊Q+tJ7fp|cwxP`Q؝{Gn{ , `Cy~78M<3E`w}n6`yt6nc"P ?zؖ]~?8@ ¿zؖOWfbw'b+vJNew`@( vY/@7`Q^Cp/0`Q#Qz؜{#6mfw ν3AU>@ R6k, `Bv 08{;c#E[_{?"7'&`X8fLv@%¾rqF XNh:n 0,[[`d(T|cc}ED|ogcrsgzBEw X^L ;⽃`p(T"31eË'X~\  0)~%8X걥~/^ÔA;a2mo}E?r3, `W.j!;|zp(#z֚?fE)+{SힷG;F >/|cavz},oY/@`Q{s^z &P^jc?q@w`Q{\뽰(v@ߘ2r7E*jx}@"]G^g߳^, U9{ԕu, i違<8mPU|88XrvYzZE!zסF^^9?_$l 1CVrr?:l`vpx(T%}X/@k(jp?*㱬@m*zET#qr{ =(icَl `QG\zUvQzFԤe_Oe  t֫P%P66'yjW- T MGത> v@ȑ~Q@Ivz}bT MxG(bL֫ 'G.<67֫"P%P66nm,߉R-B(ʤݾ>%C A޸#*U5AolG4(33sUV-_E8gZZڏ?HrQ69?ŋ+ 6/PvvP@S/ @In?= xZ{G$@ W7@/^֕߬SUoRٳ\իǕpZE zjԤe&47ߌϿ)*a2Hۚ6mZ֭/^(|RkرZm۶7n˭&:v=աC^La޼yt"]Z/ @Lbl'Mhxtrg&0~8<6o cƌ\r ,Y9SSS V.*߰˭̦Ko֨QtҔ? ,XP~E[_P&+ChšޣgaP%pMP&2m,)+}hV@~Dt`.Y)Oo T t#Іk~<Zhˡޣ]zm4Yw9v/P%@\HXЖ+uNKgwhe -;=a7J+67o(. ,a#bo`K^, |X@sEW뚝ؓ[m۔iЌax^`Q=0|\ zk^ , ͸h?Sf溽o>)Вm{3 P, +t؈K vYВtߢ-Rudۏ~@ Ρ, ި( P, 7.; 7ИoQjfuzÔn{#|T{Gϲ;pb(4&vo^`QsY/ }X/  f P, C'Cv؆ ew`QhLVjo fg;*EɅ%~zyoB?zpz(g?vT촜fw$qr?:ОS., `<F^HEbv:-Y)i:?(z>_x8cb5~S(?znlΣsqMfQ Жs:xH&@ſ Kþ6d>NJNYk0nŦ;N ѳ pQhNfbƲ\=4fp~Q@Iq x fD%~o gKmR 5i _C~O(@;)\p| 7~0efn3<9zfg`QhFҥq+6Q9JNǁ;p_unQ!? PID:O2WoLI߭=mg`QhIOa_N9?o]T)߱q;l pËo2 [CcO<5X@;NLbo8Cgq\c`QhIvz_T6x؇o)"t;9_* hJzGw8wۧps, L`ɞH5)osk{; /ݎ*@cxx{c{{S͞5}ZvwJ2y =trkKiPwLE9=a)ķH{BfpnZx(57!y]v7lЉ |Ʋ9 ͹(.}8yk/Ќ_c#x B K3(tAܪ;OH7'i"__7)+`_oAcQe12 Hnvy.;Ը?r"J\Ӑ#NAƃǷDܮxm)0.XD Ty=`{WK+ JV٩K}WwxCfm[]G}8d.:?+Xp (OUgFJe @3d Av>ѣG;3O2 a! 3X}amS<6O\G XѽOǏǨcr-ʸ|3ivPPPHHHxx8;wϰ*yy66V`PP eJZ~ ֔CjB/K<<رDc7U෇!3XEvMG[;\ 2t~Xp q{tJFӦ}_dG׊T0je\^=zW@@xU=~5+TCY]0aHm߾وomDcl`yy6!TޕEZS<6OXXpT͚J '-- laݺYYǦLRzR^0kb!W|EiS|8?8dHҥKԪUyѢ|K'#V-_5=eʔ}{7"ڼu+,5ȏ?~JʹQ6{9QVXA);(((444..}'xT)Vb.H9EU.4c5PĺvQ4f4cg!UN)Ŋ>~|Pxr O[,[6X1Wr *neܸo:uj~vaL!3XB6Y1"(h{9B'sR`pI&o@(ą \iZ*3%'.T W_s\ƍժUPJ!2)WNJ uu-̕@S|X[OU0)WZ>==ʃ!KVf% 4k`-6T(q%B9EU.4c5P\grcP*ʕHn T9)hTl/~i'VSܽǔi\ \\MTB ;{iBZ>F!3XB6Y1U{XjS3a<&S`vlRR~ E<$|^+SB,Xs_Ⅷ7@a=??ֻwkggGԫW!f/sj% XT)lJ’`H6LXAM@5d(ןtWmJԩSuJl TJysZj/gE#GV5m˿+˄E\`JhVʕvkc6%uA `9EU.4c5P]ȍAm@p$e4"R-QʣGsUB,~妊S\) }$e7Er^Zv~Q\bpI&o@(X86 ;=ա;§M?,MDk_ڵ{R*͢VwJ*xl?3uj^. #kVڵT|ر_{mdܸo5s| Ŷdy7&Mx`6fSRI0XNrCM@(PND.ƠnZr$8x~ e$RB߿ݣF hMx$rlxS\`6ao PkOXWul_ׯ^hzyƹU)u 7`xom=c|]r9z T0Tp Ir9? KLzlJN4k*A+Wzkc6%u1k%S\P- 2 1ouu-ܨQwbM rJٱcGŋM{^/oQO,~qScI-۞JDk?_H/xƐBod:,HQt'Lzuʧg϶‼1y3$ސBo3Nl6lo\d ,ʬzV[e@(( ǎyJm7'[~X1W_}*SnC/3k֭?kfQfR5r>iΎUse˖z'Wl-W΍yE5U<+ _nҤaѢE6}%+я&2dD$<=)SRs9;~|]zչXuV1撒BCaT)C*Vt'T'LTH&n1k6%xCf ɾ͙3M}ٲ o. +Npst_MKS06 Ir-_>95}:ܜP\̂#oٲ53GQv;ףG.qw.9kÅ R6| EA&pQU#>H2LL==8ڭ[kU0k`-TM?ʂjMZZZܢ&=%ސ"}@?<}WXpf=}ըi_/~#[;_~5VcW!_ H!KY?7֯9^+zC/[ 5{ ubcg#uYW\5aJ#z azu@@]a@ vkgBv}9ůG\ NKg/"2GLݕ}۫ևdFd߫H4v[U12E#jM)NߎYPi\֫(YܹsHA ?l&yWzg VSVrjܪ-{}b/%y2K7q~m; : %ˋa4Ԕ|֙i7) @ Iǿ}+5 H};A: vm,>}v ?zlL.~`QIr wrܹC$...ƀ P͹}@W-]aJiii[lg::i[R0 e[Nn_hv$3!FExj^v#e﷞U?eד{oEKvz;i1rGؘɱz>wٯGWg#lo͝ascM^GJJ]"μ)+ v`Q;m;3Cqk^!jxpRo܍f}kt,).9?Hw\"((1+v4PCW [9, 8Y)iq+7j10B瓣%]r_%56@I~cَcw8%Gqv{ǐV./831)I}߿BD+7];mxowVr*@^#DLЙnw},687suWg%;#sfw87tY(%+)i i 8헸X/zbM{i_{zKd6+LLɗAUFM˩~Ù& ?uH f?ᩱK\e#pv@j>0>b~%ӥhc , {aQ]#GxHr(jW|p9o., xFdg|{mcN|reݎЏhE)w x8>^lS~[zLNd$ܡ[;N;<͇W#N cCf3N_9|d_vNLM{ ne5/vcoO\l#r-^t\냓X@vF͝ao,7ۑ79X5iGZC#ֆ.C6¹9۪䧦^3S`|ʝhtrJ]v4xCl溽L~VB3qvPծtCqj# ([n ;NA.sysD`xnІƶá}Q=͇LYXpϿ#h|~: m3F̧Y, 苔;gTFcĜIպ]+ʽz i0"IKp@d&HulS&-j yk1, Svv2f?v2srȟ^`krjx님i5}rvNb쵳Wh: L<N`sEIz?| JNe#2&:]a{1rFc;6!籂ޣ_df{d=CmzHr<h{D%q6( 4g_G 6X̹þd8(O_p8*؟GIm|"Ģ8P+遟znPtNKgwzޅ{}W^#/ޒ8 &V޷Tv; JI𓸕@]c$ʇ_k`PB?{ ؐKq+6:¯D}~wPڝlp (Wwi}{G_f#@>iMB_ qMd@+L;>VpH~ t@VjG_cWѳ$%A`Q^r.޷:(R<lɴnoHX?B4ww,  1g7e;8Q+ut@ Um<{@E73(Dꍻ1ԯDCv[f"(`)8لnH ;pR\8섭{MV*րdfGx hKSZeKX/ptKK-l{[{"|Ή:U6?',o_r[[OQ-<2s"bU>9sa.# ÿ@m,ΖGjꄘ+v~|k)#:',Vuz=ĚWdyAjsVq/,jSwf6Vs"",t7P7u7O9?PcCfaUDVE.XίCqHƩw?oyr5U^XAr~& [Cw6+s"",-;pH]y#͓Ao+[pgg7-WF [գUg*,Vն/n}k0i6B,0˱m WnOX~F [գUg*,B+vfl  ,Ƕڶ6@(`fcv dl \wl U=Xubڬb_6e`6lXXac -8g&3)ſt;NJk.lتe:Uf)ƶf,z, VhUHJ/Hbz,VŶYN`Wn=l  ,Ƕڶ6@2%H۴2i6BlU2VŪ`ض68o[Xf,z, Vhym93|/B}UVEm֬ӧcǎUXq޼ݩ W/xt*(•jFB-tB 5Z-$$$%La9Ι3g33ovϮ(}_`Q X8Z,b"O H ڢL)nOkT7/i[^bΝP;X>&N/~mJ^VUzlFqYIƋp˫PsuI}r ;yлw ̄ Zl)̜R Q,;tp!vڍ{tOKK;~x~S5ڲeKjj*] 6p@~^3|||Μ9s֭>ǍGx"돢LٱƏ/YA&Mj۶S._y!ȫsƝdoL*v@K9zqmGØїnJe^wZLs'G5JјӚ6m_R%jA4H>}1|ǹSӕbhhCMø? mԸK7XJgk=%߳俛(ܿw?WҽR-TM^FLLL޽===ԩnd7׾}ҥKP`A׏)Nc `~?bRL`IEOM{7X[~DM#Xj@IQ똛SC4zo{D 2)idqls}}K.EcnaN ܯCbj2=I<ܱ⦆sZpps=ٯ_?z@#|#Zh ?[t[miج>=I϶TDԎ;&[)\~]#jPKQ똛kk=$+=#\{g}GD_yApBڵN* ¾n$4Cڵk٦Z%Kܼy.TnR0]~1V>r䈢Lc<ѥvRzC]@=}Ү=׮6h׎Zj_qu̹j܍;K΃ _U뀚j3#|p#)CwX1wY%twZLʔDF5ys'5Szu/-(|^ cz0.GnyRՆaqw+U|{!\H2eK <7߈_/i߾ѣ%uѫWp+Tj eoZG:/$%%%::gϞ?f̘Ν;_kb*vIUVP;ɓ۶mK~%([| ׈׮6h׎Zj_quD}ED.ZWj2is^ 7WٲJ ~Ds%[R [oqeJyx^ʕ+ɹpBԸ`xGZh!?E]uFmi;#}- w@]J? s+[!׫p Oz&Nwf̘QT)>+!_xwwƍoٲ9:F… WZuΜ91hoݺu=<<4ifͣgi˔)Sf_~;g3kԨA4jI322ʕ+ےNʜ@9 ;{7]m5`qĂ@IQC$=\˃{wz:&cL=1T|Es%sR [WqeJyx^gYzu:u<@聓O]9#{OQWjQj.;g)%{aSvծtOKYN233 *{C%g(GȡӖ^o(C@3ؘI7z{ ie:&>?8L"^ ER@csko>qLӋkv^C䚊]&vp.)^ICl@3YYYoР[q[^8 YY y.Y!Uz9|G͛{Ɖ+?{ ?@L*=G_{& AR ϸU^@}qNe:Lq\$h`F%\ . H`dnąTo*9?^ a^N, \_O>y2< ѻh1"~j \[c62`72n{qӗボG7 )@ڕ}$+/šѿ9g 1}4jO,h 8K/&+=}Ʀ^F^~d[] )"ik]y/`{O{x(8 {cO-D}wIž}ƞüAXS+ ȍC{eeG'y/v3{T| )smx/03>7 akx/9$,]7Z'2_K>G3ą8$xb L][8k:;nx/vRJy/v 1t斃x/pa3y/p8H w3P=~-m', H*)u \\ck_^:5?&aڨ&^px#5-Ȯ>#.[{pW"=@Žn7x/z~n@)wI ٱ l{9(t[_^V8G'~?sx/zKay/zs@ p\u(1H ͭqrڭR>o`.oZWm! OW{Axkx?zH?gFI?t*V0[ ~ljWmxp7ſxh%+wO{k*t#`x/p8H <"3~gǔ W*lЩr)lwx~D޽8@?.'84?^dO+Ҋ#KZ !Uz^&\{Pa'Sǁ8>m9@_!Zdgk^*IGDE-Oسo:{poh<s=W^{Е[cֿ؟CHAR!w{mZ_>2~1%t,amy/:!{=iϴK:z7J%t_}F! {cq X؇3BoO~4ԯ @Vƃ5\y@n85?hy/y"fԕO5W')<2jnįN=:w ,K'"ƢɆ޿@oN/3 @.sԺ}y/y܊%ob-mWŞ~cz䏬􌠲R]w87G8M L (~.G/1+t?Z'VG (, ^/Jf+z9O5 K ݹekwk&NusVyo,q}99{/x/y/G^D`iI[*`go` iWn{cqݤ޻e?.CHIx/:u?4vs1~y'ţ@Vg7iWoy@FVz-y/p,.;_~pzjg/y/y%1d֧zq|gڭ*bgЃ?`@"\\4)oǦ,~Vx/zzMncO;+ne]_Wxx> lgMŮ)^@\1)@@ώȺP[M܌?v_ @X[c ؓwn]ްw B廌lwCrϓz" l'w:{qŤ@;z3By/`Ƶ ̞ƞSCQqA>ڶ>B_y/ln9?\\1)kv^z$, : tK#o4{’q_ݺD9I < ~ny~o<9K =qnMŮ4a;~N@YwSw[{ps߱= ʖH ĵ6ĚM w?.aZ %Q?^DKv^IӅYyp76ܩ "##cccN{$fش?|̅5)k%&q|}BV2$yu VDz0_ٕ<$xCB+V۷+pvҦy{{(Qǧƍbhsk,)7~FHHHDDDttt||X1pL (%!An9?WPviQǎEXnɐeK1:txpv횎 ?>55){ +>l۬KX˻ڻw3g&'?~p˖/r*=Z^SIU/^xɒ%~~~|cyx,F\ұ5Z(pd7/nK[`iɩWI+N}LI;4Wt`e*὿NjuqzIq'гcʹG@/#*l8,Wv Iu?ʗ/oV+WR~΅+6P\f#GY!Z*2b7+U*Wdw})n*^Z.RiVA^݋tw/US@;vQC$LGp.&bFR.\ |zA0ۼe?>#74@Z8H =f )I J%j\gv:: !3fW.o#D@ OVl[9wBbΑ9Y6_|:+樳/M՞򵁮?)@O  #z)ӳd:U~R<XY?RKJYv}DsjIUؕ.|y.޲2q yp7%l'Ϧf>p"j`Np K$ cg|"0O"~Zo{!Uz~%V6rj~'au?Þ{lL۫[U7{?њ:cr I-_?~prӧC{l#>zy>z4@6k֗:L{"]F5W11Q+T(x,k3#cɓ!l @:曏5ڷo:z@ n~ږQ>zhWLHjW|S^6c;cM)tMv꽽ðNUi[8kJVj~Cp@WժK<)iaX͙NV~v9}xRψgYnu٤IY0uw/Ҹq݈ǺP` USS>įlOg)Fos:iYJ7nz'.]FJ3f(\hH ҵOu* wF̬gߤg^5Csp@3B-IG+072| TɔU[2q|%颒'\`N1kgX!-ǘIUyLk jXʌ<\Ĝ>Ai3JrR n[WZN8M4#ƗVܙr*2<8K [z~ǘcm WcWS&)n$m'fM[iԤs#ةȝ0i..1DTrW9ڕ/P:iL"#WfX[UͬL Ƥe̤aa3ȜY "*9H ˜>\K׹Ĥ$Keo3 \cm W52k0A4(JfQER{ȌoEGGD_EhHKPc43ZM" yYq53u-\%}=V5)S;0'r;䶾=df9aJrw$yMP+z:1͘>}57(($EhHKPZ.534!3m+ٸm<fX[ JBUczU7Zӷq 2c s!)`Sw~7A 29LiJhN-fQKR@#GǯꙜ[)K|[~M͛7iҧgy ̐WțqWh7LqSZjrƖn *V[p,z(N*m[*h+c9k֗Rb9E,pPDDBߤ@/_T@3IDAT ɓ!4j<}pfO޼ÇnJ~ΜYK?~p˖/2?9>]bOrη~ڶmK y<ÆMowukʢUPviQǎׅ9IL رpG13>tDCZ$u5jT'"b~Jʞ۷wPpHCyֆSڈhD ָ0c Ug!Eb;5Vfeݻ3wK^MO;_o/7w&oֽ{]2hS^GG3!-=ܹsŊ[_zfxG*4SN*ls\W[ L$N/M 9ʇU2W MBYnǏ˛UݔF}+߻^@=m;kWUBZ;==ʃt/Y*gy\Yf%iřa#'Kj4W\^74+mH᎒7bct4Q{5.5ECu+5KB(ƚډtH ֎Z*JXev瞫ʱ+6}ãhf X@}w)"!jn\2+V|OK(_sժ}w=X{rt矯Yr„!nYh3SZ`FtV!矴r"O joFwO?(ݻLW jsAYj4b)DlR3݅2I(VBѢ/ҬL]`2⩧MiԗBܤ#ڛov)YY1t'qs{ݻ]2ԩ̰ i PדE7d7[=\\*ҐG蔷m*Fǖ=Qf !WAIcPg!Eb-֭/Z4nܨQ_3⭧5He:Wxυ ˕*Sי9sK׭K^͛5uxQߋBxo'3!Y^V{3sʫƹC\W[ *^`Bl툦-6S_(8z4WKMf9jwPj(MPbbˏL}oR.5jTH`$sˡ`۷F23ӕnE}xRȏU{5.c0/rm Z~RD-#F (^܃ ӡ]*Q[l܈eK%ٮ.\_e|Є@cczFu}kV& ,?:zy5I$6:<˖M_uX>\Yͨ&LœR7׻VCie8Qb32IH#G~ qQUDyLk XKӦUKsgd` )SZ R3& "*9H n.\X/ߕO3>tY\F]VaF3u-fS&b-_Fu;Ҍ)-WAA J\Fl$l5a%ߕ3>tY\F]VaF3u-fS&bm3\A.rf+(MpDTr'fMfq3S:iL"#WfX[UͬL7]1m4˛A4(JfQQN bԇ@Z1ȃ4r6+)S#)0uE-[׻r eW Yޜ.<(ztQQN q]aS:iL"#WfX[UͬLsr-f{"@j˗Ov2#'0X 2AiV2JrRf?3N_ -{UyLk  ȝ6Zޒݻ޵k+S6ujƔ<`0JDTr0V:iL"#WfX[UͬLX+Ký=V<5o rƮly͚5ʊ+WGM8w.|yOimƔ<`1JDTr0V:iL"#WfX[UͬLXyiA,9sgݺ+zg2--J&MϞ=29y7m֬b# [mXތ)- yaf%3 )`3>tҲZEGԱYO'23I*Kw/R~=S!9yGQFIIKC0kAY "*9yI H/f-k^CGl8ӱec*Ґcm4*bLXXkݺH?gŤWYO B7J+4iR޼݋={dӦ+6ҽ{ݻ304!oܚ-;qիUe] ³Ei=Gǖ!6JeZװ[%tl٘24%fX[ X)S#bV}ƌ)#+_f *6GPrLo&݋؇7l$fLiiCm1[~rX`j,W"Wu1 [ "*9M k^CGl8ӱec*Ґcm4*bLX;22Ֆ61e1 %6JI&Mϝ;}ۍ S֍-SFuP}:j6o> o_nsNZװ5i 6k6SHC,];vCķcm4*bLXfƔ1t$u "*9&l1 -jUhiEz ɏ3)}͘񕚩cm %WH2m.O: nƔ-P3] <|x:fGif03X$)@(*~KtfX}H~%@]6UOy:rU3)S-E Yjo1&[ w50/?J 6AD%GϤ,fX}eo3 \cm W52bDH|!k7Smp3DxP !̰HfjA2S@jf=eZH|!k7m|3DxP !̰HfjA2S@jf=eZH|!k7m|3DxP 9z sрS:iL"#WfX[UͬL{q"̳!o1X 2AiV2JrR3>trTEG̤YIjI[LxՊƷ+N ,oNf=sI;׶0)?3u0ؒ_~#}DFF&$$p15c̤*<`&\J4iRr+~3)Esf=sI)4Q@CMNNȇ*@Zv*QY 3piӯt…/Gf$PK 4iRQEΞ==ǶnxѢ iiQaa?5jT= uZ9sgݺm{QX>k֗TuOv}uC R6YYJǯDQgt?.\H,SM!INM5k :C/YsUyK`WP@-)^@9X1w(X0,֡juؿYGQ}! biA^OO ǯP 5tS''( libDeb_o libDeb_o -[hidden]-> libDeb_a libDeb_o -[hidden]-> libDeb_so libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a libFunc_o -[hidden]-> libFunc_so libFunc_o -[hidden]-> libFuncWrap_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibFunc_c -[hidden]-> mockLibFunc_o mockLibFunc_o -[hidden]-> mockLibFunc_a mockLibFunc_o -[hidden]-> mockLibFunc_so libDeb_c -[hidden]> libFunc_c libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libDeb_o -[hidden]> libFunc_o libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libDeb_so -[hidden]> libDeb_a 'libDeb_so -[hidden]> libFunc_so 'libDeb_so -[hidden]> libFunc_a 'libDeb_a -[hidden]> libFunc_so libDeb_a -[hidden]> libFuncWrap_so 'libDeb_a -[hidden]> libFunc_a libFuncWrap_so -[hidden]> libFunc_so libFunc_so -[hidden]> libFunc_a 'libFunc_so -[hidden]> utestDoSome_bin libFunc_a -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibFunc_so 'utestDoSome_bin -[hidden]> mockLibFunc_a mockLibFunc_so -[hidden]> mockLibFunc_a ' # The Links between the objects/source files/binaries 'libFunc_c .> libDeb_c : depends on ""dependency()"" libDeb_c <. libFunc_c : depends on ""dependency()"" utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies libDeb_c --> libDeb_o : compile libDeb_o --> libDeb_so : link to shared object libDeb_o --> libDeb_a : link to static object libFunc_c --> libFunc_o : compile libFunc_o --> libFuncWrap_so : link to shared object\nwith --wrap=dependency libFunc_o --> libFunc_so : link to shared object libFunc_o --> libFunc_a : link to static object utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile mockLibFunc_o --> mockLibFunc_so : link to shared object mockLibFunc_o --> mockLibFunc_a : link to static object 'libFunc_a --> utestDoSome_bin : link ""function()"" to test 'mockLibFunc_so --> utestDoSome_bin : link mocked dependencies to test @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_extref_wrap.png000066400000000000000000001361511455674302600321020ustar00rootroot00000000000000PNG  IHDRfO<IDATx^ \M-ET>Ȳ,-Q<ȣ̲Zg+IȴETEDRZM3 L>uZu+BzaFTUE 0`ҥšCKՠ_vm㟫z|E8M%L4ˮ,˶1^,]XfXl2qdj"whVbTUEuӭcccdVZ2BKՠ:wBךC8M%L4ˮ,.ݛtJ5kG WoKJJJMM %gG1U^W}jݾ}ڢOر-3z}^,L鶭ZjNN]?;*W8TzI@STe[]Z[&]4OKb;`MeqKBی6 #T+a}ohhhDD߿OJNQU^W}jOmF>}1-=f=OܠAM;Wd L-V3 }+ QN|kJ8>&'=n]jժw9p`^B|6 $)*K鲭.m A-uF|W5U|Aڛ~wnez'yS>ra}Nc|&W^]fF#T+ax̥...d$JJJ :ə8qb͚5[haͿ/nڴi5ƌՓׯo޼Iϡ(߾}{v*Wܵkh^uCBB:udeeնm]vqB?CݺuԩC d{!ɓ'׮]VZ/YYf˴gވ4Xz5iL62e Z ===[n]R7|PR~WWΝ;WV*x㍠ L^hݻoBU~G.ϑ-=f!p{VgFK7q7[ԔtG#w}Gd?ȿSß gBhpRr%:}蔔Ǐmի^BPՊ2& uBy{bRn8ءCҦ}ǎۺukVȹM˗/s䆿s6nܘ"4Op̙oOPnDk#OJwInotQ!ʫ۳I"~֭ѼykW&M}jҥS g-شi538--LyW 흝k׼rera \=p5kҢEgGR枞;w\59ժU޽ZrC %7pضm}}}ϟ߻w۷oߺugϞ壣>|8jԨiӦqמ  ~С… u˽nzmpVVI9r$W)D.yɆ ͛˽ЬYB.Y ĿUm;vԩ\=i@'''MHs~ƍ4r .W_וڵk=Hޟ߸q#iϕ=<v[t= (tdkeUmf;w:Hnrt*VOnܞ9mȪ{&1Q:oHJR ȑ?((H~Q2`P#sKQS얜׮]#秃CժU9-уk&7-YΎlNd„ >W???{rrG(7" ɵۧW %ݏ»bvP.J2T.%ϯӧw}:9$(_AQ@$zvPx^W}~0wT.^U:W^j}x9L@rzR'۞+Pr9tPkkVZpBԆȽi%,ߞ+o\Z,rjB _bŊj#r ?z!j+Nt;4o@#ܹ0$_ dSB̑Lj[6bV~Q^t}*ڊ'X0}tLyC gVdFYsbbN$)M^ : ~啗?AKTT- ȁsԤPҳ^W|9 /@*J%Ep?|}YwZZP٦MSrC܄ =-Z/^{ئMO|K.7Vh/(Vo߾u +9rf{!!-.;gM۶m>|_i$x]Eri*ީSZniӦ/Zt-CddxoԢdXH$LKF(n*}m9 )ơN§n͛|RO]+?eFҧiӦ\Yu9>vl;c3g\imJVܖZr4wL6G7 _B,wʇ*~7#J8 ,cVT?SRRӌʣ%[EUVuV˖-WXW̑k#OJw+퍣ӅrwQfdY.%FS8`̱T_ܹxqp'rG((mʵ +D*R>O{q=>e0yذ\MׯUޕB{E!h!7<_)Ew:}t^u9>vKr ~~kֵܖ:!)-cUX)dY_E]>eVl1upBr_~]{KQSHd?;;xSڴitRRFd!6rjQx؟.R0#$r-5d7[l|]k43:D*R>w"1ڢgs^=42҅[SoњN<sjqq~Ȇ|}IdIS]󣞒н=zI&0Mnek֬ټy7j|,((Xvmʕz-^S?5kF6!L) Ԣٳ^ԩ_uʔ)uwr/$޴iurr"_JwyߟYr666&M_K=WK\Ak׮7|jժ[{׺u)|Z0ZjsCn L/TtH҉F-J&M ^xǠyΜow.|!*իW9&>ԶmĨ"^Ŋɹ7Z NWF+WN!eZZ7|cSXo#^4ipkX$P #]fI?5Ւܖۧ(wJrPІܻwpƌ1r{r/yEqZ$?ˌt2&`ttt׮]Imvi&G%JL!哙_rssg͚հaz*%%E܈,$Fn_-t?ފB(uA,ڒYmErMKX ^(cw=;H@T~[ᢸ@-#ۏjԨF: G/XAܾDEcRA)wɬR[2kIǵpRHLc1x2[ t}PlH :ðƒ.MѣÛFg`LS׭!^{ ;k>G?S+l=Tl7N89԰aڵk\?Q!=W!~}Yj t>L>ⴊ GU .}?IgU %C>#~rl5m8M%]+ = vn]Xf` - AwyskF^;pP ^!H:;ջ1մl7]+=yXZK;de@[Jw"WV lH~s/޸!%Y_@{l7w`4oۻ 3݅:` ؂74u,+kw]ߐqqf)DK4DS_-rE֋l7I^zNroo8Zg)ĝ C4ZeI[Fwr(&S[?wG0:L;0eL4Zu\ Ԃ ll5u8M%p ƔZ(Ց+AwaX)3!Wl 1TzTpP^2f g8q rKvdԔzt|52`.F\ssOړ+bGmrpjLo')dS*=1u;l5K gy85rNi INzuҷSX.t뒆bRjX)3r}PqD=0w\ȢCyξ(qW~$uZ'&uҥ3;l5K g{XacM_mdɤ3\lz [+KoF@`'% ^>?WQ.Tdrqv)11{4',+J]` )3r}PqD=[2)Eqa`B֗+WN\c.\dYR8KtƊg¶eߋsQ^medpz.S`'H@`Bwz%ӕC{.Kٸq_%.0eÔ[ΜqС+ N+WٽUի"bg-/;٧E事bdYRҁ $uk?I.mQΜ9$/׌, ͚5ؿ=H]ES ]>4ݠ 9J|ɖ-ߎ[Sfl>xv Wk -iօYY'ر7>mH{6kq" `u3)~"m6'79ŪP<"WV70 ^+ ^PףY)ބ$;I0\JE%]v0Tj?KUqcaeVVzwҤ$SWL!) \r%:*7n006d  P.co!_gC.JܫWgmQn۶WₔZ[ۦZ* /MRiqq>ݠ_8;/nӦiddἡ|` -rU 7TbWE |A )ڏ{o%-}l7we0nG nD\lVpN.s+W$v2jt9۵RΝ]ZzU<ӛ '<.׭7QC翊|>-](ܹkٲI:򕔿~(G_?Y*&2uM8g%{SW /Mu+_oZnQ툿e>k0e2 n0.w}օķFM6TY=S.]:Db„OWY{ Uoڴ0_5|RWTxl*7~‚0/',M`H3rBYOUZoG-X)3]p_7`@w2kpYKPl+gj+rAFGs\;!665s;v,Q7=a`\k{L똕ӧ~Ƒ."ޓQQ/' ;l5K gZ/Y2j̭"wcV*Ծ} r,L²Ĺ&l/W]d5k" ݅r$&0%%I9!}啗ի`x>Ih*t`6Kѣ_?SXeqI Y'#@[J}}}~H3~;7n\7''[==dW&a`PY^N"[Sg; }jw]Ri#wzNJ%'-=FSfl)4yʕ+,`60 ʒfV]t؊{B6Su'OfڶtսCc":` "w}K`!%jpJ Au.,3k0e\40 l5K8M%:t|52`  Az@%H@P t>L>] yc1 kl5K8M%:t|52` w}0h` jfpV AE.,9;0eiGrf;f.>ÁF\t7غ0/ :@vub֯9t=XxwJ t> L+<O,D0G-%o,y{ɛM*1r֋jUjC+vE'=^$ Һcލ?k- :`- 9KBW$;d'vҵL@[{AK)3#w)ɥWzx66hԀ)3x$E]Wi?%bR,Ճ]ҵLXzXL_^Zf#mWEw82xԀ)3KwfOgӵ`0eks <)A'B0e`n875^ Sfj!7> f޾G {ZP,W[xa @Eo~{LAv,MаOfҵLX(rEi4B2PW؈Y.kpb|Ԁ)3 GԕW{+boz ] j%#@T{oWet-Sf092`AʁS>_X.Q?:ѵLX,< da W+f3ӵLX#@6bg`yqfԀ)3 z' "2`G^zf#pKs~eZP,œ+x(ÔSҮ[a`~tⴛ5` "gk2`Mr`oA`LX~u'] jE8ݲsZa AMAN.ѩK0e`]|G@0e"Osty7vҵL'Wm=:^ )36=h;<?AԀ)3sVGN0e'7O%z%k@ 20g㖞b] Sf,_Yw+3N)Ԁ)3ucg`툼Lz L0.zvy 0wh] jyJmk y2`ȀQ?:+\2SZPP~fv`[|0eGO(qz}LSc=(L ׼m^N`;I Ԁ)3svD^:a%)3Sm_`3`IOHk@ 20+1E0O0" Rw @jѩ1Z6 JͧހtQ s(H 󑟑[FkL*Sf=J'/=3ݧ nO9е0mJ6c0]L{5IW PjWoՏg`0]209 02?3^*3@-(k @AJ_2͝;qu]~=W?:uYaÆ:XYYoرc[nmժUJvzeUͭ'MSŋ7mڴFcƌIOOYzrro!L6/w"s؀)3W(#$ed;;k׮L0$o޽oٳyz2F84&CժU-уoF6],XSGGG{{ׯ?|pԨQӦMYz`;Ʈ"HgBOl;9z"-[*7o~%Lֶhт+129? df/^nNlmmccc;w4i•YzUo~O$+&%cZ}"s؀)3G &*Uʢn&$ȕ1Ry7 dx+WfSf=LεM_/xHgtߧ\6>>\=02C`F/-6_t0!u r LE;~.~^Pc0~{G\z  cZ=Ar<:'_c-Ôy8>SWӵt0{#ڍk PR$ÿD z`0c205r(BOtpZ=ArĄset->t u>ȸy^ st-Sf{>JGJɺrgHqڼ|z{H'3ZP Lƣ+{k{w^xҋӥ0t=ƎӵLtV'WIFb_t-|}t^L] *it Zy}-Ցt-{#}Jy@ĭ󈜴` \itA6atnZ0}l>d?I[P@:] *[_[ J ?t->mAAM,vaT)3妦kMzt̤>?v^,Ņ[ZP 6b֙x|O]LHm<8Tz0/b~uk@%2` Aof`$Wָ3r5džD3N]}i7] *30K[Vw˘+k\3_IJ0e"< 1Kѵ`^ү'ad,pjѵL0㋜*n] f{2_̻k?] *s3PEKе`"-=9z>] j >AT)3fswkgf,ٟ^::hZ1T)3fc9Jz}ۦߓ+ P>Sk@%2`H3Pˡޓ2\cOP'< !wYT)3V\VPQHqk q{GTu샓ZP TN_!Il&uM ZP TpcGp1Iቮx6ۭ=r@OS/]o]ѽpN ҃ {ϼ}OX5"H~Fpp,I0ec G92a qmW|X$~գW/./xmS䧿]*Xrkϡ{#}->J/gd=0e`l<*vYx 75}O܇|L'qsLi xibAvgqq`@Ϛ6䓌QSfb W~|Tvс>7cm~'ԅ9M|e&[ O% ?` ]>7kFn ?"3{'7-(n,/=3včt #`3N~]F}&{T~߫z/%I=tH㴫?|ZAn_y{ǰHj>:h9J ‹tM_ Bv$qa njr}_`t >J"o׽eX'r蹛wh>+Mo}IV4|p"nF)3:nMQo_J*z}[wn=Lq O< hO\oU.F  z>˿st P'75ݳJLٞ{\\{'* $bw_o1,?cH_7 q=RϣLύmscK6~}&{ۭ\a/,Ӎ]A^]>Y`GLu.qk]uLϱӹPO깱#|_+h .⻮._E K|Wz0e}H$0ϗ[~C{Qߋ#^VT+GxHqV@Gdd&#z›*=.!^e!ta CKӾ{# ݝr7@GddK0SfnuZu+z$ tS`&T@0eFJujg;]1&ݝ\s7@G e )3`Hha-X;BnLڿzsxxxTTT\\\RRRjj*3N_n ̕r#`CG ȑ%motfa 'Ա&(\7&mm62,'$$? 00uwp-yN Cn[as9+NCk?:uضm;$ \/J'O RnO^^6d޽NPFu5<~CLm@dEIWI2[H<T#ebLB<8r{ O"trIX)|Q`!w”0Gywл۷n'A G5UZsUwãF 6m}oݺՓ ܼسggHJŋ'ٽE<99x„OHɟ.Y2[|!4y]jwLrIqqqO @ݝdp':v8 ;jv. mn ̕B˥U/w-Q^-'cbԢH.1)S>nОĉ#?>y*Uu W~Ͷ\dgRlW6g7w};D߾PB@G )K{fʝ ޫԋ KH7`̀9#p /zrh-R 8QBylk=\9%%IzʻRhO'neU+ \IIӲe#<q99<~peµ$7o |i[$F豻DGa'r]΅!0MRzt%5fω;\^%&y rѠAW^y߾ܞăEH+V|k wCLȁ~}Sv+ ߥ0 SfRjzƦW&@H/+—ɆeÇ޵kiAAd6M.zi[$FZptip$&0MRz%Μq:+Z5]r[jQxiTlb޹2mڨ=Tn/| ɲ+ݐk@{150 tDPȑ(,˝rc fKUɝ7WrKܷ)^r%n,LsGJA .yq=>e0yذ\MׯUޕB{E!h!W%/6<|x޽3fy7 ],w*^Er`H)^@G )KH²Y!98r[sM$Ļj43|:n,LsGJq)4͚5 W~d|rqĈ>ι;?f϶M+W[uRޕB{~Ekڰa__D̚uÆuȷ@7^M*ěk)S>SِsZIcw']_%M۶͜F-Jv8VM^x[Fn8 Y/T]Kxy9Zk+:ن>852FryF{.UV!wlFr{aK_|EqZ$GըQt_|SH 9R<eBrpJN& pRHLc1w”0@#.!9n1d8bwxs7f;֬YqH 0 SfGJ2{hMn/^c`L`n 1u ]~ q*#H7`̀9*O#,Wܺu3ītIPc%nPL邝tD,grqŦƍr(w)302(gθt 'p+{ުRW[<Z҆$ڬZ5n]kwEg׮ҋdڶm_݂-^v7o>Hbb`:wJ`L`BwWs_#!~(ΝW\KNMz*gW OUߘٳ۴iʕ)ߺue˾'+&fdM_߆tg75mC*r;۷o!b*$sD gWRҁ ֭~3g%'-׌, ͚5ؿ=H8P= }>4/.mN7le|#@0eQ)zݺu3ȥޚ5?s{uںuaVI;vlu|^ڵddXGFLmE 'H ɍ(G5p`t*T(ϯ%ȕ IP;ae%U7!Wr+v,tS`^+U\2ȕ)I#H_QzUerIV`_4-ylP\m7lE\}qm@G )6 ~uƌ1:Сͽzu~۶-數 eֶ)qB{ #,B|켸MoG-tfa 0R Azt\?[_)m G6)ڏ{o%Uml77LQh&-2bL`Bw܈qb#~a#+W ;])0WrY/YΝ]ZzUEB)3qq{ݺϲ[܌^B|lP.b*rؘ;w-[6"'J?R[t_~ff *T(/<*dG\OzaP/'~i_{b}roG-tfa 0R!aÆY'ٽ[.:k 7H:*wA&|g_ji&+K>M@N+s׷ XG:k*UiRaK/n%wNn ̕\ sV|EDN N;4e&N??=32${aY|l,Sf.v>B.G={_zťKdR޴iӯZ*MK ]ßԍ:#> :Ҍ\sV| ݀Y2(׬ Н"\gM֒6$:ڊ\zUWNM gKg*1  ݝV+G:vGӧ~Ƒ.RܒQQ( ;])0WrY/Y+VKLs^zE?fSvتRڷoFg&m#"vkל\w͚5\R:"UHH`RNN&enHxW^y^Z ONƁ Lc!~9aY]P}={vwÆuVI툿e>n,LsJ=RrAFpƍDp ʤ,\2vwzv,tS`Xzu#;ʕ?vtD0rA/;)u 0 Sf2*Z+W?1 e8R*즚 B7fYχF;`zIr9}RIǧcPۖn{hL@0ȇ) IKIrg_ds`8O-h7ʔ? Bn*zҵ?|=at;!M.t@/#H7`@Y9)NWGa6bVnm{#ؿz3n@Pb [IכJlݎ1 ?Py0% 5zf}3vRV6*W)JMi ?=oSpױ^Æψ;=!n1W=ϡ뙍wDP#Vj·$,wk]s<^c ݀=2y|1>v}xV >-NDk >ⲍ=οNԐ}NHH}՘eB{'>cW(Xtw9UUGOnf6п+ FvLۦ7+VrryFj=Zij=]np[/*nLaetE> k>_o{{AMNg옶ȥ'tI!*yo;L礤$瑾GhKHVnwAתG_TjLBjn焘eFҍWŮ'VzAIYNl_ڥt)۾iHZuwyuQӷXK7t` 7 6gUcC~3-"""Hŭx֤w&w>@Y)Wv?H7*3F;7nе{7s'FĨ Y)vH֫L:JȂrdJW?+]nӗfmZ/z+w ͓W{p: ~{LMFiv%D˨P atI!*yo;LT`ϞPoA;3qE>P&Σɠ[]Zʼ}~S׾8˺;!9t;`$xV+cЎXNr5;Aw}=׫n}?8 ݀522MMuw mᩱ]ލt'=fBBBc=Ń5)]%-yMq@o@$F;DתHݔVŋtUS e{8@zE'=^#uD b99r|Ccӵ~O^6} 98f~K1qH7`̠ĴND_\XxkA*|CjԘk:tm LK˼Z|T~ewY֒*`ĸ~M H*vI73~/b~uk-3/-+[ᯬ )OwF*#1%~ްeRQ6_}_|%ڳݤY#NZ'7ȉA=sSnepi!~SKZto?zc{ 0/,C~Sf$?#+9 # <<&zOZ`[^Zmç]x'Y$[^Z&g{m>ZGLMk-VDt?Ug'3囙1ԁ)3(J̯·zMjw焘eFҍ,mGMkI1 W$}ZL6п4'GϿ#o԰i݃gK |u䵍^ kӬG!cnPfo SfL֝mY[#'LKϤAr] WNd_!8>PV,]Mׂ'{_`s;_{V;:hx%@!f^`|}x)#c.=5 ?u!@0ef rrIt=pjb ĄI~k'I :I2(=zsؽ B] Lr>8'`[ʸnGL-|ߐ^~y|Dp'$5>u?̄~͆6|ۥ}bt.xit-kW8d?\>WGF s`Qr=nOׂyGe]`6 .k?t;2}v#4b¿Qj28!nm8(#PӓWָ; 7ZӍ.9l0{#] MFN^czN}(%F:5v1] `o=ʸy'OcC~"!]Z3F%)3sV'a/.7UJn/IL"wA'o/ ,?3;e+ȷ᠈onyKn<o_ult2wGD3wzzw4*oZ(;!Q~oI,$nLĔ{ ^_uuwBO#z#Z0ql~k@ sR:;u>$4_'ӵ` 9gOށF_q,IϏdW{N /3|}1nG[Lۣsq1:5ѳ]3m{K7}#3k@o\cA E}ܥ%?;(6c1KD 5&&TcIXb/1Xb%5ҫ(T RDH:[n}}ٹwgvy[]PEQ (23dO=lǗ]K4 'hHaC.צ,Aݚ_D=$. |%ȹU'v~9@{̸dȈkSIvDZqAkcE1ϏO!ESf&/!\[d] آ, T~>GOA-G]ssH?@< {g04EWþ%,CŲdG~\K1Y .$Cy^!a?_f+#~ܑ W20e&9Ux);L~7.fzDqxqiXҰ Yuq* MNdW?$ȿYW _Mڹ@7h!3@x2=^i$@vx 8+4^SA‡ w`LT"#FM.SQ âMZ`̺vUm_z?&)Qa2i$IeIiOp]^g8[T/WI&\b wdY4;?AW\ϙ WW~)3CR?W<[]޷)iN_/=V:ٞ3YWFCq˱=>p28ׄ#b,#"r+VP<" [57ӗ&=1RWZCܸ|_; GcJ&ꝼ@Lf1S0zMz7ݜWWHF[s`&@T u^:qq¤t 0Zξ0fUFI"yg~ǂT $O'k1ِpe0ZR2ߓ0e mј( 0*`LǨ**޼[s^ɤ`8QyuV́˛켤S?[b9]7ߞ}n/ /AQOגV,- .n3Ѐ݇g|r H?@n(HL;|mjkwϿIq-is2ħNpm3( CoDm:/pew/t2w`D~ϻI+ / s@mјќ;q U`L{ <l|eؠO<8yw7߹iy:WЯ7qJ-iK(8r(+LvFv;LT+ @=C=U dwEo=IZRQ\}=|Vԃl\Vf96~yǞF#RWV9l/X)29k&  (ܻ [N\d|_,B!JZب^XiF7ۡPϴ)3-!;+ra r4oT/r8t<HZ@2ؙ'M`l.:iπ3 d)3-n $IΓVh'!pZ"΁4:FҰo]'8ُd)3@3;F iD]QV@2ȉw/ @c6 ȕڬAFMR+9FGr+~H &.0e׶dV@I$;]G Hiݦ 7u{> (CrI+?)n'?r>j=:DWQ4rVnK0}C{_ (݂?[GZ@2`Tg_XYZF%Qĩ d u-cTVb)Jri=w/ɥ'ڿJZOU9htբ}&'iGֵ>oAZ@2`>u2%<5'2@_72&⠯H+2܀Gy~ѹW??Bfh5}CO?~G70`;w6mܫLh`KIIoiiٺuk@tŋcjjڽ{*p޽iӦhѢYfSLʢ:dmm]NYYY~z339s`y;uo>tꌜ۱cGss磢(;Np|ʕ۷Ge.ĉ!iGx LNntgI+<>]w@ڲ_V@v?QFBDZ5'&OXPPvځ-,,\\X9+W1"aÆZrpp(..9s&6rUwޗ.]***Y`_~IO4)55on߾6!!!;;{֬Y-իWXq9}(fʎ\ݰaСCӿ[b/㎘?NV@8@`d^7P>yv[H }p˕Nfydn.V3dF>oͩ,yu'a2KOOBSSSʾgϞ6mڄ` 1Աcǻw;w:uDŴkn>{y ͵i*[n11VxqU^y+:#gIA;wL}K:w72a{@`< #nG+vb6eI% FKoոGdNcǎ˖-!vlԨQqq1Nڤb'OlnnޥK///l@hhLjW堢x;`֭D}bp9sqBA)Xn>~ڴi\޹s':.IaaaHHĉ}ʕGG\uFԾF 'qơC eF(S7Q\Z]!΁4: 3XHqGEW \v@0Ԟ|ҁ\v pZa,΁4: 3݈( }J .3n|?፤S@tU?E#g4!.=W<==vڠA޽Y1Lee%֭[ƍl՗shѢcǎg W:Ԭ١C~K_I'ZVV|rkkk+++tPl$NIݻwݛ6mZ-5k6eʔ,СC8ׯ1333gNAAv+--7oڽSNI&5_رQQ'Z^^rۣ2Q xD}_*UIݙ67ӍJ0O5WLqw\ZɿLf"44ZS"y\+L UqW0iWwMVksPzf9at& ઘ|X`N%svtL gd?<؎HJJɡ,8x2=/N[J61堫0b* *kF[..[B950ӍJ0ۂb&j}b#`JL<911ڵkHwpwwpqqF:D^3l07tP\\=sLl@޽/]TTT |嗔IRSSmmmg͚h"l_z5OJJ kq9} ֬YCq6l:th\\%>+?vnf}xFmj:\3UŏOLuJf_Dՠ۵KױVӃ1NkN)2)xݍdm:\q Sf% W ^:j3\TO%/6oތӀ86-iÆ1W|V@HUq_ 0rqw70J30><@w6YۂW BNqc#ߓİ1j.,,455{iӦMHH-ǵv޽Çt#WZ[[4խ[Ƞ*@kq9SHRq\ܹ3s8C~Lq[M:DsӳMSMb޸ AU^;d xA>o6 iucϨߎRҌ& haIFtxz~ƶm@ePYZv je9Æ1W|VOq] 0rr揑f`7rpr#i8/y;e˖s;6jԈzo4JMz.&<<|]tz=8 >̤zQ*Jub;QX:\uF\vrP CWF'-T t7jT᪘7Bq{?S9z*.!n`Ӛ݂?onnx t*f"F7piyXpc.}MKtڵb̙葘QeDa,$>51kU,:.$3̖W*L0 xQmAb&j}~ ǫYnN73'''wy˖-t o V&{𰴴ě\@%;vɓ'h0A =** ###Y㌫ș90gO0q UluEkw&(;멦U1n\dwT#,:.E~\2}Dfg𾎫\#)v<\!Z<اX2yXp;?z 0u &{mllXao̦6-c dz9jCi.K"=_NZi0×'TԜ6m`,,,8@XW3&MtƍbVVVUh\6mWw܉jRXX2qDl_rѣ{aꌜ}GEM2NptƍCE8Q&~G)yNhN܄eg=t*fԍr9[~z> ^EYmQ.E*\=b8~J:Am2*Ws0)̪t.\.$z 0u ;;;d<|0a!\1S̖jb}1k|rU@`q] 0t rha%@й6%4Zݻw__:`o޼ys E… [׀"^{5SS>}\t *. o~̊a*++Qnn7nܷo_WWWlGWܹs[hѱc{alRE(R+_Aʖ/_nmmRtPl$NI ad=.Zp57F%XO5uʞ|.Mf,:.E<&jt*ホ\#)vSG8<\!Z<اX2iXp襣6>#%<}.] ; <>YCm2[ƬU1u-hCng[]D =NEq)S,J$3]PQQQ~}*= _Km'D{9ѣGqΝ;;wwp2L8ֽڃ/g].AUϹ:?⸬0Yxԃ#!">LQ0ù娊b?䊻ͤd  !ե[d`۷ozxwPYwʌg2bjJ_gMkkfµ9ג\ bSɺK׮]+**fΜ{Y<OH+TRN\LZ`\}WiO֓ڽS,3 ǾD+*KJMo#Y{ :t3g~&A iY7 5MfVqzεd ǁxY78.&*w? TL*HL#RɍJ>iCSfQsaѤP<o fJyꓐg?Kn3H+H٫Hl޼m۶Ivq5Mõ4õ jZkjqqd]Bagg|>LYV@Tٛ?` 0jܬ> AcËC @h02#IZr 0b{qEQ~W>zo޼iY7 5M8V ת\KVs'M-&{{.]k0qOB SbV0(0e5g,,:bi 3!1NV@yDo9h'iIp˥2CIh1OL0ԩSw W ics[ 5Z7rMX0})/(r26DZ@z?vm&KiMeezd/~KNZhg LK޽$WV!0R7G=`q(si _X: w\h3YHkP mllBC5MYt &sȗI+27/@ Or $o )~P$m߃ws'UTdhW=Ǜ &/wפ LKkS!/^0F i Lz TDס$NNS˞!_n?BZSj4iá*8Soi#!ncͤ%MϐV wVqiӈ{޽?" %r9[~z>rvّV@844P0zoAZH%v=iɏO H2#ɸr٤P*w7A$JuuO vJl (g|/%` lwcƋWщhi2{/#q])LJwy {gH+lF;k&i?aq FS- 'Q )y4 (y/ #`h*KJ/4f?d與g|`&ȾJ2 k?GZ,+?* (H @\`?r]۾{AOB &ˍc@_ǭ݄ J0^R2]ی#4/B)$ (x~߳E!s~X_DfȸH+xPT_& :oFKgV`pgV@\`J6-IYyxjt^2t>oAZ6o *HÛ%H+0H;d.i̞V>8EZ@>qx]f,`ro]mD'" FBq٫I+0(+txqHeiL=#`ΤP6}8(!PUVZxsɟd聼؇L'I @iщ}&|V FB̶wV`_CZ)jJ86-- 3e1<$IDATo/Pzuj1GUQio:q6e 0^>]pĝ\3iD̪9쌋!P6Yn ǧĤԾ UU^=>ȹGZ@\CZH24 ld:[&YKeRI8 RQT 3g PUo8{S< F7?yEZwIy1H+ 0eVu?:@Zs{& .sJApxqHyAiϭ_Dm:JZ@DJ:6%`:a~)n#Jrqj1ޯYWo^i^/JvLZQPY֓!_l PUrI+BCG, ÂL UU~ /{Mf!2_LGmAcᅾ@f!'ϑVB0c9i=/k8(ua~=iu\գKa? 2(.u2Yνa8 $MA!` BЙ@UՓޯ"gr 6ۖ` \KcИ[KF;LZ)S篌@ J{E%d荄#޽?ÍiGZiC!U*zݯL;4y2X]ЎTk~V@(to$k @Z@o>!+nQ}#(,>pGh$E)Erʬ6Gľ&5ԯ_M3F޸q 4ٳ߳4&/\щUee&tõ84;[/%@Jd^;d.ݒpĝ (vt4lSfXJKCbc]7n\мy{5rŋg\=~>:kU+>!v=șaѴ|@yʬ(5-I5ť'Q@'*iF-=̓:jz ~y^! &7:J? Sj3½v&48FCyhi4zʌu/ aͳicfҜ9>}6޽ɓYX6-4i(N}G[&MLG@keظqAڵkw;֟ǎѣcƍ uYj2wttЎٳ"zt N#Km  Q$PK>SUӹ1*M1۶-߬Y-VV-EE9͜9u_b}-ʕ_Ç理 jo,\al+}Gtyf\=thU& |o;p՟Yɓ%$xY3w 7._r؁))Fzۨάvcǎ={766x@+ЉЧ7zpN^ 9Uecs9U5x|Cy j9λG8}{Żg\?o_ގؘdwbta\@+N_6>Sr$\w$) $3lģKU5 6jnܬO41zC#&J\݅~= 0e֭MtNNkz׮%IIX a,,^~=رmdN߾}S'kF;wz۶5{ƦGx^tÆ/`3 7.Tg”J.;] 'f|$vIo`PQX|׿;W|_UFǗ= O:oz*+Mȹϊ?\_b]RWqMUQyrsɟ+hōﶻw'6aRelw2.xgѨ3 LP7ލ#j,1۔E %L6W.N:/@S83 yq 2AnT[g꿓zšɐ[pm3 ȈK~$8NmI[QYF/tZ5SN[׮6 ݱ*+wYZKmܸ`ʔa81rs6ib:MFOs՟̙2. u.F8_o4xz|>o6IFSf_ori5lW/r2]/g;ph9tsˑq9NeOГGQPAn\,'lr@\gs[ tTȈGԡhtK:)G|}kRCzuZΘ13ы.u0Q mm7ml4Yi3JKd&MTjfRmo_ܠA}D ,ݦCӡfŮm߫7ֲ}kd>ewul8̗<<~ hqq8 1;'62S&^gm8ـA#%qxmۤ20)3u2LõiթfoytFf0r&UShXg522KuwuNa PI#nA·s*L7&`FIwI8BIf+@H?QZObm }8ԾTY2žQ{]ƥU/ OeE;tje .γsQO#y7yl ~jJ6C:5557~'*KJ]Z9x?%[KCy6cH6ڱ'k֭ZꫩԊ %2 ˱gri=Ljɵ4׶eEy!d۱{;O3s&ټcxg7;f%yTB̪߉B頵t[Q F] @{謬,2Z#n3xz~%I) +QZepjƾ{;2^00e&˰ |Ù̒D`],FQ%f#k '|HI'`prʌoW+fIJMNrvvFdM-$>P| `%Nl@+$QD!,^wp7(5FE1le&N={vܼ3JJ ݙ;G70g,tʯڷ4GGD!Al%&:wnuII9w:vrJk( m8OfۢEf^2eXf%Xg.fjڰ{'OnFk$eHG_ϥzmi1(ҷ0iqDJVr7J^ ;ɓ%$xY3wױ}C--o/dʯP><4lXU/…߿%]֨ +NL\ȤIC<R]|}^r u,ֳAUK{EEAQQN3gFk$i"F(%1cZ$6%L-C)S"LIBem"}KjSg2t;w;uttAAiCܹKa\tؖ ڋ^ yz'ƎdɧF3Fzy$&z2BɹjmM8]ڵ޵kIR9Ih6%>P| `$fl@+!zd)Ѻe0eJ`ʌxdHMү!niټc'Tl´HMRŜB FF^ XwgjGQ3syyjZ1;03{);J ml ;ޫ2r 99|x?iRCzuY@WXةɓ7ҥUy$m4s1iQO"iČ VEd4!5WD%`ti<+P"6SfQ~6m,fyi8⪡Ԅ[Z6"[p50-/fݻ8@nsF^tOKaFlvҞ-3613 gj̘w~QF#رYB=aO=LUVﲴ4Ǜ\HF<3ByZ(Mk!0*Pj"G;pD%{ɰvPL#eafQv:LE-Ѻe]m4RfetZDi-\!2!7.h޼ih?L7UC lޱE*FaZv$0-/G5j71w85kǻO8YaC20+V|Al~%Lsf/n#JoJڵu/KKs'AnӦjt6&M~(}UKl䪼F6่ƴk/Oڋi^+_b+@FdZTV:y0Fd$"z^2j^+Y-K6bmJV#_z͔=q7mZK[nM3̙tg]8oތ-udw2&C,-SkؕG|&Vmm(RA $Z8C$|u*SN8:CM,D|/[[Yܷo96n۶y}.]H(AΑpsA7oA;uecw׮6 GѲkΆ^{u> =\HR4s1#Gc Ep5kaO 1p`Ь <oHm|i%3>i Э͆ ØX/x+h`:h'2LB5^ JP8Hd4 NtCަL\\vlܸ ڵ;fKÉP;vD7J%dУfH`t@$>&Wt V)3֥(Zlֶ|'~f[hQ<+֡q9x8&\Voн {o6։bE*$uĵr"]R FU i2"Һd5 k5qN '`TZHWh'EṈ'X;:h!҈M^K3OMX+fm [+#f6>9rd-zBq޻wdiڴ+3=M۷z@頻)?F~6oޔ XmР>n۶k݈ ڃ\7۷UxϞا~zvP'Hd4UCcǶ˖}NnTp.L#V;W Y7>&?]51]FOs4T` V)3֥܈3q)SkWz.QH]AL7T`EEU8=bQŸKةITD2\] kBڹsYb"KQX#c`4IcmJe[k`2Yʭ,}7S8kǎFx 5P| `$flDRD!)}ғDHߒZxݺuFa׮i@LI-d E" %1c`Dj/\ҫD02Dhi1(ҷ0<-n/8M۶-4G:}z3ܾ}v^/Ѐڑ="®_W7nԿOZHV->|s[ӫ.EṈ@LAdBpIiE_@ґhW % @zSf--&E>=Aݻ),嵧M dA;vT\ĵK߾=vZ'BׯGh*i2"Ȅᒘ 0E]5 HU"LIB"@[R g>6TTQ (M55mXPܗP=94n܈O$H1D& Č Vd,d@rH!2井K6eDhi1E*67!,@Z8mXxyA7wB=6n=$^;c߾b׮%Zb ϥ6Zc "'`Tʎ1c`Dj/JxwtX{Z> bJ%Cq!)3Z6H!Qisa $ Sqf֕c#֭ɡ~zxs/ؘ~ =9 7"BN V3FI-d E10*enj 0E]5a]'D:,YmOV􄮤ѧ !TsCd0.d;ef\b"$T:mnB:,Y$⢩,tҤ8-?Id&EṈ`= 2yF36[A|N]5RdҮ"ݿ''t%>3Z  Sfaazlnloq-s:o&zu :krD\>>KYZh *+;uv2:bE* / OZR4u N/OFEAdrJ1#fldDA]Mjdoje>G m֩SC{&@AHೃ=̜9СU%Tuڴ@íZK3g~W_t.f~G`xwLY߾=Yߡk9xp#GyzٻwQ)C#dLʕ{zBԸ ń+T_R i2" EAdJ1#fld,7naw9CÇSEGP,ru!FTҶmXWz: :ܹs{4Og ǎ&X}4ҷ߾aêUƶl--&\QHZ8aQpK d+H-d ED8G "'`Tʎ1ct(ݾZÒՎ8:XAWeHCF]5Z_2NN_xM Qz(}OK/5Amղ!TrЪ?MO<= 74ja0?2%00nR0Sf-Zxq1T|Pe22.ZX;oײA"pEJpsC KjHډi.fWaveEṈu(AdJ1#flE?R렵tX-6Z3\ U}EhW֗ jzGtZJ{IF͚her͚nx $XJf~oe]~ {ik0?2%00$`B̄ <־eii4eDhi1M Hj0e[d+H-d E$)QI)fČ ZAmAkd#ZlY)b~FE q$U#%&I!ZKy==!AH'h-0d qF_N"&TH$oqp.8xejBM$>P| `$flXEﮙ9,D`,#Zl*fƬ3MmRD8D\| kK[SD0)3Aז"q$#NnguRhetZHɑ /qbCgXш#ٵؔ z踔,0^#r3±.=+_$?ZԩSnnnD EH:#^E]=u.W6nS I~\c1:0{Z!Ү:#PmK[S`c:;;cDjtiG'?55l#HH$`@.n:m G"}aaE؀$dK-S@)ߔ+CBBQN5:责E6QW$0 W6nS8  +"Ć>}L%N< ?T-[~05mFjԺ^Z c=t\ DnL/RSS"""}Q@pt%(+ )?6j#Fm G"}aaEؐاż@'7,V]IIDĴW_U}UR "t` D7e :脣ӎN~II $FD^HXF~a  t‘HhX `X!6`ʬ?~kGp%&O>OOUn]b@fʌ馩jYH!̠R "t` D7e XF6(z<5LLL||JNnժfcٲϛ41nhN::ދ7׮ܼYϞN1EFCweо^:g-g۶EHOo^2g PֵkGwPQ압:YGG;Oᳯ%%kڜD3g9th=A_p:ovڸq{ uic*jff/c9;Q Xû5.ƛD/qfRux^ Qnn68wϞv-۷Xd}Y[\g]X aٽ^^{ڴ^2W~՛2e~roQ~zT.JMԶmXWz.\*d~~ۿOҨbmР>Fe1%>ر]qq_PcVPiM@CCs*@'B %iV)Eăammt*ii'`k,%I{b#Aw}۝.t?}fv~3?i|m]Ed뺎$iT "*tdvjץK<ҳgO_v>Џ=qXS2ظ#'Ox^V6 *7il]qe{/H.drBw߷RGQ}/54TO8Ijeo'jG .Ĭ_lv>0{c'l/ ('^\*fБ͛ ~(ぁd<1qe{wܸ88_ڵO66].vvx}jVE 1{\ %WgRҴ2…7Vn:s5b』Wdڭ[cGܸ1d/Ĭo2~趌Ur2jjk;MdcK{z:Ed/uJ{m3DT,\J*"ugeϿ2\Jf޿@U rUrm*+*,Xƾ̲~)"3@dXdFQ*"3@dȌ"2Df@į("3@dFEf#Ck~CQ-a"3( ((: "2Jidroxwo?u"3Ṯ8N"LzX:Y9ɘ]^*J& Db&^adg.} /N///'IqhN~ffDdy^:NR&hN~rfDd٬yL& Dtt/ ).mIENDB`cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_f.plantuml000066400000000000000000000033411455674302600310430ustar00rootroot00000000000000@startuml skinparam linetype polyline object "libFunction.c" as libFunc_c { function() dependency() } object "libFunction.o" as libFunc_o { function() dependency() } object "libFunction.so" as libFunc_so { function() dependency() } object "utestDoSomething.c" as utestDoSome_c { testDoSomething() } object "utestDoSomething.o" as utestDoSome_o { testDoSomething() } object "utestDoSomething" as utestDoSome_bin { testDoSomething() function() 'dependency() 'dependency() // mocked } object "mockLibFunction.c" as mockLibFunc_c { dependency() // mocked } object "mockLibFunction.o" as mockLibFunc_o { dependency() // mocked } object "mockLibFunction.a" as mockLibFunc_a { dependency() // mocked } libFunc_c .> libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_so : link to shared object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile mockLibFunc_o --> mockLibFunc_a : link to static object libFunc_so --> utestDoSome_bin : link ""function()"" to test mockLibFunc_a --> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibFunc_c -[hidden]-> mockLibFunc_o mockLibFunc_o -[hidden]-> mockLibFunc_a libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libFunc_so -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibFunc_a @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_f.png000066400000000000000000000705241455674302600300020ustar00rootroot00000000000000PNG  IHDR4?HqIDATx^ \U1-AsEq,KͲr]SSZڢXd".niW\,; K6\Hə޽{g ܹf͚tX 3c=GݻӢH\Sҧ>6栤[+J\L?q'lrϝiܸõvBY+ٕg&MJot)uҨQma$J<"#XSrֶm={Z!%%>**J5j&D/ ڑҹvǦI>m1ݯi{SE ASM}bI,* qͥ7siHd&#/9+J0mJ233y0nTv޽{g֭&B/ WqJ\Sӧ>6栤[3Vn[h!~O,Ԋ oaU[޸ͦMIoh)SFXΙXdw$kJΌk?ߧk?ᅦ kM_ȊLS(WÐ!N(m }+WnRtRɥt)VsPR- F E֭JA#bF כi;W-O\%YqG73gݻ!~KڼCWf|4&&_޸yr%H(C5!3g]63z6$9w&77wܹ 4Vڈ#RRR~Ϟ=[k޼ dJm8MVL/w 7o~lmm_{5߂W۶m+W_ ^hΠO_8::֬YsԨQ?%mK4lb NGFxP Ys=k633/m\ժN m%nO4zMlo߾ŋYFFƄ A@L=}z˗/_. 'Otvv_+033s̘1իWoܸ1D*6J} ~ر½yk׶hѢB ϝ;FW[NF*իE"E BƩl kW^Iig۷Bzx̕mҷԩ֩XV+2…I6-::֤oJz)7Y9r*>~|@xAwNU}T#kll 6qDU+ʔ\[Y)\+Fؤ^<{7|,YB_-GFOm,M@4iR~nݺէOoˠ)l xP f#srNΙ3Aj*я.Q>8֭]ʓS_&V(0?|XYirŊvR]u:8'3PeGj@#5j0QR̤UպQpY2UP4ۯ\B3ͭRJ111lcǎ̌r]ȧs3f`yuԉ=Z9883gΜI=߼y}ju>mVT5kV K:t`z#+ۏQRs*B)y܄֨E+; S!TED}bZ1d':~c-U<:EX}"<ꞘX~}V[.Dׯ_,KHZI5&(D2Ctmt}R3zt1OݰaCVV/C)9#v3.*\]ݿ`ذ'cz%.\:l[n5"wy.Q Uic yU3(7V~@iҡ.Yi>ի͛HwIu*7EMY2U-Q4iiaSeϟgs5nܘ4i"],vLRW➹OPQ&Ha*ڈtXABϝ> 䡲I`bj~~NޮP<8UQXV>ٙ(W|]>B`Pp30}xx8] 7mtLɵµjM%}rd#T_|y5tjkkJeP'{/]$w&G/lwqip/+'$ׯ_yo]!ۉfjrʲңQ׮]J?e<{h (_:T"k@i\L ]U+>4aSֳ rU1J{6)XYbdnʔ)b0lhUY4bm*%VPs*B)y.N ]xq">Jdg>xTLYf*t[nurrb\[g#FQ0,MʁN8!bCk%=~V 4`e2TP5*~}8=Ee!!_?yғ4mZo۶mMd eVVZ,Hb➉uxeUz4 h$¿6h``ZW4WotyA*ViS nܸѤI JRW.\`Hn %>@a U4bJGzc;}P:Xdw$S!TEMKǃ8lړܻm_ڵ+' ׯ)JQV-tppI,~7Νrڵ xVZ )5jجN:AAA999bcIoĉ:5!&Mbz2^ѳgO&B%*A7k 6v9NNm6:XWhn/ޅlYiC6nS;g-.wa4!'Y-l~3g]t6mӻu)&&F4U||<ۘF8}=zχqPQ&oeX}݅'TY4bmʽzA%VK\VPO_ѤIݟ~ J *"lbAd';a7=T,S.o >_Fd *i& Yvvv[޷oSWZU86R{^{|/–-[RajRR%j-k[3<#G`g9C&5jgUW&G%*A/Zu׮]h:d;{҅ %gjՐm:qr {*ET޵kŃ7ywyU^RYiCnJ & LxG9ZW|ܹۓ5oޜ}azA*F}z "?1*ʚ:u*]QrJ"49smWk6lؐP2$I{"ݻWT"A\^ݮn/}eK*oJ &VVa}ԾU:mR\W:Q:rd5+S66 sVQ vjePzPsXQ PəXYg.dOq㏺'oIyg\m[V`ۮ݋셿Nj֬~zkv8:BE8~~h^ JhJA)A3Ċ-bMt o%KKM=}2ggPhײc6mZ,^mrQKl'ʕz{,ғm՚ܝ>Jy%_@#RW- JXYB(,'礐QY\kgW^^aTB[Nv;٦}ٹ6 툒g"iYJ,9svvؾ}VK|'$gYv/Q*[lЦM+Rxm۶o߷]4%̙./Qx5q_4_XNI$YO-PtL bžKл @%g7Ȟ sw9MYreIß8<ܓ3JoDD[7O 5z}:oGSo6P #M>?`޼7gﯾBn/l.50Nfhd= fuU E)VpRS\w_[~-qTbЧ;9+~TvV.],'wNĨ G]C?OjϤVkIM=v]Ɖt0ƉFS XIQN]Ls޽ro_qTbЧ@rVzEd'];<͕;3]vC/lDK:X?4s玭QL0f:Y,] )u(~SjFΙ3١f78cժUvtߴ'ؤVI+ַl޾٣F DU3 yLN|&b S-ِ%+pg*oTӼyCwnnxu.^-Իj qAՈ$`787j3GB@rVL"=;~X2؋;3~ʫ%ۭW~|۶Z5%MJc:[˔uٕge˗ǎBjJ?(QT}رg ڵkʎ JZךD-l4Z\Xw[r5sYl^ɆsL={V{ufwP .LztJ?# 䬘D8y9hWN^.zfyx5]~-U]SKC/AlPlׯwkAJsbcqY|LYK^%3W:sc K~)&2M,Zˠ4+tr#똂 f)1l%#0lVXIwE0(ۺu ۔~GD AĒ3XPLس Wڇ^ϾU&9H|2G)qrC밣GOrp]N.o,%A~WN_yN!!gΤK r=s;-+Ď#-K&,+ֳ;g;gYO-2(( 1I/ذTIֆ+3Wި@2z :wn6ս{ժ~C\tw4q!ۗQۼyNH? ZHԤЕ&Kokmԝef$͇͕:5/Z䘛YX J~!^Ի[+WG?5Λ73fU=,ZSbSVMmmkٲq`b%3HұIWOhhѨz*S~JuYO-2(( ݓǤ}ǤiϜ}=s7*$&qp1m{}/".E;qYNmS_~GD AəD)sy*<tWvʴ5_ZVԂh!.Lc z23ئws>FD AX3 ZiZj՚h!.LcE &g lǼ,W59..&dX#I\Uqօ_@4%RW- J3%.ZŚIGHPXJDd'];|_nk6MgXQ⢅ Pətqt41HOv!hhJ]sXQ⢅ Pətqt41HpA "ꗅ4,Wv*LUA R"wmE AX3}DB IDrVa~B#RAٿbcΕ&HJ9YgZK7N_vc<+[x\3000$$$..?Nlws_L֖r) ZGna9lh# :Gt|gcX~:n4cu޷RAY1 3 @=,,&]y[ *j^o١sDgݻw1WX^uzy"J0 9+&Ar N=]vrs֪C$,`~+ȗ} jώ]|x JΊyE ?F '0h aχ j93E+##?Ɗ3gs|3 9NP`!;LJzaLd/g2d7KUܛeZ$gwCx-F߱u|*OĄzzz)v<X%483y)y-@$_=_ϳ"b̬ˀY󒍵zZ PKs0͇;k&??K6@7962`}yx(K{? VɸpI^t!y3s,֓ʇV\u'GkZ%>0]P<7+y3.6me%4#adc=SN|CPwEay_Z!dy[573h'.l{apsuҰ,c['sy-b::d*h ]Ny;y_,M./  ok!%֞#teXV]iZel%# <{&gYrq:^ Л#qF|(7#V&g~^kzc17y=>:}vu,y1Z~C^ (9.j={f{jcquN^ Џ~;3?vVϡG*X#Vݍ-x FGBZ@qwQuX)VU#)W{rs @rkgeuzl=aKCGb$'=܃s(֎&g{y0~c8} P\<<{eNjCC>>a2_JVnPُRTWKz9WR&g;[}ϙ˼P}%}?I@ij.C.Z@aٗWl3Hssdzj0]nC|lg_T MMqT{WZ(xC<j3ǞZ*g&/?;7^ 0K6 j3]3<U ~h$*xHlsNxNWLJc@ M|lIel d.̬w@8_69T ]~`V.j=Ƞ Pj32**;k`əM;^P^Y=Arfzll^Y=ڳU> L}P5=[`k0+p1'V{ zbg@vvի|rV1a8::R6+^|E;;-[>|xM6m߾ŋ3QFcǎ,xqnnܹs4hPZ#F0=^Y=l޼y:urJBBѣYyE׮]oӹs3f0=>}1MV77J*/&&mvQ07¬Y=Wpwwwuu}a&Nhx f.ʓ&M;wkϳ26nܘi޺uSSSiXmrƈϡG?s:<3'`>ؾ^`vΡw&PpIW~SR4^ OWwyf \ȝC^^0=ջf>xkPZ3"'oo>1GwcO&H(E}ν#&k=FZ@ 7m^ R}4}kwEuztw+EckcnZ$x.b/N<C.Z$Qs$_@)&'-߱磨||?kP3ƭG{rp@ ra#Z@ay-093uJ2=5=_0o~i^ $gx`~'F(qg&/cun}@rYI)a#PHW;9_0C}z ə S~[hό ZQݍ-x-Sp AĽ':J P~ @W;WH@rFca!'(e*^ 0b H@rVYI);:JwO`ԛ ə^v4NSsR:=o~vg/o!NH%Gdžto&]eZv?^ 0s3~'@3ø0?sW.Vzv0aq^0 ?zv)@3ɼ07"̬-;Ƌ ۾(^ 0',H@rf$׽;<7ܬl gO[`%s{_I(wH@rf< ;iW]]xٴ)*b>_q&@k^  YQ+!?Z{fMe07I K`/E. zߺk@rfR%w+vzx 9:d*+fdؾP#}N0R"=  93:ݙ+6=M-;;v7~WKר|?<@DƝ~X~vą/w֕j $gƓ}?2{>o{%gϽ} X%VC++lp"oxcfz?ׁGQW68 ro˛3w<5T=}91TMϾ)lVמ QóWUə|wMptd񁇞6$]KwϮwEYICz|L?ngr{|)W;Џ]uwL?~7HH e3$hx3aYԢ{AB$gVLNjzsjLCo6oc{6W|9S/H %gt bI[uK.f1-r<)EjD 93ƦP Kv*$$$""":::>>>))?I:wӽš|5@܌^8>oQ@3'9bF כi;Wyr ܻwoXXgw=XjחX$<˘MϾ[UZk݂%/% s7mi% || 93z$g*u}|=*,9[7eg"tX% \F;_0H FL\XlrF;$##3m.cn*Tmg>+#srr0K&|DTMŢԖfCBB#DdK,OعNJ-`.]8/$gchrֵ7n$̙_pͥ 96vkrYFu ϝ;S6/޺`^k /ba56^:ܼ{7n( ^,Z@e iJgYe{`bj~~Ng  3Q \F>/wqip/+'$ׯ_u\kvv"z\!bԨk׬R>E=޽rq|%JUve(=ee!׭`#;x`k)t)eKNvvv ]'VJ̈́g  3Q \F>/ [3$D2e/ӟXr_07H K섈3j*4,P.6k 6v9NNm6:>II+VSB4~Jϔ p̚Pq%.+eٕM Ү͇/$gBDIMS^˭]]_' udw _Jjժ!ۖu@55aUJtk׊޹o󪺽פ4~١J7n&iCV։ ^|п'ڔ$"936 $% \F;_0H F%9srƮ蟐ez7GB~?ə_KGp-| 93Lxb\rַGfe*ЦԦəL'3\ e s`BXYg.dOq㏺'yg\m[V`ۮ݋Nj֬~zkv8:DjJ A p-| 93*qA(%KKM=}2ggPhײ/*d6mZ,^mrQKl'ʕz%"pW#PN fhA əirsRHΨ,+/^/MȀ0*P~Vl'sfL'3\ e s`TB`9;;l߾R%K3ά]w(-6hӦŊS)[۶m[vҷGa.3TLs No>1| 93 LdOORJΜ\lsҤ?_AlI%m7""owN֭՚>IQs.. ]pU*{.4^~-[ܥƉt'Z *.#HQfB L%} YcArf0bآK.V.k/]@e:D%CG]C?OjϤVkIM=v]Ɖt0Ɖ#0õRY.&ro_qTbЧ5/$gOh(w5d#6/]ԩMŊv/񵤙;wlUf1ԩ͚5`e^O}1QsqvvYƍ?Θyj7mI:6`%J-[62{hfG*u@eN|&#S-ِ%+p3SϞU㓋5oސ=1޸q} C\j KJ]X<֜FMsH?2's`Bj*I~ճӏo۶UTLgKF8cq.;,]{rرC(WZ%3ʴ;?l9\vMٱq _ך,-l4Y \-.?3S!{%nfٳz2'&Yӛ+::@\D%.,}9\l PG9/$g pW#PNH6O([6]׻ѥ0%U,s&]+]X˄%ұq셿l4Z(f J.#?3Sa-6L=[oHGEtpȁ{+lzS6VV qA,\XrJn]6G9/$g";M"&kF2 xzW&aa)rlqH}ϜIzwZqOBLW=Hw'.K] m߾\~:#Ȝ 3Q b&\Z!Cj*I7&&w*Wh.&5jT7o,g̪{Ynt/V>ײeJfY'-K&]z,WS٢EիL)5il13\( {Ltf?sF63g6Bg\+n=>Ibjs٦>SHw'.K] {:ukǑ~dN ə(f {.tw5}SП.u[ EqO#$$ģ^=0>9qAS_07H F)4HHXZ!CjJөtM#/Z5e)kM0õ@Q\3u c^.s`Btyt E2TF4 p-т 3Q -%06VthP0õ\F _07H F)4HHXZ!#jJ A p-| 93]AEr !pW#`4Q,gYrkzҺNfxc).skj`n.'!|[lrS !H }@,H0Kv`>sWN8V7>o|a/ Ll̿Vəd=Ls k/8}n7t.՗XpOO8sb.}$[3E2dӮXݳSW{k9w ` 9bM萩ݳR 4&g·]kmظsRy Ukv{)Nv'"9JR'Vwst Z %gi^\nG6x~_M[NHHH``4X\m}6?{f? AXrM{}[53GNE@ K,>;Q*_o7Zš{#O׾ہnnؙfg5jc[#cVZ@>£j1Ƿ (Xarv΅lwIq0\ȭʸw+t| C}'F/$g96>ջ{!gy 3Z̬޻$_~hd`~|b aQNv(K-p~x- {y7_^ @,ߗlkv!~MP42'(*_ȧYf_@,ߗtQ?;vS.'fXRr $_#ϽAfe H }_ G}GkOȻmh79}y<O5(f|h19{j%} @6CC{ylߗ7n|HOb%%J[g'Օ[x-&$߾ޕ23<piC⭳(rą0%߽}y_GXz^k0ŗfd^|חy|ݣgx @Isۥ䞼/iR',v۸vᗰ"jtO8(ro/-3&g .~G6x~ߩy 8>|湙Z9s97n1sc,73}N鼻OOĥZ ?%}Ԙ29{>~_[XëP!|StSc,_ք;Pwvi%i[16g'7ndzڵkjzDcԕ l s.%/Q:<9*qqqqtgϞݡCAPP?S:]ȧs3f2(m޼9==ŋCeJjj߾}iiiǍgH/)wwwWW 6lĉL?sL͛7xdҘɘ%0k,A J;7o^N\0zhŃk2J1ߖOSo*}F}Ν;;2ˆ>7gL])5$Fi`:QŋK32Ee"eTJe ,,i8COY.57n,eԭ[wɒ%ׯ?[IJJK[V&W U...QQQX~}V#;QLƂ>22Rg6iD5C 5Qr So*}F1*m۶Ftttڵ XZpC?7uU¦א\J^,GOQ9(*Qt L"5@ZFxx8]7mtL4'NtҥZj6-[V0Љ~<0y#t+Fidg}v* k̇k216&V37k,''gС)7gL])5$Fi`69`#&7(#^`@=%KPuV'''4(ӂ<+Vh8q4hЀ `M_|8;7ŏLrb{!gy-}+#^ Anr+02Y®=9W ʉ^k"&zɦ/gkIUs䌸y_sG+kr?q?Vs=oR|!]s!KVa+Dd %'5==o~17y brFD/ٴ|ZÚ2/1t!.b~=qwnF&o%gyxih$`'5;9Anfu=zϯFS[`8$gon7"Q*_ m*^ 0k Xo#ȡSp89G~(]Zrsom;J<\>sw<@Jt;` Y|¡zLHz?tЎ^ O/9{t#a]kE΁cfn2tZ^ }3"7+`/i[X7nwIM+ GKw2 o`@rFg2&oN,CN]k&7:>0d1,9#S٩ |7>3&ۿd[W-@zX,tX݇g&_-sq۸뛂0IΈI;[}t~_|b*|ϼ`fr32yueiM[R~v!^W,, dI?;uEs=o~:-i7lm<0z_Le$CMG)RrF\Mj?? YI) U ~&H{muPZ'a2o&gDuߍ[ UtAqI9!!|}iX&HΈGsmn&*9?~6oȸO/[|( [k402&Vz۷M,[w}wNN{.ۻ|P=r:9[25aw(^ o},9#9+>Xe@H"A]͗ V s-ry]j8\5-? e=29#ֶ"; ƹ#$zɦIl318t+èAx?VJ߶PV3~yvc7WlqnR˞FwNlzM$gX9iiOBM-jo,'gĽckٶ&Mσ}vx?TFre02ԗ~-1Kr8qEn;t9D=R'﷩^e(-{JOBye }fɣKx aLe?J[pI>ohΉOwM,rݯߦ-Cg[koQWI-$ڂ4əw]-qRgp +!7+v^-Dw@8ň3bl ~}oR'9c9&[B'Ԡ[ێJ Fg@Lbf [yAiCVs=1'/rG}lg%|rFJD]04%p^PjIu5y+6 O9UOA-9Z~/HBw`p1>>)pb5yR:z)XYRLZZ-\oPa{{``޽{(߽E]LI2ϥ.C+WaȐnNm6֭89W\յ+6&P6*z J꫑9N-Uؾ23&޾FiѢHəF]_t1_FOtVbJRi/dfR.6jJ'NlKn'M]VtVjc J,@ *7# ˖MnԨ}cddrͥxxmѢQ ۿt7ge>}dzNtN{a\''L,@ꝋ%8֭]7opz7nk֬O!!!qqqa zxS:srNΙ3Aj*/9(KgP`2;ҜXѣ#V U/z*u:8'3PePɨQi(tp 6XjB",97vPa/8N bY:tx۩S˗o =}N(\s3f|޹XjժsZ |ޡXX|4s!wooo46^;wY&Ą{tssӧXӻw5.mr ' a'N3YO&_5jTee9;att=b̘!^j%v}ʯ֜(_:TYYi>ի͛Hw떉֜״e~))t)W?yү *DFnfs|7#pP))!tMԕR.P+Hd; ]/^k;Jb.(ԀѶm={Z!%%>**J5j.mrz/rBBpXYv&+$5XreYYi.F\v*U^.ۯ˿%./3Pt+>,40JOYFuDkkZS}ccL_}ԃxХHRcPtVmA𕍆RI KkUUF";'=޾JӦm[ޡXL EOJ*efӶF0fڵ{7֭[k`Ĩh"Pv1nSR3$D2e/d>\P {&Nֱk]ȖƯ>TP2cqfL漦(;է>6栤1@Q>.,Pd=NE h)t)9V?yҘH緰2]/)b-+7n`w(\K%77<(h=TP,ZzHǏ!C'1*#\LGi߬YحL2Lƽ^gVg'%XN^ ٲՇ*lJ fq9+oJ:,M@1 5d4i'_I2ck$|{\1$Q\PPF'iҊ"݉q'hn3~7_zNխS{]҉ME.P_xhBQfljZX2dV(09mUi*|GO- ҇[}?x`ƌ<^[UV_:TP,p008(NRƻznݺֵkׯjQQQ`#ԩ>T]wޝ;wcՙSV:ITu߾}7ر#eQ m``)S7y9ЯT~TD`@jTkD!6k;'ҐYR;ͦ4ME~+gDF%6uޏzFfd,qo̚5!<<n3W"KLkOl 7S_ JoJ9[ڽ{W1WȲ.ȑ#aD,Xзo_V ///88x׮]Rգa;;v ʠ~ԧM0+L0Ƃ6 >))iW\:}tR<2 |>;g}j 8p޼y\/ҴiH}XXn݂7nO.MLe#eޱ11 e׮e^z%&hڴ /ß?|MbS~~!x3&…=zyڗ8Tږ= !FהZxAl0%%l0.䄄h6ydRTuD3=#*N*WJKgρ~z4&,R ]]KvhaaJ_@ѣ[@'lJSZh}8}z'G-5j leE <|5i:z2!LQupAAQհ ev ;]M~}tN>Iʪ~ T;"[R}3lO &1114 ի0xRn׮D.]B[{&bB !Xo5~ ehң;uDvAYzdT:'^jO8AGJfTڤ7W5b5k12Uٚ*vnΥl%)-4>EO 8q(Q#_c!EβĂXf?sLS\sƴ#ixD '뽼W&eUIg̙34)GRff5n0hҤ /,,]x```TTԞ={HxvM5|_\RibSoϢuWՐ;T]l=Sui@Q鄲tyRC,JS ]]smf֪LU/UXbF6Glb+E1Zh}` mxxX_a瑯f"MgYq\AaxbV׼`f@Ge?bQv_+h|3"""HY/&!>kFڲytYQ8ݻwC@s -{c:Xr nNU9:y$)8qB4JJ'Py6F^z@C,JX4c0JVT3Ub U.6+Y%zTɳ,(|xRRWKzs=L7`A͙3dj `~ĈǏǰ0i[{&fZxU CՅP\\,>MuΝ;d|hN*WF~+<)pK ܡf*ڤECt>g/UV.ԩ)kFްa_wo_He*j!f0N z, .EPTTԳgO//蜜QxehMv5i҄ÂJM81PC*OeCpOAAA4=Q`` MbڪU+ ԩSCB裏'~ǎݻwѣǁmhU5U;wf͚'YkvaСC U2*Fufdd$4`>䠑'Ё~I;ϒJhDZL-}iug;G1kBCwHu05fLt ,/B!EY~vܗg? 41Na8@  Tҗ*VF.X0T`ŌFڇݻ!xдW28.R,#7NNR~'jYzE|h6z@c=O%gN,#?~QW8Y}&fo'j~a ,t>Ve[.]4enY}?+hbh{i,r@@4PEσi:wFU|lȑWhb!5ތm8s[>_eybdhyS땦ygzvڮΝ#G* p(#bplgU'fHi9טX#hbwboyFY02C4Z; Ԅ g/m)L=ƿ#6s#gW]6 jd lwɑ1rl+LzjՊTGS pHXp[8H=֯_?}4Cf&v\)/mj嗙J Bڻw-mZ:6n0\DϞWς\9ȸElMD ]FIpv1y~ wvw.K@ivW,#猵} ?ysJޏCPE L41ʯ &QD*űq_E~QWڻx=g A*CVl|a ¬e` ~ssVd rK С AqpC8  aAf8ab, fE9Ml̘?9?DB*1ٲ86q0lY"7gF7gw/ 4·S҉]Ѯ =Oe-[GIMMRy^@|є&%裾paa&ߢE%6%,{2AcbZhnT"AApfx_'*\khw-GO8NlֽfW^EB*lyFpfq2MQZ\\TaainP9c2uMP HJȶQU{FU/1ԩڵMESOh#2GSσh:41nP9.+W OxBMe@^%edۨYQ/ Z%iZw۶Ϟ-PTt1u]|DFƢΝ#~R<9z Μ@YF 8YhwyҌl*C^#1ȶotN?0Kh,,,-R׹twCtShyjIt  @pЛ|ˈƋp7fŌl2$Tpe5seUɓ1+kȡ>{y/8-cb:7۳g%DK*d#2GS3ӄtzßux!I򘔘mT?s23 I6jZqz^/8?#c9ԧuUfbwlYL]C?5<H+Py[pfGBw!E4^E!Vm[.8#zf libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_so : link to shared object libFunc_o --> libFunc_a : link to static object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile mockLibFunc_o --> mockLibFunc_so : link to shared object mockLibFunc_o --> mockLibFunc_a : link to static object 'libFunc_a --> utestDoSome_bin : link ""function()"" to test 'mockLibFunc_so --> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibFunc_c -[hidden]-> mockLibFunc_o mockLibFunc_o -[hidden]-> mockLibFunc_a mockLibFunc_o -[hidden]-> mockLibFunc_so libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libFunc_so -[hidden]> libFunc_a 'libFunc_so -[hidden]> utestDoSome_bin libFunc_a -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibFunc_so 'utestDoSome_bin -[hidden]> mockLibFunc_a mockLibFunc_so -[hidden]> mockLibFunc_a @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_selfref.png000066400000000000000000001012221455674302600311710ustar00rootroot00000000000000PNG  IHDRV {IDATx^ \U1-3Dp,-QLr|[YZbK厈"""*("("v<6tfn\f}?χϙ<̹w3̹V8' ȃ <:BDʅV<8$v 0ʅ$h.A8I=<B͸K ̓=T8--G%x+" +2yRv=̓w\MRdf Z0sBD`e/[7Y'N6v}7hfcSS^ siZr0枟}.](G,VCKؔ_C\QI@}m9ǰh5oހaZ ;! (-geZ[W- oJuҬY}n$$EtG|1}緄wj|\@8/SejHiVk+t 7]U*ٖ| sQ/\EwaIJ {c6[l$M[BQc|_)֯u}9 ٳ?sСHDžz"tZBJճ:K0BkĈVٹ#6FP62zejHiVkzzhX FX 7v.%ٖ| sN/O}S;kqg*\[2o٣烻w0ghzy[=w1J|y/^I&5k9rdVV=z]v֭[޽{h[  ׊yV$UTywTxxxt^stt?8{F5O_שSgܸqS V%4m͛| f͚Z#!b%Z ӖnNQڅ ǝN頠 $"6FѡJ+ܦhdi 6ĦM6O޺uk˖-w)&&M<)M/,,;wno_.^X^իW?a~~ jժռys2a`HI `HN8;x 򩣢^#-IV= E4DURzåzC&!u@!0ºu36_VuAWi6zճSllntޘMr5kTuްaUX1¶99s{"H{As^tG|qB*vxZ^={x""Oӗsܜ=z_N2֭KR\r6lU2mEm0n r̅ ~TvZr?s 9}5qSN߿JJ;m4/D&!UHąYMhҤ^͚ٟ\ R}po9Z[W&Akh[@eo peeRV~ =^zvgɶID7lhj :~ѡ.RɸqCN5O#S)u]a)TnߺuxkjHͮ]R3su6o<_diNg\䯿UJp{ўO-o#էU %RX`A$ $;wLzWoIR6-M*BE raL\S`9;7  A>-VtoFX߯z|E3ё{,55qƴܰaC}&%%qmEm0nوIiccC͚5 e!)B=twH>uӦMiYj<( ٹc|z/3eʗTO.[N.ۮ_?0lX/Ѷ͛~kנeeR>r5o(cOv1a'ONo<Г&}55p˳Q9sF޽ "={tKu]4:*ܦhd|JܽOi&ոM·I]v7oN-ZzrX7իL=3"e#էUr/죣؋~j=+ڏԷD RzAfhhR*4L^W2; XI!DP1lw\g8fh9L!^z#""hkk۲eˀdڊaZ 5ܦRJ(E?E\2*Uв~)$]oܸeFG&.$&zF$&-7n\6_fڝ;E;>WREZz,bܸ!ש^{Rޞ⯿kߧ+W~C]+Z&#dR.BӸM)TH$@sV$o9s&_)5Bgf)>IYt2l_Z`6%Zc 2sF@PQ'=zvB3H +eWVPiժcLtiKalX N{;IIIcmt… *>_d԰ZAoy?dM4eRdޓ#UHąDɄ^KD+"EVoٲѡCe6oIRˤpztʔ/v}Wޞ Ѳ*6 H1f.B$O\ 0DNʇVjS~0IDt޽{E˖-R#$]]~Pl$=67Z{M=+)-тToc 2sF"eu~3gQ ͸h&B%QE7>=_DwC&!u@!j$'iWE9yԨR5"$\zu=șO tRnn.֭Kvvv9CF/^8++Ν;C Kns͚5m۶ %$qf 4/**+ z#L2e)!tԩT/_Ժiz"UHȜۤVAa6iժIBAas*klE2'WIue*|8]=eMmưS`Ν.\H!!!8$xSwonsݻw3gջ:99 |MNN&2R#;w ,/3y>J^~a߳gOif{Z`6/-023J=v 3Wh$_PQ'h_& jb:h CDqU$^CVTEϞȼvZGGGRڵ;vUըQEmpnʕ_u///΀o޽4Vi¼Xްa×^z233sv!s6Mr]6Z=lmm̹MjfaU~=!Ē pp9Ouk}\yӏXC*eRH9(hãG'><6cȏ>zGޞTYjCn &|ۗưS`TTTNHnݚ\Sq'Y:*y6I67?̚5\mDmƍL+/ZȵkZ5kFz` o#է"6mJ{IƞM=K ̦$[Nd DpR* rJfawq0"Q‹?f%ˍU.RO|y{iF,5~PMa$#;vp͚5mZm/WڗF%@J,Ld DpR*\+gTɇofeI;)|@(XDZn3bUꂦkQWqaJ!>9U ڈ|2ʒ`2Փ Lls0WbQaQaYUW;_S; w ?81sBhH*{DQ^;kʢ$PPpaKD D66&y=6RRY ` D-S 0H*ʋ3Z=j8PӋ'E>vpe~J{>ˮ]o?ژ@nu+ UK^YDϯ* "KEc KXdyt}=B焘Ft}'c8=,It<L\@%8@`(++ߵkgg XWѐwժDWXfZfY¢TT&׉)EWe^8sl(oO zULȃ| ࢢ\LZkŏy01 )/)TƦh'JĕqǓX-PqQH*{D0dQ$..HBVtD>T0!rn>cIyra>6U*rœ•*USxUqD;II~LFFQΝK^DUQK<({zNʯ8:6YdbaMH_r'XO 'e\!A'/F~@ucN1V$II-!^ʆ L-{YӉ0[7G4o &@=lX͛ XH?ڜ 4ٲe?2'+d6:Eh>fU@ Hv[.=Яm۶$jժ\2(c/ں2- QyoġQF5wHLu_ĕׯ#:6f0:-ܩѿnkLu3BVtD <3Fj<[8>{)&0Y~MA$?-[jt%.Η_D~F`o_ܪU~dNT1 V.21lUçzTwxB'¢'WoqcQRSV2z{̘!!4E7I|֭/ٝp &\`d#Ȝb@\db/Qسuq/Qg3.I fg%/.(dgNJm>?;dF 5EŬPRq_Kmݺ?S E&qƘ91 N=ET>Ϝ?Ӓ?pe؄zz?~ YхU#5Wh[~90e-{f̚NDƏsYn|to<]w/ g0f0, `_8̉*&E&¸ň=rc[I[COm=_ɿˌW_j *(}tyV#z|0e-{fZ1k:IM=jgWstS>G~L~/ {Ҟ WAqULȃL q;#{.]Wn#TwroGˁ:17-B$//ltF1+pS 0c +xCBC7j䐟N7壛XFE"+)|JUj/x>xLF}5ݸGbWbD`vąڶmI_Qr̃ɮmlpWT1 V.21,|=S u^qux٦c}2qQCU@``(wQ$2qQȇ*e rULȃL _iw]uU(;h\Į\A)Y93"+>[`u`5_vlڲVjC !;)կ'w3im>(7*y:3ޚ/{{2ժ%,cv3c>u\@ VZ%hO*DGSXt7s7("jy:0ʚ/7bcw]l:Q:, zM^MM:d=eAlAĭ{dV Б?m zgDaV[0;^k/zf,f r|d޺Vt!io$ }XlAl)lf- ig'Wo(;aq43yEpC)"/O死>Sϱ"F.hf`fR gj٭MlH;Sn! 6~v,V К.Os~k?= i) 6s2y}[К#2FV̅.>!#/ȃ͜S}ehM,-.7pyگX@l=zhqA![Ўۻ70[rw1Xȃ͖|rN VH^ YP\Pxq/C3'u2@l8 i\Cԣl,ȹ0QgM+|yyЛUZ~ŗO^O `a 6ONR7PJG__7V{&,#)A_@?JJɯ%Έ)lHCa+Zh VI,Ɍa%<܈]dX-@ 7VTá>u\nnVyYA޵{>Kb+v 9M>VTFsm~ gŃ<ج~eȌWLyf 2Nh19:uЕOZы뉇Z}1q~WH<\h~0:a?BNǝ'F~^|$n;Vyp{#ЕѮOuB ?e'ȃ́\z|WPY9l@?zzu@lDtn\V rs![P'G@P]a3L|^8j+8l"=@`f ఙ4 ΝۨQ#Ӫɓ'=)M'aÆ7|ںM6O޺uk˖-TҩSΌtլY3[[ۉ'szP\\x&MԬYsȑYYYTbA`f 6h/Y֭[)))ǏUd.ѣtm޼yTO"o߾ĘkjO7vʙC ,L9!!ѣG_~)Sł@P]AloѢETTSE.^]FˤyL"M6|mbΌkocc_,ŚڸqcZ@ p03@W4TT@6iXMRoda㥗^z 3A ty9@#e˖:]Hz_NˤasЪUDZ@ p03@W4]]]OD͞={"{s̡zPg6IŅ>ճgOULadGd߿?X8j+ȃfjРAݺu7nHrssoPg6!۴iZjل-S(..^vM}}}ł@P]Al/ sj f 9@8j+8@E>f 3A ty9j >Y-@ҥ c ty9$:>q腱K^9Tb<-u `303'AȌۻ :Ipziqy۹=VHpݷn B dzU^4@Fz5/VSX\neENNr= `3$?=dB>Iaft|p"[P!4 `3EOz}RC.UCr)ӒG#2s @lΐ$$!&i1[qWj*T9jy'|7!7/:.O Hv1?¢~o?=,ͭMG?).f+FAl)=S%WO@hB>{s>VP'|wFAlAd%$3"߳q (\ j'aOh(Eq^K>=;,@?£@+[";|긐lV$OUG#6 PDǓKYyx_O 2 z@[.9zgDf=&|҈X-@=x4" F9[:qy۹=V`<~[_ zTgZMa[7[Ê JT3usȇcbM溕TV<Fsmɟ\`=K;sw}'i\[P x4ȃ<T$$-ïXL8 ,9i!}M38eq^jݲy?#?[Px4ȃ<),u\~ǻO꘴7V?W 6Qf\K`4AӸ͇"]y0#3^;#B=03U$);||兯oIF<ͦGHy0( c8êӁ`76g󑦨V%rw>{H]y0[IGn:+ϗ? y0o-`SVr/;H, q||5j` ,$8<+wޗ?WEȡrK{l8O )C 9C% V=*xI8bۏi ,@|res{OSa}00{sX;n|A~˫F=M;}ldչfXS` %<~x9v>nv$43KLⶃl?>|z6=as^s pzk7k P |NzTxoo 8<:<*t ~o$k,q=@DK޵{Omҷnt[=ΚDJwoۏIzq*ij %<8vՊ= |]y0 ewKyإ@a\o>}K߭b-<@`i4 |I=<p.r翳'{Mf- CST|~ ?{`@ɃJ՘<8pȸ䌌oM $Zo>tCQ45O6H[ ,m`aAhGh0syy7??p aX#͛ʑsǺ|W"xy޿ޘ%KJu˟|]M.Ϟ={Ʒ{s挖j` 2"rZNQڅ ǝN頠 ċ6FѡQ_!n/.es4LDZ=_/ijU'*aW=;uzƦJMo_,$ȬY4[ rŊ)$/97ۗ@ sRRmAld8v+'ܵU-Wt78Ѳ"UZ?}zJޞ ^=;R㳊d$6?qb 5PEC)Հdܸ!d͚'!|dFt|AP-ᥜMj*sժJNki@_O;>S|Ij߾RÆml޼Wv ZZZ䣏!WPqq2d& }H=iҿiw[S * k53gtޝ "ҳLTR^dV [cgW{%_+`]#h1d2 /AN0ѱILZNI nܸ.-7lhfʹ;wv"}R,(9ŸqCׯSÇ&ɥ=_<6cȏ>zG^4/:Tᦰlq`.\Q'痥Mt ڊ.\$*Xa]#v %z[X 9jWa)*f4G&IJ}7||VQonm]];ǐMmSK$Q:˗r{ϑXZȑUJ~|v=&Zp\[l;fך66+ tL:9,lqHI恅 S%5BHj`P\f4M,$')P ("W 4eR4M#}7C 6\%B0I 4ZCu3f0b\%B0I  uX"*AH`PLlw֕E-I/0l mL&ȃM@A!r$I@ JɃl^}k+@66&]%X"*AH`PL_ܯ߇gleR B `  p r IC@ JˬzwŊ)DY*2אiѡC*;IGI:^܁s簽+b<@APD!iȃA 2s_L];=;\@z숆丫V b9-oƚ523ϒ$R\@6NL/_LB& U $ y0(Af.EE<֕1 `b@R^R MNp?@A8J! %e\.[]@:Ů];˃&YorAol0kLСh'}x6\J#%ZAE<\]]W1be:} Qc! %e\3}mT|'I+UH7N6|w ,ٝ;`KCFw"Tc%K&P;-~u//7~"mDQ+hLrbˋ{.5ʮ_?иq]~Xӧ5FH`P6sɄ\qZ6uP0Dzff={vIs[=uko۶(;իw''ZAE|$LEKn8q(9WըQ')3!)}>+q눎 . w dۚ>Cn jT4 C*rIP7 ΆK0ek ԍ&'OѷoɭRy\/ I +m߾\GD\ ?#34 4x ޯZo*V,]\;uz>1̿,\W=^Ysmfؘ0_+tG5ީ2 (T X4@8z*jSjhيߞXoy38$d(#oݺ0I +tSq! %He| ?{6;_LW_[.B"'Ƙ1 NyEK>Ϝ?ӡQe؄zz?ZAE<"ߍB JEm=3ef-#"鹬[tS>6o._㗅3 3b<Ј}Gf!iȃA as_D(bĞK}WWbΦ:ߧO^js!Ԯ]cɒ1z啗"O۶-TyM~~k*, &\/o/'9o4UYHsVP (ȥ7i烉 | '-k3ӊYˈHjQ;۷/Q6bDg |_$`K4h`r#Ȍ $ yRK߫72f5'ѹ/g1bϥ`~1 RgS˿_APDg~=$4t{FtS>ʈeT>~AQ4EaVNʑ6{uoGSωeTZ_]i0lj~bm[f& aHcLvmcS{$W킐4OIt$`4}nJ PHeTZ_]i@A8J! 6O汹/LUV+`~1 RQ ("W 4}\":],gMHeTZ_=i@A8J! V7|2kWYί4P]|᪐w "0!(EM %T*_*)IC@>ʃ~jz_=$yIQ (3D!ȃy0^GyUٿ<4<|x";|g3\(;\Ǿ^cU%7N/44411=ܙ?<ɽ ʝ4dw߯w|P?ʗmvJW $yr)G]W]7C0$6oAlz"##ɗM&c˘?g 9@0EYrr2{ %Q\Pxם>=y|FN۱~1bb=۷j!ȃ~ۂKr_ge`)AlzNg???Ow/{xnVX$D9diiiG-9P;_ay>F~m=s+U0I=@\Gïw$-kK `ӓL%ij [aD9Xedd5i/GLZ;Y3Nb#WozsV`z<| 9.}IKr_u3eGw~-S!wZZÍ91a)`",rg&Ř?kpϣmɼuRhBL쁺eJ!ȃMGIr!jo1WgoL +eMMjGi ,Ĩy|`r{Z)חn 3ypRORL2}|uI諳6QDˇo͞ v\c+L*3xVٺy%$ꖷKf=&v_~Sפ_Z;yit [Ƨ8/d 6sGrG]>%|aVkHBCCݷk6j֣LHD՟LM+nޣ&%’br1j<8'/E/rܷXxN-/r\j{꺰Zeh,)j0;=MDZHNaxr_OU+ȃ8 k8}jN2}á}ĕUmޟU*GcS`~:޼fKQv݁>Uf:f_h2B>:i_f`(.(L;sڒ?Dr#sǵ>fMUK9})tGc$G Oq^=&>%P?0MB>jYQᣖoeӗ}K{V^ǾWMeLJs_c@8ΈIa١|l>PwιL.wZʞ2$f+PO_}ƿ-#+!IZ=plPYƝ[C?ۿNJe:93x]cإ]Y-J?m l;ܯQ+a31qYM7o9oNjB pT$jۻv=b١nn؟q=G`Ꮿd )Jp,y|9u~Uors}j |sgϑ cz}=uDdzv!1T)Q70YSn=s&ڀ3)3W7e=|7_Z|fдkxj0.`0$%)/,{,`Z̃ 2NENYnW59aњb9PGrsNdKڙ',s9e 񱼴Ǭ0G8sS/:Oei}Om^z_ͩ03`<2LimȸxuF&H2tu+~ l;<AdF-@KՏ<:E'R1nojDCF`z4i+S\Hc#N{ɸT[dSRjYhُfc՛H/sV%NƥbԈ}OK31nM(h!V %(Gq2#/ղT-Ѳ-ʹǸ7^C ;vx7lll:u\x^zW\-M<ޞ&ߞrvY[[nzT)57n|駵jժ^A8͛77hРB dxM4Yȑ#^<Ϟ?aҼy6lGjx͚58q"ӂN ΝۨQ#'6a( D'Gf\Axf3*`&RGP?cUXI|FQgٳ wܩ['O8P.L7I@Lq~ԉB}D+1 3(So#$B3 <@ RRK&&&-\s|;;;Ì|=z}Nn͛ǯIv111Æ Jmرc999d^4iѣ9$''M777gg焄G}SXzd<ݣNLi[),XӂN,Yt֭3,%Ffܦ#508qQ1M6~ȧTW2͟$ZFiP I9ϤG]1Kez FIfܦ#50eH/2qNF@ӯ[\S 3Vr)p5Z&A*_KiذڵkJ Lo߾U9::rjjjƍi ?oVjĘGGG -Zp({M>MGj`p0cHA]TW|d:ЛIqqq'=pU\H7DGJ!ΏсFcg4^d✳a3Ϝ9_ˇiXJriBˤ@6rdkk۲eˀ w^fMTX3~釸5KTό떏Ԙ)- ͸MGj`Vp0cHAmUi´6e?jժhذa- %6Cf<\|lUOjS]+F.,-2N76EY)%Dz#޽Ke˖ 8GR BH.\^r:8xӦMo&t2˙bW:?b>%W_}uÆ h|O`z++&M[ay rOꑛ[I` {L 8aYY-P"y*]0=Ś}6,-7q_kFL"@kI&@ 28.g+ɃzBriU~E8Dd%$M;#EIJuLf}Л3'jdɉZ$Dh4Ξdw힑SVg޼P6c+rꚢlU`0Cf\n%@;x@G3%!M+q!5|Oi,}a`1߿lVEj:'-͡Vb(=u8Q~_i[GƆ$$& q_O:Hߺ}rS W o`Hn!3X-P #o\ԫs9igȩk|z0}d4 dHPs;)lP:Oo8< ʔGcڍ8mV}`tn C3o-SV_eg̑vf4rs[7,HMaQ/;k]鎇ԁk*:..ae3|h @do;1T&{\"wxeD死ǻO8?/DZuȝ=G0+@G8eHsz6yZS |o Oc-0 q2s=E]Y-q`,s|j0f$ qODLnjzgj) Baf}!lD9u @SX-(o$>͎[\!Z`~~>filڑ~ẏ}Ti2b}]-[|O}2Ղ `'"~6@',{uUet[v#ñiN3 r|y)`J[HI{ Y %앀C ҁΐ xIXD]ᣖZ2sn+˃)¢^ǎ;Oq5wSνz \U1QKEDp_ʲ@-D,LI{M{7ߖJ-ms6Qh1U"nD pNΙ9s}~=sܙ=yeLEi١YK⼆VޓG@,˩ Db=(u\?wb/ yD^k r1ç3If\ LrL;:) [O>UY ڤ>!>[(,&ܼV|M}C18!cXkϖTֈEe긏LFP"6y)&v:΃%vgmӀ Xϵo_wL A4(QDQ--~/ߥEQ` G>#\QZl [xa(!Oy -:?tC-H=O&e-hۊ ۞xSYbsy۷ 7yfXCI/|Q8(fkʖ#_ݺude-hSQZSG @[9wx8]|LPVO{ke] ML6GoC/ud)r`~o{B,e?l] PȆ!'oe@ؔ8'c=eH]t.ui[F™$5CY L2}|\C{&l{i}g-C loڝ~|SW}OlU'O'o?SǓ-,(.N;z4vܸ'UU=yԼySRW A~fF}7N"=|c vςzʔIZOoj`3!Q3gR(i5W AO<0#^=;䬬,aI=9U#EbQ' *##`KբI)DsEŁw߯I:nwرXR>>}ܶwh{gnTD뻝rN^CF}wR4֭[4ir / >eeӛD׮(i5 o [ySƔP8UQR.F {P#KGK'Ҏw]Rwn()vzwULmt|0$~;@@z٤Kv_x{˃]]ߺ VtS챇Z~GCltlRw[e\;bhEnc0A("G@m]1ryHIϥ}L膏\HJSFOŽgE;?BJQc0QÇ>^R `H]K%$)dQެkgάW'HHT]WMyYR}W۫7N5Ҷ͆$?6ҶE{? ¦2r<?;o2ڙL11ryŔߨ籠;Fxs1./&-' (d+7I]}h&ɷ6;.ׁ>A7/23gRQQ #F<&%p^^GL2/@Ҽg hIGU\yp˖U%}=yD`UȢ?|Yw`>zCyo\~/3gN|Us_yYkU7~Koaä냇 )3,幙Zm R-Env~x}7tcu* 5t:&gww;FD̗M%-/^noRvͥwnKTu~; Q3VK o 5[|箻A:ztom`W}e7UZW.(–(;^pZfD'Blv FB{Ÿ q ##[Li~ቐ;||T ƥ? AU/ ?Y I\Z}d(>dt=ZT&Zfov~XT([ c\Ô։cGOV闖8FowN7`l$&O+[r_57c;Tdd2h^f+F@C79[}$F Eա0|`W+TO/3qMJl%N,nX0n$N`l$S%ZjBװW\]ʟViTTT\\ 999* sJװW\8H@ ">y0.]e%HH/t3w'Z W_'B]o ${b`#aJfliȐmAa)Nw9s&?A|O4&؝@^%c7kkjٲyL̂ⴣGcǍ{ݡ\$3Z\{uW.K_})Sg6f>2@OtaE@ -f069-IO:t(F4)9N "kR\Hs|Z0kڹ\mzwFyVrGa.푓]8+WA6mz3wFxh"a6Y+@A F> Ppumh:݉j=&uN/e4fl٤Kv_;8j= si/<<;UQt3wFxL"}≇nҫ9RNN117O>ԩU^^R~&o/KWG;׏9(##8 -;8j= sb·؅7ngf>2ǙRY@RmOyzU+ًW\0vp $UT+ًW\D̃}ѩSլ;n֬ $4{>ww;FḐ{S--M۴o? S6^7]9ku._vһw%9Z\؇/ڵCf>1B䍝pqiح[q>=?/yQ !5bc:$ݔ iOؼy[on!AASk{۶IYSWHowϐJJ;i0 ZeC F8PD;ؠZ#1CKƤ\T >7ݞ{,[60 5nP3S3 >p׮ xK1J<}gn:b')(>Q#)S'Nh͚˜zd [$T|Tap"RMsj5r#?ǑA+,=b7C*1WRs{vtX^~"cE٬mQ^B*Lj`vY'.թW`-8;⋷'aGEbN1T- 9PI 7#99[Hy.+z(==PEcF254=?P3ztFEE}IV3qT*Fo,ד߃!~>|`J2ơffMQzPP[E]LFu4T=r(rjr9U]aܫW(zihփ$D̃1$gAw4]X @A FEd`jh ;1gkP $$Z`l$/vssѺr\PV70Пkbqz:}davx/xtփ$ĉ̃=Bx*֣_Ge"#<^Ga;Gfx~g|]KI'x0#{S<}gC @A F8ǜnCz<r6l@ZQzf*?}KCwR5h'-sikzjrQ3zW<}g[ @A F>*/Hex]x7lk j` :6) }(^aVٹԉd`0#{S<}gC @A F>|4BCYEUz0CiwwWNJ \w #Om:3 I3 FV6luh֧Ͻ_`<"oo?Q<4=? >0%eEN6 sY>20;|Qh/t6֣'tx d`6E FCId`jh ;}gs_'6jv}ҖcX m%j DgόIH A޽#";[=>K^}Λ7U+/>n֬<<CWaVD1duxMJVл\xh(2*D̃DCJ %> }}{$pAwKνq#-1^Fn j DgIH}֟۷ӕ?U;H- `c6nAg -jӛ3DDڵCFFeGՊgXV ;N"iu+H͛ܪt7kkȺU~~=]6C1duxMJVлP] yEݴ(؆ܺuu$8iY*CKsCM5"MIDATQQ B*l6Vߵk/л&)**j&OyΧs!mٲ & +Q<gi7zw]V`Ãk E?L4W>>2`O?*;v q2`k_O31lÆ0H׬ 6 a ypmsFSGFǶ\ 菓32 ussc6m-N a ypmsGSGFG)7Y\ehyP 0F<9Y#)AsUN\eA<A[<e0F<A[`Ay0 v "̃0FĖ\ "F 0FĖ\ %̃i0FĖ\%^F 0FV\ i##bEAj̃Uy *k libFunc_c /': depends on ""dependency()""'/ libFunc_c --> libFunc_o : compile libFunc_o --> libFunc_so : link to shared object libFunc_o --> libFunc_a : link to static object utestDoSome_c .> libFunc_c : tests ""function()"" utestDoSome_c .> mockLibFunc_c : uses mocked dependencies utestDoSome_c --> utestDoSome_o : compile utestDoSome_o --> utestDoSome_bin : link to test binary mockLibFunc_c --> mockLibFunc_o : compile mockLibFunc_o --> mockLibFunc_so : link to shared object mockLibFunc_o --> mockLibFunc_a : link to static object 'libFunc_a --> utestDoSome_bin : link ""function()"" to test 'mockLibFunc_so --> utestDoSome_bin : link mocked dependencies to test libFunc_c -[hidden]-> libFunc_o libFunc_o -[hidden]-> libFunc_a libFunc_o -[hidden]-> libFunc_so utestDoSome_c -[hidden]-> utestDoSome_o utestDoSome_o -[hidden]-> utestDoSome_bin mockLibFunc_c -[hidden]-> mockLibFunc_o mockLibFunc_o -[hidden]-> mockLibFunc_a mockLibFunc_o -[hidden]-> mockLibFunc_so libFunc_c -[hidden]> utestDoSome_c utestDoSome_c -[hidden]> mockLibFunc_c libFunc_o -[hidden]> utestDoSome_o utestDoSome_o -[hidden]> mockLibFunc_o libFunc_so -[hidden]> libFunc_a 'libFunc_so -[hidden]> utestDoSome_bin libFunc_a -[hidden]> utestDoSome_bin utestDoSome_bin -[hidden]> mockLibFunc_so 'utestDoSome_bin -[hidden]> mockLibFunc_a mockLibFunc_so -[hidden]> mockLibFunc_a @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/scenario_selfref_wrap.png000066400000000000000000001001751455674302600322300ustar00rootroot00000000000000PNG  IHDRJ}IDATx^ X1-E3D-1˲,5Q\R˵k,-,mq߱Rq%rGDDqIEE7d_^Ʀr{|?y{Μ{}ϼ3̜kb*P ȆzA6 a^ ldOޣ HJ^j:}d|V rh8}d _^#^./_l ˆ)j# $@6 p [YYHCCC###د .̆fˆ=QB~}Bۥ%x#.,F| ? +h%YAlx>>>GFF&$$_P&P`PeA6\ kLkڴM a $;ٲeK/5ZJǎDEyrgiކY0dg<#m*w.\7oL _hhh||< ]j^ABbpc@6ܣǛwPa/NvF@zyv_psWǍPJgio'֭9_(w. ˆw]F-[<==CBBد [.}-lE)c=O۷ŋվZҧ>6Ay$`Pq1?~MZhA߱cX,''g#TMN?{솅]+;wqʕOG;~ڵk7k֌F"M>ɀC1hcc3aP [n}饗VJ:::_~%ފ1bĔ)S8%t>|8dJڈaZ5&>7oϟ?W'Bm,G:ujszrЉJ` UZ#f%[`|Ǝj0jT&mdm]bvWɶ|ŋ' ̕RVV -U"AG $/9T%\4iz40"~і8V2 \ŊV!-9ki]]]WNpunk׮%s=zSHn̙-ZL)vƍImmm}}}9ΝK=߽{6r}ZިT7o^\>5yN8G[Rc EIĪ nC.+*; jX?$RGD@2ܥX^t;h_w~۸oV< q;ĿܨQ#ܠAAo߾[>ôkM* +SZjUܴiӰ0,F?XOS7i҄+C.&db=]Źt~#F2e ݻۥKÇ+ٖټzկN\Yn)wy *.Əz|9IO\7ZqrUr "i0k>}:ݽ{Wn9)rm1CU dp+ZX^M䷴Iɻ1ŋrtttf͸r;5\VUWo+V$bUTEdp!ֶr)_PQ%N>B$1.{y4Jcnp&+9h*3pشh"00S2m%m0~SN_R%|C?X_reUTr堤Yr OSXoܨWnnժo/ىffJ*reic~P^5>b*.?-",WmT*k4W2rR/*IWU^M , ZQ<}tRnL8lhi~)-qފdp+Z({89sLݻϚ5ӻ:;;_~]DlBBy/ȍpٽ{el#קzrV ̦ ̦·D">(L%aPH[2p7oϓ]5VX?$RGD@2 c˅䥦j*@MիW;99UZ]v{,_}Ukkm>|SլY%mB$1O \7,WV,5ɼ|#>0GkTŋ})_fY)YܪU;95&v^]q{+mAU!+>CС=ϟ=Kf)׻t^Q qy3P^x,ˍ_~KoXlȅ*{DQO6pQyoCg)tV1䣢X2Yƒ"K6 )=}ޑs, EȊ֯oWn1cWġj (!m9[k' 0]S8 .ƒ{>z]]պxTxNH֊Ki,${Uwme׳oe7 u'dr6d֕%/C^ف.&5`3mm@ aQ;vYlJg* QNH %>{ry]Ŏ> QeA6\(g6̏f/gBپݕH*Цئ j7Wx|Ŏǿ_}i16CjaiƖg>]VA_Ģ%,etwnBʺ;&.&F\{ p ?@e ^'6qe*Цئ Ur\@LGP5 "Q7Bmbppַ,s-booCsOV|gLH[WZCwRn۷ލuk*cὼ~p&&5:B\@LJxB@1]M8 .ØbLW!3T`GG[Pbŷktsv^ZbN*U@;)K{yi)h|tr\@LGġj #N>Ȇ0glZke0PKJV"ىfܸ GpDV L帀ȅ*{D(Xo"#N>Ȇ03ZGG5ˮ^ 3f:,7LoBAAv/[72Uo߾d'͜ܟqy9P saiDV}E9T(9[tuqň=RO!66lQctTlOJ+UmN: )!,FF(d۶E\L̰o=,l0 B[am~&d\X +W|Uf+OJ 'ԩSShs9ٲec,^hQLgSb3p񎎶u޹9sU;;]~M<f-9}X֭Ԙ?gc"O"Ԑ. Ν .maN/gF*ThҤ^PZnB嗛;.T%YL%D҆ Ya)Zj½,ф7kV?6ֻ)ew7n#,b8 M`|jsGbpcX[|:})w*8Us@..b.m7m}z߾_ڴiAիlUQXX4ں2W/r߄ CiYrf!i_}J|^ccìŸo_fgc""UOHt,}v>zw;mڨ~9{0ܼy~uur]BS-# M nIp1+90H0=+/65hP7.U=vZ= (OiSՖ- [l$G'daal{nᏦzpQ W k Rr?>qiPt\\'jլbElڱ+r eaB+DEy?M"6z,,1aby#ň'$ CnPٳ|'͛7T\vz&q@C8f%gI"g=[ u38$d)_:‚P݉wL╯(Xm?# ňG0Ĉ=T=ԕ:֥335yWɱw'{>ia'?vmǃrq!\)s6m/[9 S nܰx!C\.\:#SI3aⱉ#, ܽa:Md^xB0 ev{g/DeW׉Tްaa (Wdo|HfbV<;az̔ŦHƍsInڢ xw²xdCfkhZ8,#N>Ȇ=X#\䫩˕n bG^\*LPUٿK~Wj"•R_۷3 :3QNE&0\5% мܦM*Ukݺ̄#.&^Eh/֮]cƌϩdV}ň'$ CnP[WT1))ʉTBaΟ?F̛7RRRH*?7L@܉ 'WֳgIr![Z[,6#];]Xxw²xdYߊ?# ňG0Ĉ=jpQ;k87{ߣ@ vUq9t7;5U_x1 ((gLtbni>77TR2:z`:bp)o\Zի=ݣa4Q˶_"8BmbU]6-MLMxB0$ bOSuхv]jQ]#N>Ȇ0椝mJVfj"K6vCJ:]~P I8T >!`.)F| ? a,~RƥZ,KgXmSye `(ĤD.T# @Bbp)o\Zϫe//oG!. &%ʡ @Bbp)o\Zϫ#z90G|yiJmb B/?]HňG!G9kK^M-$#V7\\@Etf1l1lت4_ME6rR ڭ9{i F}Q˶a_T+[FQJ S.6eKwںl3]\ 1@2 .J [  .eĠb ntO\|||\9࿾uc+?ѡcDGWNN{(La3۱]#Qpa00glk A\\^':`b ./-9m[R"h|ٮ7JSM[ E{cb+@G{N<<6+XAlش sww\Κ[`&O WN` 6SѰu ErٽE@[LdæE. }tW?d&OWN@3.8kM^>["($RaJ:` 6-Jsiy^jMaD|P1YPY )91;[LdæE- ѫiVk| fA{IA:O Vj"Kkl4]\ifa'c=?_C 鈆SNgl3.`v)׾~5 ӧ#~{? a _<~ %2o%5s~$=V<aI pn ><< tze[{:5x:"A6lz{#Y5WOGX6Ȇ-a  &7hIacCvelؒ95bePV >p& urOGX2Ȇ-޵{we#+c 4 RBha%zΆs㗰Z@!ozmD^j:[O$<ױE5l2Ig+O/l@h 4s6pX(Ȇ-G{jO$סo;l@d'?8}ٰer 'X-'ߺe+#{V7ka ~hT@x 7|$S#IzOޣ|lPȆ-;jP1ghI|Vo20a"cxYl@\]cΞlP1Ȇ-nx?8%ЅqYڎLٰpfԂ؟ZTI⾓9OjVC,.eA6l9{?Ju}p& [Y- <:*  sPٰPneG sPGr(P#L @P΃P sPGr@pPϟ={vÆ ׮]UL<4vvvTMNO!nݺ_~ںuǏߴiS-TұcXތjڴ̈́ rs.O#7FYpaƍkժ5jԨ N@p@6l9ph"ggk׮%%%7ѣǝBu6gNO!گ_?2tuu^z_mvڕ7w ¼yx=SpsssqqqÇG1eN@p@6l9p޼yhY/^ȕYf\B411+gff&M&] f|asteܨQ# @p@6l9p^JlJmre>D7ܜ/`%g1 @dÖ-Z(օFTtW~B˖-2 sPٰׅE͜9({frlRwCQz>SV\I;y!333,,29(lrB=//oƌwppX~=W=i$BOG.Mf4iRvm>2Fzj''Ukn޽29(lrB4`L@P9(Ch9 A8`N Z @dÖWZTdNfۚ[XF5x /KTˣ Wj(ٰ%:l7y+@3o# MNn.|djrw_>ɇ T] yo20 V aph^Ǿ~Vgo85b.;lX=dݽ樓LObh3 VY@D\3wV aU;叁/7:,jjCgZ }([xvd|Z bNѰuX(o< Z(w[w@ V)9)L8kRT .nbհ.ųZz mkxqɸSWv}aV TaCo , |,+$A6 ]tznHx2|H*{4X|+Y[`k!fh$Z.YPȆtuij۔ h6k yrHk#Mj5[I̹%?y zuZA6 $ޱӟ]3ԑ+<|mC;_`P`dH3b&76go[BI +v@} Jd禜8d_r]'?Z`h 4wo +^ NXK$຅8xr>6=u30БG‹[Q3ׅtҧN/g߾"%/5ʀ99vw΋KOt'-c6`a^5/ͣB}X;J  0rh83'VCzD|b3{-k .ygnn?3jkT aˆ/XP./_lR)>=wz(vKܸt+SN^`-*A6 tp0%ZmD(ɇ= [6&jk߇;A7Z,t_>uzQ ?A8  ٰU .Z1444222...!!!--9=5l0=\jq{WobZA6 t bK!b͸+ {s 8%%LӑSޝ|Wg;k xUT͘]P̣b KU*dÀo=aRz=)\6mbwwwJ###oΣ f$xH `,'Ȇ>ٰfʹMԘ0ahN@-[RӪUtJT';;{ mh/%Ivɓ?"K;;*ЦrBk oyfJBCCoΣk,xUo,qkj>apo޹DBsd $;8ۍ'۩k~ ^KL 7CN(oܾ[s|ܹP2eû.lx˖-!!!qqq7GALM(@S<ȆP2ѻ50ĝP˕32B+souҴi=~$J8΅"זdÆQS* >aCa*Tz\Ty1l.DROkF"90 6 0"e)xU~7LkNA :BqJp/Yqs232Brbb7fE{*T4+׹P2l0DJmS܄ϑ#ۼB5EC(.xUe) Vq"60Xތy) b0С0!-,p^o 7yƦ~ݿޘEt _/|nֶ g{fV\kaP(t!=EuuXfgw[ gώSLJ NM=~: QDr(xUe)a"Tӗ\J>aCa*VkJ4iRv Wr7Ujd˖ޘMJ_f~};:˖MlF6+ItBPAs^-#Ȇ C2J/(8`ƍkzaԨtM郃mں29m'O0+-'R'i42X<ȆҘ -C0YGɝ6SXoܨWnnժo/ىffJ*reGic~P^5>b*.?-#,WL*k4W26 (aRd9B2̙mB،/g#σl(2a({ibgH *_Nlljhp߾_$2WE.'|hʔ]l/܅dYnCr4?40ƌP@9` ɠSne!J OQd&b>'9BM)g/>a XF S=,ɵJ#!-[6q#@ܜ&d[:qРn\Y-iiǫUVB,7~塊r7 r&A!,9B͛7+5}d y TLE*xȊ&iDu68geld[ϼWqPJn9*8c6m;Nl/y/9Tl{a3"PXD2(e9\YkENn>2X<ȆW.[;*++b0kJ#!Vɩ1Yk Ng۫hm]m[ m XJy.~Y2ˉ<ťC6d͛“dYnmI#jФI=7>[Il/7x0 aY9%W[QJ8>2X<ȆҘ -C0Y<}: `)}d@B9da𨲑(118>~KoXlVA6 t`*L*Y֭=f`5  `)}d@B9daOD*% X8 `)}d@B6d֕%<(C^ف.5`3mmL Q38AYO lކ/E X(۷I۔ 6J9NXu b0С ?e ^'6qe*Цئٰa(xN>aCn*,s-booCsOVm|gLH[WZCwRn۷ލuk+dar1A:σlP ,VXw23Oqt% e+V|+9WnUOO?I)!R|TMLQS89@S<ȆP a* k+ ygd@/(!Zd'7l(xN>aCa*3ZGG5ˮ^ 3f:,7LoBAAv/[72Uo߾d'͜ ) e"[9Ԫ)Z890?+F#XBlA6 t(L|tTlOJ+UmN: )!,FFv'd۶EXSǣ=ʕsrjhфRˡC^݉W_ܳMl`}01USpr+% 4e1bEFKލ9 ƒb} 1b0aRS!]X5W.l`0  "N@O<JlωC͛df<001USpr+% 4e1bEF3cI>σl0٩ayڼrٹ]j֯魤YpB:5f1-[6J^|tZ>.6,h[n;3Z^ٵgăaBӇmoݺMq6&dNVY8;8;wȷQ0}g;mVPIzAAkM_n~[RR0dI&Ya$UZj½ф7kV?6ֻȈ>ݍ X)BYK89/\d y MjLQK6>o/mڴ M~m6%c,,Skm]+*zo„tYrf!i_}J|^ccìŸo➕_fgcRh@1`oGNMկ_#G6v^[7/_{MNN+XXwKJހ `d:aQϞJ4;}jMSJ\^aYHOWõ?v&Mq/qGM+qH#ӉMg+._1clє:8Nkf/D9t@jnSqY(}d@>S8%Fb0 4ҹk6Nm*^CCوnXPɐ!..xfevw׭eăz0{&jNVAݞ{ŋ'Qu"7loB5([rIgLY+dܸ==t릻-*7n3lXoaA( Y YkV?P<Ȇ3EN@2"-`0 pLKB@ԩSsѢ 1WEg\fM B%tbhӦE*ϵn݌rfBc"SfKMk׮1c\kbh@1`֭*ULJ rbb0P珫Qy:c 8ŝH}re={fZ1k%$'eBnS9GvtaA( Y 7"bgv˗+8,>aRMIp:\T($c{. & 0jsfo:w~Mkbhl(Q:1XBC4lhm*G4YFGLG<ȆE~FV3Q34!]k򡰤SSuT+VfnoqaŪ6mZpoɁdr;´5[-.Uꚵ y [> i]h.!9lAVo#9j^GjeVW0YGALPNA L /P:U+ydar1A:σlr2 >̀ sYSrSuT+Vn0< b'Xu bٰyS XT(~Uʪk`0 Σ./_F_Jb"\j&.VX$A6l~+" #œX Ȇ ( \ `,'Ȇׂͅ0^,Laٰa䥦;ɑ[}s\Ev8ނeBCCك ,c jGN;ߗ[ژxm#z dæLAf27t̛p%$ٰe I_Ͷ[̂Mwڸl[:t0CH ?7m`G;;S*}[n`m̍?elŁG6lZzVC+ C_WXX}o~~~>> 8ǶוKl D@=۱M9qvZle!ggoxw5s}rlִ ʂlX=bq̼u=gC@Y,5:karV , dåKAv.%4.~{tԌuIM""|8hFynۦ/:͕2?y<64ٴٰ{xOMD5>6I~~ߋK h:aɥ2fc)~ &8Ś$~~~˜-jM/@./w>2ǭu>ώޱBeзqXȆ.>32]6)蔹dB \^l]zCoVk`G h>8V:}~G\&rt FNtaq3łlp4y)_\Ǒ㽪;9k槛_,$Xkw5*M,@cPx}$)̾#9lu$.L_O9q?HnubǙ٢:AЪ?6՚X77gX(ܻBͤ$X߯?3ˌ=r>f+Elh(uuўz']p’2`!*},5 e~o޸%,m&PؙQ kv{7̧ .ٰ422x^Zk á7P%aXC"rsèݳWH^?Mn[dBW\i˱w'2##Yqw_y)(;BV @)SWdB9\ԌuwY 7G{MڳaF bm~U9Տ#&9WP{SX-LF|Ey}t)O`Qe6><{yv:yWSvga<_kX-v$d!V ~sߺ',I9~%rgX-0sT ?|yEdF!x{!ff"|K˸HX*ػY-0s,<~t>J "s~y(C[d49ymgٹwÞ/.Ji75[ ̆SŭEwZ~xoyN~#|Ҹ_M ~˾ɬ0ON Ξì!1ZL[I~#/W~23ds7x^Ǿd~怌I0MB V @{Snlg79) O^gtXkLjybpƍ9ׯ$TMo92!PȈOT +Ⱥ-X߯~9 '4y0RbVa+bBpͤ?ߨ^Ǿ4\~k,C`xP6\6rJV @C)o( )7wBc )l8vr37k'tk|_upx <_wf+(C86=Cگ5(`:v! g%ܾ?lk@>OquWڥx6=p`ln:s"Lxt>kzK?m拶@x `nQ6t΃gX:ĐNu44-6`lus4ɸtu(g@ʊfZ`nb6s]j螚.'}eJ~`TRO_VP X.|l{$^(gy \7FΆs:>q)]x? (wfHbj0*7@ĈNR9ȩX-0+ =z|hWnAm>Wobnx.V˚ݻ?d,=TS-,2o'{K`+``6LG=)+|cNy31, Ҕ܇Y-گ'j(1)'ΟǶcIyZG/`|(F68.y`O(>kҥśF?XxUwObW?/#v)>jzvu~'U<<ߨ?!l8?#+)ԅ92#...94]sAv.H?C\dݽt#wՏDZ@et{ fD6\|&jƺCo ؘy MˮJoaPz<76λvѮ ฻FZ`&HdÞu E >u,&x9A@oȅN ,Z?H9lêLRJ\(pmc͆$$߲͎b"1Y+/,1`f4Td]lvT2(;8߆fi~@11^下40ebEXN1Y3O9=PLP0LօfGڋ2k%$}0J><eľ~[ebq{3G4vhSp0(UF\HcLR,"1noGv}E艞i?XIhgU˸Hۛ9bCfЄGB0"Bebq{+UΌZpifF,@OGO31nMQa֭/RժU;v;wqʕ&_irrr&OloooggGs:tm۶֭ZڱHrrʐ!Cj׮]FA rrw0q# *Ud>3s٥K;wrz֭[F= ='>C 5^Ǿ< yxRq?"6 70+t >px;u$4BQ҇ѣǝBu6ga-M^^^ٱÇrhӦÇhv8qѣy$$$pnnn...7nx#LΝK{.7Tnd̵%0o<^vh"ggk׮%%%7iZL6 .'47%)8DBtϨD'Q:EqUO?ĕՆ)oH@Dq~4 Ԙm\EhoJ&!r3MǐE!i\933.2x5k &,LNŋ2] AW}P)7!iiit˕͛|˗rrrrF2 @8oVndcbbz ͛ӅBUT Lr5M-9Ξ=۽{ZjYRbE@+ r5΀gxnȍ\AHZU)ЌߔN^m =r~ȌVܘI}v#kSf+Ó\|FUfa"70+t ^ ;wPξdĪ"XՀ{{{nSnÖ-[?uX-> fVVV7[>B%Dm۾vdS=)w@6 L(U`@q9 >*Cҭ'X2ZכZg3Y-z/̽cNCP8pqkvx}16fz[)6>q&OףּRX߯o fc(r' Y-0%$a|:s-ٹ&/-<=q7q'fjP2$VR6̡ɽ+hﯼmzOX02k潎}>VP~]˅4xa(/ka'ӥl'vŅ7ڈջr䐳{e⾓H8qɬl0A PBuOMCg$Ҫ~JPJd;g'`WVzl!@?2o'uj(totRc+i`H6A=2Y J&7%Z~sP6c[_V޵{{j(oV1l'5Zse;`t}kAsèCa8< fO^Yl0 shrx>kn>7aY J W솻z.vvOYV ++=X-0 dݽwuS@_~eΜGSu77|,#bTD%&j4jL$Ѹj6n;Y4񌘍,cnhP@nx"DQBNUwt{OMMuMOߞz骱D Nh] *uDt? ExgmKDXN!c݇D5;}!ڸzf{ZQG|1wҵHYc`6Lx|/N#!96cWb#bDV"9M@ꄅt-Âm\ Ow)k φ6?W|=[ jr/]q8#|-lWDK 6cgK9G'2_6Lx]{ޙyp̂'' RF/_ΠCYFkD疇O)SxgyY9nCb ;Su\Il~A9Mx3KOkDn^x]Qfٰ@#F o{qb+n24\| Q W#?t-ؗ+S'.kayD|sTdGKL@y n?}~Ad(X,t BkPA4VRFK6,ptƑ,pﷳ?D-D ˓'gO8;QəRF/_yEq HdsnD;F; Eˆ DžW#8-3e7J%FJ_B? }P_^& R2}q9(E9~>c.g'i6,}Z A!M3:|Dvv ߠH>^6w#j8z/k&glk޳aIRFx8j/(Pɻzƞ4qMw#fro#ܼ"Y[Nk5M6L(ͿCt|1c).4(p?a2O &FBr<Ͼ߱SAߌyy#40ҵb# CNL")gٰGG6QD!:p"w}u 8 ܱwÓUk2Ad(ӯU- cl`)|wߠ/Bx9/gbz޸sd<7!f␪]\<iŵ{c~()WZN1α_w6,ߟb SZ‘ߚz/~ۇNs qt !eSWZ=n 2@?t-ȩo|>kޠ[ ƞH'`Xή*ѯJsRkv!)ӣ;iE:'$'4$-L꧂C1W6,pC gw=P9ewB~:q&~C7BJ d`L5T 9#Y1I<'k.mrR\ *ux3L  ~p7ß-QNt$, O3~D!Z7<;$>M2ԙ%1.=υ\pNhO}nOn.jxB\翓r!Uy@L <:>sUT?vP$^>ɣrN>߄D!bOMAa,è2Tϛ0.= 'yTіʰ/v6BA_8t 00׶O:tb#/vd <.}8osC~[h6z͵z G/ fV% o_:)))---===33ݻaHI@*V?DCy33X |RFЭD ߇C^A_w4(D70O02}iWG7}ļ5C* q0 gߑc3VĶhsxWwk鋶l4y!S1*UlmзnB)++nĈj9{zv]ɶE쮲mmɆFEEǧ@B~i8^G۱迋tSQFBjKHaÈoPŎyٰSϤNXVAq`7A\Y&;RB567Bk]lA6  X3n%[ou:uĵkqwݱcE6HrW ɆO_ qZZZff&m>V3c@xPbNC4\t^N[^Ft!Պ~nf%S_picl[d_CetA*t -!&=&Qat\%CoҤK#߽?ZU^u6Hn+,4p`ORO]4p<$'J=^FnTDunܸAB@r%wuݺ_zY:w~ر`^رCE5X̛zD$' ⨨ 0DϣN!݃*v !ڸA򻘡.} -&t#00KNY;^ooC8k^xmGk 0[xOώ.Dߺ0|x)S 년,K>u*ޖܖzx\TzuHy}t|9ԫWYƐ_4iXzzxCsgճ 8/ܮ]k@n]}^/ntyΜ]J5kWrP߾o(dAC6nݺ6?\ I\4SPtD*j1 ̆mb9$bOTrwxsnr*ffqsA6oժa|Z7$ƍqRd'ssWT58qb3); ϒ2رC<<׮]A^]krժUHgw5++[XKNg,R#XEŰ 4MmϹ pR @\Y\PR=xDYYqQܬe&/na7'z$5:Ur[L4)]ݽՕۋ_B,ʻ*J_rWهlz;&7U QPٰ>(He˼5pu=aЇP $7g;]̙{^:Q#/ٹXt~9]h89/g΄'|k4sl G,_a7oޚp/R3C_jZoRD _ P_%-9+C:r$HxuH'M.ؕyU8MZregwUV-PaOƌRiS_ߩ+W7# jj%lync/b+M. a}Pّ }tre; g@rs_=gEeeōgNKv.t~?*KZ㨾mgĿ5mc肂(#>l=7ǭhYEb̈d̜2.03S2><~2+fJy*ȋ%u(<̪h ×-[l٤rJ=[80Ώ.k[qyg ߨ|͋#k5n !a i  &Ppuf4c8`0Ҋ roSsThYf`ę2.Y9qs-qsܪ0?ΝWrv>q_H]֤, DE/WR/*`*n1c H#)׹X*W4, a}0t`,h؉9ntoe)d%.WtjMr|wFnẄ́3y[-t 0ANi)׹V4, a}0t`,h؉9nt-Y[EnO;U6 %.r{(PmʵK?[`$K\;br>0ThYf@L5R綣5`ĸҠlMeKYV/4oo?ebkb" *n1c .qYIhHSf` 93Q6ɈfAk#-ѣ׋ 6zɸEGS,*.dWwlg"-Uh^Vq1LdtrGLGsF4˸lX^Yn;ZÊ MTZU&A!=Ν^h6bh/@aԆ >t(q JP <X$Wqus#b͜b*n1c 1ɲQTrE#2.0#Lq͂ȉ Y)nL'&&@7D0/7w?fh3;[KPlq(3 0̆Ld\@5r悜N"ٳ={wv+͓ T^q31KtƖ-rZڦԨQcǗ}r/<ʐhmRݸ_fqqՠkPз쾱;xwwWl+[M\]kϝ;|LKb]ʛrlq1 0sʸlX̴I4 Z#'n.(X Nju{mڹ[~׶m y￟m,.i%/OB͹sQ& ܷNgkB^+&fyʕG}}vfBmۖA>-<ַkzŊ˖y6*U% x(t9nU4c`qٰ>i hFN\P@S:;W/Z YgΝ_,Y+ CZLgtkԨ&i'̦gAOo>}vj/ׅ8a\lR d\a6 =h`ڤ5(,i}悂p33cIkW׮+(%e$Tcr̡qRҺ_2Em= K ROfTvK}cwF\דkÐ ׆y[bbix )1ff` xo)^s Ris%1/\P`5k …֪T ՙ?՘UtkLW3 0̆AaE<ωTpsAs}޵뫖 ؓn[t[aSfpfIr׊Yd*U* RKN:y3,rְV'n.Y`N9yܶm@YCq+nVq1 0sʸlXL- Bىu4ɕIYr:< ωd\@(Xcr_`9nE*n1fN` f]u.f]%N5HV45& xV4ݬc`qٰ>(BԨ۶m gZBE5e5Hv꺚<'kq͢`}悂ӯSdzJ}*{.]XiƂٰ>(7E;T ѣxUTlfloY,n10mgie\@5r悲Ot=x֒LS]_ot۵ku,&Z'³Z5!.[Mnه`Jn^[v.uwm۶D K*{VAzLb»Q x9x+W"uԺu_lلȾ--0f4 hFN\P@ Zك9n-t9͜9[2 ɓ?'V|M=+fb:ۭЀĀsuߐD jzf3$==zp|*KI! IÆc_:As R-[a߲Xb Ly+ 0[lXTzIǞ965.YXѣcϺe CdΕ=x֒LSXo*,eP^+MURk8!r-t'4 tڵsAD UV3U4nܟUtRR^=k0/qA,evi͋-Ro}bq1 004ٰ><3Yk=8۴2.YXѣcϺe CdΕ=x֒LӥK1`kqPʊ2&Ν;v ֛3g`=T֭[m@…BTd'm>IYeVTw[5y#F X| r2{P;C>g,Y2};[[a)l̆AZt٦q͢%{n.je渕麜etYII{ν hmb)QY5 7,PSݹ#!h#|q}PfкCFEE%%%eddQj0,# a}PQxh`7xe8EZZPxx8^s^;IDŽ` a}PQxh`7xe8DJJ VTTT0bkp|srr 0{a6 =Q7,PS̄WIKKKJJGx ݻw 0{a6d*eܴPFN\PȆU+{Tve0V1+`&DlXp~eqpA!V#q_FSe #9 x~%GoxPZ#Q)AƻP~a'W)̆A$lXH2hPl0Fa^ԣ")ʠ5fv"̆A$lXqH2h$FDM"/0\E=/ Z#.DFf  IQhp"}y ̆_A* YRF`6 "aAz " RlA~ѫ /0F鸬`*" ̆.a@st8IDAT HaAzF" RlAA1/ #  0gy.IENDB`cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/weak_mocking_library.plantuml000066400000000000000000000012321455674302600331120ustar00rootroot00000000000000@startuml package library as l { rectangle "" as gs 'rectangle "" as ss } package library_weak as lw { rectangle "weak " as wgs rectangle "__real_" as ggs 'rectangle "_<--static-- symbol>" as gss } rectangle objdump { file weaken [ --weaken_symbols ] file genuine [ --add-symbol __real_<...> ] 'file globalize [ '--globalize-symbols '--redefine-syms '] } 'gs -[hidden]--> ss genuine -[hidden]-> weaken 'weaken -[hidden]-> globalize ggs -[hidden]-> wgs 'wgs -[hidden]-> gss gs - genuine 'genuine -> ggs gs - weaken weaken -> wgs 'ss - globalize 'globalize -> gss @enduml cmocka_extensions-cmocka_extensions-0.50.0/documentation/images/weak_mocking_library.png000066400000000000000000000324741455674302600320560ustar00rootroot00000000000000PNG  IHDRu 5IDATx^ xU[} "3( (~8 7첌DPd]B`2V!!aȊR[}=V[sNt<%nţ]^^^^^^^^^^^^^^^^^^^^^DPAAAs8w48+7ǎ&ESDŊ9]V{@K-[h")Ap 8SevO>4d^-D}NYBp8!퐏~5jԨXcItg #= XwVVVNN+,,î\2계wBRQĉ+W޽{ZZE={B+. L ce" p.;6%%=L &qVOJJz񋊊@8DzA$\1bXiY9=k<2\Q8譏$Ä -[axS2m(Nh…+V2s zxd 0q)۵kWZ-Z,^Xի+[%$$PK/˟|Ǐ덿['U euњnIY?WPGK,!w;N$T;t@ITjջ. ,S-ZDh MԽ5^t 7Proq͚5Jƍi6:/B=RxqBm;Žh@NN~ 6lH ZOkUoݺK.5k֬UV) `>vڴ8ydeC<2\B%?R͛7{o .JbTUϜ93o<]oi?l3xJ?怜!(IJz$''geeNy2*G?5hQ1CY>4RxKK.u/ѳgOzNӎ{}ȑw}SzzһS矧dbk.<-N2?x$e]vwG0`)S'56mDLϜ9s<2@n^-vIݻsN^ ҉4i҄S׭[bŊTKJ_CPCbڴikw;eN Rh۶mءC^02n{zJ/5me/}iBUTI=RxrBzw{#PլY&y衇sꫴH+n:Iw͋wgrsժUKy<2@Љ'xX^=u}?裗_~9% aÆYfQ;;;ڝ;wV OŻ'dUzV"qqK#^ 'DG$cHzD )@}VC&J*j"r=Ԯ];..-Rbjժ(8ɟyN n jNLBǎioQTTDI8[%ǣG׌!ڴiӼys)pBf8!#z"煙,8!zTO ٳ^mmzD DB곚nݺyJIWRGK< c'taզ8|M:֭[}U16Xb5ӌ}Ԏg}8[ѥPzPLSRX3CdW^y$$$N2cG!v^d{;Fj:u?ummzD )H0g5SN~Sj,X@ v6ӧOWzV={6XӦM˽xd<%fBSDަMG*q?Q!ߵktZ?h ٷo_mw)_5vJ< Ĵ,M^ǟ8q?o۶W6^=zB՞ »'>.\@ܣDQd XuB&별ۈ)2sjcȐ!A_p4nܸm۶xS‡Ooھp'13vGF #pRe%}J*͞=vJLL:!GF ^'ґ?sxS`$ƽNnݺ~ŋSRR^j''$!xd0N"111ӁtڵrC 7n\BBƍ9 aL8!J\wBG̈7 p 999T)CR8!8!# p L4uvv6bh\ ''yğApB@1cƤP +K`03NT4L''yğApB@{63mN" 9 b|G!'coN>F<_(Q ؛S 8! x2pB03m%N HϱcǴwNL(dxN!==}"RM9 PpD x 9HQCΒǐx AeB@'0C3,Y} TFVCĎ(dx8!ȉ* C5C3,Y} TFVCĎ(dx8!ȉsB̐9 9KVC',# Nr8qj:uڹsI3doN>CΒǐx Aed5KB(Nc^|E ٛSϐd1$/pBPY ;y 'Ѭ7P;1C3,Y} Kl:!EƈoBWh[e5KB \X.ھB**rСZ՘1c֮] ޜ>CFC23F|ڎBJ#!|r79sIժUF}tٺaVU*Բ%vD! (}UTC$N#Grٳ'ߙY! #!#Ih mGmǐx YP `߾Eŋ_ցì}Uh[e5KB2Ph m+FqZ >|ɒ%iii\F;3c7 M(48Ç7'&߫WΞ=i+^vM.Wf̚5Eh |1zdɤnj͛_;㕮Jyu֮]F^hׁ*͏Ҭܻwe ΜXYs~ӟ1cd-iolG .?-vv߾te_z7<)nЅ˥yY ;y"n4i޼tC˸KU={vjРNiQhD ʕ+Lܹs;x=Yj*8]ۆ =??S̯Q767ةI[L*ТEL곞9z>ZhxRV|1"H8"qneZACV䋤N[FG"˪SR|G4h W5u0>ߚ޽kР .LQ~~ɶ1o[o>55TD r^N9oKtHjQ.yĜލKZ]WO?F^FeqZ4Zp;)Uz%A_~jٲNhpx'MEQ( ɫe5KB=!EmP 4>l/Ӆ2e('*L ѪT.jT} 2`L1 Aso=)I!r Qi^FUdI^m$Im!C7jTcǶ$c}6)) ʘ+ޖT,sUm27pZQckb۶S Գn;we]Ffޙ%vD!넌w ~fe zAVv nG=* h3g _N5>xp~$ `z ZL+[O+{s*ٌ94sS/S j$UqJXtRS{Db )52+kމOjJr&M.˪|K4F׵k䮶m[>yһck8ZzѢW6̙G:Ni U腝fO#.&]:?f5KB牤һkּh.%L#g~O8ZQ fk'g:AS?pWN5#=: 32޺ NePLeXn;m=Vrޜ _}6"qne^u P腝f' PtB F!XbG2Fx7D董ڄ狳d`Q< wjZٛSϐ|j 'Ş9 9K8!`Q'b>%Nرc[.?v@уM~ݓxo1ϿaYf%%%y^ϧeB1 2/2nܸ#G1@VfΜi2G)gD?%NH nJJ B`gi.1psM[C7('''//O{" c lc^D3 K4Pvv61Յ^/]kYN{75t(w,QȈ8!Tm ? 3p.CM'DJ^eqU])?5eӺ :M[C7uaaΕE< ' 'A}cH<_鄨|\NeK{qe<>ԍM[C7⯨H{"EΠ>b1$/tB œhĹ<݀ofwvDHG!#PD3 ;yvEģqB3mNȽ=Reӎx2pB03mN̡_d}/'/:ϚQ ؛S 8!`N3/z(d`)gۈ=Nhԩ%߸$u;/L&p.ؕSpB {p!Wx%%%))i!pI7p{M\OF WvN| egg;}k>/~x,X '#^8!N'Dz}}O1WXXx߂2pB0╝n@<_tB|}}O1@6Hߘj8! 7 /v:!{O ?ю"╝n@<_@D):|un{oyJxeg8!dV}7='#^8!ND _6RtK3╝n@<_.o_Fܜog%;vB; ^8!NE%;:9_>C; ^8!NG3v?8ԏ]+;'܀x YP;!~uòEgս$╝n@<_,2@d Կ#b 7 /pB@ ©87lh; wG #p>╝n@<_,qB 7eo޾Z_\c p'db;7Ӯ߱o?xeg8! !8!ctpBJn=uN/`p╝n@<_,8!o>xe.;yH8 7 /pB@ĝ/XݲJH*:|T; p'dF'p8ӏNHy/WvN|'Ĝ?~jߜqG8~dB3pB 9!½φMKmnj-X}$@3pB 8!)[>wja+;'܀x Y 1f WvN| R~ 7 /pB@uB }7 7 /pB@wB+=jof+;'܀x YpRv|3/^{tv!!^8!NȂS|>ʺ]v>;ȎXD3pB :!1iַyi)Ԏ╝n@<_,8 )ڼs/'uyO?)#0D3pB qB̹xoC0QsvN>}QWvɴ 5쁣z8! rB6o~M C c;+;c̜Aa2m|,'D]SH6}3n5C╝ /C[ԋx Yĥ8!jׯ"퍔 Aa[||mޕ78sce׏_.@-V|-?h…&رc}ҕcXdM7]Kygzfn⪊/o5FYl!7-Z xeg,9R3~{yn{ZL> E> D'&WΞ=iNK+3warzjFlԓ]+- Nq"jWPoi6PO_}su;Tɓ^*+h}F[Nm/(>D/^Ե+\uU#t*ڄi[Ty{~]]V>ȑ-[uv'|衎s漬7oA=yr*Ti7.wSi+ zzM\~ JNDhw۔ @Wvƪ*)5Cɵ[qC+ܱ?N|c 'l`+U$dG(ԃs HuJ85葫UnF7hV49]7UIP'd=N2e(5祗^Epg~tr{veM/ϟyPƚ5otj۶mE/wXzu=YF*RQ^Ç7Sݟ1cs:-0Y|us=ߤ$'OEZt~ʕ$;(╝W2mYO]&P\HMMٳS:>Z>͚]5ĉ'warz2h%W]=|bh*'s_|LmZ@urj:޴׿ٵ+]V*U6mK[ݲկ+u1Fkժ^~\)/}AYF~@o*EDJfEφ.T$)A%''½>mi'6٬amN\5\Qe4ɼyi_^ T3G bDtZW90IΘwB~tG Zj>rJ%IB 8! [ ` %Ixeg;Ā߿+Nn߾覛U.rP%IB 8!I)aիrgI$IxegԚ?jժjtʔDjIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dN $)A VIP'dYN(1qUY&X1#xeglwB {7Q< g9!\D*fdN@U|'TPPyqƍ92pp3g bF $ ) target_include_directories(extref_dependency_static PUBLIC $ $ ) create_weak_library(FROM extref_dependency_static) cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_dependency/dependency.c000066400000000000000000000003751455674302600314250ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include "dependency.h" #include int dependency(int a, int b) { printf(" genuine: dependency(%d, %d) {\n", a, b); printf(" return %d + %d; // = %d\n", a, b, a + b); printf(" }\n"); return a + b; } cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_dependency/include/000077500000000000000000000000001455674302600305615ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_dependency/include/dependency.h000066400000000000000000000002041455674302600330440ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #ifndef DEPENDENCY_H #define DEPENDENCY_H int dependency(int a, int b); #endif /* DEPENDENCY_H */ cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_library/000077500000000000000000000000001455674302600264645ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_library/CMakeLists.txt000066400000000000000000000013341455674302600312250ustar00rootroot00000000000000# SPDX-License-Identifier: MIT add_library( extref_library SHARED library.c ) add_library( extref_library_static STATIC library.c ) set_property(TARGET extref_library PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET extref_library_static PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(extref_library PUBLIC $ $ $ ) target_include_directories(extref_library_static PUBLIC $ $ $ ) cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_library/include/000077500000000000000000000000001455674302600301075ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_library/include/library.h000066400000000000000000000001621455674302600317230ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #ifndef LIBRARY_H #define LIBRARY_H int function(int i); #endif /* LIBRARY_H */ cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_library/library.c000066400000000000000000000003351455674302600302750ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include "library.h" #include "dependency.h" #include int function(int i) { printf("genuine: function(%d) {\n", i); int res = dependency(i, i); printf("}\n"); return res; } cmocka_extensions-cmocka_extensions-0.50.0/examples/src/extref_library/weak_mock_dependency.c000066400000000000000000000003771455674302600327750ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include #include "dependency.h" int dependency(int a, int b) { printf(" mock: dependency(%d, %d) {\n", a, b); printf(" return %d - %d; // = %d\n", a, b, a - b); printf(" }\n"); return a - b; } cmocka_extensions-cmocka_extensions-0.50.0/examples/src/self_referencing/000077500000000000000000000000001455674302600267435ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/src/self_referencing/CMakeLists.txt000066400000000000000000000011131455674302600314770ustar00rootroot00000000000000# SPDX-License-Identifier: MIT add_library( selfref SHARED selfref.c ) add_library( selfref_static STATIC selfref.c ) set_property(TARGET selfref PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET selfref_static PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(selfref PUBLIC $ $ ) target_include_directories(selfref_static PUBLIC $ $ ) create_weak_library(FROM selfref_static) cmocka_extensions-cmocka_extensions-0.50.0/examples/src/self_referencing/include/000077500000000000000000000000001455674302600303665ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/src/self_referencing/include/selfref.h000066400000000000000000000002201455674302600321570ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #ifndef SELFREF_H #define SELFREF_H int function(int i); int dependency(int a, int b); #endif /* SELFREF_H */ cmocka_extensions-cmocka_extensions-0.50.0/examples/src/self_referencing/selfref.c000066400000000000000000000005661455674302600305440ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include "selfref.h" #include int function(int i) { printf("genuine: function(%d) {\n", i); int res = dependency(i, i); printf("}\n"); return res; } int dependency(int a, int b) { printf(" genuine: dependency(%d, %d) {\n", a, b); printf(" return %d + %d; // = %d\n", a, b, a + b); printf(" }\n"); return a + b; } cmocka_extensions-cmocka_extensions-0.50.0/examples/src/weak_library.cmake000066400000000000000000000046071455674302600271270ustar00rootroot00000000000000# SPDX-License-Identifier: MIT # Attention: Using this function in the /test/utest folder will cause # errors like "json-c::json-c not found". To save everyone the headache of # searching and adding every missing "find_package()" call, the weak targets # have to be made in the same place where the original is created for now; # This is usually from within the /src/CMakeLists.txt file. function(create_weak_library) cmake_parse_arguments(PARAM "NO_PREFIX" "FROM;TO;PREFIX;HELPER_SCRIPT" "WEAKEN_DEPENDENCIES" ${ARGN}) if (NOT PARAM_TO) set(weak_target_name "${PARAM_FROM}_weak") else() set(weak_target_name "${PARAM_TO}") endif() if(PARAM_NO_PREFIX) set(weak_target_prefix "") elseif(PARAM_PREFIX) set(weak_target_prefix "${PARAM_PREFIX}") else() set(weak_target_prefix "lib") endif() if(NOT PARAM_HELPER_SCRIPT) set(PARAM_HELPER_SCRIPT ${PROJECT_SOURCE_DIR}/test/tools/create_weak_library.sh) endif() set(weak_target_from ${PARAM_FROM}) get_target_property(weak_target_binary_dir ${PARAM_FROM} BINARY_DIR) set(weak_target_binary "${weak_target_binary_dir}/${weak_target_prefix}${weak_target_name}.a" ) message(STATUS "Create weak library ${weak_target_name}") add_custom_command( OUTPUT ${weak_target_binary} DEPENDS ${weak_target_from} COMMAND ${PARAM_HELPER_SCRIPT} ${weak_target_binary} "$" WORKING_DIRECTORY ${weak_target_binary_dir} VERBATIM ) add_library(${weak_target_name} STATIC IMPORTED GLOBAL) add_custom_target(${weak_target_name}_builder DEPENDS ${weak_target_binary}) add_dependencies(${weak_target_name} ${weak_target_name}_builder) set_target_properties(${weak_target_name} PROPERTIES IMPORTED_LOCATION "${weak_target_binary}") target_include_directories(${weak_target_name} INTERFACE $) target_compile_definitions(${weak_target_name} INTERFACE $) get_target_property(weak_target_linklibs ${weak_target_from} LINK_LIBRARIES) if (weak_target_linklibs) foreach(X IN LISTS PARAM_WEAKEN_DEPENDENCIES) list(REMOVE_ITEM weak_target_linklibs ${X}) list(APPEND weak_target_linklibs ${X}_weak) endforeach() target_link_libraries(${weak_target_name} INTERFACE ${weak_target_linklibs}) endif() endfunction() cmocka_extensions-cmocka_extensions-0.50.0/examples/test/000077500000000000000000000000001455674302600236335ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/tools/000077500000000000000000000000001455674302600247735ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/tools/create_weak_library.sh000077500000000000000000000034111455674302600313270ustar00rootroot00000000000000#!/bin/bash set -e -u -o pipefail if [ $# -ne 2 ]; then echo "create_weak_library.sh needs exactly two paramters:" echo "$0 " exit 1 fi library=${1} objects=${2//;/ } objects_weak="" do_ar=${CMAKE_AR:-${AR:-ar}} do_nm=${CMAKE_NM:-${NM:-nm}} do_objcopy=${CMAKE_OBJCOPY:-${OBJCOPY:-objcopy}} ar_param=${AR_PARAM:-qc} for object in $objects do local_prefix="$(basename "${object%%.c.o}")" object_name="${object%%.o}" object_weak="${object_name}.weak.o" sym_weak="${object_name}.weak.txt" sym_rename="${object_name}.rename.txt" sym_global="${object_name}.global.txt" object_nm=$($do_nm $object) # get a list of all global symbols sym_gfunc=$(echo "$object_nm" | sed -e '/\sT\s/!d; s/\sT\s/ /g') # generate the list of static symbols that should be renamed with the local prefix and turnt global echo "$object_nm" | sed -e "/\st\s/!d; /_sub_[DI]/d; s/\st\s/ /g; s/\S*\s\(\S*\)/\1 _$local_prefix\1/g" > $sym_rename echo "$sym_gfunc" | awk '{ print $2 }' > $sym_weak awk '{ print $2 }' $sym_rename > $sym_global param_global="" param_rename="" if [ -s $sym_global ]; then param_global=" --globalize-symbols=$sym_global"; fi if [ -s $sym_rename ]; then param_rename=" --redefine-syms=$sym_rename"; fi param_add="$(echo "$sym_gfunc" | sed -e 's/\(\S\+\)\s\(.\+\)/--add-symbol __real_\2=.text:0x\1,function,global/g')" # We need to check if we can properly feed objcopy via a pipe from a file $do_objcopy $param_rename $param_add $param_global $object $object_weak $do_objcopy --weaken-symbols=$sym_weak $object_weak objects_weak="$objects_weak $object_weak" done if [ -f "$library" ] then rm $library fi $do_ar $ar_param $library $objects_weak cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/000077500000000000000000000000001455674302600247775ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/CMakeLists.txt000066400000000000000000000002041455674302600275330ustar00rootroot00000000000000# SPDX-License-Identifier: MIT include(unit_test.cmake) add_subdirectory(mocks) add_subdirectory(selfref) add_subdirectory(extref) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/000077500000000000000000000000001455674302600262745ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/CMakeLists.txt000066400000000000000000000001151455674302600310310ustar00rootroot00000000000000# SPDX-License-Identifier: MIT add_subdirectory(weak) add_subdirectory(wrap) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/weak/000077500000000000000000000000001455674302600272235ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/weak/CMakeLists.txt000066400000000000000000000004031455674302600317600ustar00rootroot00000000000000# SPDX-License-Identifier: MIT create_unit_test( NAME weak_extref_example SOURCES example.c LIBRARIES extref_library mock_extref_dependency_static # important must come befor selfref_static_weak to work extref_dependency_static_weak ) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/weak/example.c000066400000000000000000000004131455674302600310200ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include #include "library.h" #include "mock_extref_dependency.h" int main() { MOCK_FUNC_AFTER_CALL(dependency, 0); int res = function(2); printf(" -> %d // %s\n", res, 0 == res ? "correctly mocked!" : "not mocked!"); } cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/wrap/000077500000000000000000000000001455674302600272455ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/wrap/CMakeLists.txt000066400000000000000000000002471455674302600320100ustar00rootroot00000000000000# SPDX-License-Identifier: MIT create_unit_test( NAME wrap_extref_example SOURCES example.c LIBRARIES extref_library_static mock_extref_dependency ) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/extref/wrap/example.c000066400000000000000000000004131455674302600310420ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include #include "library.h" #include "mock_extref_dependency.h" int main() { MOCK_FUNC_AFTER_CALL(dependency, 0); int res = function(2); printf(" -> %d // %s\n", res, 0 == res ? "correctly mocked!" : "not mocked!"); } cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/000077500000000000000000000000001455674302600261135ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/CMakeLists.txt000066400000000000000000000001751455674302600306560ustar00rootroot00000000000000# SPDX-License-Identifier: MIT include(create_mock_lib.cmake) add_subdirectory(extref_dependency) add_subdirectory(selfref) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/create_mock_lib.cmake000066400000000000000000000034371455674302600322260ustar00rootroot00000000000000# SPDX-License-Identifier: MIT function(create_mock_lib) cmake_parse_arguments(PARSED_ARGS "NO_DYNAMIC_LIBRARY" "NAME;WRAP_FLAG" "SOURCES;INCLUDES;LIBRARIES;LIBRARIES_DYNAMIC;LIBRARIES_STATIC;DEFINITIONS;DEFINITIONS_DYNAMIC;DEFINITIONS_STATIC;WRAPS" ${ARGN}) message(STATUS "create ${PARSED_ARGS_NAME} ${PARSED_SOURCES}") add_library(${PARSED_ARGS_NAME}_static STATIC ${PARSED_ARGS_SOURCES}) if(PARSED_ARGS_DEFINITIONS OR DEFINITIONS_STATIC) target_compile_definitions( ${PARSED_ARGS_NAME}_static PRIVATE ${PARSED_ARGS_DEFINITIONS} ${PARSED_ARGS_DEFINITIONS_STATIC} ) endif() target_link_libraries( ${PARSED_ARGS_NAME}_static PRIVATE cmocka ${PARSED_ARGS_LIBRARIES} ${PARSED_ARGS_LIBRARIES_STATIC} ) target_include_directories( ${PARSED_ARGS_NAME}_static PUBLIC ${PARSED_ARGS_INCLUDES} ) if(NOT ${PARSED_ARGS_NO_DYNAMIC_LIBRARY}) add_library(${PARSED_ARGS_NAME} SHARED ${PARSED_ARGS_SOURCES}) if(PARSED_ARGS_DEFINITIONS OR DEFINITIONS_DYNAMIC) target_compile_definitions( ${PARSED_ARGS_NAME} PRIVATE ${PARSED_ARGS_DEFINITIONS} ${PARSED_ARGS_DEFINITIONS_DYNAMIC} ) endif() target_link_libraries( ${PARSED_ARGS_NAME} PRIVATE cmocka ${PARSED_ARGS_LIBRARIES} ${PARSED_ARGS_LIBRARIES_DYNAMIC} ) target_include_directories( ${PARSED_ARGS_NAME} PUBLIC ${PARSED_ARGS_INCLUDES} ) list(TRANSFORM PARSED_ARGS_WRAPS PREPEND "-Wl,--wrap=") target_link_options( ${PARSED_ARGS_NAME} PUBLIC -Wl,--no-as-needed ${PARSED_ARGS_WRAPS} ) target_compile_definitions( ${PARSED_ARGS_NAME} PUBLIC ${PARSED_ARGS_WRAP_FLAG} ) endif() endfunction() cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/extref_dependency/000077500000000000000000000000001455674302600316065ustar00rootroot00000000000000CMakeLists.txt000066400000000000000000000006251455674302600342720ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/extref_dependency# SPDX-License-Identifier: MIT create_mock_lib( NAME mock_extref_dependency SOURCES mock_extref_dependency.c INCLUDES $ LIBRARIES cmocka_extensions LIBRARIES_DYNAMIC extref_dependency LIBRARIES_STATIC extref_dependency_static_weak WRAP_FLAG MOCK_EXAMPLE_EXTREF_DEPENDENCY_FUNC_LINKER_WRAPPING WRAPS dependency ) mock_extref_dependency.c000066400000000000000000000006311455674302600363770ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/extref_dependency// SPDX-License-Identifier: MIT #include "mock_extref_dependency.h" #include #include #include MOCK_FUNC_BODY(dependency, int, int a, int b) { if (MOCK_IS_ACTIVE(dependency)) { printf(" mocked: dependency(%d, %d) {\n", a, b); printf(" return %d - %d; // = %d\n", a, b, a - b); printf(" }\n"); return a - b; } return MOCK_FUNC_REAL(dependency)(a, b); } mock_extref_dependency.h000066400000000000000000000007671455674302600364160ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/extref_dependency// SPDX-License-Identifier: MIT #ifndef _MOCK_EXAMPLE_EXTREF_DEPENDENCY_H #define _MOCK_EXAMPLE_EXTREF_DEPENDENCY_H #include #include #ifdef MOCK_EXAMPLE_EXTREF_DEPENDENCY_FUNC_LINKER_WRAPPING #include #else #include #endif #include "dependency.h" MOCK_FUNC_PROTOTYPE(dependency, int, int a, int b) #endif /* _MOCK_EXAMPLE_EXTREF_DEPENDENCY_H */ cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/selfref/000077500000000000000000000000001455674302600275415ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/selfref/CMakeLists.txt000066400000000000000000000006721455674302600323060ustar00rootroot00000000000000# SPDX-License-Identifier: MIT create_mock_lib( NAME mock_selfref SOURCES mock_selfref.c INCLUDES $ $ LIBRARIES cmocka_extensions LIBRARIES_DYNAMIC selfref LIBRARIES_STATIC selfref_static_weak WRAP_FLAG MOCK_EXAMPLE_SELFREF_FUNC_LINKER_WRAPPING WRAPS function dependency ) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/selfref/mock_selfref.c000066400000000000000000000007721455674302600323520ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include "mock_selfref.h" #include #include #include MOCK_FUNC_VAR_NEW(function); int MOCK_FUNC_WRAP(function)(int i) { return MOCK_FUNC_REAL(function)(i); } MOCK_FUNC_BODY(dependency, int, int a, int b) { if (MOCK_IS_ACTIVE(dependency)) { printf(" mocked: dependency(%d, %d) {\n", a, b); printf(" return %d - %d; // = %d\n", a, b, a - b); printf(" }\n"); return a - b; } return MOCK_FUNC_REAL(dependency)(a, b); } cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/mocks/selfref/mock_selfref.h000066400000000000000000000007661455674302600323620ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #ifndef _MOCK_EXAMPLE_SELFREF_H #define _MOCK_EXAMPLE_SELFREF_H #include #include #ifdef MOCK_EXAMPLE_SELFREF_FUNC_LINKER_WRAPPING #include #else #include #endif #include "selfref.h" MOCK_FUNC_PROTOTYPE(function, int, int i) MOCK_FUNC_PROTOTYPE(dependency, int, int a, int b) #endif /* _MOCK_EXAMPLE_SELFREF_H */ cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/selfref/000077500000000000000000000000001455674302600264255ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/selfref/CMakeLists.txt000066400000000000000000000003351455674302600311660ustar00rootroot00000000000000# SPDX-License-Identifier: MIT create_unit_test( NAME weak_selfref_example SOURCES example.c LIBRARIES mock_selfref_static # important must come befor selfref_static_weak to work selfref_static_weak ) cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/selfref/example.c000066400000000000000000000004011455674302600302170ustar00rootroot00000000000000// SPDX-License-Identifier: MIT #include #include "selfref.h" #include "mock_selfref.h" int main() { MOCK_FUNC_AFTER_CALL(dependency, 0); int res = function(2); printf(" -> %d // %s\n", res, 0 == res ? "correctly mocked!" : "not mocked!"); } cmocka_extensions-cmocka_extensions-0.50.0/examples/test/utest/unit_test.cmake000066400000000000000000000027171455674302600300260ustar00rootroot00000000000000# SPDX-License-Identifier: MIT if(NOT CMAKE_CROSSCOMPILING) find_package(cmocka 1.1.5) # get cmocka if(NOT cmocka_FOUND) message(STATUS "CMocka >=1.1.5 was not found, building static version") include(CMakeModules/FetchCMocka.cmake) set(CMOCKA_LIBRARIES cmocka-static) endif() else() find_package(cmocka 1.1.5 REQUIRED) endif() function(create_unit_test) cmake_parse_arguments(PARSED_ARGS "" "NAME" "SOURCES;INCLUDES;LIBRARIES;DEFINITIONS" ${ARGN}) get_filename_component(UNIT_DIR ${CMAKE_CURRENT_LIST_DIR}/.. ABSOLUTE) get_filename_component(UNIT_NAME ${UNIT_DIR} NAME) message(STATUS "Create unit test ${PARSED_ARGS_NAME} for ${UNIT_NAME}") add_executable(${PARSED_ARGS_NAME} ${PARSED_ARGS_SOURCES}) target_link_libraries( ${PARSED_ARGS_NAME} PRIVATE ${PARSED_ARGS_LIBRARIES} ${CMOCKA_LIBRARIES} cmocka_extensions ) target_include_directories( ${PARSED_ARGS_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/.. ${CMAKE_CURRENT_LIST_DIR}/../.. ${PARSED_ARGS_INCLUDES} ) if(PARSED_ARGS_DEFINITIONS) target_compile_definitions(${PARSED_ARGS_NAME} PRIVATE ${PARSED_ARGS_DEFINITIONS}) endif() if(NOT CMAKE_CROSSCOMPILING) add_test(NAME ${PARSED_ARGS_NAME} COMMAND ${PARSED_ARGS_NAME}) endif() if(INSTALL_UNIT_TESTS) install( TARGETS ${PARSED_ARGS_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/test/${PROJECT_NAME}/${UNIT_NAME} ) endif() endfunction() cmocka_extensions-cmocka_extensions-0.50.0/src/000077500000000000000000000000001455674302600216255ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/CMakeLists.txt000066400000000000000000000001031455674302600243570ustar00rootroot00000000000000# SPDX-License-Identifier: MIT add_subdirectory(cmocka_extensions) cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/000077500000000000000000000000001455674302600253415ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/CMakeLists.txt000066400000000000000000000025451455674302600301070ustar00rootroot00000000000000# SPDX-License-Identifier: MIT add_library( cmocka_extensions INTERFACE ) set_property(TARGET cmocka_extensions PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(cmocka_extensions INTERFACE $ $ ) target_link_libraries( cmocka_extensions INTERFACE cmocka ) install( EXPORT cmocka_extensionsTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cmocka_extensions NAMESPACE cmocka_extensions:: FILE cmocka_extensionsTargets.cmake # Not sure if this is still needed ) include(CMakePackageConfigHelpers) configure_package_config_file( "Config.cmake.in" "cmocka_extensionsConfig.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cmocka_extensions PATH_VARS CMAKE_INSTALL_LIBDIR ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/cmocka_extensionsConfigVersion.cmake VERSION ${PKG_VERSION} COMPATIBILITY SameMajorVersion ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/cmocka_extensionsConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmocka_extensionsConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cmocka_extensions" ) install(TARGETS cmocka_extensions EXPORT cmocka_extensionsTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/Config.cmake.in000066400000000000000000000001231455674302600301510ustar00rootroot00000000000000@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/cmocka_extensionsTargets.cmake") cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/include/000077500000000000000000000000001455674302600267645ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/include/cmocka_extensions/000077500000000000000000000000001455674302600325005ustar00rootroot00000000000000cmocka_extensions.h000066400000000000000000000063051455674302600363120ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/include/cmocka_extensions// SPDX-License-Identifier: MIT #ifndef __CMOCKA_EXTENSIONS_H__ #define __CMOCKA_EXTENSIONS_H__ // clang-format off // because this order is a cmocka requirement #include #include #include #include #include #include #include #include #include // clang-format on #define UNUSED __attribute__((unused)) #define SKIP(fmt, ...) \ print_error("# skip %s: " fmt "\n", __func__, ##__VA_ARGS__); \ skip() #define TEST(method) print_message("# test " method "\n") #define SHOULD(fmt, ...) print_message("# should " fmt "\n", ##__VA_ARGS__) #define PARAM(fmt, ...) print_message("# test param: " fmt "\n", ##__VA_ARGS__) #define TEST_CASE(__name) cmocka_unit_test_setup_teardown(__name, __name##Setup, __name##Teardown) #define TEST_CASE_FUNC_PROTOTYPES(__name) \ void __name(void **state); \ int __name##Setup(void **state); \ int __name##Teardown(void **state); #define TEST_SUITE_FUNC_PROTOTYPES(__name) \ static int __name##Setup(void **state); \ static int __name##Teardown(void **state); #define RUN_TEST_SUITE(__testsuite, __name) cmocka_run_group_tests(__testsuite, __name##Setup, __name##Teardown) #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) /* Used by clang analyser to check if allocated memory is freed */ #ifdef __clang_analyzer__ #define FREE_FOR_CLANG_ANALYSER(NAME, CONFIG) free(CONFIG); #else #define FREE_FOR_CLANG_ANALYSER(NAME, CONFIG) #endif #define will_set_errno(__mockf, __value) __mockf##_errno = __value #define will_return_and_set_errno(__mockf, __retval, __errno) \ do { \ __mockf##_errno = __errno; \ will_set_errno(__mockf, __errno); \ will_return(__mockf, __retval); \ } while (0) #define will_return_success(__mockf, __retval) \ do { \ will_return(__mockf, 0); \ will_return(__mockf, __retval); \ } while (0) #define will_return_error(__mockf) will_return(__mockf, -1) static inline void assert_non_null_msg(void *ptr, const char *msg) { // NOLINT if (ptr == NULL) { free(ptr); fail_msg("%s", msg); __builtin_unreachable(); } } #ifndef assert_double_equal /* * provide an implementation to compare double for cmocka prior to 1.7 */ static inline void assert_double_equal(const double left, const double right, const double epsilon) { // NOLINT double absLeft; double absRight; double largest; double relDiff; double diff = left - right; diff = (diff >= 0.f) ? diff : -diff; if (diff > epsilon) { absLeft = (left >= 0.f) ? left : -left; absRight = (right >= 0.f) ? right : -right; largest = (absRight > absLeft) ? absRight : absLeft; relDiff = largest * FLT_EPSILON; if (diff > relDiff) { fail_msg("%f != %f", left, right); } } } #endif #define will_set_parameter(METHOD, PARAM_NAME, VALUE) will_return(METHOD, VALUE); #endif /* __CMOCKA_EXTENSIONS_H__ */ mock_extensions.h000066400000000000000000000057461455674302600360160ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/include/cmocka_extensions// SPDX-License-Identifier: MIT #ifndef __MOCK_EXTENSIONS_H__ #define __MOCK_EXTENSIONS_H__ #include #include typedef void cmockaMockFunc_t(void); typedef struct { int afterCall; cmockaMockFunc_t *funcPtr; void *funcData; } cmockaMock_t; typedef enum { CMOCKA_MOCK_DISABLED = 0, CMOCKA_MOCK_ENABLED, CMOCKA_MOCK_ENABLED_WITH_FUNC, } cmockaMockTypeE_t; #define CMOCKA_MOCK_INIT \ { .afterCall = -1, .funcPtr = NULL, .funcData = NULL } #define MOCK_FUNC_AFTER_CALL_WITH(__mockf, __mocka, __mockfp, __mockfd) \ { \ __mock##_##__mockf.afterCall = __mocka; \ __mock##_##__mockf.funcPtr = (cmockaMockFunc_t *)(__mockfp); \ __mock##_##__mockf.funcData = (void *)(__mockfd); \ } #define MOCK_FUNC_AFTER_CALL(__mockf, __mocka) MOCK_FUNC_AFTER_CALL_WITH(__mockf, __mocka, NULL, NULL) #define MOCK_FUNC_ENABLE(__mockf) MOCK_FUNC_AFTER_CALL_WITH(__mockf, 0, NULL, NULL) #define MOCK_FUNC_DISABLE(__mockf) MOCK_FUNC_AFTER_CALL_WITH(__mockf, -1, NULL, NULL) /* If using MOCK_FUNC_ALWAYS in a test case make sure to call MOCK_FUNC_DISABLE on cleanup or other test cases would be effected by MOCK_FUNC_ALWAYS. */ #define MOCK_FUNC_ALWAYS_WITH(__mockf, __mockfp, __mockfd) MOCK_FUNC_AFTER_CALL_WITH(__mockf, -2, __mockfp, __mockfd); #define MOCK_FUNC_ALWAYS(__mockf) MOCK_FUNC_AFTER_CALL_WITH(__mockf, -2, NULL, NULL) #define MOCK_FUNC_NEVER(__mockf) MOCK_FUNC_DISABLE(__mockf) #define MOCK_FUNC_TYPEDEF_NEW(__name, __result, ...) typedef __result __mock##_##__name##_##t(__VA_ARGS__) #define MOCK_FUNC_TYPEDEF(__name) __mock##_##__name##_##t #define MOCK_FUNC_VAR_NEW(__name) cmockaMock_t __mock##_##__name = CMOCKA_MOCK_INIT #define MOCK_FUNC_VAR_EXTERN(__name) extern cmockaMock_t __mock##_##__name #define MOCK_FUNC_VAR(__name) __mock##_##__name #define MOCK_FUNC_PTR(__name) __mock##_##__name.funcPtr #define MOCK_FUNC_DATA(__name) __mock##_##__name.funcData #define MOCK_FUNC_DATA_NEW(__name, __type, __func) __type *__name = (__type *)MOCK_FUNC_DATA(__func) static inline cmockaMockTypeE_t _cmockaMockGetType(cmockaMock_t *mock) { cmockaMockTypeE_t result = CMOCKA_MOCK_DISABLED; if (mock->afterCall == -2) { result = CMOCKA_MOCK_ENABLED; } else if (mock->afterCall == 0) { mock->afterCall = -1; result = CMOCKA_MOCK_ENABLED; } else if (mock->afterCall > 0) { mock->afterCall -= 1; } if ((result == CMOCKA_MOCK_ENABLED) && (mock->funcPtr != NULL)) { result = CMOCKA_MOCK_ENABLED_WITH_FUNC; } return result; } #define MOCK_GET_TYPE(__mfunc) _cmockaMockGetType(&__mock##_##__mfunc) #define MOCK_IS_ACTIVE(__mfunc) (bool)MOCK_GET_TYPE(__mfunc) #endif /* __MOCK_EXTENSIONS_H__ */ mock_func_weak.h000066400000000000000000000014611455674302600355470ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/include/cmocka_extensions// SPDX-License-Identifier: MIT // There are no include guards for this header as we may need // to (re)define the macros below multiple times for // a compilation unit that uses more than one mocking library #undef MOCK_FUNC_WRAP #undef MOCK_FUNC_REAL #undef MOCK_FUNC_PROTOTYPE #undef MOCK_FUNC_BODY #define MOCK_FUNC_WITH(__mockf) ((MOCK_FUNC_TYPEDEF(__mockf) *)MOCK_FUNC_PTR(__mockf)) #define MOCK_FUNC_WRAP(__mockf) __mockf #define MOCK_FUNC_REAL(__mockf) __real##_##__mockf #define MOCK_FUNC_PROTOTYPE(__fn, __fr, ...) \ MOCK_FUNC_VAR_EXTERN(__fn); \ MOCK_FUNC_TYPEDEF_NEW(__fn, __fr, __VA_ARGS__); \ __fr MOCK_FUNC_REAL(__fn)(__VA_ARGS__); #define MOCK_FUNC_BODY(__fn, __fr, ...) \ MOCK_FUNC_VAR_NEW(__fn); \ __fr MOCK_FUNC_WRAP(__fn)(__VA_ARGS__) mock_func_wrap.h000066400000000000000000000015621455674302600355730ustar00rootroot00000000000000cmocka_extensions-cmocka_extensions-0.50.0/src/cmocka_extensions/include/cmocka_extensions// SPDX-License-Identifier: MIT // There are no include guards for this header as we may need // to (re)define the macros below multiple times for // a compilation unit that uses more than one mocking library #undef MOCK_FUNC_WRAP #undef MOCK_FUNC_REAL #undef MOCK_FUNC_PROTOTYPE #undef MOCK_FUNC_BODY #define MOCK_FUNC_WITH(__mockf) ((MOCK_FUNC_TYPEDEF(__mockf) *)MOCK_FUNC_PTR(__mockf)) #define MOCK_FUNC_WRAP(__mockf) __wrap##_##__mockf #define MOCK_FUNC_REAL(__mockf) __real##_##__mockf #define MOCK_FUNC_PROTOTYPE(__fn, __fr, ...) \ MOCK_FUNC_VAR_EXTERN(__fn); \ MOCK_FUNC_TYPEDEF_NEW(__fn, __fr, __VA_ARGS__); \ __fr MOCK_FUNC_WRAP(__fn)(__VA_ARGS__); \ __fr MOCK_FUNC_REAL(__fn)(__VA_ARGS__); #define MOCK_FUNC_BODY(__fn, __fr, ...) \ MOCK_FUNC_VAR_NEW(__fn); \ __fr MOCK_FUNC_WRAP(__fn)(__VA_ARGS__)