blob: bad9f7254fbc782733784d11d73470d3da6ef2d6 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"encoding/json"
"fmt"
"io"
"os"
"go.fuchsia.dev/tools/testing/runtests"
"go.fuchsia.dev/tools/testing/testrunner"
"go.fuchsia.dev/tools/testing/testrunner/cmd/outputs"
)
// Output manages the test runner's output drivers. Upon completion, if tar output is
// initialized, a TAR archive containing all other outputs is produced.
type Output struct {
Summary *outputs.SummaryOutput
TAP *outputs.TAPOutput
Tar *outputs.TarOutput
}
// SetupTAP intializes a TAPOutput stream. out is where the stream is written. testCount
// is used to print the TAP plan (e.g. 1..testCount). See outputs.TAPOutput for full docs.
func (o *Output) SetupTAP(out io.Writer, testCount int) {
o.TAP = outputs.NewTAPOutput(out, testCount)
}
// SetupSummary initializes a Test Summary output. See outputs.SummaryOutput for docs.
func (o *Output) SetupSummary() {
o.Summary = &outputs.SummaryOutput{}
}
// SetupTar initializes a TarOutput. See outputs.TarOutput for docs.
func (o *Output) SetupTar(archivePath string) error {
fd, err := os.Create(archivePath)
if err != nil {
return fmt.Errorf("failed to open %q: %v", archivePath, err)
}
o.Tar = outputs.NewTarOutput(fd)
return nil
}
// Record writes the test result to initialized outputs.
func (o *Output) Record(result testrunner.TestResult) {
if o.Summary != nil {
o.Summary.Record(result)
}
if o.TAP != nil {
o.TAP.Record(result)
}
if o.Tar != nil {
o.Tar.Record(result)
}
}
// Complete finishes producing output for the test run.
func (o *Output) Complete() error {
if o.Tar == nil {
return nil
}
bytes, err := json.Marshal(o.Summary.Summary)
if err != nil {
return err
}
if err := o.Tar.TarFile(bytes, runtests.TestSummaryFilename); err != nil {
return err
}
return o.Tar.Close()
}