added more tests

This commit is contained in:
arunmu 2016-03-17 21:19:36 +05:30
parent fd9efecf05
commit 6a9f0aab51
5 changed files with 41 additions and 13 deletions

BIN
main

Binary file not shown.

7
s.py
View File

@ -1,7 +0,0 @@
import subprocess
p = subprocess.Popen(["grep", "f"],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE)
p.stdin.write('one\ntwo\four\n')
p.communicate()[0]

View File

@ -207,8 +207,7 @@ struct environment
}; };
enum IOTYPE { enum IOTYPE {
STDIN = 0, STDOUT = 1,
STDOUT,
STDERR, STDERR,
PIPE, PIPE,
}; };
@ -224,7 +223,7 @@ struct input
rd_ch_ = fd; rd_ch_ = fd;
} }
input(IOTYPE typ) { input(IOTYPE typ) {
assert (typ == PIPE); assert (typ == PIPE && "STDOUT/STDERR not allowed");
std::tie(rd_ch_, wr_ch_) = util::pipe_cloexec(); std::tie(rd_ch_, wr_ch_) = util::pipe_cloexec();
} }
@ -242,7 +241,7 @@ struct output
wr_ch_ = fd; wr_ch_ = fd;
} }
output(IOTYPE typ) { output(IOTYPE typ) {
assert (typ == PIPE); assert (typ == PIPE && "STDOUT/STDERR not allowed");
std::tie(rd_ch_, wr_ch_) = util::pipe_cloexec(); std::tie(rd_ch_, wr_ch_) = util::pipe_cloexec();
} }
@ -260,10 +259,16 @@ struct error
wr_ch_ = fd; wr_ch_ = fd;
} }
error(IOTYPE typ) { error(IOTYPE typ) {
assert (typ == PIPE); assert ((typ == PIPE || typ == STDOUT) && "STDERR not aloowed");
std::tie(rd_ch_, wr_ch_) = util::pipe_cloexec(); if (typ == PIPE) {
std::tie(rd_ch_, wr_ch_) = util::pipe_cloexec();
} else {
// Need to defer it till we have checked all arguments
deferred_ = true;
}
} }
bool deferred_ = false;
int rd_ch_ = -1; int rd_ch_ = -1;
int wr_ch_ = -1; int wr_ch_ = -1;
}; };
@ -548,6 +553,11 @@ public:
return res; return res;
} }
std::pair<OutBuffer, ErrBuffer> communicate()
{
return communicate(nullptr, 0);
}
private: private:
template <typename F, typename... Args> template <typename F, typename... Args>
void init_args(F&& farg, Args&&... args); void init_args(F&& farg, Args&&... args);
@ -756,6 +766,12 @@ namespace detail {
} }
void ArgumentDeducer::set_option(error&& err) { void ArgumentDeducer::set_option(error&& err) {
if (err.deferred_ && popen_->stream_.write_to_parent_) {
popen_->stream_.err_write_ = popen_->stream_.write_to_parent_;
return;
} else {
throw "Set output before redirecting error to output";
}
if (err.wr_ch_ != -1) popen_->stream_.err_write_ = err.wr_ch_; if (err.wr_ch_ != -1) popen_->stream_.err_write_ = err.wr_ch_;
if (err.rd_ch_ != -1) popen_->stream_.err_read_ = err.rd_ch_; if (err.rd_ch_ != -1) popen_->stream_.err_read_ = err.rd_ch_;
} }
@ -844,6 +860,7 @@ namespace detail {
std::string err_msg(exp.what()); std::string err_msg(exp.what());
//ATTN: Can we do something on error here ? //ATTN: Can we do something on error here ?
util::write_n(err_wr_pipe_, err_msg.c_str(), err_msg.length()); util::write_n(err_wr_pipe_, err_msg.c_str(), err_msg.length());
throw exp;
} }
// Calling application would not get this // Calling application would not get this

View File

@ -0,0 +1,16 @@
#include <iostream>
#include "../subprocess.hpp"
using namespace subprocess;
void test_redirect()
{
auto p = Popen("./write_err.sh", output{"write_err.txt"}, error{STDOUT});
assert (p.poll() == 0);
}
int main() {
test_redirect();
return 0;
}

2
test/write_err.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/bash
>&2 echo "writing error to stderr"