diff --git a/tests/common/fakeinternet.cpp b/tests/common/fakeinternet.cpp index a429039..410aa90 100644 --- a/tests/common/fakeinternet.cpp +++ b/tests/common/fakeinternet.cpp @@ -402,6 +402,13 @@ void FakeInternet::respond(QPointer socket, const FakeResponse &resp socket->write(response.body.left(response.truncateTo)); socket->flush(); socket->disconnectFromHost(); + // Schannel (Windows) на disconnectFromHost шлёт только TLS close_notify и держит + // TCP открытым, ожидая ответного close_notify, — клиент тогда висит до таймаута. + // Обрыв на то и обрыв: если сокет не закрылся сам, рвём соединение. + QTimer::singleShot(200, socket, [socket] { + if (socket && socket->state() != QAbstractSocket::UnconnectedState) + socket->abort(); + }); return; } socket->write(response.body); diff --git a/tests/fake_java/main.cpp b/tests/fake_java/main.cpp index 71fe82d..5ed6418 100644 --- a/tests/fake_java/main.cpp +++ b/tests/fake_java/main.cpp @@ -103,7 +103,8 @@ int main(int argc, char *argv[]) } if (!argsFile.empty()) { - std::ofstream out(argsFile, std::ios::trunc); + // binary: в текстовом режиме Windows превратит '\n' в "\r\n", и тесты увидят «-jar\r». + std::ofstream out(argsFile, std::ios::trunc | std::ios::binary); for (int i = 1; i < argc; ++i) out << argv[i] << '\n'; for (const std::string &name : dumpEnv) { diff --git a/tests/net/tst_msaauthservice.cpp b/tests/net/tst_msaauthservice.cpp index d0b7acc..86a60bb 100644 --- a/tests/net/tst_msaauthservice.cpp +++ b/tests/net/tst_msaauthservice.cpp @@ -112,8 +112,11 @@ private slots: QCOMPARE(c.result.userType, QStringLiteral("msa")); QCOMPARE(c.result.clientToken, MsaAuthService::clientId()); QVERIFY(!c.result.licenseMissing); - const qint64 lifetime = before.secsTo(c.result.expiresAt); - QVERIFY(lifetime > 3500 && lifetime <= 3600); + // expiresAt = момент ответа login_with_xbox + expires_in; на медленном раннере + // вся цепочка может идти дольше секунды, поэтому границы — до и после логина. + const QDateTime after = QDateTime::currentDateTimeUtc(); + QVERIFY(c.result.expiresAt >= before.addSecs(3600)); + QVERIFY(c.result.expiresAt <= after.addSecs(3600)); QVERIFY(progress.count() >= 5); // Порядок шагов и формат запроса токена. diff --git a/tests/scripts/smoke_installed.ps1 b/tests/scripts/smoke_installed.ps1 index 119f4b6..03f995b 100644 --- a/tests/scripts/smoke_installed.ps1 +++ b/tests/scripts/smoke_installed.ps1 @@ -1,4 +1,4 @@ -# Дымовая проверка установленного дерева (результат cmake --install) на Windows. +# Дымовая проверка установленного дерева (результат cmake --install) на Windows. # # powershell -File tests\scripts\smoke_installed.ps1 -Prefix C:\r\bl-smoke-stage # diff --git a/tests/scripts/static_checks.py b/tests/scripts/static_checks.py index c15dd96..290f2bf 100755 --- a/tests/scripts/static_checks.py +++ b/tests/scripts/static_checks.py @@ -11,8 +11,10 @@ опустить планку, чтобы достигнутое не откатилось. 3. CHANGELOG.md содержит раздел для версии из project(BiLauncher VERSION …): без него release.yml создаст релиз с пустым описанием (только предупреждение). +4. Скрипты .ps1 с не-ASCII символами сохранены в UTF-8 с BOM: без BOM Windows + PowerShell 5.1 читает их в ANSI-кодировке и падает на разборе кириллицы. """ -import os, re, subprocess, sys +import glob, os, re, subprocess, sys ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) BASELINE = os.path.join(ROOT, "tests", "qmllint-baseline.txt") @@ -75,12 +77,27 @@ def check_changelog(): return True +def check_ps1_bom(): + step("Кодировка .ps1") + ok = True + for path in glob.glob(os.path.join(ROOT, "**", "*.ps1"), recursive=True): + if os.path.relpath(path, ROOT).startswith("build"): # папки сборки + continue + data = open(path, "rb").read() + if not data.startswith(b"\xef\xbb\xbf") and any(b > 0x7F for b in data): + print(f"ОШИБКА: {os.path.relpath(path, ROOT)} содержит не-ASCII, но сохранён без UTF-8 BOM") + ok = False + if ok: + print("все .ps1 читаются Windows PowerShell 5.1") + return ok + + def main(): if len(sys.argv) != 2: print(__doc__) return 2 build_dir = os.path.abspath(sys.argv[1]) - results = [check_translations(), check_qmllint(build_dir), check_changelog()] + results = [check_translations(), check_qmllint(build_dir), check_changelog(), check_ps1_bom()] print("\nИТОГ:", "OK" if all(results) else "ЕСТЬ ОШИБКИ") return 0 if all(results) else 1