wtclient: divide addr_iter tests into subtests

Split out the existing tests into logical subtests.
This commit is contained in:
Elle Mouton 2023-03-30 12:29:06 +02:00
parent 5477428525
commit de80fffa6c
No known key found for this signature in database
GPG Key ID: D7D916376026F177

View File

@ -10,30 +10,47 @@ import (
// TestAddrIterator tests the behaviour of the addressIterator.
func TestAddrIterator(t *testing.T) {
// Assert that an iterator can't be initialised with an empty address
// list.
_, err := newAddressIterator()
require.ErrorContains(t, err, "must have at least one address")
t.Parallel()
// Prep some addresses to use in the subtests.
addr1, err := net.ResolveTCPAddr("tcp", "1.2.3.4:8000")
require.NoError(t, err)
addr2, err := net.ResolveTCPAddr("tcp", "1.2.3.4:8001")
require.NoError(t, err)
addr3, err := net.ResolveTCPAddr("tcp", "1.2.3.4:8002")
require.NoError(t, err)
t.Run("always at least one address", func(t *testing.T) {
t.Parallel()
// Assert that an iterator can't be initialised with an empty
// address list.
_, err := newAddressIterator()
require.ErrorContains(t, err, "must have at least one address")
// Initialise the iterator with addr1.
iter, err := newAddressIterator(addr1)
require.NoError(t, err)
// Attempting to remove addr1 should fail now since it is the only
// address in the iterator.
// Attempting to remove addr1 should fail now since it is the
// only address in the iterator.
iter.Add(addr1)
err = iter.Remove(addr1)
require.ErrorIs(t, err, wtdb.ErrLastTowerAddr)
// Adding a duplicate of addr1 and then calling Remove should still
// return an error.
// Adding a duplicate of addr1 and then calling Remove should
// still return an error.
err = iter.Remove(addr1)
require.ErrorIs(t, err, wtdb.ErrLastTowerAddr)
})
addr2, err := net.ResolveTCPAddr("tcp", "1.2.3.4:8001")
t.Run("address iteration", func(t *testing.T) {
t.Parallel()
// Initialise the iterator with addr1.
iter, err := newAddressIterator(addr1)
require.NoError(t, err)
// Add addr2 to the iterator.
@ -66,7 +83,8 @@ func TestAddrIterator(t *testing.T) {
a1 = iter.Peek()
require.Equal(t, addr1, a1)
// Wind the list to the end again so that we can test the Reset func.
// Wind the list to the end again so that we can test the Reset
// func.
_, err = iter.Next()
require.NoError(t, err)
@ -80,11 +98,8 @@ func TestAddrIterator(t *testing.T) {
require.NoError(t, err)
require.Equal(t, addr2, a2)
addr3, err := net.ResolveTCPAddr("tcp", "1.2.3.4:8002")
require.NoError(t, err)
// Add addr3 now to ensure that the iteration works even if we are
// midway through the queue.
// Add addr3 now to ensure that the iteration works even if we
// are midway through the queue.
iter.Add(addr3)
// Now Next should return addr 3.
@ -95,12 +110,16 @@ func TestAddrIterator(t *testing.T) {
// Quickly test that GetAll correctly returns a copy of all the
// addresses in the iterator.
addrList := iter.GetAll()
require.ElementsMatch(t, addrList, []net.Addr{addr1, addr2, addr3})
require.ElementsMatch(
t, addrList, []net.Addr{addr1, addr2, addr3},
)
// Also check that an iterator constructed via the Copy method, also
// contains all the expected addresses.
// Also check that an iterator constructed via the Copy method,
// also contains all the expected addresses.
newIterAddrs := iter.Copy().GetAll()
require.ElementsMatch(t, newIterAddrs, []net.Addr{addr1, addr2, addr3})
require.ElementsMatch(
t, newIterAddrs, []net.Addr{addr1, addr2, addr3},
)
// Let's now remove addr3.
err = iter.Remove(addr3)
@ -109,11 +128,18 @@ func TestAddrIterator(t *testing.T) {
// Since addr3 is gone, Peek should return addr1.
a1 = iter.Peek()
require.Equal(t, addr1, a1)
})
// Lastly, we will test the "locking" of addresses.
t.Run("address locking", func(t *testing.T) {
t.Parallel()
// First we test the locking of an address via the PeekAndLock function.
a1 = iter.PeekAndLock()
// Initialise the iterator with addr1 and addr2.
iter, err := newAddressIterator(addr1, addr2)
require.NoError(t, err)
// First we test the locking of an address via the PeekAndLock
// function.
a1 := iter.PeekAndLock()
require.Equal(t, addr1, a1)
require.True(t, iter.HasLocked())
@ -125,16 +151,16 @@ func TestAddrIterator(t *testing.T) {
iter.ReleaseLock(addr1)
require.False(t, iter.HasLocked())
// Since the lock has been released, we should now be able to remove
// addr1.
// Since the lock has been released, we should now be able to
// remove addr1.
err = iter.Remove(addr1)
require.NoError(t, err)
// Now we test the locking of an address via the NextAndLock function.
// To do this, we first re-add addr3.
// Now we test the locking of an address via the NextAndLock
// function. To do this, we first re-add addr3.
iter.Add(addr3)
a2, err = iter.NextAndLock()
a2, err := iter.NextAndLock()
require.NoError(t, err)
require.Equal(t, addr2, a2)
require.True(t, iter.HasLocked())
@ -147,23 +173,22 @@ func TestAddrIterator(t *testing.T) {
iter.ReleaseLock(addr2)
require.False(t, iter.HasLocked())
// Since the lock has been released, we should now be able to remove
// addr1.
// Since the lock has been released, we should now be able to
// remove addr1.
err = iter.Remove(addr2)
require.NoError(t, err)
// Only addr3 should still be left in the iterator.
addrList = iter.GetAll()
addrList := iter.GetAll()
require.Len(t, addrList, 1)
require.Contains(t, addrList, addr3)
// Ensure that HasLocked acts correctly in the case where more than one
// address is being locked and unlock as well as the case where the same
// address is locked more than once.
// Ensure that HasLocked acts correctly in the case where more
// than one address is being locked and unlock as well as the
// case where the same address is locked more than once.
require.False(t, iter.HasLocked())
a3 = iter.PeekAndLock()
a3 := iter.PeekAndLock()
require.Equal(t, addr3, a3)
require.True(t, iter.HasLocked())
@ -177,17 +202,18 @@ func TestAddrIterator(t *testing.T) {
require.Equal(t, addr2, a2)
require.True(t, iter.HasLocked())
// Now release addr2 and asset that HasLock is still true.
// Now release addr2 and assert that HasLock is still true.
iter.ReleaseLock(addr2)
require.True(t, iter.HasLocked())
// Releasing one of the locks on addr3 now should still result in
// HasLocked returning true.
// Releasing one of the locks on addr3 now should still result
// in HasLocked returning true.
iter.ReleaseLock(addr3)
require.True(t, iter.HasLocked())
// Releasing it again should now result in should still result in
// HasLocked returning false.
// Releasing it again should now result in should still result
// in HasLocked returning false.
iter.ReleaseLock(addr3)
require.False(t, iter.HasLocked())
})
}