Revision control

Copy as Markdown

package main
import (
"archive/zip"
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
"code.qt.io/qt/qtqa.git/src/goqtestlib"
"github.com/kardianos/osext"
)
func recordResults(resultsDirectory string, workingDir string) error {
os.Unsetenv("TESTRUNNER")
makeCommand := exec.Command("make", "benchmark")
makeCommand.Stdout = os.Stdout
makeCommand.Stderr = os.Stderr
runner := func(extraArgs []string) error {
arguments := strings.Join(extraArgs, " ")
benchmarkArgs := os.Getenv("QT_BENCHMARK_ARGS")
if benchmarkArgs != "" {
arguments = arguments + " " + benchmarkArgs
}
defer goqtestlib.SetEnvironmentVariableAndRestoreOnExit("TESTARGS", arguments)()
return makeCommand.Run()
}
name, err := filepath.Rel(os.Getenv("QT_BENCHMARK_BASE_DIRECTORY"), workingDir)
if err != nil {
return fmt.Errorf("Could not determine relative directory: %s", err)
}
if name == "." {
name = "testcase"
}
repetitions := 0
result, err := goqtestlib.GenerateTestResult(name, resultsDirectory, repetitions, runner)
if err != nil {
return err
}
return os.Rename(result.PathToResultsXML, filepath.Join(resultsDirectory, name+".xml"))
}
func archiveResults(resultsDir string, outputFile io.Writer) error {
archiver := zip.NewWriter(outputFile)
defer archiver.Close()
return filepath.Walk(resultsDir, func(path string, info os.FileInfo, err error) error {
if info == nil || info.IsDir() {
return nil
}
relativePath, err := filepath.Rel(resultsDir, path)
if err != nil {
return err
}
sourceFile, err := os.Open(path)
if err != nil {
return err
}
defer sourceFile.Close()
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = relativePath
file, err := archiver.CreateHeader(header)
if err != nil {
return err
}
n, err := io.Copy(file, sourceFile)
if n != info.Size() {
return fmt.Errorf("Incorrect number of bytes written to archive for %s: Wrote %v expected %v", path, n, info.Size())
}
return err
})
}
func collectResults(workingDir string) error {
self, err := osext.Executable()
if err != nil {
return fmt.Errorf("Unable to determine current executable name: %s", err)
}
resultsDir, err := ioutil.TempDir("", "")
if err != nil {
return err
}
defer os.RemoveAll(resultsDir)
os.Setenv("TESTRUNNER", self)
os.Setenv("QT_BENCHMARK_RECORDING_DIRECTORY", resultsDir)
os.Setenv("QT_BENCHMARK_BASE_DIRECTORY", workingDir)
os.Setenv("QT_HASH_SEED", "0")
var outputFileName string
flag.StringVar(&outputFileName, "output-file", "results.zip", "Write collected benchmark results into specified file")
flag.Parse()
os.Setenv("QT_BENCHMARK_ARGS", strings.Join(flag.Args(), " "))
makeCommand := exec.Command("make", "benchmark")
makeCommand.Stdout = os.Stdout
makeCommand.Stderr = os.Stderr
if err := makeCommand.Run(); err != nil {
return fmt.Errorf("Error running make benchmark: %s", err)
}
outputFile, err := os.Create(outputFileName)
if err != nil {
return fmt.Errorf("Error creating output file: %s", err)
}
defer outputFile.Close()
return archiveResults(resultsDir, outputFile)
}
func appMain() error {
workingDir, err := os.Getwd()
if err != nil {
return fmt.Errorf("Error determining current working directory: %s", err)
}
if os.Getenv("QT_BENCHMARK_RECORDING_DIRECTORY") != "" {
return recordResults(os.Getenv("QT_BENCHMARK_RECORDING_DIRECTORY"), workingDir)
}
return collectResults(workingDir)
}
func main() {
if err := appMain(); err != nil {
fmt.Printf("%s\n", err)
os.Exit(2)
}
}