From d0e25ce0a3dbd3463e3e9086f579aab0002b6da0 Mon Sep 17 00:00:00 2001 From: Adam Magued Date: Wed, 14 Oct 2026 05:30:51 +0000 Subject: [PATCH] feat(agent): expose Addr and Port functions for listening agent --- agent/agent.go | 25 +++++++++++++++++++++++++ agent/agent_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/agent/agent.go b/agent/agent.go index 9e605039..d514b31d 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -114,6 +114,31 @@ func Listen(opts Options) error { return nil } +// Addr returns the network address the agent is listening on, or nil if not listening. +func Addr() net.Addr { + mu.Lock() + defer mu.Unlock() + if listener == nil { + return nil + } + return listener.Addr() +} + +// Port returns the TCP port number the agent is listening on. +// It returns an error if the agent is not listening or the address is not a TCP address. +func Port() (int, error) { + mu.Lock() + defer mu.Unlock() + if listener == nil { + return 0, errors.New("gops: agent is not listening") + } + tcpAddr, ok := listener.Addr().(*net.TCPAddr) + if !ok { + return 0, fmt.Errorf("gops: listener address is not TCP: %T", listener.Addr()) + } + return tcpAddr.Port, nil +} + func listen(l net.Listener) { buf := make([]byte, 1) for { diff --git a/agent/agent_test.go b/agent/agent_test.go index e335a56c..6e91b04c 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -65,6 +65,42 @@ func TestAgentListenReuseAddrAndPort(t *testing.T) { Close() } +func TestAgentAddrAndPort(t *testing.T) { + if Addr() != nil { + t.Fatalf("Addr() = %v; want nil before Listen", Addr()) + } + if _, err := Port(); err == nil { + t.Fatal("Port() expected error before Listen, got nil") + } + + err := Listen(Options{Addr: "127.0.0.1:0"}) + if err != nil { + t.Fatal(err) + } + + addr := Addr() + if addr == nil { + t.Fatal("Addr() = nil; want non-nil after Listen") + } + + port, err := Port() + if err != nil { + t.Fatalf("Port() unexpected error: %v", err) + } + if port <= 0 { + t.Fatalf("Port() = %d; want > 0", port) + } + + Close() + + if Addr() != nil { + t.Fatalf("Addr() = %v; want nil after Close", Addr()) + } + if _, err := Port(); err == nil { + t.Fatal("Port() expected error after Close, got nil") + } +} + func TestFormatBytes(t *testing.T) { tests := []struct { val uint64