c++: remove Concepts TS code
[official-gcc.git] / libgo / go / os / fifo_test.go
blobde70927961314c2f4e50025482ac4c97cd243178
1 // Copyright 2015 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 //go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd
7 package os_test
9 import (
10 "bufio"
11 "bytes"
12 "fmt"
13 "io"
14 "os"
15 "path/filepath"
16 "runtime"
17 "sync"
18 "syscall"
19 "testing"
20 "time"
23 // Issue 24164.
24 func TestFifoEOF(t *testing.T) {
25 switch runtime.GOOS {
26 case "android":
27 t.Skip("skipping on Android; mkfifo syscall not available")
30 dir := t.TempDir()
31 fifoName := filepath.Join(dir, "fifo")
32 if err := syscall.Mkfifo(fifoName, 0600); err != nil {
33 t.Fatal(err)
36 var wg sync.WaitGroup
37 wg.Add(1)
38 go func() {
39 defer wg.Done()
41 w, err := os.OpenFile(fifoName, os.O_WRONLY, 0)
42 if err != nil {
43 t.Error(err)
44 return
47 defer func() {
48 if err := w.Close(); err != nil {
49 t.Errorf("error closing writer: %v", err)
51 }()
53 for i := 0; i < 3; i++ {
54 time.Sleep(10 * time.Millisecond)
55 _, err := fmt.Fprintf(w, "line %d\n", i)
56 if err != nil {
57 t.Errorf("error writing to fifo: %v", err)
58 return
61 time.Sleep(10 * time.Millisecond)
62 }()
64 defer wg.Wait()
66 r, err := os.Open(fifoName)
67 if err != nil {
68 t.Fatal(err)
71 done := make(chan bool)
72 go func() {
73 defer close(done)
75 defer func() {
76 if err := r.Close(); err != nil {
77 t.Errorf("error closing reader: %v", err)
79 }()
81 rbuf := bufio.NewReader(r)
82 for {
83 b, err := rbuf.ReadBytes('\n')
84 if err == io.EOF {
85 break
87 if err != nil {
88 t.Error(err)
89 return
91 t.Logf("%s\n", bytes.TrimSpace(b))
93 }()
95 select {
96 case <-done:
97 // Test succeeded.
98 case <-time.After(time.Second):
99 t.Error("timed out waiting for read")
100 // Close the reader to force the read to complete.
101 r.Close()