71 lines
2.3 KiB
Go
71 lines
2.3 KiB
Go
package commandkit_test
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"sync"
|
|
"testing"
|
|
|
|
commandkit "go.maximumdirect.net/commandkit"
|
|
)
|
|
|
|
func TestInvocationReportingMode(t *testing.T) {
|
|
if got := (commandkit.Invocation{}).ReportingMode(); got != commandkit.ReportingModeOrdinary {
|
|
t.Fatalf("zero invocation mode = %v", got)
|
|
}
|
|
var retained commandkit.Invocation
|
|
var observed commandkit.ReportingMode
|
|
command := commandkit.NewCommand(commandkit.CommandSpec[struct{}]{Name: "run", Run: func(inv commandkit.Invocation, _ struct{}) commandkit.Outcome {
|
|
retained = inv
|
|
observed = inv.ReportingMode()
|
|
return commandkit.Success()
|
|
}})
|
|
app, err := commandkit.New(commandkit.Identity{Name: "example"}, command)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, tc := range []struct {
|
|
flag string
|
|
want commandkit.ReportingMode
|
|
}{{"", commandkit.ReportingModeOrdinary}, {"--quiet", commandkit.ReportingModeQuiet}, {"--verbose", commandkit.ReportingModeVerbose}, {"--debug", commandkit.ReportingModeDebug}, {"", commandkit.ReportingModeOrdinary}} {
|
|
args := []string{"run"}
|
|
if tc.flag != "" {
|
|
args = append(args, tc.flag)
|
|
}
|
|
result := app.Execute(context.Background(), args, commandkit.Streams{Out: io.Discard, Err: io.Discard})
|
|
if result.Kind != commandkit.OutcomeSuccess || observed != tc.want || retained.ReportingMode() != tc.want {
|
|
t.Fatalf("%q: outcome=%#v mode=%v", tc.flag, result, retained.ReportingMode())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestInvocationReportingModeConcurrentReads(t *testing.T) {
|
|
command := commandkit.NewCommand(commandkit.CommandSpec[struct{}]{Name: "run", Run: func(inv commandkit.Invocation, _ struct{}) commandkit.Outcome {
|
|
start := make(chan struct{})
|
|
var wg sync.WaitGroup
|
|
for i := 0; i < 4; i++ {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
<-start
|
|
for j := 0; j < 100; j++ {
|
|
if inv.ReportingMode() != commandkit.ReportingModeDebug {
|
|
t.Error("mode changed")
|
|
}
|
|
_ = inv.Reporter().Debug("diagnostic")
|
|
}
|
|
}()
|
|
}
|
|
close(start)
|
|
wg.Wait()
|
|
return commandkit.Success()
|
|
}})
|
|
app, err := commandkit.New(commandkit.Identity{Name: "example"}, command)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if outcome := app.Execute(context.Background(), []string{"run", "--debug"}, commandkit.Streams{Out: io.Discard, Err: io.Discard}); outcome.Kind != commandkit.OutcomeSuccess {
|
|
t.Fatal(outcome)
|
|
}
|
|
}
|