Wrote Remove method. Started tests.
This commit is contained in:
32
pool.go
32
pool.go
@@ -170,3 +170,35 @@ func (p *Pool) Add(rawURL string) error {
|
|||||||
|
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
65
pool_test.go
65
pool_test.go
@@ -95,3 +95,68 @@ func TestPoolAdd(t *testing.T) {
|
|||||||
pool.Close()
|
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) {
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user