From 1810959b89b96acd3de3c04b5be3b9e7942cf1dc Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 00:20:49 +0000 Subject: [PATCH] feat(action): add snake_case bind_address alias for serve Co-Authored-By: Virgil --- action.go | 27 ++++++++++++++------------- service_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/action.go b/action.go index 4ef3f78..1f98091 100644 --- a/action.go +++ b/action.go @@ -25,18 +25,19 @@ var ( ) const ( - actionArgBind = "bind" - actionArgBindAddress = "bindAddress" - actionArgIP = "ip" - actionArgAddress = "address" - actionArgName = "name" - actionArgHost = "host" - actionArgHostName = "hostname" - actionArgPort = "port" - actionArgDNSPort = "dnsPort" - actionArgDNSPortSnake = "dns_port" - actionArgHealthPort = "health_port" - actionArgHealthPortCamel = "healthPort" + actionArgBind = "bind" + actionArgBindAddress = "bindAddress" + actionArgBindAddressSnake = "bind_address" + actionArgIP = "ip" + actionArgAddress = "address" + actionArgName = "name" + actionArgHost = "host" + actionArgHostName = "hostname" + actionArgPort = "port" + actionArgDNSPort = "dnsPort" + actionArgDNSPortSnake = "dns_port" + actionArgHealthPort = "health_port" + actionArgHealthPortCamel = "healthPort" ) type ActionDefinition struct { @@ -301,7 +302,7 @@ func (service *Service) handleReverseLookup(ctx context.Context, values map[stri func (service *Service) handleServe(ctx context.Context, values map[string]any) (any, bool, error) { _ = ctx - bind, _, err := stringActionValueOptionalFromKeys(values, actionArgBind, actionArgBindAddress) + bind, _, err := stringActionValueOptionalFromKeys(values, actionArgBind, actionArgBindAddress, actionArgBindAddressSnake) if err != nil { return nil, false, err } diff --git a/service_test.go b/service_test.go index 0593129..752d624 100644 --- a/service_test.go +++ b/service_test.go @@ -2925,6 +2925,46 @@ func TestServiceHandleActionServeSnakeCaseAliases(t *testing.T) { } } +func TestServiceHandleActionServeSnakeCaseBindAddress(t *testing.T) { + dnsPort := pickFreeTCPPort(t) + service := NewService(ServiceOptions{ + Records: map[string]NameRecords{ + "gateway.charon.lthn": { + A: []string{"10.10.10.10"}, + }, + }, + }) + + payload, ok, err := service.HandleAction(ActionServe, map[string]any{ + "bind_address": "127.0.0.1", + "dns_port": dnsPort, + }) + if err != nil { + t.Fatalf("expected serve action to start with snake_case bind_address: %v", err) + } + if !ok { + t.Fatal("expected serve action to succeed with snake_case bind_address") + } + + server, ok := payload.(*DNSServer) + if !ok { + t.Fatalf("expected DNSServer payload, got %T", payload) + } + if server == nil { + t.Fatal("expected dns server from serve action") + } + + _, runtimeDNSPort, err := net.SplitHostPort(server.DNSAddress()) + if err != nil { + t.Fatalf("expected dns address to include port: %v", err) + } + if runtimeDNSPort != strconv.Itoa(dnsPort) { + t.Fatalf("expected dns port %d, got %q", dnsPort, runtimeDNSPort) + } + + _ = server.Close() +} + func TestServiceResolveServePortDefaultsToStandardDNSPort(t *testing.T) { service := NewService(ServiceOptions{}) if service.ResolveDNSPort() != DefaultDNSPort {