test_process.cc
Go to the documentation of this file.
00001 #include <boost/test/auto_unit_test.hpp>
00002 
00003 #include "testsuite.hh"
00004 #include <utilmm/system/process.hh>
00005 #include <sys/types.h>
00006 #include <sys/stat.h>
00007 #include <fcntl.h>
00008 #include <errno.h>
00009 
00010 using namespace boost::filesystem;
00011 using namespace utilmm;
00012 using std::string;
00013 
00014 string get_file_contents(int fd)
00015 {
00016     std::string output;
00017     int read_count;
00018     do
00019     {
00020         char buffer[256];
00021         read_count = read(fd, buffer, 256);
00022         BOOST_REQUIRE(read_count >= 0);
00023         output += std::string(buffer, read_count);
00024     } while(read_count);
00025 
00026     return output;
00027 }
00028 
00029 void check_var(process& proc, std::string const& varname, std::string const& expected)
00030 {
00031     tempfile tmpfile("bla");
00032     proc.clear();
00033     proc.redirect_to(process::Stdout, fileno(tmpfile.handle()), false);
00034     proc << "printenv" << varname;
00035 
00036     proc.start();
00037     proc.wait();
00038     BOOST_REQUIRE(proc.exit_normal());
00039     BOOST_REQUIRE(!proc.exit_status());
00040 
00041     int read_fd = open(tmpfile.path().native_file_string().c_str(), O_RDONLY);
00042     string var_value = get_file_contents(read_fd);
00043     close(read_fd);
00044     BOOST_REQUIRE_EQUAL(var_value, expected + "\n");
00045 }
00046 
00047 BOOST_AUTO_TEST_CASE( test_environment )
00048 {
00049     process get_var;
00050     get_var.set_environment("TESTVAR", "my_value");
00051     get_var.set_environment("TESTVAR2", "another_value");
00052     check_var(get_var, "TESTVAR2", "another_value");
00053     check_var(get_var, "TESTVAR", "my_value");
00054 }
00055 
00056 BOOST_AUTO_TEST_CASE( test_run )
00057 {
00058     path testdir = path(__FILE__).branch_path();
00059     tempfile tmpfile("bla");
00060     
00061     process copy;
00062     copy << "cp" 
00063         << (testdir/"test_pkgconfig.pc").native_file_string()
00064         << tmpfile.path().native_file_string();
00065 
00066     copy.start();
00067     copy.wait();
00068     BOOST_REQUIRE(copy.exit_normal());
00069     BOOST_REQUIRE(!copy.exit_status());
00070 }
00071 BOOST_AUTO_TEST_CASE( test_nonblocking )
00072 {
00073     process blocking;
00074     blocking << "sleep" << "10";
00075     blocking.start();
00076     blocking.signal(SIGKILL);
00077     blocking.wait();
00078 }
00079 
00080 void assert_closed(int fd)
00081 {
00082     BOOST_REQUIRE(close(fd) == -1);
00083     BOOST_REQUIRE(errno == EBADF);
00084 }
00085 BOOST_AUTO_TEST_CASE( test_redirect )
00086 {
00087     path testdir = path(__FILE__).branch_path();
00088     int files[2];
00089     pipe(files);
00090     auto_close read_guard(files[0]);
00091     
00092     process cat;
00093     cat << "cat" << (testdir/"test_pkgconfig.pc").native_file_string();
00094 
00095     cat.redirect_to(process::Stdout, files[1]);
00096     cat.start();
00097 
00098     // the write pipe should be closed now. Otherwise
00099     // we'll never reach EOF on files[0] and the loop
00100     // will block
00101     assert_closed(files[1]);
00102 
00103     string output = get_file_contents(files[0]);
00104     BOOST_REQUIRE(output.size() > 0);
00105 
00106     cat.wait();
00107     BOOST_REQUIRE(cat.exit_normal());
00108     BOOST_REQUIRE(!cat.exit_status());
00109 
00110     int test_source = open( (testdir/"test_pkgconfig.pc").native_file_string().c_str(), O_RDONLY);
00111     BOOST_REQUIRE(test_source != -1);
00112     string source = get_file_contents(test_source);
00113     close(test_source);
00114 
00115     BOOST_REQUIRE_EQUAL(source, output);
00116 }
00117 


utilmm
Author(s): Sylvain Joyeux/sylvain.joyeux@m4x.org
autogenerated on Mon Oct 6 2014 03:17:01