mcuboot/samples/zephyr/test-compile.go

157 lines
2.5 KiB
Go

// +build ignore
//
// Build all of the tests.
//
// Run as:
//
// go run test-compile.go -out name.tar
package main
import (
"archive/zip"
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
"path"
"github.com/JuulLabs-OSS/mcuboot/samples/zephyr/mcutests"
)
var outFile = flag.String("out", "test-images.zip", "Name of zip file to put built tests into")
func main() {
err := run()
if err != nil {
log.Fatal(err)
}
}
func run() error {
flag.Parse()
zipper, err := NewBuilds()
if err != nil {
return err
}
defer zipper.Close()
for _, group := range mcutests.Tests {
fmt.Printf("Compiling %q\n", group.ShortName)
c := exec.Command("make",
fmt.Sprintf("test-%s", group.ShortName))
// TODO: Should capture the output and show it if
// there is an error.
err = c.Run()
if err != nil {
return err
}
err = zipper.Capture(group.ShortName)
if err != nil {
return err
}
}
return nil
}
// A Builds create a zipfile of the contents of various builds. The
// names will be constructed.
type Builds struct {
// The file being written to.
file *os.File
// The zip writer writing the data.
zip *zip.Writer
}
func NewBuilds() (*Builds, error) {
name := *outFile
file, err := os.OpenFile(name, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
if err != nil {
return nil, err
}
z := zip.NewWriter(file)
return &Builds{
file: file,
zip: z,
}, nil
}
func (b *Builds) Close() error {
return b.zip.Close()
}
func (b *Builds) Capture(testName string) error {
// Collect stat information from the test directory, which
// should be close enough to make the zip file meaningful.
info, err := os.Stat(".")
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = testName + "/"
_, err = b.zip.CreateHeader(header)
if err != nil {
return err
}
for _, name := range []string{
"mcuboot.bin",
"signed-hello1.bin",
"signed-hello2.bin",
} {
err = b.add(testName, name, name)
if err != nil {
return err
}
}
return nil
}
func (b *Builds) add(baseName, zipName, fileName string) error {
inp, err := os.Open(fileName)
if err != nil {
return err
}
defer inp.Close()
info, err := inp.Stat()
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = path.Join(baseName, zipName)
header.Method = zip.Deflate
wr, err := b.zip.CreateHeader(header)
if err != nil {
return err
}
_, err = io.Copy(wr, inp)
if err != nil {
return err
}
return nil
}