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