/* This file is part of the KDE libraries Copyright (C) 2007 Oswald Buddenhagen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include class KProcessTest : public QObject { Q_OBJECT private Q_SLOTS: void test_channels(); void test_setShellCommand(); }; // IOCCC nomination pending static char **gargv; static QString recurse(QProcess::ProcessChannelMode how) { QProcess p; p.setProcessChannelMode(QProcess::MergedChannels); p.start(gargv[0], QStringList() << QString::number((int)how)); p.waitForFinished(); return p.readAllStandardOutput(); } #define EOUT "foo - stdout" #define EERR "bar - stderr" #define POUT "program output:\n" #define ROUT "received stdout:\n" #define RERR "received stderr:\n" #define EO EOUT "\n" #define EE EERR "\n" #define TESTCHAN(me,ms,pout,rout,rerr) \ e = "mode: " ms "\n" POUT pout ROUT rout RERR rerr; \ a = "mode: " ms "\n" + recurse(KProcess::me); \ QCOMPARE(a, e) void KProcessTest::test_channels() { QString e, a; TESTCHAN(SeparateChannels, "separate", "", EO, EE); TESTCHAN(ForwardedChannels, "forwarded", EO EE, "", ""); TESTCHAN(MergedChannels, "merged", "", EO EE, ""); } void KProcessTest::test_setShellCommand() { KProcess p; p.setShellCommand("cat"); QCOMPARE(p.program().count(), 1); QCOMPARE(p.program().at(0), KStandardDirs::findExe("cat")); QVERIFY(p.program().at(0).endsWith("/bin/cat")); p.setShellCommand("true || false"); QCOMPARE(p.program(), QStringList() << "/bin/sh" << "-c" << "true || false"); } static void recursor(char **argv) { if (argv[1]) { KProcess p; p.setShellCommand("echo " EOUT "; echo " EERR " >&2"); p.setProcessChannelMode((QProcess::ProcessChannelMode)atoi(argv[1])); fputs(POUT, stdout); fflush(stdout); p.execute(); fputs(ROUT, stdout); fputs(p.readAllStandardOutput(), stdout); fputs(RERR, stdout); fputs(p.readAllStandardError(), stdout); exit(0); } gargv = argv; } QTEST_KDEMAIN_CORE( recursor(argv); KProcessTest ) #include "kprocesstest.moc"