cpp-subprocess/test/test_subprocess.cc
Haowen Liu f6232a7f26
Improve CMake setup (#118)
* Support CMake 4

CMake 4 has removed compatibility with CMake < 3.5
Bumping minimum required version to 3.5 enables
CMake 4 to build this code.

* Move header into subdir

* Improve CMake setup

This commit configures and installs CMake metadata files. This also
provides the namespaced ALIAS target `cpp-subprocess::subprocess`.

* Update README with CMake instructions

* Update include paths in tests
2025-05-04 20:22:13 +05:30

100 lines
2.3 KiB
C++
Executable File

#include <iostream>
#include <cpp-subprocess/subprocess.hpp>
using namespace subprocess;
void test_exename()
{
#ifdef __USING_WINDOWS__
auto ret = call({"--version"}, executable{"cmake"}, shell{false});
#else
auto ret = call({"-l"}, executable{"ls"}, shell{false});
#endif
std::cout << ret << std::endl;
}
void test_input()
{
auto p = Popen({"grep", "f"}, output{PIPE}, input{PIPE});
const char* msg = "one\ntwo\nthree\nfour\nfive\n";
p.send(msg, strlen(msg));
auto res = p.communicate(nullptr, 0);
std::cout << res.first.buf.data() << std::endl;
}
void test_piping()
{
auto cat = Popen({"cat", "../subprocess.hpp"}, output{PIPE});
auto grep = Popen({"grep", "template"}, input{cat.output()}, output{PIPE});
auto cut = Popen({"cut", "-d,", "-f", "1"}, input{grep.output()}, output{PIPE});
auto res = cut.communicate().first;
std::cout << res.buf.data() << std::endl;
}
void test_easy_piping()
{
auto res = pipeline("cat ../subprocess.hpp", "grep Args", "grep template");
std::cout << res.buf.data() << std::endl;
}
void test_shell()
{
#ifdef __USING_WINDOWS__
auto obuf = check_output({"cmake", "--version"}, shell{false});
#else
auto obuf = check_output({"ls", "-l"}, shell{false});
#endif
std::cout << obuf.buf.data() << std::endl;
}
void test_sleep()
{
auto p = Popen({"sleep", "30"}, shell{true});
while (p.poll() == -1)
{
std::cout << "Waiting..." << std::endl;
#ifdef __USING_WINDOWS__
#else
sleep(1);
#endif
}
std::cout << "Sleep ended: ret code = " << p.retcode() << std::endl;
}
void test_read_all()
{
Popen p = Popen({"echo", "12345678"}, output{PIPE});
std::vector<char> buf(6);
int rbytes = util::read_all(p.output(), buf);
std::string out(buf.begin(), buf.end());
assert(out == "12345678\n" && rbytes == 9); // echo puts a new line at the end of output
std::cout << "read_all() succeeded" << std::endl;
}
void test_simple_cmd()
{
auto p = Popen({"ls", "-l"}, output{PIPE});
auto obuf = p.communicate().first;
std::cout << "Data : " << obuf.buf.data() << std::endl;
std::cout << "Data len: " << obuf.length << std::endl;
}
int main() {
/*
test_exename();
test_input();
test_piping();
test_easy_piping();
test_shell();
test_sleep();
test_read_all();
*/
test_simple_cmd();
return 0;
}