github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/simplefs/downloads_test.go (about) 1 // Copyright 2019 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package simplefs 6 7 import ( 8 "fmt" 9 10 "os" 11 "path/filepath" 12 "strings" 13 "testing" 14 "time" 15 16 "github.com/keybase/client/go/kbfs/env" 17 "github.com/keybase/client/go/kbfs/libkbfs" 18 "github.com/keybase/client/go/protocol/keybase1" 19 "github.com/stretchr/testify/require" 20 "golang.org/x/net/context" 21 ) 22 23 func TestDownloadManager(t *testing.T) { 24 ctx := context.Background() 25 config := libkbfs.MakeTestConfigOrBust(t, "jdoe") 26 sfs := newSimpleFS(env.EmptyAppStateUpdater{}, config) 27 defer closeSimpleFS(ctx, t, sfs) 28 29 t.Log("Write a file in the shared directory") 30 pathPriv := keybase1.NewPathWithKbfsPath(`/private/jdoe`) 31 writeRemoteFile( 32 ctx, t, sfs, pathAppend(pathPriv, `test.txt`), []byte(`foo`)) 33 syncFS(ctx, t, sfs, "/private/jdoe") 34 35 cacheDir, err := os.MkdirTemp(TempDirBase, "simplefs-downloadtest-cache") 36 require.NoError(t, err) 37 defer os.RemoveAll(cacheDir) 38 downloadDir, err := os.MkdirTemp(TempDirBase, "simplefs-downloadtest-download") 39 require.NoError(t, err) 40 defer os.RemoveAll(downloadDir) 41 42 err = sfs.SimpleFSConfigureDownload(ctx, keybase1.SimpleFSConfigureDownloadArg{ 43 CacheDirOverride: cacheDir, 44 DownloadDirOverride: downloadDir, 45 }) 46 require.NoError(t, err) 47 48 testDownload := func(isRegularDownload bool, regularDownloadIndex int) { 49 downloadID, err := sfs.SimpleFSStartDownload(ctx, keybase1.SimpleFSStartDownloadArg{ 50 Path: keybase1.KBFSPath{Path: "/private/jdoe/test.txt"}, 51 IsRegularDownload: isRegularDownload, 52 }) 53 require.NoError(t, err) 54 status, err := sfs.SimpleFSGetDownloadStatus(ctx) 55 require.NoError(t, err) 56 require.Len(t, status.States, 1) 57 require.Equal(t, downloadID, status.States[0].DownloadID) 58 if isRegularDownload { 59 require.Len(t, status.RegularDownloadIDs, 1) 60 require.Equal(t, downloadID, status.RegularDownloadIDs[0]) 61 } else { 62 require.Empty(t, status.RegularDownloadIDs) 63 } 64 info, err := sfs.SimpleFSGetDownloadInfo(ctx, downloadID) 65 require.NoError(t, err) 66 require.Equal(t, isRegularDownload, info.IsRegularDownload) 67 require.Equal(t, "/private/jdoe/test.txt", info.Path.Path) 68 require.Equal(t, "test.txt", info.Filename) 69 for i := 0; !status.States[0].Done; i++ { 70 if i > 10 { 71 t.Fatalf("waiting on download to finish timeout") 72 } 73 status, err = sfs.SimpleFSGetDownloadStatus(ctx) 74 require.NoError(t, err) 75 time.Sleep(time.Second / 2) 76 } 77 if isRegularDownload { 78 if regularDownloadIndex == 0 { 79 require.Equal(t, filepath.Join(downloadDir, "test.txt"), status.States[0].LocalPath) 80 } else { 81 require.Equal(t, filepath.Join(downloadDir, fmt.Sprintf("test (%d).txt", regularDownloadIndex)), status.States[0].LocalPath) 82 } 83 } else { 84 lpath := filepath.Clean(status.States[0].LocalPath) 85 require.True(t, strings.HasPrefix(lpath, filepath.Clean(cacheDir))) 86 require.True(t, strings.HasSuffix(lpath, ".txt")) 87 } 88 err = sfs.SimpleFSDismissDownload(ctx, downloadID) 89 require.NoError(t, err) 90 } 91 testDownload(true, 0) 92 testDownload(true, 1) 93 testDownload(false, 0) 94 }