Files
MyGoNavi/internal/app/windows_update_maintenance_windows_test.go
Syngnat 60d172254d 🐛 fix(update): 安装前确认并安全关闭当前安装的全部实例
- 安装更新前先确认关闭当前安装目录下的 GoNavi 实例,并继续执行未保存 SQL 退出保护
- 按可执行文件路径枚举并复核进程身份,优雅关闭超时后再强制终止,避免 PID 复用误杀
- 通过全局维护事件阻止更新期间启动新实例,并由 PowerShell 更新器完成跨权限无空窗交接
- 同步更新前端交互、多语言提示、Wails 绑定及 Windows 发布资产校验
2026-07-21 10:55:08 +08:00

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)
}
}