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