// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package platform_test import ( "bytes" "encoding/json" "flag" "internal/diff" "internal/testenv" "os" "os/exec" "testing" "text/template" ) var flagFix = flag.Bool("fix", false, "if true, fix out-of-date generated files") // TestGenerated verifies that zosarch.go is up to date, // or regenerates it if the -fix flag is set. func TestGenerated(t *testing.T) { testenv.MustHaveGoRun(t) // Here we use 'go run cmd/dist' instead of 'go tool dist' in case the // installed cmd/dist is stale or missing. We don't want to miss a // skew in the data due to a stale binary. cmd := testenv.Command(t, "go", "run", "cmd/dist", "list", "-json", "-broken") // cmd/dist requires GOROOT to be set explicitly in the environment. cmd.Env = append(cmd.Environ(), "GOROOT="+testenv.GOROOT(t)) out, err := cmd.Output() if err != nil { if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 { t.Logf("stderr:\n%s", ee.Stderr) } t.Fatalf("%v: %v", cmd, err) } type listEntry struct { GOOS, GOARCH string CgoSupported bool FirstClass bool Broken bool } var entries []listEntry if err := json.Unmarshal(out, &entries); err != nil { t.Fatal(err) } tmplOut := new(bytes.Buffer) tmpl := template.Must(template.New("zosarch").Parse(zosarchTmpl)) err = tmpl.Execute(tmplOut, entries) if err != nil { t.Fatal(err) } cmd = testenv.Command(t, "gofmt") cmd.Stdin = bytes.NewReader(tmplOut.Bytes()) want, err := cmd.Output() if err != nil { t.Logf("stdin:\n%s", tmplOut.Bytes()) if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 { t.Logf("stderr:\n%s", ee.Stderr) } t.Fatalf("%v: %v", cmd, err) } got, err := os.ReadFile("zosarch.go") if err == nil && bytes.Equal(got, want) { return } if !*flagFix { if err != nil { t.Log(err) } else { t.Logf("diff:\n%s", diff.Diff("zosarch.go", got, "want", want)) } t.Fatalf("zosarch.go is missing or out of date; to regenerate, run\ngo generate internal/platform") } if err := os.WriteFile("zosarch.go", want, 0666); err != nil { t.Fatal(err) } } const zosarchTmpl = `// Code generated by go test internal/platform -fix. DO NOT EDIT. // To change the information in this file, edit the cgoEnabled and/or firstClass // maps in cmd/dist/build.go, then run 'go generate internal/platform'. package platform // List is the list of all valid GOOS/GOARCH combinations, // including known-broken ports. var List = []OSArch{ {{range .}} { {{ printf "%q" .GOOS }}, {{ printf "%q" .GOARCH }} }, {{end}} } var distInfo = map[OSArch]osArchInfo { {{range .}} { {{ printf "%q" .GOOS }}, {{ printf "%q" .GOARCH }} }: { {{if .CgoSupported}}CgoSupported: true, {{end}}{{if .FirstClass}}FirstClass: true, {{end}}{{if .Broken}} Broken: true, {{end}} }, {{end}} } `