github.com/lyft/flytestdlib@v0.3.12-0.20210213045714-8cdd111ecda1/futures/future_test.go (about)

     1  package futures
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"runtime"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestNewSyncFuture(t *testing.T) {
    14  	type args struct {
    15  		val interface{}
    16  		err error
    17  	}
    18  	tests := []struct {
    19  		name string
    20  		args args
    21  	}{
    22  		{"val", args{val: "val"}},
    23  		{"nil-val", args{}},
    24  		{"error", args{err: fmt.Errorf("err")}},
    25  	}
    26  	for _, tt := range tests {
    27  		t.Run(tt.name, func(t *testing.T) {
    28  			got := NewSyncFuture(tt.args.val, tt.args.err)
    29  			assert.NotNil(t, got)
    30  			assert.Equal(t, tt.args.val, got.val)
    31  			assert.Equal(t, tt.args.err, got.err)
    32  			assert.True(t, got.Ready())
    33  			v, err := got.Get(context.TODO())
    34  			assert.Equal(t, tt.args.val, v)
    35  			assert.Equal(t, tt.args.err, err)
    36  		})
    37  	}
    38  }
    39  
    40  func TestAsyncFuture(t *testing.T) {
    41  
    42  	const val = "val"
    43  	t.Run("immediate-return-val", func(t *testing.T) {
    44  		v := val
    45  		err := fmt.Errorf("err")
    46  		af := NewAsyncFuture(context.TODO(), func(ctx context.Context) (interface{}, error) {
    47  			return v, err
    48  		})
    49  		assert.NotNil(t, af)
    50  		rv, rerr := af.Get(context.TODO())
    51  		assert.Equal(t, v, rv)
    52  		assert.Equal(t, err, rerr)
    53  		assert.True(t, af.Ready())
    54  	})
    55  
    56  	t.Run("wait-return-val", func(t *testing.T) {
    57  		v := val
    58  		err := fmt.Errorf("err")
    59  		af := NewAsyncFuture(context.TODO(), func(ctx context.Context) (interface{}, error) {
    60  			time.Sleep(time.Second * 1)
    61  			return v, err
    62  		})
    63  		runtime.Gosched()
    64  		assert.NotNil(t, af)
    65  		rv, rerr := af.Get(context.TODO())
    66  		assert.Equal(t, v, rv)
    67  		assert.Equal(t, err, rerr)
    68  		assert.True(t, af.Ready())
    69  	})
    70  
    71  	t.Run("timeout", func(t *testing.T) {
    72  		v := val
    73  		ctx := context.TODO()
    74  		af := NewAsyncFuture(ctx, func(ctx context.Context) (interface{}, error) {
    75  			time.Sleep(time.Second * 5)
    76  			return v, nil
    77  		})
    78  		runtime.Gosched()
    79  		cctx, cancel := context.WithCancel(ctx)
    80  		cancel()
    81  		_, rerr := af.Get(cctx)
    82  		assert.Error(t, rerr)
    83  		assert.Equal(t, ErrAsyncFutureCanceled, rerr)
    84  	})
    85  }