File indexing completed on 2024-12-01 03:41:22

0001 /*
0002     SPDX-FileCopyrightText: 2002 David Faure <faure@kde.org>
0003     SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "kruntest.h"
0009 
0010 #include <KIO/ApplicationLauncherJob>
0011 #include <KIO/JobUiDelegate>
0012 #include <KIO/JobUiDelegateFactory>
0013 #include <KIO/OpenUrlJob>
0014 
0015 #include <KService>
0016 
0017 #include <QApplication>
0018 #include <QDebug>
0019 #include <QLabel>
0020 #include <QLayout>
0021 #include <QPushButton>
0022 #include <QTest> // QFINDTESTDATA
0023 
0024 #include <QDir>
0025 #include <qplatformdefs.h>
0026 
0027 static const int s_maxJobs = 100;
0028 
0029 static KIO::OpenUrlJob *jobArray[s_maxJobs];
0030 
0031 static const char testFile[] = "kruntest.cpp";
0032 
0033 static const struct {
0034     const char *text;
0035     const char *expectedResult;
0036     const char *exec;
0037     const char *url;
0038 } s_tests[] = {
0039     {"run(kwrite, no url)", "should work normally", "kwrite", nullptr},
0040     {"run(kwrite, file url)", "should work normally", "kwrite", testFile},
0041     {"run(kwrite, remote url)", "should work normally", "kwrite", "http://www.kde.org"},
0042     {"run(doesnotexit, no url)", "should show error message", "doesnotexist", nullptr},
0043     {"run(doesnotexit, file url)", "should show error message", "doesnotexist", testFile},
0044     {"run(doesnotexit, remote url)", "should use kioexec and show error message", "doesnotexist", "http://www.kde.org"},
0045     {"run(not-executable-desktopfile)", "should ask for confirmation", "nonexec", nullptr},
0046     {"run(missing lib, no url)",
0047      "should show error message (remove libqca-qt5.so.2 for this, e.g. by editing LD_LIBRARY_PATH if qca is in its own prefix)",
0048      "qcatool-qt5",
0049      nullptr},
0050     {"run(missing lib, file url)",
0051      "should show error message (remove libqca-qt5.so.2 for this, e.g. by editing LD_LIBRARY_PATH if qca is in its own prefix)",
0052      "qcatool-qt5",
0053      testFile},
0054     {"run(missing lib, remote url)",
0055      "should show error message (remove libqca-qt5.so.2 for this, e.g. by editing LD_LIBRARY_PATH if qca is in its own prefix)",
0056      "qcatool-qt5",
0057      "http://www.kde.org"},
0058 };
0059 
0060 Receiver::Receiver()
0061 {
0062     QVBoxLayout *lay = new QVBoxLayout(this);
0063     QPushButton *btn = new QPushButton(QStringLiteral("Press here to terminate"), this);
0064     lay->addWidget(btn);
0065     connect(btn, &QPushButton::clicked, qApp, &QApplication::quit);
0066 
0067     start = new QPushButton(QStringLiteral("Launch OpenUrlJobs"), this);
0068     lay->addWidget(start);
0069     connect(start, &QAbstractButton::clicked, this, &Receiver::slotStart);
0070 
0071     stop = new QPushButton(QStringLiteral("Stop those OpenUrlJobs"), this);
0072     stop->setEnabled(false);
0073     lay->addWidget(stop);
0074     connect(stop, &QAbstractButton::clicked, this, &Receiver::slotStop);
0075 
0076     QPushButton *launchOne = new QPushButton(QStringLiteral("Launch one http OpenUrlJob"), this);
0077     lay->addWidget(launchOne);
0078     connect(launchOne, &QAbstractButton::clicked, this, &Receiver::slotLaunchOne);
0079 
0080     for (uint i = 0; i < sizeof(s_tests) / sizeof(*s_tests); ++i) {
0081         QHBoxLayout *hbox = new QHBoxLayout;
0082         lay->addLayout(hbox);
0083         QPushButton *button = new QPushButton(QString::fromUtf8(s_tests[i].text), this);
0084         button->setProperty("testNumber", i);
0085         hbox->addWidget(button);
0086         QLabel *label = new QLabel(QString::fromUtf8(s_tests[i].expectedResult), this);
0087         hbox->addWidget(label);
0088         connect(button, &QAbstractButton::clicked, this, [this, button]() {
0089             slotLaunchTest(button);
0090         });
0091         hbox->addStretch();
0092     }
0093 
0094     adjustSize();
0095     show();
0096 }
0097 
0098 void Receiver::slotLaunchTest(QPushButton *sender)
0099 {
0100     const int testNumber = sender->property("testNumber").toInt();
0101     QList<QUrl> urls;
0102     if (s_tests[testNumber].url) {
0103         QString urlStr = QString::fromUtf8(s_tests[testNumber].url);
0104         if (urlStr == QLatin1String(testFile)) {
0105             urlStr = QFINDTESTDATA(testFile);
0106         }
0107         urls << QUrl::fromUserInput(urlStr);
0108     }
0109     KService::Ptr service;
0110     if (QByteArray(s_tests[testNumber].exec) == "nonexec") {
0111         const QString desktopFile = QFINDTESTDATA("../src/kioworkers/trash/kcmtrash.desktop");
0112         if (desktopFile.isEmpty()) {
0113             qWarning() << "kcmtrash.desktop not found!";
0114         }
0115         const QString dest = QStringLiteral("kcmtrash.desktop");
0116         QFile::remove(dest);
0117         bool ok = QFile::copy(desktopFile, dest);
0118         if (!ok) {
0119             qWarning() << "Failed to copy" << desktopFile << "to" << dest;
0120         }
0121         service = KService::Ptr(new KService(QDir::currentPath() + QLatin1Char('/') + dest));
0122     } else {
0123         service = KService::Ptr(new KService(QStringLiteral("Some Name"), QString::fromLatin1(s_tests[testNumber].exec), QString()));
0124     }
0125     auto *job = new KIO::ApplicationLauncherJob(service, this);
0126     job->setUrls(urls);
0127     job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
0128     job->start();
0129 }
0130 
0131 void Receiver::slotStop()
0132 {
0133     for (int i = 0; i < s_maxJobs; i++) {
0134         qDebug() << "deleting job" << i;
0135         delete jobArray[i];
0136     }
0137     start->setEnabled(true);
0138     stop->setEnabled(false);
0139 }
0140 
0141 void Receiver::slotStart()
0142 {
0143     for (int i = 0; i < s_maxJobs; i++) {
0144         qDebug() << "creating testjob" << i;
0145         jobArray[i] = new KIO::OpenUrlJob(QUrl::fromLocalFile(QDir::tempPath()));
0146         jobArray[i]->setAutoDelete(false);
0147         jobArray[i]->start();
0148     }
0149     start->setEnabled(false);
0150     stop->setEnabled(true);
0151 }
0152 
0153 void Receiver::slotLaunchOne()
0154 {
0155     auto *job = new KIO::OpenUrlJob(QUrl(QStringLiteral("http://www.kde.org")));
0156     job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
0157     job->start();
0158 }
0159 
0160 int main(int argc, char **argv)
0161 {
0162     QApplication::setApplicationName(QStringLiteral("kruntest"));
0163     QApplication app(argc, argv);
0164 
0165     Receiver receiver;
0166     return app.exec();
0167 }
0168 
0169 #include "moc_kruntest.cpp"