github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/util/waitmap/waitmap_test.go (about)

     1  package waitmap
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestGetAfter(t *testing.T) {
    13  	m := New()
    14  
    15  	m.Set("foo", "bar")
    16  	m.Set("bar", "baz")
    17  
    18  	ctx := context.TODO()
    19  	v, err := m.Get(ctx, "foo", "bar")
    20  	require.NoError(t, err)
    21  
    22  	require.Equal(t, 2, len(v))
    23  	require.Equal(t, "bar", v["foo"])
    24  	require.Equal(t, "baz", v["bar"])
    25  
    26  	v, err = m.Get(ctx, "foo")
    27  	require.NoError(t, err)
    28  	require.Equal(t, 1, len(v))
    29  	require.Equal(t, "bar", v["foo"])
    30  }
    31  
    32  func TestTimeout(t *testing.T) {
    33  	m := New()
    34  
    35  	m.Set("foo", "bar")
    36  
    37  	ctx, cancel := context.WithTimeout(context.TODO(), 100*time.Millisecond)
    38  	defer cancel()
    39  
    40  	_, err := m.Get(ctx, "bar")
    41  	require.Error(t, err)
    42  	require.True(t, errors.Is(err, context.DeadlineExceeded))
    43  }
    44  
    45  func TestBlocking(t *testing.T) {
    46  	m := New()
    47  
    48  	m.Set("foo", "bar")
    49  
    50  	go func() {
    51  		time.Sleep(100 * time.Millisecond)
    52  		m.Set("bar", "baz")
    53  		time.Sleep(50 * time.Millisecond)
    54  		m.Set("baz", "abc")
    55  	}()
    56  
    57  	ctx := context.TODO()
    58  	v, err := m.Get(ctx, "foo", "bar", "baz")
    59  	require.NoError(t, err)
    60  	require.Equal(t, 3, len(v))
    61  	require.Equal(t, "bar", v["foo"])
    62  	require.Equal(t, "baz", v["bar"])
    63  	require.Equal(t, "abc", v["baz"])
    64  }