File indexing completed on 2024-04-28 05:50:34

0001 /*
0002     SPDX-FileCopyrightText: 2023 Theodore Wang <theodorewang12@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 // Own
0008 #include "ProcessInfoTest.h"
0009 
0010 // Qt
0011 #include <QDir>
0012 #include <QString>
0013 #include <QTest>
0014 
0015 // Konsole
0016 #include "../ProcessInfo.h"
0017 #include "../session/Session.h"
0018 
0019 // Others
0020 #include <memory>
0021 
0022 #include <QTest>
0023 
0024 using namespace Konsole;
0025 
0026 std::unique_ptr<ProcessInfo> ProcessInfoTest::createProcInfo(const KProcess &proc)
0027 {
0028     return std::unique_ptr<ProcessInfo>(ProcessInfo::newInstance(proc.processId()));
0029 }
0030 
0031 void ProcessInfoTest::testProcessValidity()
0032 {
0033     if (Session::checkProgram(QStringLiteral("bash")).isEmpty())
0034         return;
0035 
0036     KProcess proc;
0037     proc.setProgram(QStringLiteral("bash"));
0038     proc.start();
0039 
0040     QVERIFY(createProcInfo(proc)->isValid());
0041 
0042     proc.close();
0043     proc.waitForFinished(1000);
0044 }
0045 
0046 void ProcessInfoTest::testProcessCwd()
0047 {
0048 #ifndef Q_OS_FREEBSD
0049     if (Session::checkProgram(QStringLiteral("bash")).isEmpty())
0050         return;
0051 
0052     KProcess proc;
0053     proc.setProgram({QStringLiteral("bash"), QStringLiteral("-x")});
0054     proc.start();
0055 
0056     auto procInfo = createProcInfo(proc);
0057     const QString startDir(QDir::currentPath());
0058     const QString parentDir(startDir.mid(0, startDir.lastIndexOf(QLatin1Char('/'))));
0059 
0060     bool ok;
0061     QString currDir;
0062 
0063     currDir = procInfo->currentDir(&ok);
0064     QVERIFY(ok);
0065     QCOMPARE(currDir, startDir);
0066 
0067     proc.write(QStringLiteral("cd ..\n").toLocal8Bit());
0068     proc.waitForReadyRead(1000);
0069     procInfo->update();
0070 
0071     currDir = procInfo->currentDir(&ok);
0072     QVERIFY(ok);
0073     QCOMPARE(currDir, parentDir);
0074 
0075     proc.write(QStringLiteral("exit\n").toLocal8Bit());
0076     proc.waitForFinished(1000);
0077 #endif
0078 }
0079 
0080 void ProcessInfoTest::testProcessNameSpecialChars()
0081 {
0082 #ifndef Q_OS_FREEBSD
0083     if (Session::checkProgram(QStringLiteral("bash")).isEmpty())
0084         return;
0085 
0086     const QVector<QString> specNames({QStringLiteral("(( a("), QStringLiteral("("), QStringLiteral("ab) ("), QStringLiteral(")")});
0087 
0088     KProcess mainProc;
0089     mainProc.setProgram({QStringLiteral("bash"), QStringLiteral("-x")});
0090     mainProc.start();
0091 
0092     auto mainProcInfo = createProcInfo(mainProc);
0093     bool ok;
0094 
0095     for (auto specName : specNames) {
0096         mainProc.write(QStringLiteral("cp $(which bash) '%1'\n").arg(specName).toLocal8Bit());
0097         mainProc.waitForReadyRead(1000);
0098         mainProc.write(QStringLiteral("exec %1'%2'\n").arg(QDir::currentPath() + QDir::separator(), specName).toLocal8Bit());
0099         mainProc.waitForReadyRead(1000);
0100 
0101         mainProcInfo->update();
0102 
0103         QDir::current().remove(specName);
0104 
0105         const QString currName(mainProcInfo->name(&ok));
0106         QVERIFY(ok);
0107         QCOMPARE(currName, specName);
0108     }
0109 
0110     mainProc.write(QStringLiteral("exit\n").toLocal8Bit());
0111     mainProc.waitForFinished(1000);
0112 #endif
0113 }
0114 
0115 QTEST_MAIN(ProcessInfoTest)
0116 
0117 #include "moc_ProcessInfoTest.cpp"