功能:完善通用云管工作台、审计与诊断能力

这个提交包含在:
songyiming 于 2026-11-11 18:46:16 +08:00 提交
1 父节点 5ac692724d
当前提交 9f05aa20ea
225 个文件已更改
+14266 -141

没有与搜索条件相匹配的文件

@@ -11,6 +11,7 @@ class DesktopListPageTest : public QObject {
private slots:
void firstClickDisablesActionsAndBlocksDuplicate();
void poweredOffSharedDesktopCanStart();
};
void DesktopListPageTest::firstClickDisablesActionsAndBlocksDuplicate() {
@@ -49,5 +50,26 @@ void DesktopListPageTest::firstClickDisablesActionsAndBlocksDuplicate() {
QVERIFY(editButton->isEnabled());
}
void DesktopListPageTest::poweredOffSharedDesktopCanStart() {
DesktopListPage page;
DesktopInfo desktop;
desktop.id = QStringLiteral("shared-linux");
desktop.name = QStringLiteral("Ubuntu");
desktop.os = QStringLiteral("Ubuntu");
desktop.state = DesktopState::kAvailable;
desktop.powerOnConnect = true;
desktop.poweredOff = true;
page.setDesktops({desktop});
auto* button = page.findChild<QPushButton*>(QStringLiteral("connectButton"));
QVERIFY(button);
QVERIFY(button->isEnabled());
QCOMPARE(button->text(), QStringLiteral("启动并连接"));
QSignalSpy spy(&page, &DesktopListPage::desktopSelected);
button->click();
QCOMPARE(spy.count(), 1);
QCOMPARE(spy.at(0).at(0).toString(), desktop.id);
QVERIFY(!button->isEnabled());
}
QTEST_MAIN(DesktopListPageTest)
#include "test_desktop_list_page.moc"
@@ -14,6 +14,7 @@
#include "desktop_list_page.h"
#include "main_window.h"
#include "platform_client.h"
namespace vdi {
@@ -26,6 +27,10 @@ public:
int delayMs = 0;
int authRequests = 0;
int listRequests = 0;
bool sharedGPU = false;
bool prepareFailed = false;
int preparePolls = 0;
int ticketRequests = 0;
protected:
void incomingConnection(qintptr descriptor) override {
@@ -55,8 +60,24 @@ protected:
++listRequests;
body["items"] = QJsonArray{QJsonObject{
{"id", "authorized-desktop"}, {"name", "Authorized Windows"},
{"os", "Windows"}, {"powerState", "running"},
{"os", "Windows"}, {"powerState", sharedGPU ? "stopped" : "running"},
{"powerOnConnect", sharedGPU},
{"endpoint", "127.0.0.1"}, {"app", "Desktop"}}};
} else if (path == "/api/v1/terminal/desktop-prepare") {
status = 202;
body["taskId"] = "prepare-task";
body["status"] = "queued";
} else if (path == "/api/v1/terminal/desktop-prepare/prepare-task") {
++preparePolls;
body["status"] = prepareFailed ? "failed" : (preparePolls > 1 ? "success" : "running");
body["message"] = "prepare test result";
} else if (path == "/api/v1/terminal/connect-ticket") {
++ticketRequests;
status = 201;
body["ticket"] = "prepared-ticket";
} else if (path == "/api/v1/terminal/connect-ticket/consume") {
body = QJsonObject{{"desktopId", "authorized-desktop"}, {"sessionId", "prepared-session"},
{"endpoint", "127.0.0.1"}, {"width", 2560}, {"height", 1440}, {"fps", 45}};
} else {
body["items"] = QJsonArray{};
}
@@ -210,6 +231,38 @@ private slots:
QVERIFY(selectionVisible(window));
QVERIFY(!window.deviceAuthTimer_->isActive());
}
void sharedDesktopWaitsBeforeIssuingTicket() {
for (bool fail : {false, true}) {
TestPlatform server;
QVERIFY(server.listen(QHostAddress::LocalHost, 0));
configure(server, server.serverPort());
server.sharedGPU = true;
server.prepareFailed = fail;
PlatformClient client;
bool authenticated = false;
client.authenticate([&](const AuthResult& result) { authenticated = result.ok; });
QTRY_VERIFY(authenticated);
bool listed = false;
client.list([&](std::vector<DesktopInfo> desktops, const QString& error) {
QVERIFY(error.isEmpty());
QCOMPARE(desktops.size(), size_t(1));
QVERIFY(desktops[0].powerOnConnect && desktops[0].poweredOff);
QCOMPARE(desktops[0].state, DesktopState::kAvailable);
listed = true;
});
QTRY_VERIFY(listed);
bool completed = false;
client.ticket("authorized-desktop", [&](const ConnectionTicket& ticket, const QString& error) {
QCOMPARE(error.isEmpty(), !fail);
if (!fail) QCOMPARE(ticket.sessionId, QString("prepared-session"));
completed = true;
});
QTRY_VERIFY(server.preparePolls > 0);
QCOMPARE(server.ticketRequests, 0);
QTRY_VERIFY(completed);
QCOMPARE(server.ticketRequests, fail ? 0 : 1);
}
}
};
} // namespace vdi
@@ -16,8 +16,22 @@ private slots:
void buildsConsistentStreamArguments();
void selectsProfileWithoutLosingStats();
void rejectsInvalidDecoderOverride();
void validatesConfiguredBitrate();
};
void MoonlightSessionTest::validatesConfiguredBitrate() {
ConnectionTicket ticket;
ticket.width = 2560;
ticket.height = 1440;
QProcessEnvironment environment;
for (const QString& value : {QString("25000"), QString("0"), QString("150001"), QString("invalid")}) {
environment.insert("VDI_MOONLIGHT_BITRATE_KBPS", value);
auto options = MoonlightSession::optionsFromEnvironment(environment);
const auto arguments = MoonlightSession::buildStreamArguments(ticket, options);
QCOMPARE(arguments.at(arguments.indexOf("--bitrate") + 1), value == "25000" ? QString("25000") : QString("30000"));
}
}
void MoonlightSessionTest::parsesSplitReadyMarkers() {
MoonlightOutputParser parser;
parser.append("Test decode succ");