diff options
Diffstat (limited to 'cmd/mbf/daemon_test.go')
| -rw-r--r-- | cmd/mbf/daemon_test.go | 125 |
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) + } +} |
