Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
36 changes: 36 additions & 0 deletions agent/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading