| // +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/mcu-tools/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 |
| } |