]> Cypherpunks repositories - gostls13.git/commitdiff
debug/buildinfo: add old-Go and not-Go tests
authorMichael Pratt <mpratt@google.com>
Fri, 26 Jul 2024 16:05:40 +0000 (12:05 -0400)
committerGopher Robot <gobot@golang.org>
Mon, 29 Jul 2024 15:32:56 +0000 (15:32 +0000)
There is currently no coverage for the pre-1.18 buildinfo format, or for
parsing non-Go binaries. Add basic tests for each of these.

Updates #68592.

Change-Id: Iec14d29ffc1392e46f592c0c7bebf2eb75f7d0d3
Reviewed-on: https://go-review.googlesource.com/c/go/+/601457
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Pratt <mpratt@google.com>

src/debug/buildinfo/buildinfo_test.go
src/debug/buildinfo/testdata/go117 [new file with mode: 0755]
src/debug/buildinfo/testdata/notgo [new file with mode: 0755]

index ea7228c30052cb83f1816da3b94963d7ac86d9e7..9f9756a22c2fbb21a22493e0c243afabb8dd90d7 100644 (file)
@@ -248,6 +248,62 @@ func TestReadFile(t *testing.T) {
        }
 }
 
+// Test117 verifies that parsing of the old, pre-1.18 format works.
+func Test117(t *testing.T) {
+       // go117 was generated for linux-amd64 with:
+       //
+       // main.go:
+       //
+       // package main
+       // func main() {}
+       //
+       // GOTOOLCHAIN=go1.17 go mod init example.com/go117
+       // GOTOOLCHAIN=go1.17 go build
+       //
+       // TODO(prattmic): Ideally this would be built on the fly to better
+       // cover all executable formats, but then we need a network connection
+       // to download an old Go toolchain.
+       info, err := buildinfo.ReadFile("testdata/go117")
+       if err != nil {
+               t.Fatalf("ReadFile got err %v, want nil", err)
+       }
+
+       if info.GoVersion != "go1.17" {
+               t.Errorf("GoVersion got %s want go1.17", info.GoVersion)
+       }
+       if info.Path != "example.com/go117" {
+               t.Errorf("Path got %s want example.com/go117", info.Path)
+       }
+       if info.Main.Path != "example.com/go117" {
+               t.Errorf("Main.Path got %s want example.com/go117", info.Main.Path)
+       }
+}
+
+// TestNotGo verifies that parsing of a non-Go binary returns the proper error.
+func TestNotGo(t *testing.T) {
+       // notgo was generated for linux-amd64 with:
+       //
+       // main.c:
+       //
+       // int main(void) { return 0; }
+       //
+       // cc -o notgo main.c
+       //
+       // TODO(prattmic): Ideally this would be built on the fly to better
+       // cover all executable formats, but then we need to encode the
+       // intricacies of calling each platform's C compiler.
+       _, err := buildinfo.ReadFile("testdata/notgo")
+       if err == nil {
+               t.Fatalf("ReadFile got nil err, want non-nil")
+       }
+
+       // The precise error text here isn't critical, but we want something
+       // like errNotGoExe rather than e.g., a file read error.
+       if !strings.Contains(err.Error(), "not a Go executable") {
+               t.Errorf("ReadFile got err %v want not a Go executable", err)
+       }
+}
+
 // FuzzIssue57002 is a regression test for golang.org/issue/57002.
 //
 // The cause of issue 57002 is when pointerSize is not being checked,
diff --git a/src/debug/buildinfo/testdata/go117 b/src/debug/buildinfo/testdata/go117
new file mode 100755 (executable)
index 0000000..d7acbee
Binary files /dev/null and b/src/debug/buildinfo/testdata/go117 differ
diff --git a/src/debug/buildinfo/testdata/notgo b/src/debug/buildinfo/testdata/notgo
new file mode 100755 (executable)
index 0000000..bc19ec2
Binary files /dev/null and b/src/debug/buildinfo/testdata/notgo differ