github.com/system-transparency/u-root@v6.0.1-0.20190919065413-ed07a650de4c+incompatible/integration/testcmd/gotest/uinit/gotest.go (about) 1 // Copyright 2018 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "context" 9 "io" 10 "log" 11 "os" 12 "os/exec" 13 "path/filepath" 14 "strings" 15 "time" 16 17 "github.com/u-root/u-root/pkg/mount" 18 "golang.org/x/sys/unix" 19 ) 20 21 func walkTests(testRoot string, fn func(string, string)) error { 22 return filepath.Walk(testRoot, func(path string, info os.FileInfo, err error) error { 23 if !info.Mode().IsRegular() || !strings.HasSuffix(path, ".test") || err != nil { 24 return nil 25 } 26 t2, err := filepath.Rel(testRoot, path) 27 if err != nil { 28 return err 29 } 30 pkgName := filepath.Dir(t2) 31 32 fn(path, pkgName) 33 return nil 34 }) 35 } 36 37 // Mount a vfat volume and run the tests within. 38 func main() { 39 if err := os.MkdirAll("/testdata", 0755); err != nil { 40 log.Fatalf("Couldn't create testdata: %v", err) 41 } 42 var err error 43 if os.Getenv("UROOT_USE_9P") == "1" { 44 err = mount.Mount("tmpdir", "/testdata", "9p", "", 0) 45 } else { 46 err = mount.Mount("/dev/sda1", "/testdata", "vfat", "", unix.MS_RDONLY) 47 } 48 if err != nil { 49 log.Fatalf("Couldn't mount /dev/sda1: %v", err) 50 } 51 52 walkTests("/testdata/tests", func(path, pkgName string) { 53 ctx, cancel := context.WithTimeout(context.Background(), 25000*time.Millisecond) 54 defer cancel() 55 56 r, w, err := os.Pipe() 57 if err != nil { 58 log.Printf("Failed to get pipe: %v", err) 59 return 60 } 61 62 cmd := exec.CommandContext(ctx, path, "-test.v") 63 cmd.Stdin, cmd.Stderr = os.Stdin, os.Stderr 64 65 // Write to stdout for humans, write to w for the JSON converter. 66 // 67 // The test collector will gobble up JSON for statistics, and 68 // print non-JSON for humans to consume. 69 cmd.Stdout = io.MultiWriter(os.Stdout, w) 70 71 // Start test in its own dir so that testdata is available as a 72 // relative directory. 73 cmd.Dir = filepath.Dir(path) 74 if err := cmd.Start(); err != nil { 75 log.Printf("Failed to start %v: %v", path, err) 76 return 77 } 78 79 j := exec.CommandContext(ctx, "test2json", "-t", "-p", pkgName) 80 j.Stdin = r 81 j.Stdout, cmd.Stderr = os.Stdout, os.Stderr 82 if err := j.Start(); err != nil { 83 log.Printf("Failed to start test2json: %v", err) 84 return 85 } 86 87 // Don't do anything if the test fails. The log collector will 88 // deal with it. ¯\_(ツ)_/¯ 89 cmd.Wait() 90 // Close the pipe so test2json will quit. 91 w.Close() 92 j.Wait() 93 }) 94 95 log.Printf("GoTest Done") 96 97 unix.Reboot(unix.LINUX_REBOOT_CMD_POWER_OFF) 98 }