mirror of https://go.googlesource.com/go
110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
// 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}}
|
|
}
|
|
`
|