blob: e8ffe9e75d4a11dc0626c7f612d8c06f934c73ad [file] [log] [blame]
// 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}}
}
`