package main import ( "os" "path/filepath" "strings" "testing" ) // A relaunch of OpsLog itself must not suppress the new process's window. // // SysProcAttr is where that damage was done: hideConsole sets HideWindow, which // on Windows becomes SW_HIDE in the STARTUPINFO, and Windows applies it to the // first top-level window the new process shows. The updated OpsLog started, // took the single-instance mutex and connected the rig — invisibly. Two // operators on 0.27.23 reported it as "it goes to reload and just fails to // load": a process in the task manager, no window, and killing it then starting // it by hand working every time. // // Nil, not "some specific value": there is nothing a self-relaunch needs from // STARTUPINFO, and anything set there is a window flag waiting to be wrong. func TestRelaunchCmdDoesNotTouchTheWindow(t *testing.T) { cmd := relaunchCmd(filepath.Join("C:", "OpsLog", "OpsLog.exe"), "--post-update", "--wait-pid", "1234") if cmd.SysProcAttr != nil { t.Errorf("relaunchCmd set SysProcAttr = %+v; a self-relaunch must leave the window alone", cmd.SysProcAttr) } if len(cmd.Args) != 4 || cmd.Args[1] != "--post-update" || cmd.Args[3] != "1234" { t.Errorf("args = %v, want the exe plus the three passed through", cmd.Args) } // The working directory matters: the new instance keeps its data folder // beside the executable, and inheriting the old process's cwd would look for // it somewhere else entirely. if cmd.Dir != filepath.Join("C:", "OpsLog") { t.Errorf("Dir = %q, want the executable's folder", cmd.Dir) } } // hideConsole is right for the console tools and wrong for OpsLog, and the two // live a few lines apart. This is the guard that stops the update path // borrowing it again — which is how it broke the first time, when the // PowerShell helper was replaced by a direct exec.Command beside them. func TestUpdateRelaunchDoesNotHideTheWindow(t *testing.T) { src, err := os.ReadFile("update.go") if err != nil { t.Fatalf("read update.go: %v", err) } if strings.Contains(string(src), "hideConsole(") { t.Error("update.go calls hideConsole — a relaunch of OpsLog must not hide its window (see relaunch.go)") } if !strings.Contains(string(src), "relaunchCmd(exe,") { t.Error("update.go no longer relaunches through relaunchCmd, where that rule is written down") } }