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  }