github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/hasher/hasher_internal_test.go (about) 1 package hasher 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "testing" 8 9 "github.com/rclone/rclone/fs" 10 "github.com/rclone/rclone/fs/config/obscure" 11 "github.com/rclone/rclone/fs/operations" 12 "github.com/rclone/rclone/fstest" 13 "github.com/rclone/rclone/fstest/fstests" 14 "github.com/rclone/rclone/lib/kv" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func putFile(ctx context.Context, t *testing.T, f fs.Fs, name, data string) fs.Object { 20 mtime1 := fstest.Time("2001-02-03T04:05:06.499999999Z") 21 item := fstest.Item{Path: name, ModTime: mtime1} 22 o := fstests.PutTestContents(ctx, t, f, &item, data, true) 23 require.NotNil(t, o) 24 return o 25 } 26 27 func (f *Fs) testUploadFromCrypt(t *testing.T) { 28 // make a temporary local remote 29 tempRoot, err := fstest.LocalRemote() 30 require.NoError(t, err) 31 defer func() { 32 _ = os.RemoveAll(tempRoot) 33 }() 34 35 // make a temporary crypt remote 36 ctx := context.Background() 37 pass := obscure.MustObscure("crypt") 38 remote := fmt.Sprintf(`:crypt,remote="%s",password="%s":`, tempRoot, pass) 39 cryptFs, err := fs.NewFs(ctx, remote) 40 require.NoError(t, err) 41 42 // make a test file on the crypt remote 43 const dirName = "from_crypt_1" 44 const fileName = dirName + "/file_from_crypt_1" 45 const longTime = fs.ModTimeNotSupported 46 src := putFile(ctx, t, cryptFs, fileName, "doggy froggy") 47 48 // ensure that hash does not exist yet 49 _ = f.pruneHash(fileName) 50 hashType := f.keepHashes.GetOne() 51 hash, err := f.getRawHash(ctx, hashType, fileName, anyFingerprint, longTime) 52 assert.Error(t, err) 53 assert.Empty(t, hash) 54 55 // upload file to hasher 56 in, err := src.Open(ctx) 57 require.NoError(t, err) 58 dst, err := f.Put(ctx, in, src) 59 require.NoError(t, err) 60 assert.NotNil(t, dst) 61 62 // check that hash was created 63 if f.opt.MaxAge > 0 { 64 hash, err = f.getRawHash(ctx, hashType, fileName, anyFingerprint, longTime) 65 assert.NoError(t, err) 66 assert.NotEmpty(t, hash) 67 } 68 //t.Logf("hash is %q", hash) 69 _ = operations.Purge(ctx, f, dirName) 70 } 71 72 // InternalTest dispatches all internal tests 73 func (f *Fs) InternalTest(t *testing.T) { 74 if !kv.Supported() { 75 t.Skip("hasher is not supported on this OS") 76 } 77 t.Run("UploadFromCrypt", f.testUploadFromCrypt) 78 } 79 80 var _ fstests.InternalTester = (*Fs)(nil)