github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/pkg/osutil/fileutil_test.go (about)

     1  // Copyright 2015 syzkaller project authors. All rights reserved.
     2  // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
     3  
     4  package osutil
     5  
     6  import (
     7  	"fmt"
     8  	"path/filepath"
     9  	"strconv"
    10  	"sync"
    11  	"testing"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestProcessTempDir(t *testing.T) {
    18  	for try := 0; try < 10; try++ {
    19  		func() {
    20  			tmp := t.TempDir()
    21  			const P = 16
    22  			// Pre-create half of the instances with stale pid.
    23  			var dirs []string
    24  			for i := 0; i < P/2; i++ {
    25  				dir, err := ProcessTempDir(tmp)
    26  				if err != nil {
    27  					t.Fatalf("failed to create process temp dir")
    28  				}
    29  				dirs = append(dirs, dir)
    30  			}
    31  			for _, dir := range dirs {
    32  				if err := WriteFile(filepath.Join(dir, ".pid"), []byte(strconv.Itoa(999999999))); err != nil {
    33  					t.Fatalf("failed to write pid file: %v", err)
    34  				}
    35  			}
    36  			// Now request a bunch of instances concurrently.
    37  			done := make(chan error)
    38  			allDirs := make(map[string]bool)
    39  			var mu sync.Mutex
    40  			for p := 0; p < P; p++ {
    41  				go func() {
    42  					dir, err := ProcessTempDir(tmp)
    43  					if err != nil {
    44  						done <- fmt.Errorf("failed to create temp dir: %w", err)
    45  						return
    46  					}
    47  					mu.Lock()
    48  					present := allDirs[dir]
    49  					allDirs[dir] = true
    50  					mu.Unlock()
    51  					if present {
    52  						done <- fmt.Errorf("duplicate dir %v", dir)
    53  						return
    54  					}
    55  					done <- nil
    56  				}()
    57  			}
    58  			for p := 0; p < P; p++ {
    59  				if err := <-done; err != nil {
    60  					t.Error(err)
    61  				}
    62  			}
    63  		}()
    64  	}
    65  }
    66  
    67  func TestGrepFiles(t *testing.T) {
    68  	dir := t.TempDir()
    69  	require.NoError(t, FillDirectory(dir, map[string]string{
    70  		"a.c":     `must be found`,
    71  		"a/b.c":   `nested`,
    72  		"a/b/c.c": `even more nested, must be found`,
    73  		"a.txt":   `must be found, but has a different extension`,
    74  	}))
    75  
    76  	ret, err := GrepFiles(dir, ".c", []byte(`must be found`))
    77  	require.NoError(t, err)
    78  	assert.ElementsMatch(t, []string{"a.c", "a/b/c.c"}, ret)
    79  }