forked from rosa/hakurei
This services internal/pkg artifact IR with Rosa OS extensions originating from another process. Signed-off-by: Ophestra <cat@gensokyo.uk>
126 lines
2.5 KiB
Go
126 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"hakurei.app/check"
|
|
"hakurei.app/internal/pkg"
|
|
"hakurei.app/message"
|
|
)
|
|
|
|
func TestCureFromIR(t *testing.T) {
|
|
t.Parallel()
|
|
if !daemonDeadline().IsZero() {
|
|
t.Fatal("daemonDeadline did not return the zero value")
|
|
}
|
|
|
|
c, err := pkg.Open(
|
|
t.Context(),
|
|
message.New(log.New(os.Stderr, "cir: ", 0)),
|
|
0, 0, 0,
|
|
check.MustAbs(t.TempDir()),
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("Open: error = %v", err)
|
|
}
|
|
defer c.Close()
|
|
|
|
client, server := net.Pipe()
|
|
done := make(chan struct{})
|
|
go func() {
|
|
defer close(done)
|
|
go func() {
|
|
<-t.Context().Done()
|
|
if _err := client.SetDeadline(time.Now()); _err != nil && !errors.Is(_err, io.ErrClosedPipe) {
|
|
panic(_err)
|
|
}
|
|
}()
|
|
|
|
if _err := c.EncodeAll(
|
|
client,
|
|
pkg.NewFile("check", []byte{0}),
|
|
); _err != nil {
|
|
panic(_err)
|
|
} else if _err = client.Close(); _err != nil {
|
|
panic(_err)
|
|
}
|
|
}()
|
|
|
|
a, cureErr := cureFromIR(t.Context(), c, server)
|
|
if cureErr != nil {
|
|
t.Fatalf("cureFromIR: error = %v", cureErr)
|
|
}
|
|
|
|
<-done
|
|
wantIdent := pkg.MustDecode("fiZf-ZY_Yq6qxJNrHbMiIPYCsGkUiKCRsZrcSELXTqZWtCnESlHmzV5ThhWWGGYG")
|
|
if gotIdent := c.Ident(a).Value(); gotIdent != wantIdent {
|
|
t.Errorf(
|
|
"cureFromIR: %s, want %s",
|
|
pkg.Encode(gotIdent), pkg.Encode(wantIdent),
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestDaemon(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
var buf bytes.Buffer
|
|
logger := log.New(&buf, "daemon: ", 0)
|
|
|
|
addr := net.UnixAddr{
|
|
Name: filepath.Join(t.TempDir(), "daemon"),
|
|
Net: "unix",
|
|
}
|
|
|
|
ctx, cancel := context.WithCancel(t.Context())
|
|
defer cancel()
|
|
|
|
cm := cache{
|
|
ctx: ctx,
|
|
msg: message.New(logger),
|
|
base: t.TempDir(),
|
|
}
|
|
defer cm.Close()
|
|
|
|
ul, err := net.ListenUnix("unix", &addr)
|
|
if err != nil {
|
|
t.Fatalf("ListenUnix: error = %v", err)
|
|
}
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
defer close(done)
|
|
if _err := serve(ctx, logger, &cm, ul); _err != nil {
|
|
panic(_err)
|
|
}
|
|
}()
|
|
|
|
var p *check.Absolute
|
|
p, err = cureRemote(ctx, &addr, pkg.NewFile("check", []byte{0}))
|
|
if err != nil {
|
|
t.Fatalf("cureRemote: error = %v", err)
|
|
}
|
|
cancel()
|
|
<-done
|
|
|
|
const want = "fiZf-ZY_Yq6qxJNrHbMiIPYCsGkUiKCRsZrcSELXTqZWtCnESlHmzV5ThhWWGGYG"
|
|
if got := filepath.Base(p.String()); got != want {
|
|
t.Errorf("cureRemote: %s, want %s", got, want)
|
|
}
|
|
|
|
const wantLog = `daemon: fulfilled artifact fiZf-ZY_Yq6qxJNrHbMiIPYCsGkUiKCRsZrcSELXTqZWtCnESlHmzV5ThhWWGGYG
|
|
`
|
|
if gotLog := buf.String(); gotLog != wantLog {
|
|
t.Errorf("serve: logged\n%s\nwant\n%s", gotLog, wantLog)
|
|
}
|
|
}
|