github.com/lingyao2333/mo-zero@v1.4.1/core/syncx/resourcemanager_test.go (about) 1 package syncx 2 3 import ( 4 "errors" 5 "io" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 type dummyResource struct { 12 age int 13 } 14 15 func (dr *dummyResource) Close() error { 16 return errors.New("close") 17 } 18 19 func TestResourceManager_GetResource(t *testing.T) { 20 manager := NewResourceManager() 21 defer manager.Close() 22 23 var age int 24 for i := 0; i < 10; i++ { 25 val, err := manager.GetResource("key", func() (io.Closer, error) { 26 age++ 27 return &dummyResource{ 28 age: age, 29 }, nil 30 }) 31 assert.Nil(t, err) 32 assert.Equal(t, 1, val.(*dummyResource).age) 33 } 34 } 35 36 func TestResourceManager_GetResourceError(t *testing.T) { 37 manager := NewResourceManager() 38 defer manager.Close() 39 40 for i := 0; i < 10; i++ { 41 _, err := manager.GetResource("key", func() (io.Closer, error) { 42 return nil, errors.New("fail") 43 }) 44 assert.NotNil(t, err) 45 } 46 } 47 48 func TestResourceManager_Close(t *testing.T) { 49 manager := NewResourceManager() 50 defer manager.Close() 51 52 for i := 0; i < 10; i++ { 53 _, err := manager.GetResource("key", func() (io.Closer, error) { 54 return nil, errors.New("fail") 55 }) 56 assert.NotNil(t, err) 57 } 58 59 if assert.NoError(t, manager.Close()) { 60 assert.Equal(t, 0, len(manager.resources)) 61 } 62 } 63 64 func TestResourceManager_UseAfterClose(t *testing.T) { 65 manager := NewResourceManager() 66 defer manager.Close() 67 68 _, err := manager.GetResource("key", func() (io.Closer, error) { 69 return nil, errors.New("fail") 70 }) 71 assert.NotNil(t, err) 72 if assert.NoError(t, manager.Close()) { 73 _, err = manager.GetResource("key", func() (io.Closer, error) { 74 return nil, errors.New("fail") 75 }) 76 assert.NotNil(t, err) 77 78 assert.Panics(t, func() { 79 _, err = manager.GetResource("key", func() (io.Closer, error) { 80 return &dummyResource{age: 123}, nil 81 }) 82 }) 83 } 84 } 85 86 func TestResourceManager_Inject(t *testing.T) { 87 manager := NewResourceManager() 88 defer manager.Close() 89 90 manager.Inject("key", &dummyResource{ 91 age: 10, 92 }) 93 94 val, err := manager.GetResource("key", func() (io.Closer, error) { 95 return nil, nil 96 }) 97 assert.Nil(t, err) 98 assert.Equal(t, 10, val.(*dummyResource).age) 99 }