package audio import ( "os" "testing" "time" ) func TestInSSHSession(t *testing.T) { t.Setenv("SSH_CONNECTION", "") t.Setenv("SSH_CLIENT", "") t.Setenv("SSH_TTY", "") if InSSHSession() { t.Fatal("harusnya false tanpa env SSH") } t.Setenv("SSH_CONNECTION", "10.0.0.1 22") if !InSSHSession() { t.Fatal("harusnya true dengan SSH_CONNECTION") } } func TestEngineDisabledGraceful(t *testing.T) { e := New(Options{Enabled: false}) if e.Ready() { t.Fatal("engine disabled tidak boleh ready") } if got := e.Status(); got != "nonaktif" { t.Fatalf("status: %q", got) } e.Play(Click) // tidak boleh panic e.Play(Navigate) } func TestEngineSSHMute(t *testing.T) { t.Setenv("SSH_CONNECTION", "10.0.0.1 22") e := New(Options{Enabled: true, MuteOnSSH: true}) if !e.Muted() { t.Fatal("harusnya muted di sesi SSH") } if got := e.Status(); got != "SSH auto-mute" { t.Fatalf("status: %q", got) } e.Play(Click) // no-op } // TestEngineSpike — bukti Phase 0 (T-0.3). Jalankan manual: // // TIA_AUDIO_SPIKE=1 go test ./internal/audio/ -run TestEngineSpike -v -count=1 // // Mengukur init (harus non-blocking) dan memastikan Play() cepat + tidak panic. // Tanpa audio device, test tetap lulus sebagai bukti degradasi anggun. func TestEngineSpike(t *testing.T) { if os.Getenv("TIA_AUDIO_SPIKE") != "1" { t.Skip("set TIA_AUDIO_SPIKE=1 untuk menjalankan spike audio") } t0 := time.Now() e := New(Options{Enabled: true, Volume: 70}) t.Logf("New() kembali dalam %v (non-blocking)", time.Since(t0)) t1 := time.Now() ok := e.WaitReady(5 * time.Second) t.Logf("init+ready selesai dalam %v (ready=%v, status=%q, err=%v)", time.Since(t1), ok, e.Status(), e.Err()) if !ok { // Skenario tanpa audio device: cukup buktikan tidak panic. e.Play(Click) return } for _, ev := range []Event{Click, Navigate, NotifySuccess} { t2 := time.Now() e.Play(ev) t.Logf("Play(%s) kembali dalam %v", ev, time.Since(t2)) time.Sleep(150 * time.Millisecond) } time.Sleep(400 * time.Millisecond) }