putxt/putxt_test.go

76 lines
1.7 KiB
Go

package putxt
// meant to act as a simple example
import (
"bytes"
"errors"
"net"
"strings"
"testing"
"time"
"git.tcp.direct/kayos/common/entropy"
"git.tcp.direct/kayos/common/squish"
)
type handler struct {
t *testing.T
needle []byte
}
func (h *handler) Ingest(data []byte) ([]byte, error) {
var err error
data, err = squish.Gunzip(data)
if err != nil {
return nil, err
}
if strings.ReplaceAll(string(data), "\n", "") == string(h.needle) {
h.t.Log("got needle, echoing it back...")
return h.needle, nil
}
return []byte("invalid request"), errors.New("data does not match generated test needle: " + string(data))
}
func TestPutxt(t *testing.T) {
socketPath := t.TempDir() + "/putxt.sock"
testHandler := &handler{t: t, needle: []byte(entropy.RandStr(4096))}
td := NewTermDumpster(testHandler).WithGzip().WithMaxSize(3 << 20).WithTimeout(5 * time.Second)
var errChan = make(chan error)
go func() {
err := td.ListenUnixSocket(socketPath)
if err != nil {
errChan <- err
}
}()
select {
case err := <-errChan:
t.Fatalf("failed to listen on unix socket: %v", err.Error())
default:
time.Sleep(10 * time.Millisecond)
c, err := net.Dial("unix", socketPath)
if err != nil {
t.Fatalf("failed to connect to unix socket: %v", err.Error())
}
defer c.Close()
res := make(chan []byte)
go func() {
buf := make([]byte, 4096)
n, err := c.Read(buf)
if err != nil {
errChan <- err
}
res <- buf[:n]
}()
_, err = c.Write(testHandler.needle)
if err != nil {
t.Fatalf("failed to write to unix socket: %v", err.Error())
}
buf := <-res
if !bytes.Equal(buf, testHandler.needle) {
t.Fatalf("expected %s, got %s", testHandler.needle, string(buf))
}
}
}