mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
Mirrors the .md/.txt sweep across all tracked _test.go, testdata XML,
and .http integration files. Test files are self-contained (producer
+ assertion in the same file), so the matched-pair swap stays green
under `go test ./...`.
Mapping applied:
192.168.178.[0-9]+ → 192.0.2.[same]
192.168.1.[0-9]+ → 192.0.2.[same]
Sound Machinechen → Living Room SoundTouch
A Sound Machine → Kitchen SoundTouch
A81B6A536A98 + case/separator variants → AABBCCDDEEFF (etc.)
A81B6A849D99 → AABBCCDDEE01
A81B6A849D88 → AABBCCDDEE03
A81B6A536A09 → AABBCCDDEE04
884AEAEEBD27 → AABBCCDDEE02
3230304 → 1000001
9569497 → 1000002
Two semantic fixes alongside the bulk swap:
- pkg/service/zeroconf/zeroconf_test.go: the "private 192" and
"strips query" cases pin acceptance of RFC-1918 192.168/16. They
must use a real 192.168 value; doc-range IPs would (correctly) be
rejected by validateZcBaseURL. Switched to 192.168.10.10 — generic
enough not to match any home LAN default, real enough for the
validator. Added a comment explaining why this single test still
carries a 192.168 literal.
- pkg/service/setup/setup_test.go: TestTestDNSRedirection mocks the
device's `od -An -tu1` byte output, which is space-separated
octets ("192 168 1 100"). My sed only matched the dot-separated
form, so the mock was returning the old IP while the test
assertions had moved to the doc range. Updated to " 192 0 2 100".
go build ./... clean. go test ./... clean (only TestDocsConsistency
remains failing, which is a pre-existing/untracked-file issue).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gesellix/bose-soundtouch/pkg/service/setup"
|
|
)
|
|
|
|
func TestPeerObserver_RegisterSignalForget(t *testing.T) {
|
|
o := newPeerObserver()
|
|
|
|
ch := o.Register("192.0.2.42")
|
|
if ch == nil {
|
|
t.Fatal("Register returned nil channel")
|
|
}
|
|
|
|
first := setup.PeerHit{Path: "/updates/soundtouch", At: time.Now()}
|
|
if !o.Signal("192.0.2.42", first) {
|
|
t.Error("Signal returned false for registered IP")
|
|
}
|
|
|
|
// Second signal while the buffer is still full (no reader yet) drops
|
|
// silently and returns false — only the first hit per window matters.
|
|
if o.Signal("192.0.2.42", setup.PeerHit{Path: "/streaming/x"}) {
|
|
t.Error("second Signal returned true; expected false (buffer full, undrained)")
|
|
}
|
|
|
|
select {
|
|
case got := <-ch:
|
|
if got.Path != first.Path {
|
|
t.Errorf("hit.Path = %q, want %q", got.Path, first.Path)
|
|
}
|
|
case <-time.After(100 * time.Millisecond):
|
|
t.Error("Signal did not deliver hit to channel")
|
|
}
|
|
|
|
o.Forget("192.0.2.42")
|
|
|
|
// After Forget, Signal returns false.
|
|
if o.Signal("192.0.2.42", first) {
|
|
t.Error("Signal returned true after Forget")
|
|
}
|
|
}
|
|
|
|
func TestPeerObserver_UnknownIP(t *testing.T) {
|
|
o := newPeerObserver()
|
|
if o.Signal("10.0.0.1", setup.PeerHit{Path: "/anything"}) {
|
|
t.Error("Signal returned true for unregistered IP")
|
|
}
|
|
}
|
|
|
|
func TestPeerObserver_SignalIsNonBlocking(t *testing.T) {
|
|
o := newPeerObserver()
|
|
o.Register("192.0.2.42") // never drain
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
for i := 0; i < 100; i++ {
|
|
o.Signal("192.0.2.42", setup.PeerHit{Path: "/x"})
|
|
}
|
|
close(done)
|
|
}()
|
|
|
|
select {
|
|
case <-done:
|
|
// Signal never blocked even with no reader and a full buffer.
|
|
case <-time.After(500 * time.Millisecond):
|
|
t.Fatal("Signal blocked when buffer was full — must drop silently")
|
|
}
|
|
}
|