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)