mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-08 15:43:42 +08:00
- 安装更新前先确认关闭当前安装目录下的 GoNavi 实例,并继续执行未保存 SQL 退出保护 - 按可执行文件路径枚举并复核进程身份,优雅关闭超时后再强制终止,避免 PID 复用误杀 - 通过全局维护事件阻止更新期间启动新实例,并由 PowerShell 更新器完成跨权限无空窗交接 - 同步更新前端交互、多语言提示、Wails 绑定及 Windows 发布资产校验
56 lines
1.6 KiB
Go
56 lines
1.6 KiB
Go
//go:build windows
|
|
|
|
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
func TestAcquireWindowsUpdateMaintenanceBlocksUntilRelease(t *testing.T) {
|
|
name := fmt.Sprintf(`Global\GoNavi-Update-Test-%d-%d`, os.Getpid(), time.Now().UnixNano())
|
|
lease, err := acquireWindowsUpdateMaintenanceObject(name)
|
|
if err != nil {
|
|
t.Fatalf("acquire maintenance object: %v", err)
|
|
}
|
|
t.Cleanup(lease.Release)
|
|
if active, err := windowsUpdateMaintenanceObjectActive(name); err != nil || !active {
|
|
t.Fatalf("maintenance active = %v error = %v, want active", active, err)
|
|
}
|
|
if _, err := acquireWindowsUpdateMaintenanceObject(name); err == nil {
|
|
t.Fatal("second maintenance acquisition unexpectedly succeeded")
|
|
}
|
|
lease.Release()
|
|
if active, err := windowsUpdateMaintenanceObjectActive(name); err != nil || active {
|
|
t.Fatalf("maintenance active after release = %v error = %v, want inactive", active, err)
|
|
}
|
|
}
|
|
|
|
func TestPrepareWindowsUpdateHandoffWaitsForSignal(t *testing.T) {
|
|
handoff, err := prepareWindowsUpdateHandoff()
|
|
if err != nil {
|
|
t.Fatalf("prepare update handoff: %v", err)
|
|
}
|
|
t.Cleanup(handoff.Close)
|
|
namePtr, err := windows.UTF16PtrFromString(handoff.Name)
|
|
if err != nil {
|
|
t.Fatalf("build handoff name: %v", err)
|
|
}
|
|
handle, err := windows.OpenEvent(windows.EVENT_MODIFY_STATE, false, namePtr)
|
|
if err != nil {
|
|
t.Fatalf("open update handoff event: %v", err)
|
|
}
|
|
if err := windows.SetEvent(handle); err != nil {
|
|
windows.CloseHandle(handle)
|
|
t.Fatalf("signal update handoff event: %v", err)
|
|
}
|
|
windows.CloseHandle(handle)
|
|
if err := handoff.Wait(); err != nil {
|
|
t.Fatalf("wait for update handoff: %v", err)
|
|
}
|
|
}
|