feat: add preferred debug port planning
This commit is contained in:
@@ -159,6 +159,91 @@ func TestShellStartsInstanceAsynchronouslyAndAppliesResult(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestShellAssignsAndRecommendsUnreservedPreferredPorts(t *testing.T) {
|
||||
shell := NewShell(material.NewTheme())
|
||||
shell.SetSettings(SettingsState{RemoteDebugStartPort: 9777})
|
||||
shell.SetInstances([]InstanceRow{
|
||||
{ID: "preferred", PreferredRemoteDebugPort: 9777},
|
||||
{ID: "runtime", RemoteDebugPort: 9778},
|
||||
{ID: "legacy"},
|
||||
{ID: "legacy-second"},
|
||||
})
|
||||
|
||||
if shell.rows[1].PreferredRemoteDebugPort != 9779 || shell.rows[2].PreferredRemoteDebugPort != 9780 || shell.rows[3].PreferredRemoteDebugPort != 9781 {
|
||||
t.Fatalf("assigned preferred ports = %#v", shell.rows)
|
||||
}
|
||||
if got := shell.recommendRemoteDebugPort(""); got != 9782 {
|
||||
t.Fatalf("recommended port = %d, want 9782", got)
|
||||
}
|
||||
reserved := shell.reservedRemoteDebugPorts("legacy")
|
||||
if len(reserved) != 4 || reserved[0] != 9777 || reserved[1] != 9779 || reserved[2] != 9778 || reserved[3] != 9781 {
|
||||
t.Fatalf("reserved ports = %#v", reserved)
|
||||
}
|
||||
}
|
||||
|
||||
func TestInstancePortLabelDistinguishesSuggestedAndActualPorts(t *testing.T) {
|
||||
cases := []struct {
|
||||
row InstanceRow
|
||||
want string
|
||||
}{
|
||||
{InstanceRow{Status: "已退出", PreferredRemoteDebugPort: 9666}, "建议 9666"},
|
||||
{InstanceRow{Status: "启动中", PreferredRemoteDebugPort: 9667}, "准备 9667"},
|
||||
{InstanceRow{Status: "运行中", PreferredRemoteDebugPort: 9666, RemoteDebugPort: 9668}, "实际 9668"},
|
||||
{InstanceRow{Status: "外部已关联", RemoteDebugPort: 9669}, "外部 9669"},
|
||||
}
|
||||
for _, test := range cases {
|
||||
if got := instancePortLabel(test.row); got != test.want {
|
||||
t.Fatalf("instancePortLabel(%#v) = %q, want %q", test.row, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestShellPersistsFallbackPortAfterSuccessfulManagedStart(t *testing.T) {
|
||||
shell := NewShell(material.NewTheme())
|
||||
shell.SetInstances([]InstanceRow{{ID: "instance", Name: "实例", Status: "启动中", PreferredRemoteDebugPort: 9666}})
|
||||
changes := 0
|
||||
shell.OnInstancesChanged(func([]InstanceRow) { changes++ })
|
||||
shell.startStates["instance"] = &instanceStartState{request: 1, running: true}
|
||||
shell.startResults <- instanceStartResult{
|
||||
id: "instance",
|
||||
request: 1,
|
||||
outcome: InstanceStartOutcome{PID: 4242, RemoteDebugPort: 9668, Source: "chub_registry"},
|
||||
}
|
||||
|
||||
shell.consumeStartResults()
|
||||
row, ok := shell.instanceRow("instance")
|
||||
if !ok || row.Status != "运行中" || row.RemoteDebugPort != 9668 || row.PreferredRemoteDebugPort != 9668 {
|
||||
t.Fatalf("fallback result = %#v", row)
|
||||
}
|
||||
if changes != 1 {
|
||||
t.Fatalf("instance change notifications = %d, want 1", changes)
|
||||
}
|
||||
}
|
||||
|
||||
func TestShellRejectsReservedPreferredPortWhenCreatingOrEditing(t *testing.T) {
|
||||
shell := NewShell(material.NewTheme())
|
||||
shell.SetInstances([]InstanceRow{
|
||||
{ID: "one", Name: "一号", Browser: "Chrome", UserDataDir: `C:\profiles\one`, Status: "已退出", PreferredRemoteDebugPort: 9666},
|
||||
{ID: "two", Name: "二号", Browser: "Edge", UserDataDir: `C:\profiles\two`, Status: "已退出", PreferredRemoteDebugPort: 9667},
|
||||
})
|
||||
|
||||
shell.instanceName.SetText("三号")
|
||||
shell.instanceDir.SetText(`C:\profiles\three`)
|
||||
shell.instancePort.SetText("9666")
|
||||
shell.createInstanceFromForm()
|
||||
if len(shell.rows) != 2 || !strings.Contains(shell.formFeedback, "端口 9666") {
|
||||
t.Fatalf("create duplicate port = rows %#v, feedback %q", shell.rows, shell.formFeedback)
|
||||
}
|
||||
|
||||
shell.beginEdit("one")
|
||||
shell.editPreferredPort.SetText("9667")
|
||||
shell.saveEdit()
|
||||
row, _ := shell.instanceRow("one")
|
||||
if row.PreferredRemoteDebugPort != 9666 || !strings.Contains(shell.editFeedback, "端口 9667") {
|
||||
t.Fatalf("edit duplicate port = row %#v, feedback %q", row, shell.editFeedback)
|
||||
}
|
||||
}
|
||||
|
||||
func TestShellDoesNotStartTheSameInstanceTwiceWhilePending(t *testing.T) {
|
||||
shell := NewShell(material.NewTheme())
|
||||
target := shell.rows[0]
|
||||
|
||||
Reference in New Issue
Block a user