aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmd/mbf/daemon_test.go
blob: 6fd95a960375dfc3440b65d76b356a905034ecbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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 TestNoReply(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(c, server, remoteNoReply)
	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}), 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)
	}
}