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  }