package engine import ( "bytes" "strings" "sync" "testing" ) func TestBufferedReporterRecordsEventsInOrder(t *testing.T) { r := NewBufferedReporter() r.Progress("m", 1, 3, "step 1") r.Log("m", "hello") r.Progress("m", 2, 3, "step 2") ev := r.Events() if len(ev) != 3 { t.Fatalf("want 3 events, got %d", len(ev)) } if ev[0].Kind != EventProgress || ev[0].Current != 1 { t.Errorf("event[0] = %+v", ev[0]) } if ev[1].Kind != EventLog || ev[1].Message != "hello" { t.Errorf("event[1] = %+v", ev[1]) } } func TestBufferedReporterIsConcurrencySafe(t *testing.T) { r := NewBufferedReporter() var wg sync.WaitGroup for i := 0; i < 50; i++ { wg.Add(1) go func(i int) { defer wg.Done() r.Progress("m", i, 50, "x") }(i) } wg.Wait() if got := len(r.Events()); got != 50 { t.Fatalf("want 50 events, got %d", got) } } func TestPlainReporterFormat(t *testing.T) { var buf bytes.Buffer r := NewPlainReporter(&buf) r.Progress("packages", 2, 10, "installing tio") r.Log("packages", "pacman: done") out := buf.String() for _, want := range []string{"[packages] (2/10) installing tio", "[packages] pacman: done"} { if !strings.Contains(out, want) { t.Errorf("output missing %q; got:\n%s", want, out) } } }