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  }