github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/jottacloud/jottacloud_internal_test.go (about) 1 package jottacloud 2 3 import ( 4 "context" 5 "crypto/md5" 6 "fmt" 7 "io" 8 "testing" 9 "time" 10 11 "github.com/rclone/rclone/fs" 12 "github.com/rclone/rclone/fstest" 13 "github.com/rclone/rclone/fstest/fstests" 14 "github.com/rclone/rclone/lib/random" 15 "github.com/rclone/rclone/lib/readers" 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestReadMD5(t *testing.T) { 21 // Check readMD5 for different size and threshold 22 for _, size := range []int64{0, 1024, 10 * 1024, 100 * 1024} { 23 t.Run(fmt.Sprintf("%d", size), func(t *testing.T) { 24 hasher := md5.New() 25 n, err := io.Copy(hasher, readers.NewPatternReader(size)) 26 require.NoError(t, err) 27 assert.Equal(t, n, size) 28 wantMD5 := fmt.Sprintf("%x", hasher.Sum(nil)) 29 for _, threshold := range []int64{512, 1024, 10 * 1024, 20 * 1024} { 30 t.Run(fmt.Sprintf("%d", threshold), func(t *testing.T) { 31 in := readers.NewPatternReader(size) 32 gotMD5, out, cleanup, err := readMD5(in, size, threshold) 33 defer cleanup() 34 require.NoError(t, err) 35 assert.Equal(t, wantMD5, gotMD5) 36 37 // check md5hash of out 38 hasher := md5.New() 39 n, err := io.Copy(hasher, out) 40 require.NoError(t, err) 41 assert.Equal(t, n, size) 42 outMD5 := fmt.Sprintf("%x", hasher.Sum(nil)) 43 assert.Equal(t, wantMD5, outMD5) 44 }) 45 } 46 }) 47 } 48 } 49 50 func (f *Fs) InternalTestMetadata(t *testing.T) { 51 ctx := context.Background() 52 contents := random.String(1000) 53 54 item := fstest.NewItem("test-metadata", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) 55 utime := time.Now() 56 metadata := fs.Metadata{ 57 "btime": "2009-05-06T04:05:06.499999999Z", 58 "mtime": "2010-06-07T08:09:07.599999999Z", 59 //"utime" - read-only 60 //"content-type" - read-only 61 } 62 obj := fstests.PutTestContentsMetadata(ctx, t, f, &item, contents, true, "text/html", metadata) 63 defer func() { 64 assert.NoError(t, obj.Remove(ctx)) 65 }() 66 o := obj.(*Object) 67 gotMetadata, err := o.Metadata(ctx) 68 require.NoError(t, err) 69 for k, v := range metadata { 70 got := gotMetadata[k] 71 switch k { 72 case "btime": 73 assert.True(t, fstest.Time(v).Truncate(f.Precision()).Equal(fstest.Time(got)), fmt.Sprintf("btime not equal want %v got %v", v, got)) 74 case "mtime": 75 assert.True(t, fstest.Time(v).Truncate(f.Precision()).Equal(fstest.Time(got)), fmt.Sprintf("btime not equal want %v got %v", v, got)) 76 case "utime": 77 gotUtime := fstest.Time(got) 78 dt := gotUtime.Sub(utime) 79 assert.True(t, dt < time.Minute && dt > -time.Minute, fmt.Sprintf("utime more than 1 minute out want %v got %v delta %v", utime, gotUtime, dt)) 80 assert.True(t, fstest.Time(v).Equal(fstest.Time(got))) 81 case "content-type": 82 assert.True(t, o.MimeType(ctx) == got) 83 default: 84 assert.Equal(t, v, got, k) 85 } 86 } 87 } 88 89 func (f *Fs) InternalTest(t *testing.T) { 90 t.Run("Metadata", f.InternalTestMetadata) 91 } 92 93 var _ fstests.InternalTester = (*Fs)(nil)