// Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // SPDX-License-Identifier: GPL-3.0-or-later package remoteinput import ( "errors" "os" "testing" "time" ) func TestAdoptPipeInterruptsInheritedRead(t *testing.T) { reader, writer, err := os.Pipe() if err != nil { t.Fatal(err) } defer writer.Close() if _, err := AdoptPipe(reader, true); !errors.Is(err, ErrProtocol) { t.Fatal("read-only descriptor was accepted as helper output") } if _, err := AdoptPipe(writer, false); !errors.Is(err, ErrProtocol) { t.Fatal("write-only descriptor was accepted as helper control") } owned, err := AdoptPipe(reader, false) if err != nil { t.Fatal(err) } defer owned.Close() done := make(chan error, 1) go func() { var value [1]byte; _, err := owned.Read(value[:]); done <- err }() owned.Close() select { case err := <-done: if err == nil { t.Fatal("closed inherited pipe kept reading") } case <-time.After(time.Second): t.Fatal("Close did not interrupt inherited read") } if _, err := reader.Stat(); err == nil { t.Fatal("adoption left the original descriptor open") } file, err := os.CreateTemp(t.TempDir(), "not-a-pipe") if err != nil { t.Fatal(err) } defer file.Close() if _, err := AdoptPipe(file, false); !errors.Is(err, ErrProtocol) { t.Fatal("helper accepted a regular file") } if _, err := AdoptPipe(nil, false); !errors.Is(err, ErrProtocol) { t.Fatal("helper accepted a missing descriptor") } }