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) } }