From 35e499620e712d8aded4a69ab65cf2c13be9095e Mon Sep 17 00:00:00 2001 From: Jay Date: Wed, 15 Apr 2026 13:57:56 -0400 Subject: [PATCH] Wrote Remove method. Started tests. --- pool.go | 32 ++++++++++++++++++++++++++ pool_test.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/pool.go b/pool.go index e08e538..e98b898 100644 --- a/pool.go +++ b/pool.go @@ -170,3 +170,35 @@ func (p *Pool) Add(rawURL string) error { return nil } + +func (p *Pool) Remove(rawURL string) error { + url, err := NormalizeURL(rawURL) + if err != nil { + return err + } + + p.mu.Lock() + if p.closed { + p.mu.Unlock() + return errors.NewPoolError("pool is closed") + } + + conn, exists := p.connections[url] + if !exists { + p.mu.Unlock() + return errors.NewPoolError("connection not found") + } + delete(p.connections, url) + p.mu.Unlock() + + close(conn.stop) + conn.inner.Close() + + select { + case p.events <- PoolEvent{URL: url, Kind: EventDisconnected}: + case <-p.done: + return nil + } + + return nil +} diff --git a/pool_test.go b/pool_test.go index dd80a97..1315092 100644 --- a/pool_test.go +++ b/pool_test.go @@ -95,3 +95,68 @@ func TestPoolAdd(t *testing.T) { pool.Close() }) } + +func TestPoolRemove(t *testing.T) { + t.Run("removes known url", func(t *testing.T) { + mockSocket := NewMockSocket() + mockDialer := &MockDialer{ + DialFunc: func(string, http.Header) (Socket, *http.Response, error) { + return mockSocket, nil, nil + }, + } + + pool, err := NewPool(nil, nil) + assert.NoError(t, err) + pool.dialer = mockDialer + + pool.Add("wss://peer1") + pool.Add("wss://peer2") + + // expect two connection events + counter := 2 + assert.Eventually(t, func() bool { + if counter == 0 { + return true + } + select { + case e := <-pool.events: + counter = counter - 1 + assert.Equal(t, EventConnected, e.Kind) + } + return false + }, testTimeout, testTick, "expected connection events") + + // remove a connection + err = pool.Remove("wss://peer2/") + assert.NoError(t, err) + + // expect a disconnected event + assert.Eventually(t, func() bool { + select { + case e := <-pool.events: + return assert.Equal(t, EventDisconnected, e.Kind) + default: + return false + } + }, testTimeout, testTick, "expected disconnected event") + + // connection no longer in pool + pool.mu.Lock() + defer pool.mu.Unlock() + _, ok := pool.connections["wss://peer2"] + assert.False(t, ok, "connection is still in pool") + }) + + t.Run("normalizes url before lookup", func(t *testing.T) { + + }) + + t.Run("unknown url returns error", func(t *testing.T) { + + }) + + t.Run("closed pool returns error", func(t *testing.T) { + + }) + +}