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