Files
BiLauncher/tests/unit/tst_javalocator.cpp
T
galeon 41599fa82f
tests / linux (push) Failing after 2m18s
tests / windows (push) Skipped
tests / macos (push) Skipped
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
new unit tests, hehe 67
Signed-off-by: galeon <dertiellis@gmail.com>
2026-10-12 13:14:08 +03:00

146 lines
5.3 KiB
C++

#include "testenv.h"
#include "fixtures.h"
#include "javalocator.h"
#include "javaruntime.h"
#include "localization.h"
#include <QDir>
class TestJavaLocator : public QObject
{
Q_OBJECT
QString m_game;
int m_unique = 0;
// majorVersion() кеширует ответ по пути, поэтому каждая подставная java — в своей папке.
QString fakeJava(const QString &version)
{
return Fixtures::installFakeJava(m_game + QStringLiteral("/jdk-%1").arg(++m_unique), version);
}
private slots:
void init()
{
TestEnv::resetLauncherRoot();
m_game = TestEnv::freshDir(QStringLiteral("game"));
}
void majorVersion_data()
{
QTest::addColumn<QString>("version");
QTest::addColumn<int>("major");
QTest::newRow("java8") << "1.8.0_392" << 8;
QTest::newRow("java11") << "11.0.21" << 11;
QTest::newRow("java17") << "17.0.8" << 17;
QTest::newRow("java21 short") << "21" << 21;
QTest::newRow("java25 ea") << "25-ea" << 25;
}
void majorVersion()
{
QFETCH(QString, version);
QFETCH(int, major);
QCOMPARE(JavaLocator::majorVersion(fakeJava(version)), major);
}
void majorVersionOfNonJava()
{
QCOMPARE(JavaLocator::majorVersion(m_game + QStringLiteral("/nope/java")), 0);
}
void windowlessVariant()
{
const QString java = fakeJava("17.0.8");
#if defined(Q_OS_WIN)
QCOMPARE(JavaLocator::windowlessVariant(java), QFileInfo(java).absolutePath() + "/javaw.exe");
QFile::remove(QFileInfo(java).absolutePath() + "/javaw.exe");
QCOMPARE(JavaLocator::windowlessVariant(java), java);
#else
QCOMPARE(JavaLocator::windowlessVariant(java), java);
#endif
QCOMPARE(JavaLocator::windowlessVariant(QStringLiteral("/opt/custom/launcher")),
QStringLiteral("/opt/custom/launcher"));
}
void findAllSeesManagedAndGameRuntimes()
{
// Java, поставленная лаунчером (JavaRuntimeStore).
InstalledJavaRuntime managed;
managed.id = QStringLiteral("temurin-jdk-21");
managed.kind = QStringLiteral("jdk");
managed.major = 21;
managed.version = QStringLiteral("21.0.2");
managed.javaPath = Fixtures::installFakeJava(JavaRuntimeStore::dirFor(managed.id), "21.0.2");
QVERIFY(JavaRuntimeStore::writeMeta(managed, nullptr));
// Java официального лаунчера внутри .minecraft/runtime.
const QString mojang = Fixtures::installFakeJava(
m_game + "/runtime/java-runtime-gamma/linux/java-runtime-gamma", "17.0.8");
const QStringList all = JavaLocator::findAll(m_game);
QVERIFY(all.size() >= 2);
QCOMPARE(QFileInfo(all.at(0)).canonicalFilePath(), QFileInfo(managed.javaPath).canonicalFilePath());
bool hasMojang = false;
for (const QString &path : all)
hasMojang |= QFileInfo(path).canonicalFilePath() == QFileInfo(mojang).canonicalFilePath();
QVERIFY(hasMojang);
QStringList unique = all;
QCOMPARE(unique.removeDuplicates(), 0);
}
void selectPrefersPreferredWhenSuitable()
{
const QString java = fakeJava("21.0.2");
QString error;
QCOMPARE(JavaLocator::select(m_game, 17, java, &error), QFileInfo(java).absoluteFilePath());
QVERIFY(error.isEmpty());
// Папка JDK тоже годится: берётся bin/java.
const QString fromDir = JavaLocator::select(m_game, 17, QFileInfo(java).absolutePath() + "/..", &error);
QCOMPARE(QFileInfo(fromDir).canonicalFilePath(), QFileInfo(java).canonicalFilePath());
}
void selectReportsMissingPreferred()
{
QString error;
const QString missing = m_game + "/no-such-java";
QVERIFY(JavaLocator::select(m_game, 17, missing, &error).isEmpty());
QCOMPARE(error, Loc::text("java.error.notAtPath").arg(QDir::toNativeSeparators(missing)));
}
void selectFallsBackToManagedRuntime()
{
InstalledJavaRuntime managed;
managed.id = QStringLiteral("temurin-jdk-21b");
managed.kind = QStringLiteral("jdk");
managed.major = 21;
managed.version = QStringLiteral("21.0.2");
managed.javaPath = Fixtures::installFakeJava(JavaRuntimeStore::dirFor(managed.id), "21.0.2");
QVERIFY(JavaRuntimeStore::writeMeta(managed, nullptr));
const QString old = fakeJava("1.8.0_392");
QString error;
const QString chosen = JavaLocator::select(m_game, 21, old, &error);
QCOMPARE(QFileInfo(chosen).canonicalFilePath(), QFileInfo(managed.javaPath).canonicalFilePath());
}
void selectExplainsTooOld()
{
for (const QString &candidate : JavaLocator::findAll(m_game)) {
if (JavaLocator::majorVersion(candidate) >= 99)
QSKIP("в системе есть Java 99+");
}
const QString old = fakeJava("17.0.8");
QString error;
QVERIFY(JavaLocator::select(m_game, 99, old, &error).isEmpty());
// Сообщение называет лучшую из найденных — она не ниже нашей 17.
QVERIFY(!error.isEmpty());
QVERIFY(error.contains(QStringLiteral("99")));
}
};
BILAUNCHER_TEST_MAIN(TestJavaLocator)
#include "tst_javalocator.moc"