Files

57 lines
1.4 KiB
Go

// 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")
}
}