Scert/backend/internal/nginxactivation/client_linux_test.go

71 lines
1.8 KiB
Go

package nginxactivation
import (
"context"
"errors"
"net"
"os"
"path/filepath"
"testing"
"time"
)
func TestClientCancellation(t *testing.T) {
path := filepath.Join(t.TempDir(), "a.sock")
listener, err := net.ListenUnix("unix", &net.UnixAddr{Name: path, Net: "unix"})
if err != nil {
t.Fatal(err)
}
listener.SetUnlinkOnClose(false)
defer listener.Close()
if err := os.Chmod(path, 0o600); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
clientDone := make(chan error, 1)
go func() {
_, err := (Client{SocketPath: path, ServiceUID: uint32(os.Geteuid())}).State(ctx)
clientDone <- err
}()
if err := listener.SetDeadline(time.Now().Add(3 * time.Second)); err != nil {
t.Fatal(err)
}
connection, err := listener.AcceptUnix()
if err != nil {
t.Fatal(err)
}
defer connection.Close()
_ = connection.SetDeadline(time.Now().Add(3 * time.Second))
var message request
if err := readFrame(connection, &message); err != nil {
t.Fatal(err)
}
cancel()
select {
case err := <-clientDone:
if !errors.Is(err, context.Canceled) {
t.Fatal("取消原因丢失", err)
}
case <-time.After(time.Second):
t.Fatal("客户端取消后没有及时关闭连接")
}
}
func TestServiceUnexpectedClose(t *testing.T) {
f := newRotationFixture(t)
path := filepath.Join(t.TempDir(), "a.sock")
listener, err := net.ListenUnix("unix", &net.UnixAddr{Name: path, Net: "unix"})
if err != nil {
t.Fatal(err)
}
listener.SetUnlinkOnClose(false)
if err := listener.Close(); err != nil {
t.Fatal(err)
}
service := LocalService{Rotation: f.rotation, AllowedUID: uint32(os.Geteuid())}
if err := service.Serve(context.Background(), listener); !errors.Is(err, net.ErrClosed) {
t.Fatal("监听器异常关闭不应报告正常退出", err)
}
}