Browse Source

CTest: Restore inheritance of stdin by test processes

Since commit v3.11.0-rc1~117^2 (CTest: Re-implement test process
handling using libuv, 2017-12-10) we do not give the child test
processes any stdin.  Prior to that change we let the child test
processes inherit stdin from ctest itself.  Tests that run serially
might be able to use the real stdin meaningfully, so restore that
behavior and add a test case.

Fixes: #18591
pull/324/head
Brad King 7 years ago
parent
commit
86e8315482
  1. 3
      Source/CTest/cmProcess.cxx
  2. 3
      Tests/RunCMake/CMakeLists.txt
  3. 12
      Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
  4. 1
      Tests/RunCMake/CTestCommandLine/TestStdin-stdin.txt
  5. 1
      Tests/RunCMake/CTestCommandLine/TestStdin-stdout.txt
  6. 18
      Tests/RunCMake/print_stdin.c

3
Source/CTest/cmProcess.cxx

@ -127,7 +127,8 @@ bool cmProcess::StartProcess(uv_loop_t& loop, std::vector<size_t>* affinity)
uv_pipe_open(pipe_writer, fds[1]);
uv_stdio_container_t stdio[3];
stdio[0].flags = UV_IGNORE;
stdio[0].flags = UV_INHERIT_FD;
stdio[0].data.fd = 0;
stdio[1].flags = UV_INHERIT_STREAM;
stdio[1].data.stream = pipe_writer;
stdio[2] = stdio[1];

3
Tests/RunCMake/CMakeLists.txt

@ -368,7 +368,8 @@ add_RunCMake_test(FetchContent)
if(NOT CMake_TEST_EXTERNAL_CMAKE)
set(CTestCommandLine_ARGS -DTEST_AFFINITY=$<TARGET_FILE:testAffinity>)
endif()
add_RunCMake_test(CTestCommandLine)
add_executable(print_stdin print_stdin.c)
add_RunCMake_test(CTestCommandLine -DTEST_PRINT_STDIN=$<TARGET_FILE:print_stdin>)
add_RunCMake_test(CacheNewline)
# Only run this test on unix platforms that support
# symbolic links

12
Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake

@ -161,3 +161,15 @@ endfunction()
if(TEST_AFFINITY)
run_TestAffinity()
endif()
function(run_TestStdin)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestStdin)
set(RunCMake_TEST_NO_CLEAN 1)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
add_test(TestStdin \"${TEST_PRINT_STDIN}\")
")
run_cmake_command(TestStdin ${CMAKE_CTEST_COMMAND} -V)
endfunction()
run_TestStdin()

1
Tests/RunCMake/CTestCommandLine/TestStdin-stdin.txt

@ -0,0 +1 @@
Content for TestStdin

1
Tests/RunCMake/CTestCommandLine/TestStdin-stdout.txt

@ -0,0 +1 @@
Content for TestStdin

18
Tests/RunCMake/print_stdin.c

@ -0,0 +1,18 @@
#include <stdio.h>
int main()
{
char buf[1024];
size_t nIn = sizeof(buf);
while (nIn == sizeof(buf)) {
nIn = fread(buf, 1, sizeof(buf), stdin);
if (nIn > 0) {
size_t nOut;
nOut = fwrite(buf, 1, nIn, stdout);
if (nOut != nIn) {
return 1;
}
}
}
return 0;
}
Loading…
Cancel
Save