xref: /aosp_15_r20/external/bazelbuild-rules_go/go/tools/windows-testrunner/windows-testrunner.go (revision 9bb1b549b6a84214c53be0924760be030e66b93a)
1package main
2
3import (
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
15func 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
35func 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
88func 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}
106