57 lines
1.4 KiB
Go
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")
|
|
}
|
|
}
|