-
Notifications
You must be signed in to change notification settings - Fork 19
Description
Review API tests (public/exported symbols) vs unit tests (private or hidden utility classes and functions). Most of the ACF tests fall under the API test category (they link against public symbols in the ACF_EXPORT classes + functions. We may also have utility hidden/private code that is tested only indirectly through the API calls, and that warrants more rigorous direct testing elsewhere. Two examples of private code that warrants direct testing are the local ACF shader classes and the optimized SIMD RGBA/texture unpacking code. We don't want to add such functionality to the API just to support devops testing tasks, so we have a few options.
- Ideally, we would build this code in
OBJECTlibraries so it could be reused in a test app and by the main ACF library, but OBJECT libraries aren't portable in general.
- pros: optimal
- cons: OBJECT libraries aren't portable
- As an alternative we can build that code as a support
STATIClibrary, and the main ACF library can link to that code. The additional library should be more or less transparent to the user if they are using aSHAREDACF library (it is absorbed by the library) or if they are using aSTATICACF library through CMakefind_package(acf CONFIG REQUIRED) target_link_libraries(foo PUBLIC acf::acf)since the generated package configuration code will provide the transitive linking transparently.
- pros: supports reuse (avoid recompilation)
- cons: adds another library (mostly an issue for STATIC builds and non-cmake users -- in practice, it would be fairly messy to use ACF as a STATIC lib without CMake/Hunter anyway, due to the STATIC 3rdparty dependencies, so that seems to weaken the argument against introducing support STATIC libraries)
- If we want to avoid exporting an additional private library (it wouldn't have public headers but would be exported in the installation step), then we could collect the required source (sugar, etc) and just recompile the code directly into the test exe or via a test only static lib.
- pros: avoid introducing an extra support lib in the ACF export set
- cons: requires recompilation of the code (not a huge concern in ACF) and adds some additional build complexity
Since the ACF API tests will link to the compiled ACF library, and the ACF unit tests will link to some copy of private ACF code (already inside the the ACF library) the two tests should be managed in separate executables to avoid ODR conflicts.