File indexing completed on 2024-05-12 04:39:30

0001 /*
0002     SPDX-FileCopyrightText: 2017 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <cmakeserver.h>
0008 #include <tests/autotestshell.h>
0009 #include <tests/testproject.h>
0010 #include <tests/testcore.h>
0011 #include "testhelpers.h"
0012 #include <cmakeutils.h>
0013 
0014 #include <QTest>
0015 #include <QJsonObject>
0016 #include <QLoggingCategory>
0017 #include <QVersionNumber>
0018 
0019 using namespace KDevelop;
0020 
0021 class CMakeServerTest : public QObject
0022 {
0023     Q_OBJECT
0024 public:
0025     CMakeServerTest()
0026     {
0027         QLoggingCategory::setFilterRules(QStringLiteral("default.debug=true\nkdevelop.projectmanagers.cmake.debug=true\n"));
0028 
0029         AutoTestShell::init({ "KDevCMakeManager", "KDevCMakeBuilder", "KDevMakeBuilder", "KDevStandardOutputView" });
0030         TestCore::initialize();
0031     }
0032 
0033 private Q_SLOTS:
0034     void initTestCase()
0035     {
0036         const auto exe = CMake::findExecutable();
0037         QVERIFY(!exe.isEmpty());
0038         const auto versionStr = CMake::cmakeExecutableVersion(exe);
0039         QVERIFY(!versionStr.isEmpty());
0040         const auto version = QVersionNumber::fromString(versionStr);
0041         QVERIFY(!version.isNull());
0042         const bool versionWithServer = (version >= QVersionNumber(3, 8) && version < QVersionNumber(3, 20));
0043         if (!versionWithServer)
0044             QSKIP("cmake server not supported");
0045     }
0046 
0047     void testRun()
0048     {
0049         CMakeServer server(nullptr);
0050         QSignalSpy spyConnected(&server, &CMakeServer::connected);
0051         QVERIFY(server.isServerAvailable() || spyConnected.wait());
0052 
0053         QSignalSpy spy(&server, &CMakeServer::response);
0054         QJsonObject codeModel;
0055         int errors = 0;
0056         connect(&server, &CMakeServer::response, this, [&errors, &codeModel, &server](const QJsonObject &response) {
0057             if (response.value(QStringLiteral("type")) == QLatin1String("reply")) {
0058                 if (response.value(QStringLiteral("inReplyTo")) == QLatin1String("configure"))
0059                     server.compute();
0060                 else if (response.value(QStringLiteral("inReplyTo")) == QLatin1String("compute"))
0061                     server.codemodel();
0062                 else if(response.value(QStringLiteral("inReplyTo")) == QLatin1String("codemodel"))
0063                     codeModel = response;
0064             } else if(response.value(QStringLiteral("type")) == QLatin1String("error")) {
0065                 ++errors;
0066             }
0067         });
0068 
0069         const QString name = QStringLiteral("single_subdirectory");
0070         const auto paths = projectPaths(name);
0071         const QString builddir = QStringLiteral(CMAKE_TESTS_BINARY_DIR "/cmake-server-test-builddir/") + name;
0072         QVERIFY(QDir(builddir).removeRecursively());
0073         QVERIFY(QDir(builddir).mkpath(builddir));
0074 
0075         QVERIFY(spy.wait());
0076         server.handshake(paths.sourceDir, Path(builddir));
0077         QVERIFY(spy.wait());
0078         server.configure({});
0079         while(codeModel.isEmpty())
0080             QVERIFY(spy.wait());
0081         QCOMPARE(errors, 0);
0082         QVERIFY(!codeModel.isEmpty());
0083         qDebug() << "codemodel" << codeModel;
0084     }
0085 };
0086 
0087 QTEST_MAIN( CMakeServerTest )
0088 
0089 #include "test_cmakeserver.moc"