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 }