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  }