package driver import ( "os" "sync" "testing" ) func TestNewTempFile(t *testing.T) { const n = 100 // Line up ready to execute goroutines with a read-write lock. var mu sync.RWMutex mu.Lock() var wg sync.WaitGroup errc := make(chan error, n) for i := 0; i < n; i++ { wg.Add(1) go func() { mu.RLock() defer mu.RUnlock() defer wg.Done() f, err := newTempFile(os.TempDir(), "profile", ".tmp") errc <- err deferDeleteTempFile(f.Name()) f.Close() }() } // Start the file creation race. mu.Unlock() // Wait for the goroutines to finish. wg.Wait() for i := 0; i < n; i++ { if err := <-errc; err != nil { t.Fatalf("newTempFile(): got %v, want no error", err) } } if len(tempFiles) != n { t.Errorf("len(tempFiles): got %d, want %d", len(tempFiles), n) } names := map[string]bool{} for _, name := range tempFiles { if names[name] { t.Errorf("got temp file %s created multiple times", name) break } names[name] = true } if err := cleanupTempFiles(); err != nil { t.Errorf("cleanupTempFiles(): got error %v, want no error", err) } if len(tempFiles) != 0 { t.Errorf("len(tempFiles) after the cleanup: got %d, want 0", len(tempFiles)) } }