108 lines
2.3 KiB
Go
108 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"git.cloudyne.io/go/msteinert-go-pam/cmd/pam-moduler/tests/internal/utils"
|
|
)
|
|
|
|
func ensureNoError(t *testing.T, err error) {
|
|
t.Helper()
|
|
if err != nil {
|
|
t.Fatalf("unexpected error %v", err)
|
|
}
|
|
}
|
|
|
|
func ensureError(t *testing.T, err error, expected error) {
|
|
t.Helper()
|
|
if err == nil {
|
|
t.Fatalf("error was expected, got none")
|
|
}
|
|
if !errors.Is(err, expected) {
|
|
t.Fatalf("error %v was expected, got %v", err, expected)
|
|
}
|
|
}
|
|
|
|
func ensureEqual(t *testing.T, a any, b any) {
|
|
t.Helper()
|
|
if !reflect.DeepEqual(a, b) {
|
|
t.Fatalf("values mismatch %#v vs %#v", a, b)
|
|
}
|
|
}
|
|
|
|
func Test_Communication(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ts := utils.NewTestSetup(t, utils.WithWorkDir())
|
|
|
|
for _, name := range []string{"test-1", "test-2"} {
|
|
name := name
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
socketPath := filepath.Join(ts.WorkDir(), name+".socket")
|
|
|
|
listener := NewListener(socketPath)
|
|
connector := NewConnector(socketPath)
|
|
|
|
ensureNoError(t, listener.StartListening())
|
|
ensureNoError(t, connector.Connect())
|
|
|
|
ensureError(t, listener.StartListening(), ErrAlreadyListening)
|
|
ensureError(t, connector.Connect(), ErrAlreadyConnected)
|
|
|
|
resChan, errChan := make(chan *Result), make(chan error)
|
|
go func() {
|
|
res, err := listener.WaitForData()
|
|
resChan <- res
|
|
errChan <- err
|
|
}()
|
|
|
|
req := NewRequest("A Request")
|
|
ensureNoError(t, connector.SendRequest(&req))
|
|
|
|
res, err := <-resChan, <-errChan
|
|
ensureNoError(t, err)
|
|
ensureEqual(t, *res, req)
|
|
|
|
go func() {
|
|
res := NewRequest("Listener result")
|
|
ensureNoError(t, listener.SendResult(&res))
|
|
}()
|
|
|
|
res, err = connector.WaitForData()
|
|
ensureNoError(t, err)
|
|
ensureEqual(t, *res, NewRequest("Listener result"))
|
|
|
|
go func() {
|
|
req, err := listener.WaitForData()
|
|
res := NewRequest("Response", *req)
|
|
|
|
defer func() {
|
|
resChan <- &res
|
|
errChan <- err
|
|
}()
|
|
ensureNoError(t, listener.SendResult(&res))
|
|
}()
|
|
|
|
done := make(chan bool)
|
|
req = NewRequest("Requesting...")
|
|
go func() {
|
|
defer func() {
|
|
done <- true
|
|
}()
|
|
res, err := connector.DoRequest(&req)
|
|
ensureNoError(t, err)
|
|
ensureEqual(t, *res, NewRequest("Response", req))
|
|
}()
|
|
|
|
res, err = <-resChan, <-errChan
|
|
ensureNoError(t, err)
|
|
ensureEqual(t, *res, NewRequest("Response", req))
|
|
<-done
|
|
})
|
|
}
|
|
}
|