rclone/lib/bucket/bucket_test.go

170 lines
4.2 KiB
Go

package bucket
import (
"errors"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func TestSplit(t *testing.T) {
for _, test := range []struct {
in string
wantBucket string
wantPath string
}{
{in: "", wantBucket: "", wantPath: ""},
{in: "bucket", wantBucket: "bucket", wantPath: ""},
{in: "bucket/path", wantBucket: "bucket", wantPath: "path"},
{in: "bucket/path/subdir", wantBucket: "bucket", wantPath: "path/subdir"},
} {
gotBucket, gotPath := Split(test.in)
assert.Equal(t, test.wantBucket, gotBucket, test.in)
assert.Equal(t, test.wantPath, gotPath, test.in)
}
}
func TestJoin(t *testing.T) {
for _, test := range []struct {
in1, in2 string
want string
}{
{in1: "", in2: "", want: ""},
{in1: "in1", in2: "", want: "in1"},
{in1: "", in2: "in2", want: "in2"},
{in1: "in1", in2: "in2", want: "in1/in2"},
{in1: "in1/", in2: "in2", want: "in1/in2"},
{in1: "in1", in2: "/in2", want: "in1/in2"},
{in1: "in1", in2: "in2/", want: "in1/in2/"},
{in1: "/in1", in2: "/in2", want: "/in1/in2"},
{in1: "/in1", in2: "../in2", want: "/in1/../in2"},
} {
got := Join(test.in1, test.in2)
assert.Equal(t, test.want, got, fmt.Sprintf("in1=%q, in2=%q", test.in1, test.in2))
}
}
func TestCache(t *testing.T) {
c := NewCache()
errBoom := errors.New("boom")
assert.Equal(t, 0, len(c.status))
// IsDeleted before creation
assert.False(t, c.IsDeleted("bucket"))
// MarkOK
c.MarkOK("")
assert.Equal(t, 0, len(c.status))
// MarkOK again
c.MarkOK("bucket")
assert.Equal(t, map[string]bool{"bucket": true}, c.status)
// MarkDeleted
c.MarkDeleted("bucket")
assert.Equal(t, map[string]bool{"bucket": false}, c.status)
// MarkOK again
c.MarkOK("bucket")
assert.Equal(t, map[string]bool{"bucket": true}, c.status)
// IsDeleted after creation
assert.False(t, c.IsDeleted("bucket"))
// Create from root
err := c.Create("", nil, nil)
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true}, c.status)
// Create bucket that is already OK
err = c.Create("bucket", nil, nil)
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true}, c.status)
// Create new bucket
err = c.Create("bucket2", func() error {
return nil
}, func() (bool, error) {
return true, nil
})
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true}, c.status)
// Create bucket that has been deleted with error
c.status["bucket2"] = false // mark bucket deleted
err = c.Create("bucket2", nil, func() (bool, error) {
return false, errBoom
})
assert.Equal(t, errBoom, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": false}, c.status)
// Create bucket that has been deleted with no error
err = c.Create("bucket2", nil, func() (bool, error) {
return true, nil
})
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true}, c.status)
// Create a new bucket with no exists function
err = c.Create("bucket3", func() error {
return nil
}, nil)
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": true}, c.status)
// Create a new bucket with no exists function with an error
err = c.Create("bucket4", func() error {
return errBoom
}, nil)
assert.Equal(t, errBoom, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": true}, c.status)
// Remove root
err = c.Remove("", func() error {
return nil
})
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": true}, c.status)
// Remove existing bucket
err = c.Remove("bucket3", func() error {
return nil
})
assert.NoError(t, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": false}, c.status)
// IsDeleted after removal
assert.True(t, c.IsDeleted("bucket3"))
// Remove it again
err = c.Remove("bucket3", func() error {
return errBoom
})
assert.Equal(t, ErrAlreadyDeleted, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": false}, c.status)
// Remove bucket with error
err = c.Remove("bucket2", func() error {
return errBoom
})
assert.Equal(t, errBoom, err)
assert.Equal(t, map[string]bool{"bucket": true, "bucket2": true, "bucket3": false}, c.status)
}