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"