File indexing completed on 2024-05-19 05:34:38

0001 /*
0002     SPDX-FileCopyrightText: 2007 Bertjan Broeksema <b.broeksema@kdemail.net>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "plasmoidpackagetest.h"
0008 #include "../config-plasma.h"
0009 
0010 #include <KJob>
0011 #include <QDir>
0012 #include <QFile>
0013 #include <QStandardPaths>
0014 #include <kzip.h>
0015 
0016 #include <QDebug>
0017 
0018 #include "applet.h"
0019 #include "pluginloader.h"
0020 
0021 void PlasmoidPackageTest::initTestCase()
0022 {
0023     QStandardPaths::setTestModeEnabled(true);
0024 }
0025 
0026 void PlasmoidPackageTest::init()
0027 {
0028     qDebug() << "PlasmoidPackage::init()";
0029     m_package = QString("Package");
0030     m_packageRoot = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/packageRoot";
0031     m_defaultPackage = Plasma::PluginLoader::self()->loadPackage("Plasma/Applet");
0032     cleanup(); // to prevent previous runs from interfering with this one
0033 }
0034 
0035 void PlasmoidPackageTest::cleanup()
0036 {
0037     qDebug() << "cleaning up";
0038     // Clean things up.
0039     QDir(m_packageRoot).removeRecursively();
0040 }
0041 
0042 void PlasmoidPackageTest::createTestPackage(const QString &packageName)
0043 {
0044     qDebug() << "Create test package" << m_packageRoot;
0045     QDir pRoot(m_packageRoot);
0046     // Create the root and package dir.
0047     if (!pRoot.exists()) {
0048         QVERIFY(QDir().mkpath(m_packageRoot));
0049     }
0050 
0051     // Create the package dir
0052     QVERIFY(QDir().mkpath(m_packageRoot + "/" + packageName));
0053     qDebug() << "Created" << (m_packageRoot + "/" + packageName);
0054 
0055     // Create the metadata.desktop file
0056     QFile file(m_packageRoot + "/" + packageName + "/metadata.desktop");
0057 
0058     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0059 
0060     QTextStream out(&file);
0061     out << "[Desktop Entry]\n";
0062     out << "Name=" << packageName << "\n";
0063     out << "X-KDE-PluginInfo-Name=" << packageName << "\n";
0064     file.flush();
0065     file.close();
0066 
0067     qDebug() << "OUT: " << packageName;
0068 
0069     // Create the ui dir.
0070     QVERIFY(QDir().mkpath(m_packageRoot + "/" + packageName + "/contents/ui"));
0071 
0072     // Create the main file.
0073     file.setFileName(m_packageRoot + "/" + packageName + "/contents/ui/main.qml");
0074     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0075 
0076     out << "THIS IS A PLASMOID SCRIPT.....";
0077     file.flush();
0078     file.close();
0079 
0080     qDebug() << "THIS IS A PLASMOID SCRIPT THING";
0081     // Now we have a minimal plasmoid package which is valid. Let's add some
0082     // files to it for test purposes.
0083 
0084     // Create the images dir.
0085     QVERIFY(QDir().mkpath(m_packageRoot + "/" + packageName + "/contents/images"));
0086     file.setFileName(m_packageRoot + "/" + packageName + "/contents/images/image-1.svg");
0087 
0088     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0089 
0090     out << "<svg>This is a test image</svg>";
0091     file.flush();
0092     file.close();
0093 
0094     file.setFileName(m_packageRoot + "/" + packageName + "/contents/images/image-2.svg");
0095 
0096     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0097 
0098     out.setDevice(&file);
0099     out << "<svg>This is another test image</svg>";
0100     file.flush();
0101     file.close();
0102 }
0103 
0104 void PlasmoidPackageTest::isValid()
0105 {
0106     Plasma::Package *p = new Plasma::Package(m_defaultPackage);
0107     p->setPath(m_packageRoot + '/' + m_package);
0108 
0109     // A PlasmoidPackage is valid when:
0110     // - The package root exists.
0111     // - The package root consists an file named "ui/main.qml"
0112     QVERIFY(!p->isValid());
0113 
0114     // Create the root and package dir.
0115     QVERIFY(QDir().mkpath(m_packageRoot));
0116     QVERIFY(QDir().mkpath(m_packageRoot + "/" + m_package));
0117 
0118     // Should still be invalid.
0119     delete p;
0120     p = new Plasma::Package(m_defaultPackage);
0121     p->setPath(m_packageRoot + '/' + m_package);
0122     QVERIFY(!p->isValid());
0123 
0124     // Create the metadata.desktop file.
0125     QFile file(m_packageRoot + "/" + m_package + "/metadata.desktop");
0126     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0127 
0128     QTextStream out(&file);
0129     out << "[Desktop Entry]\n";
0130     out << "Name=test\n";
0131     out << "Description=Just a test desktop file";
0132     file.flush();
0133     file.close();
0134 
0135     // Create the ui dir.
0136     QVERIFY(QDir().mkpath(m_packageRoot + "/" + m_package + "/contents/ui"));
0137 
0138     // No main file yet so should still be invalid.
0139     delete p;
0140     p = new Plasma::Package(m_defaultPackage);
0141     p->setPath(m_packageRoot + '/' + m_package);
0142     QVERIFY(!p->isValid());
0143 
0144     // Create the main file.
0145     file.setFileName(m_packageRoot + "/" + m_package + "/contents/ui/main.qml");
0146     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0147 
0148     out.setDevice(&file);
0149     out << "THIS IS A PLASMOID SCRIPT.....\n";
0150     file.flush();
0151     file.close();
0152 
0153     file.setPermissions(QFile::ReadUser | QFile::WriteUser);
0154     // Main file exists so should be valid now.
0155     delete p;
0156     p = new Plasma::Package(m_defaultPackage);
0157     p->setPath(m_packageRoot + '/' + m_package);
0158     QVERIFY(p->isValid());
0159     QCOMPARE(p->contentsHash(), QString("db0b38c2b4fe21a9f37923cc25152340de055f6d"));
0160     delete p;
0161 }
0162 
0163 void PlasmoidPackageTest::filePath()
0164 {
0165     return;
0166     // Package::filePath() returns
0167     // - {package_root}/{package_name}/path/to/file if the file exists
0168     // - QString() otherwise.
0169     Plasma::Package *p = new Plasma::Package(m_defaultPackage);
0170     p->setPath(m_packageRoot + '/' + m_package);
0171 
0172     QCOMPARE(p->filePath("scripts", "main"), QString());
0173 
0174     QVERIFY(QDir().mkpath(m_packageRoot + "/" + m_package + "/contents/ui/main.qml"));
0175     QFile file(m_packageRoot + "/" + m_package + "/contents/ui/main.qml");
0176     QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
0177 
0178     QTextStream out(&file);
0179     out << "THIS IS A PLASMOID SCRIPT.....";
0180     file.flush();
0181     file.close();
0182 
0183     // The package is valid by now so a path for code/main should get returned.
0184     delete p;
0185     p = new Plasma::Package(m_defaultPackage);
0186     p->setPath(m_packageRoot + '/' + m_package);
0187 
0188     const QString path = QFileInfo(m_packageRoot + "/" + m_package + "/contents/ui/main.qml").canonicalFilePath();
0189 
0190     // Two ways to get the same info.
0191     // 1. Give the file type which refers to a class of files (a directory) in
0192     //    the package structure and the file name.
0193     // 2. Give the file type which refers to a file in the package structure.
0194     //
0195     // NOTE: scripts, main and mainscript are defined in packages.cpp and are
0196     //       specific for a PlasmoidPackage.
0197     QCOMPARE(p->filePath("scripts", "main"), path);
0198     QCOMPARE(p->filePath("mainscript"), path);
0199     delete p;
0200 }
0201 
0202 void PlasmoidPackageTest::entryList()
0203 {
0204     // Create a package named @p packageName which is valid and has some images.
0205     createTestPackage(m_package);
0206 
0207     // Create a package object and verify that it is valid.
0208     Plasma::Package *p = new Plasma::Package(m_defaultPackage);
0209     p->setPath(m_packageRoot + '/' + m_package);
0210     QVERIFY(p->isValid());
0211 
0212     // Now we have a valid package that should contain the following files in
0213     // given filetypes:
0214     // fileTye - Files
0215     // scripts - {"main"}
0216     // images - {"image-1.svg", "image-2.svg"}
0217     QStringList files = p->entryList("scripts");
0218     QCOMPARE(files.size(), 1);
0219     QVERIFY(files.contains("main"));
0220 
0221     files = p->entryList("images");
0222     QCOMPARE(files.size(), 2);
0223     QVERIFY(files.contains("image-1.svg"));
0224     QVERIFY(files.contains("image-2.svg"));
0225     delete p;
0226 }
0227 
0228 void PlasmoidPackageTest::createAndInstallPackage()
0229 {
0230     qDebug() << "                   ";
0231     qDebug() << "   CreateAndInstall ";
0232     createTestPackage("plasmoid_to_package");
0233     const QString packagePath = m_packageRoot + '/' + "testpackage.plasmoid";
0234 
0235     KZip creator(packagePath);
0236     QVERIFY(creator.open(QIODevice::WriteOnly));
0237     creator.addLocalDirectory(m_packageRoot + '/' + "plasmoid_to_package", ".");
0238     creator.close();
0239     KIO::NetAccess::del(QUrl::fromLocalFile(m_packageRoot + "/plasmoid_to_package"), 0);
0240 
0241     QVERIFY(QFile::exists(packagePath));
0242 
0243     KZip package(packagePath);
0244     QVERIFY(package.open(QIODevice::ReadOnly));
0245     const KArchiveDirectory *dir = package.directory();
0246     QVERIFY(dir); //
0247     QVERIFY(dir->entry("metadata.desktop"));
0248     const KArchiveEntry *contentsEntry = dir->entry("contents");
0249     QVERIFY(contentsEntry);
0250     QVERIFY(contentsEntry->isDirectory());
0251     const KArchiveDirectory *contents = static_cast<const KArchiveDirectory *>(contentsEntry);
0252     QVERIFY(contents->entry("ui"));
0253     QVERIFY(contents->entry("images"));
0254 
0255     m_defaultPackageStructure = new Plasma::PackageStructure(this);
0256     Plasma::Package *p = new Plasma::Package(m_defaultPackageStructure);
0257     qDebug() << "Installing " << archivePath;
0258     // const QString packageRoot = "plasma/plasmoids/";
0259     // const QString servicePrefix = "plasma-applet-";
0260     KJob *job = p->install(archivePath, m_packageRoot);
0261     connect(job, SIGNAL(finished(KJob *)), SLOT(packageInstalled(KJob *)));
0262 
0263     // QVERIFY(p->isValid());
0264     delete p;
0265 }
0266 
0267 void PlasmoidPackageTest::packageInstalled(KJob *j)
0268 {
0269     qDebug() << "!!!!!!!!!!!!!!!!!!!! package installed" << (j->error() == KJob::NoError);
0270     QVERIFY(j->error() == KJob::NoError);
0271     // QVERIFY(p->path());
0272 
0273     Plasma::Package *p = new Plasma::Package(m_defaultPackageStructure);
0274     KJob *jj = p->uninstall("org.kde.microblog-qml", m_packageRoot);
0275     // QObject::disconnect(j, SIGNAL(finished(KJob*)), this, SLOT(packageInstalled(KJob*)));
0276     connect(jj, SIGNAL(finished(KJob *)), SLOT(packageInstalled(KJob *)));
0277 }
0278 
0279 void PlasmoidPackageTest::packageUninstalled(KJob *j)
0280 {
0281     qDebug() << "!!!!!!!!!!!!!!!!!!!!! package uninstalled";
0282     QVERIFY(j->error() == KJob::NoError);
0283 }
0284 
0285 QTEST_MAIN(PlasmoidPackageTest)
0286 
0287 #include "moc_plasmoidpackagetest.cpp"