github.com/0xKiwi/rules_go@v0.24.3/go/tools/windows-testrunner/windows-testrunner.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  
    12  	"gopkg.in/yaml.v2"
    13  )
    14  
    15  func main() {
    16  	log.SetFlags(0)
    17  	log.SetPrefix("testrunner: ")
    18  
    19  	var configPath string
    20  	flag.StringVar(&configPath, "config", "", "location of presubmit.yml")
    21  	flag.Parse()
    22  	if configPath == "" {
    23  		var err error
    24  		configPath, err = findConfigPath()
    25  		if err != nil {
    26  			log.Fatal(err)
    27  		}
    28  	}
    29  
    30  	if err := run(configPath, flag.Args()); err != nil {
    31  		log.Fatal(err)
    32  	}
    33  }
    34  
    35  func run(configPath string, args []string) error {
    36  	configData, err := ioutil.ReadFile(configPath)
    37  	if err != nil {
    38  		return err
    39  	}
    40  	var config interface{}
    41  	if err := yaml.Unmarshal(configData, &config); err != nil {
    42  		return err
    43  	}
    44  
    45  	platform := config.(map[interface{}]interface{})["platforms"].(map[interface{}]interface{})["windows"].(map[interface{}]interface{})
    46  	var buildFlags []string
    47  	for _, f := range platform["build_flags"].([]interface{}) {
    48  		buildFlags = append(buildFlags, f.(string))
    49  	}
    50  	testFlags := buildFlags
    51  	for _, f := range platform["test_flags"].([]interface{}) {
    52  		testFlags = append(testFlags, f.(string))
    53  	}
    54  	var buildTargets, testTargets []string
    55  	if len(args) == 0 {
    56  		for _, t := range platform["build_targets"].([]interface{}) {
    57  			buildTargets = append(buildTargets, t.(string))
    58  		}
    59  		for _, t := range platform["test_targets"].([]interface{}) {
    60  			testTargets = append(testTargets, t.(string))
    61  		}
    62  	} else {
    63  		buildTargets = args
    64  		testTargets = args
    65  	}
    66  
    67  	buildCmd := exec.Command("bazel", "build")
    68  	buildCmd.Args = append(buildCmd.Args, buildFlags...)
    69  	buildCmd.Args = append(buildCmd.Args, buildTargets...)
    70  	buildCmd.Stdout = os.Stdout
    71  	buildCmd.Stderr = os.Stderr
    72  	if err := buildCmd.Run(); err != nil {
    73  		return err
    74  	}
    75  
    76  	testCmd := exec.Command("bazel", "test")
    77  	testCmd.Args = append(testCmd.Args, testFlags...)
    78  	testCmd.Args = append(testCmd.Args, testTargets...)
    79  	testCmd.Stdout = os.Stdout
    80  	testCmd.Stderr = os.Stderr
    81  	if err := testCmd.Run(); err != nil {
    82  		return err
    83  	}
    84  
    85  	return nil
    86  }
    87  
    88  func findConfigPath() (string, error) {
    89  	d, err := os.Getwd()
    90  	if err != nil {
    91  		return "", err
    92  	}
    93  	for {
    94  		configPath := filepath.Join(d, ".bazelci/presubmit.yml")
    95  		_, err := os.Stat(configPath)
    96  		if !os.IsNotExist(err) {
    97  			return configPath, nil
    98  		}
    99  		parent := filepath.Dir(d)
   100  		if parent == d {
   101  			return "", fmt.Errorf("could not find presubmit.yml")
   102  		}
   103  		d = parent
   104  	}
   105  }