This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch feature/add-fuzzing in repository https://gitbox.apache.org/repos/asf/celix.git
commit a60479b50f7d4be3a022080f9c059f362129dd36 Author: Pepijn Noltes <pnol...@apache.org> AuthorDate: Thu Aug 14 15:42:14 2025 +0200 Add documentation for building benchmarks, fuzz testing, and running tests --- documents/README.md | 3 +- documents/building/README.md | 7 ++++ documents/building/benchmarks.md | 74 ++++++++++++++++++++++++++++++++++++++ documents/building/fuzz_testing.md | 74 ++++++++++++++++++++++++++++++++++++++ documents/building/testing.md | 65 +++++++++++++++++++++++++++++++++ 5 files changed, 221 insertions(+), 2 deletions(-) diff --git a/documents/README.md b/documents/README.md index c174acbe7..d5f1c6667 100644 --- a/documents/README.md +++ b/documents/README.md @@ -81,8 +81,7 @@ bundles contains binaries depending on the stdlibc++ library. * Building * [Building and Installing Apache Celix](building/README.md) - * [Building and Developing Apache Celix with CLion](building/dev_celix_with_clion.md) -* C Patterns +≈* C Patterns * [Apache Celix C Patterns](c_patterns.md) * Utils * [Apache Celix Properties & Filter](properties_and_filter.md) diff --git a/documents/building/README.md b/documents/building/README.md index c64351003..7d01b8bb7 100644 --- a/documents/building/README.md +++ b/documents/building/README.md @@ -237,3 +237,10 @@ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ../libs/pushstreams make -j sudo make install ``` + +# Further Reading + +- [Building with CLion](dev_celix_with_clion.md) +- [Building and Running Tests](testing.md) +- [Fuzz Testing](fuzz_testing.md) +- [Building and Running Benchmarks](benchmarks.md) diff --git a/documents/building/benchmarks.md b/documents/building/benchmarks.md new file mode 100644 index 000000000..d1061b3b8 --- /dev/null +++ b/documents/building/benchmarks.md @@ -0,0 +1,74 @@ +--- +title: Benchmarks in Apache Celix +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> + + +# Benchmarks in Apache Celix + +This document describes how to build and run benchmarks for Apache Celix. + +## Building Benchmarks + +Benchmarks can be built using the CMake option `ENABLE_BENCHMARKING` +The Apache Celix benchmarks uses Google benchmark library. + +To build benchmarks run: + +```sh +cmake -B build -DENABLE_BENCHMARKING=ON +cmake --build build +``` + +## Benchmarks + +The following benchmark executables are available after building the utils and framework benchmarks: + +**Utils Benchmarks:** +- `build/libs/utils/benchmark/celix_filter_benchmark` +- `build/libs/utils/benchmark/celix_long_hashmap_benchmark` +- `build/libs/utils/benchmark/celix_string_hashmap_benchmark` +- `build/libs/utils/benchmark/celix_utils_benchmark` + +**Framework Benchmarks:** +- `build/libs/framework/benchmark/celix_framework_benchmark` + +Paths may vary depending on your configuration and enabled options. + +## Running Benchmarks + +Benchmark executables are located in the `build` directory, typically under the relevant bundle or library subdirectory. To run a benchmark: + +```sh +./build/libs/utils/benchmarks/celix_utils_benchmark +## Command-Line Options +The benchmark executables accept standard Google Benchmark command-line options. +For example, to run only benchmarks matching a specific pattern and output results in JSON format: + +```bash +./build/libs/utils/benchmark/celix_filter_benchmark --benchmark_filter=complexFilter --benchmark_format=json +``` + +Replace `celix_utils_benchmark` and the filter pattern as needed. To see a list of supported command-line flags, run the benchmark executable with the `--help` option: + +```bash +./build/libs/utils/benchmarks/./celix_filter_benchmark --help +``` + +This will display all available Google Benchmark options. diff --git a/documents/building/fuzz_testing.md b/documents/building/fuzz_testing.md new file mode 100644 index 000000000..50f0abb21 --- /dev/null +++ b/documents/building/fuzz_testing.md @@ -0,0 +1,74 @@ +--- +title: Fuzz testing with libFuzzer +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> + +# Fuzz Testing with libFuzzer + +The utilities library contains fuzz targets that can be built with +[LLVM libFuzzer](https://llvm.org/docs/LibFuzzer.html). Fuzzing is +enabled when using the Clang compiler and the `UTILS_LIBFUZZER` CMake +option. + +## Building + +Configure CMake with Clang and enable the libFuzzer option: + +```bash +cmake \ + -G Ninja \ + -S . -B build \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DENABLE_FUZZING=ON +``` + +Build the fuzzer executables: + +```bash +cmake --build build --parallel --target celix_properties_fuzzer celix_version_fuzzer celix_filter_fuzzer +``` + +## Corpus + +The `corpus` directories for the fuzzers contain a few seed inputs, which help guide the initial fuzzing process. +More files can be added to these directories to improve coverage. The fuzzer will automatically use all files in the +specified corpus directory as starting points for mutation and exploration. + +## Running +The resulting fuzzers accept standard libFuzzer command line options. For example, to run each fuzzer for 30 seconds +using the provided seed corpus and print coverage information: + +```bash +./build/libs/utils/celix_filter_fuzzer -max_total_time=30 -print_coverage=1 ./build/libs/utils/filter_corpus +``` + +Replace `celix_filter_fuzzer` and `filter_corpus` with the appropriate fuzzer executable and corpus directory as needed. +To see a list of supported command-line flags, run the fuzzer executable with the `-help=1` option. For example: + +```bash +./build/libs/utils/celix_filter_fuzzer -help=1 +``` + +This will display all available LibFuzzer options. + +## Continuous Fuzzing + +A GitHub Actions workflow runs the fuzzer periodically. The workflow +configuration can be found at `.github/workflows/fuzzing.yml`. diff --git a/documents/building/testing.md b/documents/building/testing.md new file mode 100644 index 000000000..557258ce0 --- /dev/null +++ b/documents/building/testing.md @@ -0,0 +1,65 @@ +--- +title: Testing Apache Celix +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> + +# Testing Apache Celix + +This document describes how to build and run tests for Apache Celix. + +## Building Tests + +Celix uses CMake and Google Test for its unit and integration tests. To build the tests, ensure you have all dependencies installed, then run: + +```sh +cmake -B build -DENABLE_TESTING=ON -DCMAKE_BUILD_TYPE=Debug +cmake --build build +``` + +```sh +#conan + +To enable AddressSanitizer (ASAN) when building tests, configure CMake with the `ENABLE_ASAN` option: + +```sh +cmake -B build -DENABLE_TESTING=ON -DENABLE_ADDRESS_SANITIZER=ON -DCMAKE_BUILD_TYPE=Debug +cmake --build build +``` + +This will build Apache Celix and its tests with ASAN enabled, helping to detect memory errors during test execution. + +## Running Tests + +After building, you can run all tests using CTest: + +```sh +ctest --output-on-failure --test-dir build +``` + +Or run a test for a specific subdir, e.g.: + +```sh +ctest --output-on-failure --test-dir build/bundles/shell +``` + +Or run a specific test binary directly from the `build` directory, e.g.: + +```sh +./build/bundles/components_ready_check/tests/components_ready_check_test +```