github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/fsutil/claim_test.go (about) 1 package fsutil 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "sort" 7 "testing" 8 9 . "github.com/markusbkk/elvish/pkg/testutil" 10 ) 11 12 var claimFileTests = []struct { 13 dir string 14 pattern string 15 wantFileName string 16 }{ 17 {".", "a*.log", "a9.log"}, 18 {".", "*.txt", "1.txt"}, 19 {"d", "*.txt", filepath.Join("d", "1.txt")}, 20 } 21 22 func TestClaimFile(t *testing.T) { 23 InTempDir(t) 24 25 ApplyDir(Dir{ 26 "a0.log": "", 27 "a1.log": "", 28 "a8.log": "", 29 "d": Dir{}}) 30 31 for _, test := range claimFileTests { 32 name := claimFileAndGetName(test.dir, test.pattern) 33 if name != test.wantFileName { 34 t.Errorf("ClaimFile claims %s, want %s", name, test.wantFileName) 35 } 36 } 37 } 38 39 func TestClaimFile_Concurrent(t *testing.T) { 40 InTempDir(t) 41 42 n := 9 43 ch := make(chan string, n) 44 for i := 0; i < n; i++ { 45 go func() { 46 ch <- claimFileAndGetName(".", "a*.log") 47 }() 48 } 49 50 names := make([]string, n) 51 for i := 0; i < n; i++ { 52 names[i] = <-ch 53 } 54 sort.Strings(names) 55 56 for i, name := range names { 57 wantName := fmt.Sprintf("a%d.log", i+1) 58 if name != wantName { 59 t.Errorf("got names[%d] = %q, want %q", i, name, wantName) 60 } 61 } 62 } 63 64 func claimFileAndGetName(dir, pattern string) string { 65 f, err := ClaimFile(dir, pattern) 66 if err != nil { 67 panic(fmt.Sprintf("ClaimFile errors: %v", err)) 68 } 69 defer f.Close() 70 return f.Name() 71 }