Testcontainers for C/C++/Swift and other native languages#
Warning
This is a prototype. There is a lot to do before it can be distributed and used in production, see the GitHub Issues and the project roadmap
This is not a standalone Testcontainers engine, but a C-style shared library adapter for native languages like C/C++, D, Lua, Swift, etc. It is an MVP SDK that can be later extended for the languages. The project is based on Testcontainers for Go which is one of the most powerful Testcontainers implementations.
Contributions and feedback are welcome!
Also join the #testcontainers-native
channel on the Testcontainers Slack.
Key Features#
- Testcontainers for C/C++ - a shared library and C-style headers that can be used in native projects
- Support for C, C++, Swift and other native projects.
- Minimum viable Testcontainers API functionality: starting and terminating containers, passing files, exposing ports, accessing container logs, etc.
- Minimum HTTP client wrapper to simplify requests and assertions
- Testcontainers for Go under the hood, with all its reporting and resource management capabilities. Memory might leak a lot in the current versions, but we do not want containers to leak :)
- Support for Testcontainers Modules
This is what a very simple run without a test framework may look like.
Quick Start#
Follow the Getting Started Guide.
Installing the library#
It is advised to include CMake as a dependent module for now. If you like living dangerously until proper vcpkg and Conan packages are ready, you can optionally install the library to your system:
Documentation#
Using in C/C++/Swift projects#
See the examples and demos for more examples.
Using in other languages#
TL;DR: You get the C header file, a shared library object or a DLL file from the Testcontainers for C module. Then, you can bind this native library in your project type. It allows supporting many other languages that support using native tooling via dynamically or statically linked libraries:
Disclaimer: The schema above shows the most popular languages for Embedded systems, based on the IEEE Spectrum 2021 Report and the JetBrains 2021 Developer Ecosystem Survey for Embedded Software. More native languages exist and can be supported by Testcontainers Native.
Feel free to contribute examples or SDKs for the languages! See the Swift Solution Page for examples. Testcontainers Native Architecture describes how it can be done in principle.
Credits#
Using a complex Golang framework from C/C++ is not trivial. Neither the CMake files are. This project would not succeed without many quality articles and help from the community.
Kudos to:
- All Testcontainers, Golang C-Shared build mode, CGO and WireMock contributors!
- Manuel de la Peña for maintaining Testcontainers for Go and answering bizarre questions about the implementations
:-)
- Vladimir Vivien for Calling Go Functions from Other Languages using C Shared Libraries
- Ben McClelland for An Adventure into CGO - Calling Go code with C
- Insu Jang for Implementing Kubernetes C++ Client Library using Go Client Library
- Infinite number of StackOverflow contributors
Discuss#
For any questions and feedback,
join the #testcontainers-native
channel on the Testcontainers Slack.
Support the Project#
The best support is investing some time in the project. All contributions are welcome, checkout the Contributor Guide. Of course, GitHub Sponsorships will be appreciated too.