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)