98 lines
2.9 KiB
Go
98 lines
2.9 KiB
Go
package cluster
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"sort"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNewDownstreamManager(t *testing.T) {
|
|
dm := NewDownstreamManager()
|
|
assert.Empty(t, dm.Connected())
|
|
|
|
t.Run("single connection", func(t *testing.T) {
|
|
w1, g1 := net.Pipe()
|
|
dm.addConnection("1", w1)
|
|
assert.Equal(t, []string{"1"}, dm.Connected())
|
|
|
|
dm.Disconnect("1")
|
|
assert.ErrorIs(t, w1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, g1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
|
|
assert.Empty(t, dm.Connected())
|
|
})
|
|
|
|
t.Run("multiple connection with single name", func(t *testing.T) {
|
|
w1, g1 := net.Pipe()
|
|
dm.addConnection("1", w1)
|
|
assert.Equal(t, []string{"1"}, dm.Connected())
|
|
w2, g2 := net.Pipe()
|
|
dm.addConnection("1", w2)
|
|
assert.Equal(t, []string{"1"}, dm.Connected())
|
|
|
|
assert.NoError(t, w1.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, g1.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, w2.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, g2.SetReadDeadline(time.Now()))
|
|
|
|
dm.Disconnect("1")
|
|
assert.ErrorIs(t, w1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, g1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, w2.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, g2.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
|
|
assert.Empty(t, dm.Connected())
|
|
})
|
|
|
|
t.Run("multiple connection with different names", func(t *testing.T) {
|
|
w1, g1 := net.Pipe()
|
|
dm.addConnection("1", w1)
|
|
assert.Equal(t, []string{"1"}, dm.Connected())
|
|
w2, g2 := net.Pipe()
|
|
dm.addConnection("2", w2)
|
|
got := dm.Connected()
|
|
sort.Strings(got)
|
|
assert.Equal(t, []string{"1", "2"}, got)
|
|
|
|
dm.Disconnect("1")
|
|
assert.ErrorIs(t, w1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, g1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
|
|
assert.NoError(t, w2.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, g2.SetReadDeadline(time.Now()))
|
|
|
|
assert.Equal(t, []string{"2"}, dm.Connected())
|
|
|
|
dm.Disconnect("2")
|
|
assert.ErrorIs(t, w2.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, g2.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
})
|
|
}
|
|
|
|
func TestDisconnectUnauthorized(t *testing.T) {
|
|
dm := NewDownstreamManager()
|
|
w1, _ := net.Pipe()
|
|
dm.addConnection("w1", w1)
|
|
w2a, _ := net.Pipe()
|
|
dm.addConnection("w2", w2a)
|
|
w2b, _ := net.Pipe()
|
|
dm.addConnection("w2", w2b)
|
|
w3, _ := net.Pipe()
|
|
dm.addConnection("w3", w3)
|
|
|
|
assert.NoError(t, w1.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, w2a.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, w2b.SetReadDeadline(time.Now()))
|
|
assert.NoError(t, w3.SetReadDeadline(time.Now()))
|
|
|
|
DisconnectUnauthorized(dm, dm.Connected(), []string{"w3"})
|
|
assert.ErrorIs(t, w1.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, w2a.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.ErrorIs(t, w2b.SetReadDeadline(time.Now()), io.ErrClosedPipe)
|
|
assert.NoError(t, w3.SetReadDeadline(time.Now()))
|
|
}
|