// Copyright 2022 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 debug_test import ( "reflect" "runtime/debug" "strings" "testing" ) // strip removes two leading tabs after each newline of s. func strip(s string) string { replaced := strings.ReplaceAll(s, "\n\t\t", "\n") if len(replaced) > 0 && replaced[0] == '\n' { replaced = replaced[1:] } return replaced } func FuzzParseBuildInfoRoundTrip(f *testing.F) { // Package built from outside a module, missing some fields.. f.Add(strip(` path rsc.io/fortune mod rsc.io/fortune v1.0.0 `)) // Package built from the standard library, missing some fields.. f.Add(`path cmd/test2json`) // Package built from inside a module. f.Add(strip(` go 1.18 path example.com/m mod example.com/m (devel) build -compiler=gc `)) // Package built in GOPATH mode. f.Add(strip(` go 1.18 path example.com/m build -compiler=gc `)) // Escaped build info. f.Add(strip(` go 1.18 path example.com/m build CRAZY_ENV="requires\nescaping" `)) f.Fuzz(func(t *testing.T, s string) { bi, err := debug.ParseBuildInfo(s) if err != nil { // Not a round-trippable BuildInfo string. t.Log(err) return } // s2 could have different escaping from s. // However, it should parse to exactly the same contents. s2 := bi.String() bi2, err := debug.ParseBuildInfo(s2) if err != nil { t.Fatalf("%v:\n%s", err, s2) } if !reflect.DeepEqual(bi2, bi) { t.Fatalf("Parsed representation differs.\ninput:\n%s\noutput:\n%s", s, s2) } }) }