test: write Go wrapper code so that bug302 can be run by run.go

Issue #4139.

Change-Id: I50d85a65b22c0cfb4d2a078cee45cf7adb23ba77
Reviewed-on: https://go-review.googlesource.com/1210
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
diff --git a/test/fixedbugs/bug302.go b/test/fixedbugs/bug302.go
index dc7637f..65c98c4 100644
--- a/test/fixedbugs/bug302.go
+++ b/test/fixedbugs/bug302.go
@@ -1,9 +1,41 @@
-// $G $D/bug302.dir/p.go && pack grc pp.a p.$A && $G $D/bug302.dir/main.go
-
-// NOTE: This test is not run by 'run.go' and so not run by all.bash.
-// To run this test you must use the ./run shell script.
+// +build !nacl
+// run
 
 // Copyright 2010 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 main
+
+import (
+	"fmt"
+	"go/build"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+)
+
+func main() {
+	a, err := build.ArchChar(runtime.GOARCH)
+	if err != nil {
+		fmt.Println("BUG:", err)
+		os.Exit(1)
+	}
+
+	run("go", "tool", a+"g", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
+	run("go", "tool", "pack", "grc", "pp.a", "p."+a)
+	run("go", "tool", a+"g", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
+	os.Remove("p."+a)
+	os.Remove("pp.a")
+	os.Remove("main."+a)
+}
+
+func run(cmd string, args ...string) {
+	out, err := exec.Command(cmd, args...).CombinedOutput()
+	if err != nil {
+		fmt.Println(string(out))
+		fmt.Println(err)
+		os.Exit(1)
+	}
+}