@@ -24,6 +24,7 @@ type TermTest struct {
2424 outputProducer * outputProducer
2525 listenError chan error
2626 opts * Opts
27+ exited * cmdExit
2728}
2829
2930type ErrorHandler func (* TermTest , error ) error
@@ -50,6 +51,9 @@ type SetOpt func(o *Opts) error
5051const DefaultCols = 140
5152const DefaultRows = 10
5253
54+ var processExitPollInterval = 10 * time .Millisecond
55+ var processExitExtraWait = 500 * time .Millisecond
56+
5357func NewOpts () * Opts {
5458 return & Opts {
5559 Logger : VoidLogger ,
@@ -234,6 +238,10 @@ func (tt *TermTest) start() (rerr error) {
234238 }()
235239 wg .Wait ()
236240
241+ go func () {
242+ tt .exited = <- waitForCmdExit (tt .cmd )
243+ }()
244+
237245 return nil
238246}
239247
@@ -316,6 +324,28 @@ func (tt *TermTest) SendCtrlC() {
316324 tt .Send (string ([]byte {0x03 })) // 0x03 is ASCII character for ^C
317325}
318326
327+ // Exited returns a channel that sends the given termtest's command cmdExit info when available.
328+ // This can be used within a select{} statement.
329+ // If waitExtra is given, waits a little bit before sending cmdExit info. This allows any fellow
330+ // switch cases with output consumers to handle unprocessed stdout. If there are no such cases
331+ // (e.g. ExpectExit(), where we want to catch an exit ASAP), waitExtra should be false.
332+ func (tt * TermTest ) Exited (waitExtra bool ) chan * cmdExit {
333+ return waitChan (func () * cmdExit {
334+ ticker := time .NewTicker (processExitPollInterval )
335+ for {
336+ select {
337+ case <- ticker .C :
338+ if tt .exited != nil {
339+ if waitExtra { // allow sibling output consumer cases to handle their output
340+ time .Sleep (processExitExtraWait )
341+ }
342+ return tt .exited
343+ }
344+ }
345+ }
346+ })
347+ }
348+
319349func (tt * TermTest ) errorHandler (rerr * error ) {
320350 err := * rerr
321351 if err == nil {
0 commit comments