github.com/xhghs/rclone@v1.51.1-0.20200430155106-e186a28cced8/lib/bucket/bucket_test.go (about)

     1  package bucket
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestSplit(t *testing.T) {
    11  	for _, test := range []struct {
    12  		in         string
    13  		wantBucket string
    14  		wantPath   string
    15  	}{
    16  		{in: "", wantBucket: "", wantPath: ""},
    17  		{in: "bucket", wantBucket: "bucket", wantPath: ""},
    18  		{in: "bucket/path", wantBucket: "bucket", wantPath: "path"},
    19  		{in: "bucket/path/subdir", wantBucket: "bucket", wantPath: "path/subdir"},
    20  	} {
    21  		gotBucket, gotPath := Split(test.in)
    22  		assert.Equal(t, test.wantBucket, gotBucket, test.in)
    23  		assert.Equal(t, test.wantPath, gotPath, test.in)
    24  	}
    25  }
    26  
    27  func TestCache(t *testing.T) {
    28  	c := NewCache()
    29  	errBoom := errors.New("boom")
    30  
    31  	assert.Equal(t, 0, len(c.status))
    32  
    33  	// IsDeleted before creation
    34  	assert.False(t, c.IsDeleted("bucket"))
    35  
    36  	// MarkOK
    37  
    38  	c.MarkOK("")
    39  	assert.Equal(t, 0, len(c.status))
    40  
    41  	// MarkOK again
    42  
    43  	c.MarkOK("bucket")
    44  	assert.Equal(t, map[string]bool{"bucket": true}, c.status)
    45  
    46  	// MarkDeleted
    47  
    48  	c.MarkDeleted("bucket")
    49  	assert.Equal(t, map[string]bool{"bucket": false}, c.status)
    50  
    51  	// MarkOK again
    52  
    53  	c.MarkOK("bucket")
    54  	assert.Equal(t, map[string]bool{"bucket": true}, c.status)
    55  
    56  	// IsDeleted after creation
    57  	assert.False(t, c.IsDeleted("bucket"))
    58  
    59  	// Create from root
    60  
    61  	err := c.Create("", nil, nil)
    62  	assert.NoError(t, err)
    63  	assert.Equal(t, map[string]bool{"bucket": true}, c.status)
    64  
    65  	// Create bucket that is already OK
    66  
    67  	err = c.Create("bucket", nil, nil)
    68  	assert.NoError(t, err)
    69  	assert.Equal(t, map[string]bool{"bucket": true}, c.status)
    70  
    71  	// Create new bucket
    72  
    73  	err = c.Create("bucket2", func() error {
    74  		return nil
    75  	}, func() (bool, error) {
    76  		return true, nil
    77  	})
    78  	assert.NoError(t, err)
    79  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true}, c.status)
    80  
    81  	// Create bucket that has been deleted with error
    82  
    83  	c.status["bucket2"] = false // mark bucket deleted
    84  	err = c.Create("bucket2", nil, func() (bool, error) {
    85  		return false, errBoom
    86  	})
    87  	assert.Equal(t, errBoom, err)
    88  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": false}, c.status)
    89  
    90  	// Create bucket that has been deleted with no error
    91  
    92  	err = c.Create("bucket2", nil, func() (bool, error) {
    93  		return true, nil
    94  	})
    95  	assert.NoError(t, err)
    96  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true}, c.status)
    97  
    98  	// Create a new bucket with no exists function
    99  
   100  	err = c.Create("bucket3", func() error {
   101  		return nil
   102  	}, nil)
   103  	assert.NoError(t, err)
   104  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": true}, c.status)
   105  
   106  	// Create a new bucket with no exists function with an error
   107  
   108  	err = c.Create("bucket4", func() error {
   109  		return errBoom
   110  	}, nil)
   111  	assert.Equal(t, errBoom, err)
   112  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": true}, c.status)
   113  
   114  	// Remove root
   115  
   116  	err = c.Remove("", func() error {
   117  		return nil
   118  	})
   119  	assert.NoError(t, err)
   120  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": true}, c.status)
   121  
   122  	// Remove existing bucket
   123  
   124  	err = c.Remove("bucket3", func() error {
   125  		return nil
   126  	})
   127  	assert.NoError(t, err)
   128  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": false}, c.status)
   129  
   130  	// IsDeleted after removal
   131  	assert.True(t, c.IsDeleted("bucket3"))
   132  
   133  	// Remove it again
   134  
   135  	err = c.Remove("bucket3", func() error {
   136  		return errBoom
   137  	})
   138  	assert.Equal(t, ErrAlreadyDeleted, err)
   139  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": false}, c.status)
   140  
   141  	// Remove bucket with error
   142  
   143  	err = c.Remove("bucket2", func() error {
   144  		return errBoom
   145  	})
   146  	assert.Equal(t, errBoom, err)
   147  	assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": false}, c.status)
   148  }