github.com/cilium/ebpf@v0.15.1-0.20240517100537-8079b37aa138/internal/testutils/glob.go (about)

     1  package testutils
     2  
     3  import (
     4  	"fmt"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	"golang.org/x/sys/cpu"
    10  )
    11  
    12  // Files calls fn for each given file.
    13  //
    14  // The function errors out if the pattern matches no files.
    15  func Files(t *testing.T, files []string, fn func(*testing.T, string)) {
    16  	t.Helper()
    17  
    18  	if len(files) == 0 {
    19  		t.Fatalf("No files given")
    20  	}
    21  
    22  	for _, f := range files {
    23  		file := f // force copy
    24  		name := filepath.Base(file)
    25  		t.Run(name, func(t *testing.T) {
    26  			fn(t, file)
    27  		})
    28  	}
    29  }
    30  
    31  // Glob finds files matching a pattern.
    32  //
    33  // The pattern should may include full path. Excludes use the same syntax as
    34  // pattern, but are only applied to the basename instead of the full path.
    35  func Glob(tb testing.TB, pattern string, excludes ...string) []string {
    36  	tb.Helper()
    37  
    38  	files, err := filepath.Glob(pattern)
    39  	if err != nil {
    40  		tb.Fatal("Can't glob files:", err)
    41  	}
    42  
    43  	if len(excludes) == 0 {
    44  		return files
    45  	}
    46  
    47  	var filtered []string
    48  nextFile:
    49  	for _, file := range files {
    50  		base := filepath.Base(file)
    51  		for _, exclude := range excludes {
    52  			if matched, err := filepath.Match(exclude, base); err != nil {
    53  				tb.Fatal(err)
    54  			} else if matched {
    55  				continue nextFile
    56  			}
    57  		}
    58  		filtered = append(filtered, file)
    59  	}
    60  
    61  	return filtered
    62  }
    63  
    64  // NativeFile substitutes %s with an abbreviation of the host endianness.
    65  func NativeFile(tb testing.TB, path string) string {
    66  	tb.Helper()
    67  
    68  	if !strings.Contains(path, "%s") {
    69  		tb.Fatalf("File %q doesn't contain %%s", path)
    70  	}
    71  
    72  	if cpu.IsBigEndian {
    73  		return fmt.Sprintf(path, "eb")
    74  	}
    75  
    76  	return fmt.Sprintf(path, "el")
    77  }