aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmd/mbf/daemon_test.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-04-17 01:06:13 +0900
committerOphestra <cat@gensokyo.uk>2026-04-17 02:05:59 +0900
commit9daba6080992f7a965873936dc20a85385bbc269 (patch)
tree8e83b6b4029e75f5a8fa6a25116fd175a6723c47 /cmd/mbf/daemon_test.go
parentbcd79a22ffb1b307879efed9ca0c7bde293af81d (diff)
cmd/mbf: daemon command
This services internal/pkg artifact IR with Rosa OS extensions originating from another process. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'cmd/mbf/daemon_test.go')
-rw-r--r--cmd/mbf/daemon_test.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/cmd/mbf/daemon_test.go b/cmd/mbf/daemon_test.go
new file mode 100644
index 00000000..cf67059a
--- /dev/null
+++ b/cmd/mbf/daemon_test.go
@@ -0,0 +1,125 @@
+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)
+ }
+}