| // 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) |
| } |
| }) |
| } |