void ProcessTest::testLaunchRedirectIn() { #if !defined(_WIN32_WCE) std::string name("TestApp"); std::string cmd; #if defined(_DEBUG) name += "d"; #endif #if defined(POCO_OS_FAMILY_UNIX) cmd = "./"; cmd += name; #else cmd = name; #endif std::vector<std::string> args; args.push_back("-count"); Pipe inPipe; ProcessHandle ph = Process::launch(cmd, args, &inPipe, 0, 0); PipeOutputStream ostr(inPipe); ostr << std::string(100, 'x'); ostr.close(); int rc = ph.wait(); assert (rc == 100); #endif // !defined(_WIN32_WCE) }
void ProcessTest::testLaunchRedirectOut() { #if !defined(_WIN32_WCE) std::string name("TestApp"); std::string cmd; #if defined(_DEBUG) name += "d"; #endif #if defined(POCO_OS_FAMILY_UNIX) cmd = "./"; cmd += name; #else cmd = name; #endif std::vector<std::string> args; args.push_back("-hello"); Pipe outPipe; ProcessHandle ph = Process::launch(cmd, args, 0, &outPipe, 0); PipeInputStream istr(outPipe); std::string s; int c = istr.get(); while (c != -1) { s += (char) c; c = istr.get(); } assert (s == "Hello, world!"); int rc = ph.wait(); assert (rc == 1); #endif // !defined(_WIN32_WCE) }
void ProcessTest::testLaunch() { std::string name("TestApp"); std::string cmd; #if defined(_DEBUG) name += "d"; #endif #if defined(POCO_OS_FAMILY_UNIX) cmd = "./"; cmd += name; #elif defined(_WIN32_WCE) cmd = "\\"; cmd += name; cmd += ".EXE"; #else cmd = name; #endif std::vector<std::string> args; args.push_back("arg1"); args.push_back("arg2"); args.push_back("arg3"); ProcessHandle ph = Process::launch(cmd, args); int rc = ph.wait(); assert (rc == 3); }
void ProcessTest::testIsRunning() { #if !defined(_WIN32_WCE) std::string name("TestApp"); std::string cmd; #if defined(_DEBUG) && (POCO_OS != POCO_OS_ANDROID) name += "d"; #endif #if defined(POCO_OS_FAMILY_UNIX) cmd = "./"; cmd += name; #else cmd = name; #endif std::vector<std::string> args; args.push_back("-count"); Pipe inPipe; ProcessHandle ph = Process::launch(cmd, args, &inPipe, 0, 0); Process::PID id = ph.id(); assert (Process::isRunning(ph)); assert (Process::isRunning(id)); PipeOutputStream ostr(inPipe); ostr << std::string(100, 'x'); ostr.close(); int POCO_UNUSED rc = ph.wait(); assert (!Process::isRunning(ph)); assert (!Process::isRunning(id)); #endif // !defined(_WIN32_WCE) }
void ProcessTest::testLaunchEnv() { #if !defined(_WIN32_WCE) std::string name("TestApp"); std::string cmd; #if defined(_DEBUG) && (POCO_OS != POCO_OS_ANDROID) name += "d"; #endif #if defined(POCO_OS_FAMILY_UNIX) cmd = "./"; cmd += name; #else cmd = name; #endif std::vector<std::string> args; args.push_back("-env"); Pipe outPipe; Process::Env env; env["TESTENV"] = "test"; ProcessHandle ph = Process::launch(cmd, args, 0, &outPipe, 0, env); PipeInputStream istr(outPipe); std::string s; int c = istr.get(); while (c != -1) { s += (char) c; c = istr.get(); } assert (s == "test"); int rc = ph.wait(); assert (rc == 0); #endif // !defined(_WIN32_WCE) }
bool Environment::isItTheSamePathAsCurrent(unsigned int pId) { StringStorage currModulePath, testedModulePath; ProcessHandle pHandle; pHandle.openProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pId); pHandle.getProcessModulePath(&testedModulePath); getCurrentModulePath(&currModulePath); return currModulePath.isEqualTo(&testedModulePath); }
void ProcessTest::testLaunchArgs() { #if defined (_WIN32) && !defined(_WIN32_WCE) std::string name("TestApp"); std::string cmd = name; std::vector<std::string> args; args.push_back("-echo-args"); args.push_back("simple"); args.push_back("with space"); args.push_back("with\ttab"); args.push_back("with\vverticaltab"); // can't test newline here because TestApp -echo-args uses newline to separate the echoed args //args.push_back("with\nnewline"); args.push_back("with \" quotes"); args.push_back("ends with \"quotes\""); args.push_back("\"starts\" with quotes"); args.push_back("\""); args.push_back("\\"); args.push_back("c:\\program files\\ends with backslash\\"); args.push_back("\"already quoted \\\" \\\\\""); Pipe outPipe; ProcessHandle ph = Process::launch(cmd, args, 0, &outPipe, 0); PipeInputStream istr(outPipe); std::string receivedArg; int c = istr.get(); int argNumber = 1; while (c != -1) { if ('\n' == c) { assert(argNumber < args.size()); std::string expectedArg = args[argNumber]; if (expectedArg.npos != expectedArg.find("already quoted")) { expectedArg = "already quoted \" \\"; } assert(receivedArg == expectedArg); ++argNumber; receivedArg = ""; } else if ('\r' != c) { receivedArg += (char)c; } c = istr.get(); } assert(argNumber == args.size()); int rc = ph.wait(); assert(rc == args.size()); #endif // !defined(_WIN32_WCE) }
Preprocessor* preprocess(const std::string& file) { Path pp(file); pp.setExtension("i"); std::string exec = config().getString("PocoDoc.compiler.exec"); std::string opts = config().getString("PocoDoc.compiler.options"); std::string path = config().getString("PocoDoc.compiler.path", ""); bool usePipe = config().getBool("PocoDoc.compiler.usePipe", false); std::string popts; for (std::string::const_iterator it = opts.begin(); it != opts.end(); ++it) { if (*it == '%') popts += pp.getBaseName(); else popts += *it; } StringTokenizer tokenizer(popts, ",\n", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); std::vector<std::string> args(tokenizer.begin(), tokenizer.end()); args.push_back(file); if (!path.empty()) { std::string newPath(Environment::get("PATH")); newPath += Path::pathSeparator(); newPath += path; Environment::set("PATH", path); } if (usePipe) { Poco::Pipe inPipe; ProcessHandle proc = Process::launch(exec, args, 0, &inPipe, 0); return new Preprocessor(proc, new Poco::PipeInputStream(inPipe)); } else { ProcessHandle proc = Process::launch(exec, args); proc.wait(); return new Preprocessor(proc, new std::ifstream(pp.getFileName().c_str()), pp.getFileName()); } }
int Process::wait(const ProcessHandle& handle) { return handle.wait(); }
//static void Process::kill(const ProcessHandle& handle) { kill(handle.id()); }
ProcessHandle::ProcessHandle(const ProcessHandle &other) : CodeClass(), mProcessId(other.processId()) { }