| package unraw |
| |
| import ( |
| "context" |
| "fmt" |
| "io/ioutil" |
| "os" |
| "testing" |
| |
| "source.monogon.dev/metropolis/pkg/logbuffer" |
| "source.monogon.dev/metropolis/pkg/logtree" |
| "source.monogon.dev/metropolis/pkg/supervisor" |
| ) |
| |
| func testParser(l *logbuffer.Line, w LeveledWriter) { |
| w(&logtree.ExternalLeveledPayload{ |
| Message: l.Data, |
| }) |
| } |
| |
| func TestNamedPipeReader(t *testing.T) { |
| dir, err := ioutil.TempDir("", "metropolis-test-named-pipe-reader") |
| if err != nil { |
| t.Fatalf("could not create tempdir: %v", err) |
| } |
| //defer os.RemoveAll(dir) |
| fifoPath := dir + "/fifo" |
| |
| // Start named pipe reader. |
| started := make(chan struct{}) |
| stop, lt := supervisor.TestHarness(t, func(ctx context.Context) error { |
| converter := Converter{ |
| Parser: testParser, |
| LeveledLogger: supervisor.Logger(ctx), |
| } |
| |
| r, err := converter.NamedPipeReader(fifoPath) |
| if err != nil { |
| return fmt.Errorf("could not create pipe reader: %w", err) |
| } |
| close(started) |
| return r(ctx) |
| }) |
| |
| // Wait until NamedPipeReader returns to make sure the fifo was created.. |
| <-started |
| |
| // Start reading all logs. |
| reader, err := lt.Read("root", logtree.WithChildren(), logtree.WithStream()) |
| if err != nil { |
| t.Fatalf("could not get logtree reader: %v", err) |
| } |
| defer reader.Close() |
| |
| // Write two lines to the fifo. |
| f, err := os.OpenFile(fifoPath, os.O_RDWR, 0) |
| if err != nil { |
| t.Fatalf("could not open fifo: %v", err) |
| } |
| fmt.Fprintf(f, "foo\nbar\n") |
| f.Close() |
| |
| // Expect lines to end up in logtree. |
| if got, want := (<-reader.Stream).Leveled.MessagesJoined(), "foo"; want != got { |
| t.Errorf("expected first message to be %q, got %q", want, got) |
| } |
| if got, want := (<-reader.Stream).Leveled.MessagesJoined(), "bar"; want != got { |
| t.Errorf("expected second message to be %q, got %q", want, got) |
| } |
| |
| // Fully restart the entire hypervisor and pipe reader, redo test, things |
| // should continue to work. |
| stop() |
| |
| started = make(chan struct{}) |
| stop, lt = supervisor.TestHarness(t, func(ctx context.Context) error { |
| converter := Converter{ |
| Parser: testParser, |
| LeveledLogger: supervisor.Logger(ctx), |
| } |
| |
| r, err := converter.NamedPipeReader(fifoPath) |
| if err != nil { |
| return fmt.Errorf("could not create pipe reader: %w", err) |
| } |
| close(started) |
| return r(ctx) |
| }) |
| |
| // Start reading all logs. |
| reader, err = lt.Read("root", logtree.WithChildren(), logtree.WithStream()) |
| if err != nil { |
| t.Fatalf("could not get logtree reader: %v", err) |
| } |
| defer reader.Close() |
| |
| <-started |
| |
| // Write line to the fifo. |
| // Write two lines to the fifo. |
| f, err = os.OpenFile(fifoPath, os.O_RDWR, 0) |
| if err != nil { |
| t.Fatalf("could not open fifo: %v", err) |
| } |
| fmt.Fprintf(f, "baz\n") |
| f.Close() |
| |
| // Expect lines to end up in logtree. |
| if got, want := (<-reader.Stream).Leveled.MessagesJoined(), "baz"; want != got { |
| t.Errorf("expected first message to be %q, got %q", want, got) |
| } |
| } |