From ded328cd18c66c1f0e4ff3acb95e77d8af811344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 27 Sep 2022 16:15:19 +0200 Subject: [PATCH] imageconverter: start testing this executable as well. Just the --info for now. This seemingly adds quite a lot of uncovered lines, but those were uncovered before as well, it's just actually visible now. --- package/ci/circleci.yml | 2 +- src/Magnum/Trade/Test/CMakeLists.txt | 37 ++++- src/Magnum/Trade/Test/ImageConverterTest.cpp | 140 ++++++++++++++++++ .../Test/ImageConverterTestFiles/file.tga | Bin 0 -> 24 bytes .../info-data-ignored-output.txt | 4 + .../ImageConverterTestFiles/info-data.txt | 3 + src/Magnum/Trade/Test/configure.h.cmake | 19 +++ 7 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 src/Magnum/Trade/Test/ImageConverterTest.cpp create mode 100644 src/Magnum/Trade/Test/ImageConverterTestFiles/file.tga create mode 100644 src/Magnum/Trade/Test/ImageConverterTestFiles/info-data-ignored-output.txt create mode 100644 src/Magnum/Trade/Test/ImageConverterTestFiles/info-data.txt diff --git a/package/ci/circleci.yml b/package/ci/circleci.yml index c26a3fdf3..849e258d8 100644 --- a/package/ci/circleci.yml +++ b/package/ci/circleci.yml @@ -385,7 +385,7 @@ jobs: # to be either installed or static. Tests are however deliberately run # before install, so the static builds are the only case where the # utilities get thoroughly tested. - EXTRA_OPTS: -DMAGNUM_SCENECONVERTER_STATIC_PLUGINS=Magnum::AnySceneImporter;Magnum::AnySceneConverter;Magnum::ObjImporter + EXTRA_OPTS: -DMAGNUM_SCENECONVERTER_STATIC_PLUGINS=Magnum::AnySceneImporter;Magnum::AnySceneConverter;Magnum::ObjImporter -DMAGNUM_IMAGECONVERTER_STATIC_PLUGINS=Magnum::AnyImageImporter;Magnum::AnyImageConverter;Magnum::TgaImporter;Magnum::TgaImageConverter CMAKE_CXX_FLAGS: --coverage LCOV_EXTRA_OPTS: --gcov-tool /usr/bin/gcov-4.8 CONFIGURATION: Debug diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index 7364ecc3f..9ee972963 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -35,20 +35,29 @@ else() set(TRADE_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) endif() +# Executable testing is implemented on Unix platforms only at the moment, so +# don't even provide the filename elsewhere. +if(MAGNUM_WITH_IMAGECONVERTER AND CORRADE_TARGET_UNIX) + set(IMAGECONVERTER_EXECUTABLE_FILENAME $) +endif() + +# First replace ${} variables, then $<> generator expressions configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) corrade_add_test(TradeAbstractImageConverterTest AbstractImageConverterTest.cpp LIBRARIES MagnumTradeTestLib) -target_include_directories(TradeAbstractImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(TradeAbstractImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) corrade_add_test(TradeAbstractImporterTest AbstractImporterTest.cpp LIBRARIES MagnumTradeTestLib FILES file.bin) -target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) corrade_add_test(TradeAbstractSceneConverterTest AbstractSceneConverterTest.cpp LIBRARIES MagnumTradeTestLib) -target_include_directories(TradeAbstractSceneConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(TradeAbstractSceneConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) corrade_add_test(TradeAnimationDataTest AnimationDataTest.cpp LIBRARIES MagnumTradeTestLib) corrade_add_test(TradeCameraDataTest CameraDataTest.cpp LIBRARIES MagnumTradeTestLib) @@ -59,7 +68,25 @@ corrade_add_test(TradeImageConverterImplementa___Test ImageConverterImplementati LIBRARIES MagnumTrade FILES ImageConverterImplementationTestFiles/info.txt) -target_include_directories(TradeImageConverterImplementa___Test PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(TradeImageConverterImplementa___Test PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) + +# Executable testing is implemented on Unix platforms only at the moment +if(CORRADE_TARGET_UNIX AND NOT CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT) + corrade_add_test(TradeImageConverterTest ImageConverterTest.cpp + LIBRARIES + MagnumTrade + # Link the same static plugins as for the magnum-imageconverter + # executable so plugin existence checks are consistent between the two + ${MAGNUM_IMAGECONVERTER_STATIC_PLUGINS} + FILES + ImageConverterTestFiles/info-data.txt + ImageConverterTestFiles/info-data-ignored-output.txt + ImageConverterTestFiles/file.tga) + target_include_directories(TradeImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) + if(MAGNUM_WITH_IMAGECONVERTER) + add_dependencies(TradeImageConverterTest magnum-imageconverter) + endif() +endif() corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES MagnumTradeTestLib) corrade_add_test(TradeLightDataTest LightDataTest.cpp LIBRARIES MagnumTradeTestLib) diff --git a/src/Magnum/Trade/Test/ImageConverterTest.cpp b/src/Magnum/Trade/Test/ImageConverterTest.cpp new file mode 100644 index 000000000..b239d90a7 --- /dev/null +++ b/src/Magnum/Trade/Test/ImageConverterTest.cpp @@ -0,0 +1,140 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020, 2021, 2022 Vladimír Vondruš + + 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. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Magnum/Trade/AbstractImporter.h" + +#include "configure.h" + +namespace Magnum { namespace Trade { namespace Test { namespace { + +struct ImageConverterTest: TestSuite::Tester { + explicit ImageConverterTest(); + + void info(); +}; + +using namespace Containers::Literals; + +const struct { + const char* name; + Containers::Array args; + const char* requiresImporter; + const char* expected; +} InfoData[]{ + {"data", Containers::array({ + "-I", "TgaImporter", "--info", Utility::Path::join(TRADE_TEST_DIR, "ImageConverterTestFiles/file.tga")}), + "TgaImporter", + "info-data.txt"}, + {"data, map", Containers::array({ + "--map", "-I", "TgaImporter", "--info", Utility::Path::join(TRADE_TEST_DIR, "ImageConverterTestFiles/file.tga")}), + "TgaImporter", + /** @todo change to something else once we have a plugin that can + zero-copy pass the imported data */ + "info-data.txt"}, + {"data, ignored output file", Containers::array({ + "-I", "TgaImporter", "--info", Utility::Path::join(TRADE_TEST_DIR, "ImageConverterTestFiles/file.tga"), "whatever.png"}), + "TgaImporter", + "info-data-ignored-output.txt"} +}; + +ImageConverterTest::ImageConverterTest() { + #ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT + addInstancedTests({&ImageConverterTest::info}, + Containers::arraySize(InfoData)); + #endif + + /* Create output dir, if doesn't already exist */ + Utility::Path::make(Utility::Path::join(TRADE_TEST_OUTPUT_DIR, "ImageConverterTestFiles")); +} + +namespace { + +#ifdef IMAGECONVERTER_EXECUTABLE_FILENAME +/** @todo take a StringIterable once it exists */ +Containers::Pair call(Containers::ArrayView arguments) { + /* Create a string view array for the arguments, implicitly pass the + application name and plugin directory override */ + /** @todo drop once StringIterable exists */ + Containers::Array argumentViews{ValueInit, arguments.size() + 3}; + argumentViews[0] = ""_s; + argumentViews[1] = "--plugin-dir"_s; + argumentViews[2] = MAGNUM_PLUGINS_INSTALL_DIR; + for(std::size_t i = 0; i != arguments.size(); ++i) + argumentViews[i + 3] = arguments[i]; + + const Containers::String outputFilename = Utility::Path::join(TRADE_TEST_OUTPUT_DIR, "ImageConverterTestFiles/output.txt"); + /** @todo clean up once Utility::System::execute() with output redirection + exists */ + const bool success = std::system(Utility::format("{} {} > {} 2>&1", + IMAGECONVERTER_EXECUTABLE_FILENAME, + " "_s.join(argumentViews), /** @todo handle space escaping here? */ + outputFilename + ).data()) == 0; + + const Containers::Optional output = Utility::Path::readString(outputFilename); + CORRADE_VERIFY(output); + + return {success, std::move(*output)}; +} +#endif + +} + +void ImageConverterTest::info() { + auto&& data = InfoData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + #ifndef IMAGECONVERTER_EXECUTABLE_FILENAME + CORRADE_SKIP("magnum-imageconverter not built, can't test"); + #else + /* Check if required plugins can be loaded. Catches also ABI and interface + mismatch errors. */ + PluginManager::Manager importerManager{MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR}; + if(data.requiresImporter && !(importerManager.load(data.requiresImporter) & PluginManager::LoadState::Loaded)) + CORRADE_SKIP(data.requiresImporter << "plugin can't be loaded."); + + CORRADE_VERIFY(true); /* capture correct function name */ + + Containers::Pair output = call(data.args); + CORRADE_COMPARE_AS(output.second(), + Utility::Path::join({TRADE_TEST_DIR, "ImageConverterTestFiles", data.expected}), + TestSuite::Compare::StringToFile); + CORRADE_VERIFY(output.first()); + #endif +} + +}}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::ImageConverterTest) diff --git a/src/Magnum/Trade/Test/ImageConverterTestFiles/file.tga b/src/Magnum/Trade/Test/ImageConverterTestFiles/file.tga new file mode 100644 index 0000000000000000000000000000000000000000..711486718a0f3ccfad7e39ebfaae81823912afae GIT binary patch literal 24 XcmZQzU}k^;CLo)Gfsu)sg_R8e0SEvl literal 0 HcmV?d00001 diff --git a/src/Magnum/Trade/Test/ImageConverterTestFiles/info-data-ignored-output.txt b/src/Magnum/Trade/Test/ImageConverterTestFiles/info-data-ignored-output.txt new file mode 100644 index 000000000..505a0b8d6 --- /dev/null +++ b/src/Magnum/Trade/Test/ImageConverterTestFiles/info-data-ignored-output.txt @@ -0,0 +1,4 @@ +Ignoring output file for --info: whatever.png +2D image 0: + Level 0: {2, 3} @ R8Unorm (0.0 kB) +Total image data size: 0.0 kB diff --git a/src/Magnum/Trade/Test/ImageConverterTestFiles/info-data.txt b/src/Magnum/Trade/Test/ImageConverterTestFiles/info-data.txt new file mode 100644 index 000000000..d268ad237 --- /dev/null +++ b/src/Magnum/Trade/Test/ImageConverterTestFiles/info-data.txt @@ -0,0 +1,3 @@ +2D image 0: + Level 0: {2, 3} @ R8Unorm (0.0 kB) +Total image data size: 0.0 kB diff --git a/src/Magnum/Trade/Test/configure.h.cmake b/src/Magnum/Trade/Test/configure.h.cmake index 2bc6df432..f328ef8db 100644 --- a/src/Magnum/Trade/Test/configure.h.cmake +++ b/src/Magnum/Trade/Test/configure.h.cmake @@ -25,3 +25,22 @@ #define TRADE_TEST_DIR "${TRADE_TEST_DIR}" #define TRADE_TEST_OUTPUT_DIR "${TRADE_TEST_OUTPUT_DIR}" +#cmakedefine IMAGECONVERTER_EXECUTABLE_FILENAME "${IMAGECONVERTER_EXECUTABLE_FILENAME}" + +#ifdef CORRADE_TARGET_WINDOWS +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}" +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}" +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR}" +#endif +#else +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}" +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}" +#define MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" +#endif +#endif