70 lines
2.4 KiB
Go
70 lines
2.4 KiB
Go
package commandkit
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestHiddenSimpleDeferredMessagesDoNotAccumulate(t *testing.T) {
|
|
for _, mode := range []reportingMode{modeOrdinary, modeQuiet} {
|
|
t.Run(fmt.Sprint(mode), func(t *testing.T) {
|
|
reporter := newReporter(Streams{})
|
|
reporter.setVisibility(mode, false, false)
|
|
for index := 0; index < 256; index++ {
|
|
if err := reporter.AtEnd().Debug(fmt.Sprintf("hidden %d", index), nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := reporter.AtEnd().Warn("hidden warning"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
// This assertion owns the storage optimization, not a public queue API.
|
|
if len(reporter.state.deferred) != 0 {
|
|
t.Fatalf("retained %d renderer-free hidden messages", len(reporter.state.deferred))
|
|
}
|
|
got := reporter.finalize(Success(), nil)
|
|
if got.Status != 0 || got.Presentation.Diagnostics.State != DeliverySuppressed {
|
|
t.Fatalf("outcome=%#v", got)
|
|
}
|
|
if err := reporter.AtEnd().Debug("late"); !errors.Is(err, ErrReporterClosed) {
|
|
t.Fatalf("closed hidden submission=%v", err)
|
|
}
|
|
})
|
|
}
|
|
noContent := newReporter(Streams{})
|
|
_ = noContent.AtEnd().Warn("", nil)
|
|
if got := noContent.finalize(Success(), nil); got.Presentation.Diagnostics.State != DeliveryNone {
|
|
t.Fatalf("empty deferred submission became content: %#v", got)
|
|
}
|
|
}
|
|
|
|
func TestHiddenDeferredDetailsRemainDeferredAndCaptured(t *testing.T) {
|
|
var diagnostics bytes.Buffer
|
|
reporter := newReporter(Streams{Err: &diagnostics})
|
|
reporter.setVisibility(modeQuiet, false, false)
|
|
failure := errors.New("hidden rendering failed")
|
|
var order []string
|
|
details := []Detail{func(w io.Writer) error {
|
|
order = append(order, "first")
|
|
_, _ = io.WriteString(w, "hidden detail")
|
|
return failure
|
|
}}
|
|
_ = reporter.AtEnd().Warn("hidden", details...)
|
|
details[0] = func(io.Writer) error { t.Error("caller changed captured callback"); return nil }
|
|
_ = reporter.AtEnd().Info("", func(io.Writer) error { order = append(order, "second"); return nil })
|
|
if len(order) != 0 {
|
|
t.Fatal("details ran at submission")
|
|
}
|
|
got := reporter.finalize(Success(), nil)
|
|
if strings.Join(order, ",") != "first,second" || !errors.Is(got.Presentation.Diagnostics.RenderError, failure) || got.Status != 1 {
|
|
t.Fatalf("order=%v outcome=%#v", order, got)
|
|
}
|
|
if strings.Contains(diagnostics.String(), "hidden") || len(reporter.state.deferred) != 0 {
|
|
t.Fatalf("hidden content leaked or queue retained: %q", diagnostics.String())
|
|
}
|
|
}
|