Files
crossdesk/tests/windows_sas_guard_test.cpp
T

150 lines
5.9 KiB
C++

#include <filesystem>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include "interactive_state.h"
namespace {
std::filesystem::path FindRepoRoot() {
std::filesystem::path current = std::filesystem::current_path();
while (!current.empty()) {
if (std::filesystem::exists(current / "xmake.lua") &&
std::filesystem::exists(
current / "src/service/windows/service_host.cpp")) {
return current;
}
current = current.parent_path();
}
return {};
}
std::string ReadFile(const std::filesystem::path& path) {
std::ifstream file(path, std::ios::binary);
if (!file) {
return {};
}
std::ostringstream stream;
stream << file.rdbuf();
return stream.str();
}
bool ExpectContains(const char* name, const std::string& value,
const std::string& expected) {
if (value.find(expected) != std::string::npos) {
return true;
}
std::cerr << name << " missing expected text: " << expected << "\n";
return false;
}
bool ExpectNotContains(const char* name, const std::string& value,
const std::string& unexpected) {
if (value.find(unexpected) == std::string::npos) {
return true;
}
std::cerr << name << " contains unexpected text: " << unexpected << "\n";
return false;
}
bool ExpectTrue(const char* name, bool value) {
if (value) {
return true;
}
std::cerr << name << " expected true\n";
return false;
}
} // namespace
int main() {
const std::filesystem::path repo_root = FindRepoRoot();
if (repo_root.empty()) {
std::cerr << "failed to locate repository root\n";
return 1;
}
const std::string control_bar =
ReadFile(repo_root / "src/gui/toolbars/control_bar.cpp");
const std::string render = ReadFile(repo_root / "src/gui/render.cpp");
const std::string render_h = ReadFile(repo_root / "src/gui/render.h");
const std::string service_host =
ReadFile(repo_root / "src/service/windows/service_host.cpp");
const std::string service_host_h =
ReadFile(repo_root / "src/service/windows/service_host.h");
const std::string session_helper =
ReadFile(repo_root / "src/service/windows/session_helper_main.cpp");
bool ok = true;
ok &= ExpectTrue("secure desktop input routing",
crossdesk::IsSecureDesktopInteractionRequired(
"secure-desktop"));
ok &= ExpectNotContains("control_bar.cpp", control_bar,
"CanSendSecureAttentionSequence("
"props->remote_interactive_stage_)");
ok &= ExpectNotContains("control_bar.cpp", control_bar,
"ImGui::BeginDisabled();\n"
" }\n"
" if (ImGui::Selectable(sas_label.c_str()))");
ok &= ExpectNotContains("render.cpp", render, "sas_requires_lock_screen");
ok &= ExpectContains("render.h", render_h,
"optimistic_windows_secure_desktop_until_tick_");
ok &= ExpectContains("render.cpp", render,
"kWindowsServiceSasSecureDesktopGraceMs");
ok &= ExpectContains("render.cpp", render,
"status->sas_secure_desktop_grace_active");
ok &= ExpectContains("render.cpp", render,
"json.value(\"sas_secure_desktop_grace_active\", false)");
ok &= ExpectContains("render.cpp", render,
"status.sas_secure_desktop_grace_active");
ok &= ExpectContains("render.cpp", render,
"local_interactive_stage_ = \"secure-desktop\"");
ok &= ExpectContains("service_host.h", service_host_h,
"sas_secure_desktop_until_tick_");
ok &= ExpectContains("service_host.h", service_host_h,
"sas_secure_desktop_seen_");
ok &= ExpectContains("service_host.cpp", service_host,
"kSasSecureDesktopGraceMs");
ok &= ExpectContains("service_host.cpp", service_host,
"IsSasSecureDesktopGraceActiveLocked()");
ok &= ExpectContains("service_host.cpp", service_host,
"UpdateSasSecureDesktopGraceLocked("
"session_helper_report_interactive_stage_)");
ok &= ExpectContains("service_host.cpp", service_host,
"sas_secure_desktop_seen_ = true");
ok &= ExpectContains("service_host.cpp", service_host,
"sas_secure_desktop_until_tick_ = 0");
ok &= ExpectContains("service_host.cpp", service_host,
"sas_secure_desktop_until_tick_ =");
ok &= ExpectContains("service_host.cpp", service_host,
"now + kSasSecureDesktopGraceMs");
ok &= ExpectContains("service_host.cpp", service_host,
"\\\"sas_secure_desktop_grace_active\\\"");
ok &= ExpectContains("service_host.cpp", service_host,
"raw_interactive_stage = ResolveInteractiveStageLocked()");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"kSessionHelperStatePollMs = 1000");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"EVENT_SYSTEM_DESKTOPSWITCH");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"SetWinEventHook(");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"MsgWaitForMultipleObjects");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"WaitForSessionHelperStateChange(stop_event, "
"desktop_switch_event)");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"inaccessible_secure_input_desktop");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"desktop_info.error_code == ERROR_ACCESS_DENIED");
ok &= ExpectContains("session_helper_main.cpp", session_helper,
"secure_desktop_active = input_desktop_is_winlogon ||");
return ok ? 0 : 1;
}