test: migrate remaining tests to run.go

* bug248, bug345, bug369, and bug429 were ported from bash commands to run scripts. bug369 remains disabled.
* bug395 is a test for issue 1909, which is still open. It is marked as skip now and will be usable with compile with run.go when issue 1909 is fixed.

Fixes #4139

Updates #1909

Change-Id: Ibb5fbfb5cf72ddc285829245318eeacd3fb5a636
Reviewed-on: https://go-review.googlesource.com/1774
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/test/fixedbugs/bug248.go b/test/fixedbugs/bug248.go
index 98cda35..338bc8e 100644
--- a/test/fixedbugs/bug248.go
+++ b/test/fixedbugs/bug248.go
@@ -1,15 +1,56 @@
-// $G $D/$F.dir/bug0.go &&
-// $G $D/$F.dir/bug1.go &&
-// $G $D/$F.dir/bug2.go &&
-// errchk $G -e $D/$F.dir/bug3.go &&
-// $L bug2.$A &&
-// ./$A.out || echo BUG: failed to compile
-
-// 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 2009 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.
 
-ignored
+package main
+
+import (
+	"fmt"
+	"go/build"
+	"os"
+	"os/exec"
+	"path/filepath"
+)
+
+func main() {
+	a, err := build.ArchChar(build.Default.GOARCH)
+	check(err)
+
+	errchk, err := filepath.Abs("errchk")
+	check(err)
+
+	err = os.Chdir(filepath.Join("fixedbugs", "bug248.dir"))
+	check(err)
+
+	run("go", "tool", a+"g", "bug0.go")
+	run("go", "tool", a+"g", "bug1.go")
+	run("go", "tool", a+"g", "bug2.go")
+	run(errchk, "go", "tool", a+"g", "-e", "bug3.go")
+	run("go", "tool", a+"l", "bug2."+a)
+	run(fmt.Sprintf(".%c%s.out", filepath.Separator, a))
+
+	os.Remove("bug0." + a)
+	os.Remove("bug1." + a)
+	os.Remove("bug2." + a)
+	os.Remove(a + ".out")
+}
+
+func run(name string, args ...string) {
+	cmd := exec.Command(name, args...)
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		fmt.Println(string(out))
+		fmt.Println(err)
+		os.Exit(1)
+	}
+}
+
+func check(err error) {
+	if err != nil {
+		fmt.Println(err)
+		os.Exit(1)
+	}
+}