fix tests
This commit is contained in:
@@ -21,8 +21,8 @@
|
|||||||
#ifndef MICRO_PIP
|
#ifndef MICRO_PIP
|
||||||
|
|
||||||
# include "piincludes_p.h"
|
# include "piincludes_p.h"
|
||||||
# include "piprocess.h"
|
|
||||||
# include "piliterals_bytes.h"
|
# include "piliterals_bytes.h"
|
||||||
|
# include "piprocess.h"
|
||||||
# ifndef WINDOWS
|
# ifndef WINDOWS
|
||||||
# include <csignal>
|
# include <csignal>
|
||||||
# include <sys/wait.h>
|
# include <sys/wait.h>
|
||||||
@@ -82,9 +82,9 @@ constexpr int StdFileCount = StdLast + 1;
|
|||||||
|
|
||||||
# ifdef WINDOWS
|
# ifdef WINDOWS
|
||||||
using PipeHandleType = HANDLE;
|
using PipeHandleType = HANDLE;
|
||||||
using SizeType = DWORD;
|
using SizeType = DWORD;
|
||||||
# else
|
# else
|
||||||
using SizeType = ssize_t;
|
using SizeType = ssize_t;
|
||||||
using PipeHandleType = int;
|
using PipeHandleType = int;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
@@ -142,8 +142,8 @@ PRIVATE_DEFINITION_START(PIProcess)
|
|||||||
const int pt = pipe_type;
|
const int pt = pipe_type;
|
||||||
# ifdef WINDOWS
|
# ifdef WINDOWS
|
||||||
SECURITY_ATTRIBUTES saAttr;
|
SECURITY_ATTRIBUTES saAttr;
|
||||||
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
saAttr.bInheritHandle = TRUE;
|
saAttr.bInheritHandle = TRUE;
|
||||||
satrueAttr.lpSecurityDescriptor = NULL;
|
satrueAttr.lpSecurityDescriptor = NULL;
|
||||||
if (!CreatePipe(&(pipes[pt][PipeRead]), &(pipes[pt][PipeWrite]), &saAttr, 0)) return false;
|
if (!CreatePipe(&(pipes[pt][PipeRead]), &(pipes[pt][PipeWrite]), &saAttr, 0)) return false;
|
||||||
return true;
|
return true;
|
||||||
@@ -172,15 +172,27 @@ PRIVATE_DEFINITION_START(PIProcess)
|
|||||||
|
|
||||||
|
|
||||||
void closePipe(StdFile pipe_type, PipeDirection direction) {
|
void closePipe(StdFile pipe_type, PipeDirection direction) {
|
||||||
if (grab[pipe_type]) {
|
closePipe(pipes[pipe_type][direction]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void closePipe(PipeHandleType & hpipe) {
|
||||||
# ifdef WINDOWS
|
# ifdef WINDOWS
|
||||||
CloseHandle(pipes[pipe_type][direction]);
|
if (hpipe] != 0) {
|
||||||
pipes[pipe_type][direction] = 0;
|
CloseHandle(hpipe);
|
||||||
# else
|
hpipe = 0;
|
||||||
::close(pipes[pipe_type][direction]);
|
|
||||||
pipes[pipe_type][direction] = -1;
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
# else
|
||||||
|
if (hpipe != -1) {
|
||||||
|
::close(hpipe);
|
||||||
|
hpipe = -1;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void closeAllPipes() {
|
||||||
|
forEachPipe([this](PipeHandleType & hpipe) { closePipe(hpipe); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -190,14 +202,14 @@ PRIVATE_DEFINITION_START(PIProcess)
|
|||||||
PIByteArray read_buffer;
|
PIByteArray read_buffer;
|
||||||
read_buffer.resize(read_buffer_size);
|
read_buffer.resize(read_buffer_size);
|
||||||
SizeType bytes_read = 0;
|
SizeType bytes_read = 0;
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
# ifdef WINDOWS
|
# ifdef WINDOWS
|
||||||
BOOL ok = ReadFile(pipes[pipe_type][PipeRead], read_buffer.data(offset), read_buffer.size() - offset, &bytes_read, NULL);
|
BOOL ok = ReadFile(pipes[pipe_type][PipeRead], read_buffer.data(offset), read_buffer.size() - offset, &bytes_read, NULL);
|
||||||
if (!ok) bytes_read = 0;
|
if (!ok) bytes_read = 0;
|
||||||
#else
|
# else
|
||||||
bytes_read = ::read(pipes[pipe_type][PipeRead], read_buffer.data(offset), read_buffer.size() - offset);
|
bytes_read = ::read(pipes[pipe_type][PipeRead], read_buffer.data(offset), read_buffer.size() - offset);
|
||||||
#endif
|
# endif
|
||||||
piCout << "readed" << bytes_read;
|
piCout << "readed" << bytes_read;
|
||||||
if (bytes_read > 0) {
|
if (bytes_read > 0) {
|
||||||
offset += bytes_read;
|
offset += bytes_read;
|
||||||
@@ -214,12 +226,13 @@ PRIVATE_DEFINITION_START(PIProcess)
|
|||||||
|
|
||||||
bool writePipe(const PIByteArray & data) {
|
bool writePipe(const PIByteArray & data) {
|
||||||
SizeType sz = 0;
|
SizeType sz = 0;
|
||||||
# ifdef WINDOWS
|
# ifdef WINDOWS
|
||||||
BOOL ok = WriteFile(pipes[StdIn][PipeWrite], data.data(), data.size(), &sz, NULL);
|
BOOL ok = WriteFile(pipes[StdIn][PipeWrite], data.data(), data.size(), &sz, NULL);
|
||||||
if (!ok) sz = 0;
|
if (!ok) sz = 0;
|
||||||
#else
|
# else
|
||||||
sz = ::write(pipes[StdIn][PipeWrite], data.data(), data.size());
|
sz = ::write(pipes[StdIn][PipeWrite], data.data(), data.size());
|
||||||
# endif
|
# endif
|
||||||
|
piCout << "writePipe" << sz;
|
||||||
return sz == data.size_s();
|
return sz == data.size_s();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,7 +247,7 @@ PIProcess::PIProcess(): PIThread() {
|
|||||||
PRIVATE->pid = 0;
|
PRIVATE->pid = 0;
|
||||||
PRIVATE->forEachPipe([](PipeHandleType & pipe) { pipe = -1; });
|
PRIVATE->forEachPipe([](PipeHandleType & pipe) { pipe = -1; });
|
||||||
# endif
|
# endif
|
||||||
exec_start = false;
|
exec_start = false;
|
||||||
exec_finished = false;
|
exec_finished = false;
|
||||||
PRIVATE->initGrab();
|
PRIVATE->initGrab();
|
||||||
env = PIProcess::currentEnvironment();
|
env = PIProcess::currentEnvironment();
|
||||||
@@ -243,12 +256,14 @@ PIProcess::PIProcess(): PIThread() {
|
|||||||
|
|
||||||
PIProcess::~PIProcess() {
|
PIProcess::~PIProcess() {
|
||||||
PIThread::stopAndWait();
|
PIThread::stopAndWait();
|
||||||
|
PRIVATE->closeAllPipes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIProcess::exec_() {
|
void PIProcess::exec_() {
|
||||||
exec_finished = false;
|
exec_finished = false;
|
||||||
exec_start = false;
|
exec_start = false;
|
||||||
|
PRIVATE->closeAllPipes();
|
||||||
startOnce();
|
startOnce();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,11 +336,10 @@ void PIProcess::startProc(bool detached) {
|
|||||||
if (PRIVATE->grab[StdErr]) fcntl(PRIVATE->pipes[StdErr][PipeRead], F_SETFL, O_NONBLOCK);
|
if (PRIVATE->grab[StdErr]) fcntl(PRIVATE->pipes[StdErr][PipeRead], F_SETFL, O_NONBLOCK);
|
||||||
|
|
||||||
exec_start = true;
|
exec_start = true;
|
||||||
piMinSleep();
|
|
||||||
if (!detached) {
|
if (!detached) {
|
||||||
waitpid(pid_, &exit_code, 0);
|
waitpid(pid_, &exit_code, 0);
|
||||||
exec_finished = true;
|
exec_finished = true;
|
||||||
pid_ = 0;
|
pid_ = 0;
|
||||||
if (!detached) PRIVATE->pid = pid_;
|
if (!detached) PRIVATE->pid = pid_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -387,20 +401,17 @@ void PIProcess::closeInput() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIProcess::enableWriteStdIn(bool on)
|
void PIProcess::enableWriteStdIn(bool on) {
|
||||||
{
|
|
||||||
PRIVATE->grab[StdIn] = on;
|
PRIVATE->grab[StdIn] = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIProcess::enableReadStdOut(bool on)
|
void PIProcess::enableReadStdOut(bool on) {
|
||||||
{
|
|
||||||
PRIVATE->grab[StdOut] = on;
|
PRIVATE->grab[StdOut] = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIProcess::enableReadStdErr(bool on)
|
void PIProcess::enableReadStdErr(bool on) {
|
||||||
{
|
|
||||||
PRIVATE->grab[StdErr] = on;
|
PRIVATE->grab[StdErr] = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,17 +38,15 @@ TEST_F(ProcessTest, Output) {
|
|||||||
launcher.exec(command, args);
|
launcher.exec(command, args);
|
||||||
ASSERT_TRUE(launcher.isRunning());
|
ASSERT_TRUE(launcher.isRunning());
|
||||||
|
|
||||||
piMSleep(100);
|
ASSERT_TRUE(launcher.waitForFinish());
|
||||||
|
|
||||||
ASSERT_TRUE(launcher.isExecFinished());
|
ASSERT_TRUE(launcher.isExecFinished());
|
||||||
|
|
||||||
const auto out = PIString::fromConsole(launcher.readOutput());
|
const auto out = PIString::fromAscii(launcher.readOutput());
|
||||||
const auto err = PIString::fromConsole(launcher.readError());
|
const auto err = PIString::fromAscii(launcher.readError());
|
||||||
|
|
||||||
EXPECT_TRUE(out.contains("Hello from stdout"));
|
EXPECT_TRUE(out.contains("Hello from stdout"));
|
||||||
EXPECT_TRUE(err.contains("Hello from stderr"));
|
EXPECT_TRUE(err.contains("Hello from stderr"));
|
||||||
|
|
||||||
ASSERT_TRUE(launcher.waitForFinish());
|
|
||||||
const int exit_code = launcher.exitCode();
|
const int exit_code = launcher.exitCode();
|
||||||
EXPECT_FALSE(launcher.isRunning());
|
EXPECT_FALSE(launcher.isRunning());
|
||||||
|
|
||||||
@@ -71,21 +69,27 @@ TEST_F(ProcessTest, Input) {
|
|||||||
launcher.enableWriteStdIn();
|
launcher.enableWriteStdIn();
|
||||||
launcher.exec(command, args);
|
launcher.exec(command, args);
|
||||||
ASSERT_TRUE(launcher.isRunning());
|
ASSERT_TRUE(launcher.isRunning());
|
||||||
|
piMSleep(100);
|
||||||
|
EXPECT_TRUE(launcher.isExecStarted());
|
||||||
|
EXPECT_TRUE(!launcher.isExecFinished());
|
||||||
|
|
||||||
const PIString test_input = "Test input string\n";
|
const PIString test_input = "Test input string\n";
|
||||||
EXPECT_TRUE(launcher.writeInput(test_input.toSystem()));
|
EXPECT_TRUE(launcher.writeInput(test_input.toAscii()));
|
||||||
launcher.closeInput();
|
launcher.closeInput();
|
||||||
|
|
||||||
piMSleep(100);
|
ASSERT_TRUE(launcher.waitForFinish());
|
||||||
|
EXPECT_TRUE(launcher.isExecFinished());
|
||||||
|
|
||||||
const auto out = PIString::fromConsole(launcher.readOutput());
|
const auto out = PIString::fromAscii(launcher.readOutput());
|
||||||
EXPECT_TRUE(out.contains("Test input string"));
|
EXPECT_TRUE(out.contains("Test input string"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_F(ProcessTest, DISABLED_NonexistentCommand) {
|
TEST_F(ProcessTest, NonexistentCommand) {
|
||||||
const PIString command = {"nonexistent_command_12345"};
|
const PIString command = {"nonexistent_command_12345"};
|
||||||
|
|
||||||
launcher.exec(command);
|
launcher.exec(command);
|
||||||
EXPECT_FALSE(launcher.isRunning());
|
ASSERT_TRUE(launcher.isRunning());
|
||||||
|
ASSERT_TRUE(launcher.waitForFinish());
|
||||||
|
EXPECT_FALSE(!launcher.isExecFinished());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user