// Copyright 2015 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. package osutil import ( "fmt" "path/filepath" "strconv" "sync" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestProcessTempDir(t *testing.T) { for try := 0; try < 10; try++ { func() { tmp := t.TempDir() const P = 16 // Pre-create half of the instances with stale pid. var dirs []string for i := 0; i < P/2; i++ { dir, err := ProcessTempDir(tmp) if err != nil { t.Fatalf("failed to create process temp dir") } dirs = append(dirs, dir) } for _, dir := range dirs { if err := WriteFile(filepath.Join(dir, ".pid"), []byte(strconv.Itoa(999999999))); err != nil { t.Fatalf("failed to write pid file: %v", err) } } // Now request a bunch of instances concurrently. done := make(chan error) allDirs := make(map[string]bool) var mu sync.Mutex for p := 0; p < P; p++ { go func() { dir, err := ProcessTempDir(tmp) if err != nil { done <- fmt.Errorf("failed to create temp dir: %w", err) return } mu.Lock() present := allDirs[dir] allDirs[dir] = true mu.Unlock() if present { done <- fmt.Errorf("duplicate dir %v", dir) return } done <- nil }() } for p := 0; p < P; p++ { if err := <-done; err != nil { t.Error(err) } } }() } } func TestGrepFiles(t *testing.T) { dir := t.TempDir() require.NoError(t, FillDirectory(dir, map[string]string{ "a.c": `must be found`, "a/b.c": `nested`, "a/b/c.c": `even more nested, must be found`, "a.txt": `must be found, but has a different extension`, })) ret, err := GrepFiles(dir, ".c", []byte(`must be found`)) require.NoError(t, err) assert.ElementsMatch(t, []string{"a.c", "a/b/c.c"}, ret) }