1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/*
This file is part of the KDE libraries
Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org>
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 <kprocess.h>
#include <qtest_kde.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
class KProcessTest : public QObject {
Q_OBJECT
private Q_SLOTS:
void test_channels();
void test_setShellCommand();
};
// IOCCC nomination pending
static char **gargv;
static QString recurse(KProcess::OutputChannelMode 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()
{
#ifdef Q_OS_UNIX
QString e, a;
TESTCHAN(SeparateChannels, "separate", "", EO, EE);
TESTCHAN(ForwardedChannels, "forwarded", EO EE, "", "");
TESTCHAN(OnlyStderrChannel, "forwarded stdout", EO, "", EE);
TESTCHAN(OnlyStdoutChannel, "forwarded stderr", EE, EO, "");
TESTCHAN(MergedChannels, "merged", "", EO EE, "");
#else
QSKIP("This test needs a UNIX system", SkipSingle);
#endif
}
void KProcessTest::test_setShellCommand()
{
// Condition copied from kprocess.cpp
#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) && !defined(__GNU__)
QSKIP("This test needs a free UNIX system", SkipSingle);
#else
KProcess p;
p.setShellCommand("cat");
QCOMPARE(p.program(), QStringList() << "/bin/cat");
p.setShellCommand("true || false");
QCOMPARE(p.program(), QStringList() << "/bin/sh" << "-c" << "true || false");
#endif
}
static void recursor(char **argv)
{
if (argv[1]) {
KProcess p;
p.setShellCommand("echo " EOUT "; echo " EERR " >&2");
p.setOutputChannelMode((KProcess::OutputChannelMode)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"
|