77 lines
2.6 KiB
Go
77 lines
2.6 KiB
Go
//go:build windows && smoke
|
|||
|
|
|
||
|
|
package browser
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"chub/internal/domain"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestRealChromiumSmoke(t *testing.T) {
|
||
|
|
ctx := context.Background()
|
||
|
|
discoverer := NewDiscoverer()
|
||
|
|
launcher := NewOSLauncher()
|
||
|
|
type running struct {
|
||
|
|
kind domain.BrowserKind
|
||
|
|
dir string
|
||
|
|
handle ProcessHandle
|
||
|
|
}
|
||
|
|
var processes []running
|
||
|
|
for _, kind := range []domain.BrowserKind{domain.BrowserChrome, domain.BrowserEdge} {
|
||
|
|
executable, err := discoverer.Resolve(ctx, kind, "")
|
||
|
|
if errors.Is(err, ErrExecutableNotFound) {
|
||
|
|
t.Logf("%s not installed; skipping", kind)
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("resolve %s: %v", kind, err)
|
||
|
|
}
|
||
|
|
dir := t.TempDir()
|
||
|
|
handle, err := launcher.Start(ctx, domain.LaunchSpec{Kind: kind, Executable: executable, UserDataDir: dir, TargetURL: "https://example.com", Headless: true, ExtraArgs: []string{"--disable-gpu"}})
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("start %s: %v", kind, err)
|
||
|
|
}
|
||
|
|
processes = append(processes, running{kind: kind, dir: dir, handle: handle})
|
||
|
|
if handle.PID() <= 0 {
|
||
|
|
t.Fatalf("%s returned invalid PID %d", kind, handle.PID())
|
||
|
|
}
|
||
|
|
use, err := launcher.InspectProfile(ctx, dir)
|
||
|
|
if err != nil || !use.Occupied || use.PID != handle.PID() {
|
||
|
|
t.Fatalf("%s registry = %+v, %v", kind, use, err)
|
||
|
|
}
|
||
|
|
external := NewWindowsProfileInspector()
|
||
|
|
externalUse, externalErr := external.InspectProfile(ctx, kind, dir, handle.PID())
|
||
|
|
if externalErr != nil {
|
||
|
|
t.Logf("%s external profile inspection unavailable in headless smoke: %v", kind, externalErr)
|
||
|
|
} else if !externalUse.Occupied {
|
||
|
|
t.Logf("%s external profile inspection found no lock/window evidence in headless mode", kind)
|
||
|
|
} else {
|
||
|
|
t.Logf("%s external profile evidence: %+v", kind, externalUse)
|
||
|
|
}
|
||
|
|
if _, err := launcher.Start(ctx, domain.LaunchSpec{Kind: kind, Executable: executable, UserDataDir: dir, TargetURL: "https://example.com", Headless: true}); !errors.Is(err, domain.ErrProfileOccupied) {
|
||
|
|
t.Fatalf("duplicate %s error = %v", kind, err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if len(processes) < 2 {
|
||
|
|
t.Skip("Chrome and Edge are not both installed")
|
||
|
|
}
|
||
|
|
if processes[0].handle.PID() == processes[1].handle.PID() {
|
||
|
|
t.Fatalf("Chrome and Edge shared PID %d", processes[0].handle.PID())
|
||
|
|
}
|
||
|
|
for _, item := range processes {
|
||
|
|
if err := launcher.StopProfile(ctx, item.dir, true); err != nil {
|
||
|
|
t.Fatalf("force stop %s: %v", item.kind, err)
|
||
|
|
}
|
||
|
|
waitCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||
|
|
code, waitErr := item.handle.Wait(waitCtx)
|
||
|
|
cancel()
|
||
|
|
if waitErr != nil {
|
||
|
|
t.Logf("%s force stop returned expected process wait error: code=%d error=%v", item.kind, code, waitErr)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|