blob: faf7895baada976946973a43dd091ff84d9eff29 [file] [log] [blame]
Serge Bazanskiebe02592021-07-07 14:23:26 +02001package unraw
2
3import (
4 "context"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "testing"
9
10 "source.monogon.dev/metropolis/pkg/logbuffer"
11 "source.monogon.dev/metropolis/pkg/logtree"
12 "source.monogon.dev/metropolis/pkg/supervisor"
13)
14
15func testParser(l *logbuffer.Line, w LeveledWriter) {
16 w(&logtree.ExternalLeveledPayload{
17 Message: l.Data,
18 })
19}
20
21func TestNamedPipeReader(t *testing.T) {
22 dir, err := ioutil.TempDir("", "metropolis-test-named-pipe-reader")
23 if err != nil {
24 t.Fatalf("could not create tempdir: %v", err)
25 }
26 //defer os.RemoveAll(dir)
27 fifoPath := dir + "/fifo"
28
29 // Start named pipe reader.
30 started := make(chan struct{})
31 stop, lt := supervisor.TestHarness(t, func(ctx context.Context) error {
32 converter := Converter{
33 Parser: testParser,
34 LeveledLogger: supervisor.Logger(ctx),
35 }
36
37 r, err := converter.NamedPipeReader(fifoPath)
38 if err != nil {
39 return fmt.Errorf("could not create pipe reader: %w", err)
40 }
41 close(started)
42 return r(ctx)
43 })
44
45 // Wait until NamedPipeReader returns to make sure the fifo was created..
46 <-started
47
48 // Start reading all logs.
49 reader, err := lt.Read("root", logtree.WithChildren(), logtree.WithStream())
50 if err != nil {
51 t.Fatalf("could not get logtree reader: %v", err)
52 }
53 defer reader.Close()
54
55 // Write two lines to the fifo.
56 f, err := os.OpenFile(fifoPath, os.O_RDWR, 0)
57 if err != nil {
58 t.Fatalf("could not open fifo: %v", err)
59 }
60 fmt.Fprintf(f, "foo\nbar\n")
61 f.Close()
62
63 // Expect lines to end up in logtree.
64 if got, want := (<-reader.Stream).Leveled.MessagesJoined(), "foo"; want != got {
65 t.Errorf("expected first message to be %q, got %q", want, got)
66 }
67 if got, want := (<-reader.Stream).Leveled.MessagesJoined(), "bar"; want != got {
68 t.Errorf("expected second message to be %q, got %q", want, got)
69 }
70
71 // Fully restart the entire hypervisor and pipe reader, redo test, things
72 // should continue to work.
73 stop()
74
75 started = make(chan struct{})
76 stop, lt = supervisor.TestHarness(t, func(ctx context.Context) error {
77 converter := Converter{
78 Parser: testParser,
79 LeveledLogger: supervisor.Logger(ctx),
80 }
81
82 r, err := converter.NamedPipeReader(fifoPath)
83 if err != nil {
84 return fmt.Errorf("could not create pipe reader: %w", err)
85 }
86 close(started)
87 return r(ctx)
88 })
89
90 // Start reading all logs.
91 reader, err = lt.Read("root", logtree.WithChildren(), logtree.WithStream())
92 if err != nil {
93 t.Fatalf("could not get logtree reader: %v", err)
94 }
95 defer reader.Close()
96
97 <-started
98
99 // Write line to the fifo.
100 // Write two lines to the fifo.
101 f, err = os.OpenFile(fifoPath, os.O_RDWR, 0)
102 if err != nil {
103 t.Fatalf("could not open fifo: %v", err)
104 }
105 fmt.Fprintf(f, "baz\n")
106 f.Close()
107
108 // Expect lines to end up in logtree.
109 if got, want := (<-reader.Stream).Leveled.MessagesJoined(), "baz"; want != got {
110 t.Errorf("expected first message to be %q, got %q", want, got)
111 }
112}