github.com/fnando/bolt@v0.0.4-0.20231107225351-5241e4d187b8/internal/reporters/post_run_command_reporter.go (about)

     1  package reporters
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"os/exec"
     9  
    10  	c "github.com/fnando/bolt/common"
    11  )
    12  
    13  type PostRunCommandReporter struct {
    14  	Command string
    15  	Output  *c.Output
    16  }
    17  
    18  func (reporter PostRunCommandReporter) Name() string {
    19  	return "post-command"
    20  }
    21  
    22  func (reporter PostRunCommandReporter) OnFinished(options ReporterFinishedOptions) {
    23  	if reporter.Command == "" {
    24  		return
    25  	}
    26  
    27  	total := options.Aggregation.TestsCount()
    28  	fail := options.Aggregation.CountBy("fail")
    29  	pass := options.Aggregation.CountBy("pass")
    30  	skip := options.Aggregation.CountBy("skip")
    31  	benchmarks := len(options.Aggregation.Benchmarks())
    32  	elapsed := options.Aggregation.Elapsed()
    33  	elapsedNS := int(elapsed)
    34  	title := "Passed!"
    35  
    36  	if fail > 0 {
    37  		title = "Failed!"
    38  	}
    39  
    40  	env := os.Environ()
    41  	env = append(
    42  		env,
    43  		fmt.Sprintf(
    44  			"BOLT_SUMMARY=Finished in %s, %d tests, %d fails, %d skips, %d benchmarks",
    45  			formatDuration(elapsed, 2),
    46  			total,
    47  			fail,
    48  			skip,
    49  			benchmarks,
    50  		),
    51  		fmt.Sprintf("BOLT_TEST_COUNT=%d", total),
    52  		fmt.Sprintf("BOLT_FAIL_COUNT=%d", fail),
    53  		fmt.Sprintf("BOLT_PASS_COUNT=%d", pass),
    54  		fmt.Sprintf("BOLT_SKIP_COUNT=%d", skip),
    55  		fmt.Sprintf("BOLT_BENCHMARK_COUNT=%d", benchmarks),
    56  		fmt.Sprintf("BOLT_ELAPSED_NANOSECONDS=%d", elapsedNS),
    57  		fmt.Sprintf("BOLT_ELAPSED=%s", formatDuration(elapsed, 2)),
    58  		fmt.Sprintf("BOLT_TITLE=%s", title),
    59  	)
    60  
    61  	var buffer bytes.Buffer
    62  	out := io.Writer(&buffer)
    63  
    64  	dir, _ := os.Getwd()
    65  
    66  	cmd := exec.Command("bash", "-c", reporter.Command)
    67  	cmd.Stdout = out
    68  	cmd.Stderr = out
    69  	cmd.Dir = dir
    70  	cmd.Env = env
    71  	err := cmd.Start()
    72  
    73  	if options.Debug && err != nil {
    74  		fmt.Fprintln(
    75  			reporter.Output.Stderr,
    76  			"\n",
    77  			c.Color.Detail("⚡️")+" failed to run post run command:",
    78  			err,
    79  			buffer.String(),
    80  		)
    81  	}
    82  
    83  	if err != nil {
    84  		return
    85  	}
    86  
    87  	err = cmd.Wait()
    88  
    89  	if options.Debug && err != nil {
    90  		fmt.Fprintln(
    91  			reporter.Output.Stderr,
    92  			"\n",
    93  			c.Color.Detail("⚡️")+" failed to run post run command:",
    94  			err,
    95  		)
    96  
    97  		fmt.Fprintln(
    98  			reporter.Output.Stderr,
    99  			"output:",
   100  			buffer.String(),
   101  		)
   102  	}
   103  
   104  	if err != nil {
   105  		return
   106  	}
   107  }
   108  
   109  func (reporter PostRunCommandReporter) OnProgress(test c.Test) {
   110  }
   111  
   112  func (reporter PostRunCommandReporter) OnData(line string) {
   113  }