TOOLS AND FRAMEWORKS

Our Techstack.

As software developers and cyber security experts, we have experience with a wide range of technologies. We are broadly positioned, but can quickly delve into a topic and solve special tasks.

Software Development

Programming Languages

Over the years, we have been able to deepen our knowledge of several programming languages. Most of them we have used in large projects with tens of thousands of lines of source code.

Language Description
C/C++
C/C++ is the language where we can draw on more than 15 years of experience: from ANSI C to C11, from C++11 to C++20. We also have extensive knowledge and practical experience about the build infrastructure (Continuous Integration, CI/CD) that it takes to successfully implement projects with these languages. In addition to code generators that translate e.g. from IEC 61131-3 to this language, we have also implemented highly portable PLC runtime systems (up to SIL3 or ASIL C; ISO 262626, IEC 61508) and interpreters that are suitable for use in microcontrollers. We have already worked with GCC, Clang/LLVM, IAR, Keil and Microsoft Visual C++.
Python
Python offers numerous packages that are available to solve tasks quickly due to its widespread use. For example, we used Python to implement model-based code generators that produce build scripts and test stubs for PLC runtime systems, making it possible to check by machine whether architecture specifications are met. Furthermore, we developed our own Python disassembler for obfuscated code using a specially modified Python runtime for a reverse engineering project.
Go
Go is our language of choice for implementing backend services or tools that can be deployed as dependency-free as possible and built cross-platform. In the Go environment, we have particular experience with X.509 mechanisms, GraphQL interfaces and network protocols.
Java
Java is the language we know from the area of IDE development. We have experience in the Eclipse ecosystem and have already extended Eclipse-based IDEs with OSGi components. Examples of this are code generators for implementing PLC logic in C++ and Python, build systems for PLC applications and services that allow C/C++ toolchains to be declaratively integrated into IDEs.
Lua
Lua is loved by us because of its slimness and universal usability. We have already embedded the interpreter several times in existing C/C++ applications. We also have experience with the connection of existing libraries in Lua applications. Lua applications can also be excellently developed test-driven.
Shell
Shell are our medium of choice to automate high-level processes. This includes initialization scripts, but also complicated logic in embedded systems, for example.
others If there are tasks that require activities in other languages, we generally dare to do this, but expect a relatively longer training period, since our focus is on the languages mentioned. We have already dealt with PHP, Ruby, Perl and various Assembler dialects in projects.

Testing and Mocking Frameworks

We are advocates of test-driven development. We see the greatest advantage in the formal definition of the system associated with the test creation.

Framework Description
doctest
doctest we like to use to test applications created in modern C++. It features blazing fast compiles, which is especially beneficial during development.
Catch2
Catch2 is one of our frameworks of choice to test applications that were created in modern C++. It is widely used and provides easy-to-use and readable validation routines for virtually every mechanism in C++.
Unity Unity is characterized by low requirements for the underlying system. It is highly portable and can also be used wonderfully on embedded systems. We already published an article about integrating the framework into CMake-based projects.
ucunit ucunit is an older, ultra-lightweight test framework that we have used in particular in connection with embedded systems. We accompanied a team that certified this framework for use in testing safety-critical applications (up to SIL3, ASIL C).
cmocka cmocka is a framework we used in projects where a C library was available. What we value about this framework is that the test results can be easily evaluated.
cppunit CppUnit was our testing framework of choice in older C++ projects. We now prefer to use Catch2.
pytest
pytest is what we use to test Python code. This framework is also well suited for creating integration and/or system tests for C/C++ applications.
Testify Testify helps us to create unit- and integrationtests for software components written in Go. The standard library of the programming language itself already offers extensive support (e.g. HTTP server and client components) when creating unit and integration tests, which we like to use.
mockery mockery is what we use for the automated creation of mocks. The latter can then simply be instructed from the outside to behave as desired. This allows excellent "bad weather scenarios" to be tested.
JUnit
JUnit is used by us extensively to create unit and integration tests for Java applications.
mockito
mockito allows for creating mocks for unit and integration tests for applications developed in Java. We used it extensively to create tests for parsers and transpilers.
RCP Testing Tool (RCPTT)
RCPTT is what we used extensively to create system tests for Eclipse RCP based applications. The tests were then run "headless" through a CI/CD environment to make end-to-end scenarios reproducible.
LuaUnit LuaUnit is our framework of choice for creating unit and integration tests for components developed in Lua. It is easy to integrate and offers a variety of ready-made, easy-to-read verification routines. We mostly created mocks manually because this is quick and easy with Lua.
shUnit2 shUnit2 is what we like to use in connection with more complex logic in shell scripts. We have already published an article on our blog, where we describe how we write shell scripts test with this framework.