diff options
author | Kyle Edwards <kyle.edwards@kitware.com> | 2019-04-30 15:29:30 (GMT) |
---|---|---|
committer | Kyle Edwards <kyle.edwards@kitware.com> | 2019-05-07 17:40:06 (GMT) |
commit | 26025d6e106ffd4cd777fdc3a4343b33c8554c15 (patch) | |
tree | f40c983a734557f9137fa775fd051437079c89e4 /Tests/CMakeLib/testUVProcessChainHelper.cxx | |
parent | 6b04d1cdc281b9b0dee5f59394a1c41d8b96c4a1 (diff) | |
download | CMake-26025d6e106ffd4cd777fdc3a4343b33c8554c15.zip CMake-26025d6e106ffd4cd777fdc3a4343b33c8554c15.tar.gz CMake-26025d6e106ffd4cd777fdc3a4343b33c8554c15.tar.bz2 |
cmUVProcessChain: Add cmUVProcessChain
This class is ultimately intended as a replacement for cmsys::Process.
It spawns a series of processes using libuv, piping the output of each
command into the next.
Note: input support has not yet been implemented because write
support has not yet been implemented on cmUVStreambuf.
Diffstat (limited to 'Tests/CMakeLib/testUVProcessChainHelper.cxx')
-rw-r--r-- | Tests/CMakeLib/testUVProcessChainHelper.cxx | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/Tests/CMakeLib/testUVProcessChainHelper.cxx b/Tests/CMakeLib/testUVProcessChainHelper.cxx new file mode 100644 index 0000000..263665d --- /dev/null +++ b/Tests/CMakeLib/testUVProcessChainHelper.cxx @@ -0,0 +1,72 @@ +#include <chrono> +#include <iostream> +#include <set> +#include <sstream> +#include <string> +#include <thread> + +#include <cctype> +#include <cstdlib> + +std::string getStdin() +{ + char buffer[1024]; + std::ostringstream str; + do { + std::cin.read(buffer, 1024); + str.write(buffer, std::cin.gcount()); + } while (std::cin.gcount() > 0); + return str.str(); +} + +int main(int argc, char** argv) +{ + if (argc < 2) { + return -1; + } + + std::string command = argv[1]; + if (command == "echo") { + std::this_thread::sleep_for(std::chrono::milliseconds(3000)); + std::cout << "HELLO world!" << std::flush; + std::cerr << "1" << std::flush; + return 0; + } + if (command == "capitalize") { + std::this_thread::sleep_for(std::chrono::milliseconds(9000)); + std::string input = getStdin(); + for (auto& c : input) { + c = static_cast<char>(std::toupper(c)); + } + std::cout << input << std::flush; + std::cerr << "2" << std::flush; + return 1; + } + if (command == "dedup") { + // Use a nested scope to free all resources before aborting below. + { + std::string input = getStdin(); + std::set<char> seen; + std::string output; + for (auto c : input) { + if (!seen.count(c)) { + seen.insert(c); + output += c; + } + } + std::cout << output << std::flush; + std::cerr << "3" << std::flush; + } + + // On Windows, the exit code of abort() is different between debug and + // release builds, and does not yield a term_signal in libuv in either + // case. For the sake of simplicity, we just return another non-zero code. +#ifdef _WIN32 + return 2; +#else + std::abort(); +#endif + } + + return -1; +} |