github.com/hairyhenderson/gomplate/v3@v3.11.7/internal/tests/integration/inputdir_unix_test.go (about) 1 //go:build !windows 2 // +build !windows 3 4 package integration 5 6 import ( 7 "fmt" 8 "math" 9 "os" 10 "testing" 11 12 "golang.org/x/sys/unix" 13 "gotest.tools/v3/assert" 14 "gotest.tools/v3/fs" 15 ) 16 17 func setFileUlimit(b uint64) error { 18 ulimit := unix.Rlimit{ 19 Cur: b, 20 Max: math.MaxInt64, 21 } 22 err := unix.Setrlimit(unix.RLIMIT_NOFILE, &ulimit) 23 return err 24 } 25 26 func TestInputDir_RespectsUlimit(t *testing.T) { 27 numfiles := 32 28 flist := map[string]string{} 29 for i := 0; i < numfiles; i++ { 30 k := fmt.Sprintf("file_%d", i) 31 flist[k] = fmt.Sprintf("hello world %d\n", i) 32 } 33 testdir := fs.NewDir(t, "ulimittestfiles", 34 fs.WithDir("in", fs.WithFiles(flist)), 35 ) 36 defer testdir.Remove() 37 38 // we need another ~11 fds for other various things, so we'd be guaranteed 39 // to hit the limit if we try to have all the input files open 40 // simultaneously 41 setFileUlimit(uint64(numfiles)) 42 defer setFileUlimit(8192) 43 44 o, e, err := cmd(t, "--input-dir", testdir.Join("in"), 45 "--output-dir", testdir.Join("out")). 46 withDir(testdir.Path()).run() 47 48 setFileUlimit(8192) 49 assertSuccess(t, o, e, err, "") 50 51 files, err := os.ReadDir(testdir.Join("out")) 52 assert.NilError(t, err) 53 assert.Equal(t, numfiles, len(files)) 54 55 for i := 0; i < numfiles; i++ { 56 f := testdir.Join("out", fmt.Sprintf("file_%d", i)) 57 _, err := os.Stat(f) 58 assert.NilError(t, err) 59 60 content, err := os.ReadFile(f) 61 assert.NilError(t, err) 62 expected := fmt.Sprintf("hello world %d\n", i) 63 assert.Equal(t, expected, string(content)) 64 } 65 }