Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adding windows test driver fix #293

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
16 changes: 7 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ endif()
#

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} -Werror -Wall -Wextra -Wsuggest-override ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} -Wall -Wextra -Wsuggest-override ${CMAKE_CXX_FLAGS}")
# TODO: A better fix should handle ld's --as-needed flag
if(UNIX AND NOT APPLE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker '--no-as-needed'")
Expand Down Expand Up @@ -165,15 +165,12 @@ if(CUKE_ENABLE_QT_5)

message(STATUS "Found Qt version: ${Qt5Core_VERSION_STRING}")
if(Qt5Core_VERSION_STRING VERSION_LESS 5.15.0)
add_library(Qt::Core INTERFACE IMPORTED)
add_library(Qt::Gui INTERFACE IMPORTED)
add_library(Qt::Widgets INTERFACE IMPORTED)
add_library(Qt::Test INTERFACE IMPORTED)
set_target_properties(Qt::Core PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Core )
set_target_properties(Qt::Gui PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Gui )
set_target_properties(Qt::Widgets PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Widgets)
set_target_properties(Qt::Test PROPERTIES INTERFACE_LINK_LIBRARIES Qt5::Test )
add_library( Qt::Core ALIAS Qt5::Core)
add_library( Qt::Gui ALIAS Qt5::Gui)
add_library( Qt::Widgets ALIAS Qt5::Widgets)
add_library( Qt::Test ALIAS Qt5::Test)
endif()
set( CUKE_QT_RUNTIME_PATH $<TARGET_FILE_DIR:Qt5::Test> )
endif()

if(CUKE_ENABLE_QT_6)
Expand All @@ -185,6 +182,7 @@ if(CUKE_ENABLE_QT_6)
)

message(STATUS "Found Qt version: ${Qt6Core_VERSION}")
set( CUKE_QT_RUNTIME_PATH $<TARGET_FILE_DIR:Qt6::Test> )
endif()


Expand Down
50 changes: 44 additions & 6 deletions run-windows.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ $cmake_params = "-E chdir build cmake",
$cmake_params += "-DCMAKE_CXX_STANDARD=${cpp_standard}"

$cmake_params += "-DCUKE_ENABLE_BOOST_TEST=OFF"
$cmake_params += "-DCUKE_ENABLE_GTEST=OFF"
$cmake_params += "-DCUKE_ENABLE_QT_6=OFF"
$cmake_params += "-DCUKE_ENABLE_EXAMPLES=OFF"
$cmake_params += "-DCUKE_TESTS_UNIT=OFF"
$cmake_params += "-DCUKE_ENABLE_GTEST=ON"
$cmake_params += "-DCUKE_ENABLE_QT_6=ON"
$cmake_params += "-DCUKE_ENABLE_EXAMPLES=ON"
$cmake_params += "-DCUKE_TESTS_UNIT=ON"
$cmake_params += "-DCUKE_CODE_COVERAGE=OFF"

$cmake_params += "-Dnlohmann_json_DIR=${nlohmann_json_DIR}"
Expand All @@ -61,6 +61,44 @@ $cmake_params += "-DTCLAP_ROOT=${TCLAP_ROOT}"

$cmake_params += ".."


Invoke-CMake "$cmake_params"
Invoke-CMake "--build","build" #,"--parallel"
Invoke-CMake "--build","build","--config","Release" #,"--parallel"
Invoke-CMake "--build","build","--config","Release","--target","RUN_TESTS"

#
# Execute Calc examples
#

$CalcTests = @("build\examples\Calc\Release\GTestCalculatorSteps.exe",
"build\examples\Calc\Release\BoostCalculatorSteps.exe",
"build\examples\Calc\Release\FuncArgsCalculatorSteps.exe",
"build\examples\Calc\Release\QtTestCalculatorSteps.exe")

For ($i=0; $i -lt $CalcTests.Length; $i++) {
Write-Host "Start Test $($CalcTests[$i])" -f Green
Start-Process -NoNewWindow $CalcTests[$i]
Start-Sleep -Seconds 1.0
Set-Location -Path 'examples/Calc'
Start-Process cucumber -NoNewWindow -Wait
set-Location -Path $PSScriptRoot
}
#
# Execute QtCalc examples
#

$QtCalcTests = @("build\examples\CalcQt\Release\GTestCalculatorQtSteps.exe",
"build\examples\CalcQt\Release\QtTestCalculatorQtSteps.exe",
"build\examples\CalcQt\Release\BoostCalculatorQtSteps.exe")

For ($i=0; $i -lt $QtCalcTests.Length; $i++) {
Write-Host "Start Test $($QtCalcTests[$i])" -f Green
Start-Process -NoNewWindow $QtCalcTests[$i]
Start-Sleep -Seconds 1.0
Set-Location -Path 'examples/CalcQt'
Start-Process cucumber -NoNewWindow -Wait
set-Location -Path $PSScriptRoot
}

Invoke-CMake "--build","build","--config","Release","--target","INSTALL"


67 changes: 60 additions & 7 deletions src/drivers/QtTestDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,81 @@
#include <QTextStream>
#include <QTemporaryFile>

#include <iostream>

namespace cucumber {
namespace internal {

// wraps the QTemporaryFile creation
// on Windows the file could not be written as long as QTemporaryFile owner of the file.
Comment on lines +12 to +13
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spelling, I'd suggest (but I'm not a native speaker):

// Wraps the QTemporaryFile creation.
// Needed because on Windows, the file can not be written from QtTest as long as we keep it open.


class TemporaryFileWrapper {
public:
static TemporaryFileWrapper create() {
QTemporaryFile tempFile(QString("%1/%2_%3")
.arg(
QDir::tempPath(),
qApp->applicationName().isEmpty() ? "qt_temp"
: qApp->applicationName()
)
.arg(qApp->applicationPid()));

if (!tempFile.open()) {
return {};
}

return {tempFile.fileName() + ".txt"};
}

TemporaryFileWrapper() :
filename{} {
}

TemporaryFileWrapper(QString filename) :
filename{filename} {
}

~TemporaryFileWrapper() {
QFile::remove(filename);
}

bool exists() const {
return !filename.isEmpty();
}

QString name() const {
return filename;
}

QString read() const {
QFile file{filename};
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return QString();
QTextStream in(&file);
return in.readAll();
}

private:
QString filename;
};

const InvokeResult QtTestStep::invokeStepBody() {
QTemporaryFile file;
if (!file.open()) {
const auto file = TemporaryFileWrapper::create();
if (!file.exists()) {
return InvokeResult::failure("Unable to open temporary file needed for this test");
}
file.close();

QtTestObject testObject(this);
int returnValue = QTest::qExec(
&testObject,
QStringList() << "test"
<< "-o" << file.fileName()
<< "-o" << file.name()
);

if (returnValue == 0) {
return InvokeResult::success();
} else {
file.open();
QTextStream ts(&file);
return InvokeResult::failure(ts.readAll().toLocal8Bit());
return InvokeResult::failure(file.read().toLocal8Bit());
Comment on lines +66 to +81
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good 👍

}
}

Expand Down
26 changes: 26 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,30 @@ target_include_directories(utils INTERFACE
.
)

function(cuke_set_environment environment)
set(options)
set(oneValueArgs )
set(multiValueArgs RUNPATH)

cmake_parse_arguments(CUKE_ENV "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

if(NOT "${CUKE_ENV_UNPARSED_ARGUMENTS}" STREQUAL "")
message(
FATAL_ERROR
"unparsed arguments in call to cuke_set_environment: ${CUKE_ENV_UNPARSED_ARGUMENTS} from ${CMAKE_CURRENT_LIST_FILE}"
)
endif()

if( NOT "${CUKE_ENV_RUNPATH}" STREQUAL "")
if(WIN32)
string(REPLACE ";" "\;" CUKE_ENV_RUNPATH "${CUKE_ENV_RUNPATH}")
endif()
set(RUNPATH "$<IF:$<PLATFORM_ID:Windows>,PATH,LD_LIBRARY_PATH>")
list(APPEND environment "$<IF:$<PLATFORM_ID:Windows>,PATH,LD_LIBRARY_PATH>=path_list_prepend:$<SHELL_PATH:${CUKE_ENV_RUNPATH}>")
endif()
set(${environment} ${${environment}} PARENT_SCOPE)
endfunction()

Comment on lines +14 to +37
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a lot of code to just support Windows. Is it possible to move this to run-windows.ps1 (if it makes sense).

@cwellm any ideas from your side?

function(cuke_add_driver_test TEST_FILE)
get_filename_component(TEST_NAME ${TEST_FILE} NAME)
message(STATUS "Adding " ${TEST_NAME})
Expand Down Expand Up @@ -63,6 +87,8 @@ if((TARGET Qt::Test)
AND (NOT VALGRIND_TESTS)
)
cuke_add_driver_test(integration/drivers/QtTestDriverTest Qt::Test)
cuke_set_environment( QTTEST_ENVIRONMENT RUNPATH "${CUKE_QT_RUNTIME_PATH}" )
set_tests_properties(QtTestDriverTest PROPERTIES ENVIRONMENT_MODIFICATION ${QTTEST_ENVIRONMENT})
endif()

cuke_add_driver_test(integration/drivers/GenericDriverTest)
Loading