// Copyright 2025 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build !js && !plan9 && !wasip1 && !windows package os_test import ( "os" "os/signal" "syscall" "testing" "time" ) func init() { pipeDeadlinesTestCases = []pipeDeadlineTest{{ "anonymous pipe", func(t *testing.T) (r, w *os.File) { r, w, err := os.Pipe() if err != nil { t.Fatal(err) } return r, w }, }} } // Closing a TTY while reading from it should not hang. Issue 23943. func TestTTYClose(t *testing.T) { // Ignore SIGTTIN in case we are running in the background. signal.Ignore(syscall.SIGTTIN) defer signal.Reset(syscall.SIGTTIN) f, err := os.Open("/dev/tty") if err != nil { t.Skipf("skipping because opening /dev/tty failed: %v", err) } go func() { var buf [1]byte f.Read(buf[:]) }() // Give the goroutine a chance to enter the read. // It doesn't matter much if it occasionally fails to do so, // we won't be testing what we want to test but the test will pass. time.Sleep(time.Millisecond) c := make(chan bool) go func() { defer close(c) f.Close() }() select { case <-c: case <-time.After(time.Second): t.Error("timed out waiting for close") } // On some systems the goroutines may now be hanging. // There's not much we can do about that. }