mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-10-12 01:58:46 +02:00
55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
//go:build darwin
|
|
|
|
package cli
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"reflect"
|
|
"slices"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestInterceptDNSTargetDHCPDeadline(t *testing.T) {
|
|
if reflect.ValueOf(interceptDHCPNameserversForInterfaceFn).Pointer() != reflect.ValueOf(readTargetDHCPNameservers).Pointer() {
|
|
t.Fatal("target discovery bypasses bounded DHCP reader")
|
|
}
|
|
h := newInterceptTargetHarness(t)
|
|
h.dns["Wi-Fi"] = []string{"192.0.2.53"}
|
|
original := targetDHCPReadFn
|
|
t.Cleanup(func() { targetDHCPReadFn = original })
|
|
entered := make(chan struct{})
|
|
targetDHCPReadFn = func(ctx context.Context, device string) ([]string, error) {
|
|
deadline, ok := ctx.Deadline()
|
|
if !ok || time.Until(deadline) > nativeTargetReadBudget || device != "en1" {
|
|
t.Error("missing bounded context or wrong interface")
|
|
close(entered)
|
|
return nil, errors.New("invalid context")
|
|
}
|
|
close(entered)
|
|
<-ctx.Done()
|
|
return nil, ctx.Err()
|
|
}
|
|
interceptDHCPNameserversForInterfaceFn = readTargetDHCPNameservers
|
|
p := newInterceptTargetProg()
|
|
finished := make(chan struct{})
|
|
go func() { p.ensureInterceptDNSTarget([]string{}); close(finished) }()
|
|
<-entered
|
|
cleaned := make(chan struct{})
|
|
go func() { p.removeInterceptDNSTarget("test shutdown"); close(cleaned) }()
|
|
select {
|
|
case <-finished:
|
|
case <-time.After(5 * time.Second):
|
|
t.Fatal("DHCP lookup did not release reconciliation")
|
|
}
|
|
select {
|
|
case <-cleaned:
|
|
case <-time.After(time.Second):
|
|
t.Fatal("cleanup remained blocked after DHCP deadline")
|
|
}
|
|
if !slices.Equal(h.dns["Wi-Fi"], []string{"192.0.2.53"}) || len(h.setCalls) != 0 || len(h.resetCalls) != 0 {
|
|
t.Fatal("deadline changed existing static DNS")
|
|
}
|
|
}
|