1*760c253cSXin Liruntime, crypto/x509: add -target flag. 2*760c253cSXin Li 3*760c253cSXin Li--- src/crypto/x509/x509_test.go 4*760c253cSXin Li+++ src/crypto/x509/x509_test.go 5*760c253cSXin Li@@ -13,29 +13,32 @@ import ( 6*760c253cSXin Li "crypto/rsa" 7*760c253cSXin Li _ "crypto/sha256" 8*760c253cSXin Li _ "crypto/sha512" 9*760c253cSXin Li "crypto/x509/pkix" 10*760c253cSXin Li "encoding/asn1" 11*760c253cSXin Li "encoding/base64" 12*760c253cSXin Li "encoding/hex" 13*760c253cSXin Li "encoding/pem" 14*760c253cSXin Li+ "flag" 15*760c253cSXin Li "fmt" 16*760c253cSXin Li "internal/testenv" 17*760c253cSXin Li "math/big" 18*760c253cSXin Li "net" 19*760c253cSXin Li "net/url" 20*760c253cSXin Li "os/exec" 21*760c253cSXin Li "reflect" 22*760c253cSXin Li "runtime" 23*760c253cSXin Li "strings" 24*760c253cSXin Li "testing" 25*760c253cSXin Li "time" 26*760c253cSXin Li ) 27*760c253cSXin Li 28*760c253cSXin Li+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries") 29*760c253cSXin Li+ 30*760c253cSXin Li func TestParsePKCS1PrivateKey(t *testing.T) { 31*760c253cSXin Li block, _ := pem.Decode([]byte(pemPrivateKey)) 32*760c253cSXin Li priv, err := ParsePKCS1PrivateKey(block.Bytes) 33*760c253cSXin Li if err != nil { 34*760c253cSXin Li t.Errorf("Failed to parse private key: %s", err) 35*760c253cSXin Li return 36*760c253cSXin Li } 37*760c253cSXin Li if priv.PublicKey.N.Cmp(rsaPrivateKey.PublicKey.N) != 0 || 38*760c253cSXin Li@@ -1089,17 +1092,23 @@ func TestParsePEMCRL(t *testing.T) { 39*760c253cSXin Li } 40*760c253cSXin Li 41*760c253cSXin Li // Can't check the signature here without a package cycle. 42*760c253cSXin Li } 43*760c253cSXin Li 44*760c253cSXin Li func TestImports(t *testing.T) { 45*760c253cSXin Li testenv.MustHaveGoRun(t) 46*760c253cSXin Li 47*760c253cSXin Li- if err := exec.Command(testenv.GoToolPath(t), "run", "x509_test_import.go").Run(); err != nil { 48*760c253cSXin Li+ var cmd *exec.Cmd 49*760c253cSXin Li+ if *target == "" { 50*760c253cSXin Li+ cmd = exec.Command(testenv.GoToolPath(t), "run", "x509_test_import.go") 51*760c253cSXin Li+ } else { 52*760c253cSXin Li+ cmd = exec.Command("go_"+*target, "run", "-exec", "go_"+*target+"_exec", "x509_test_import.go") 53*760c253cSXin Li+ } 54*760c253cSXin Li+ if err := cmd.Run(); err != nil { 55*760c253cSXin Li t.Errorf("failed to run x509_test_import.go: %s", err) 56*760c253cSXin Li } 57*760c253cSXin Li } 58*760c253cSXin Li 59*760c253cSXin Li const derCRLBase64 = "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" 60*760c253cSXin Li 61*760c253cSXin Li const pemCRLBase64 = "LS0tLS1CRUdJTiBYNTA5IENSTC0tLS0tDQpNSUlCOWpDQ0FWOENBUUV3RFFZSktvWklodmNOQVFFRkJRQXdiREVhTUJnR0ExVUVDaE1SVWxOQklGTmxZM1Z5DQphWFI1SUVsdVl5NHhIakFjQmdOVkJBTVRGVkpUUVNCUWRXSnNhV01nVW05dmRDQkRRU0IyTVRFdU1Dd0dDU3FHDQpTSWIzRFFFSkFSWWZjbk5oYTJWdmJuSnZiM1J6YVdkdVFISnpZWE5sWTNWeWFYUjVMbU52YlJjTk1URXdNakl6DQpNVGt5T0RNd1doY05NVEV3T0RJeU1Ua3lPRE13V2pDQmpEQktBaEVBckRxb2g5RkhKSFhUN09QZ3V1bjQrQmNODQpNRGt4TVRBeU1UUXlOekE1V2pBbU1Bb0dBMVVkRlFRRENnRUpNQmdHQTFVZEdBUVJHQTh5TURBNU1URXdNakUwDQpNalExTlZvd1BnSVJBTEd6blowOTVQQjVhQU9MUGc1N2ZNTVhEVEF5TVRBeU16RTBOVEF4TkZvd0dqQVlCZ05WDQpIUmdFRVJnUE1qQXdNakV3TWpNeE5EVXdNVFJhb0RBd0xqQWZCZ05WSFNNRUdEQVdnQlQxVERGNlVRTS9MTmVMDQpsNWx2cUhHUXEzZzltekFMQmdOVkhSUUVCQUlDQUlRd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ1lFQUZVNUFzNk16DQpxNVBSc2lmYW9iUVBHaDFhSkx5QytNczVBZ2MwYld5QTNHQWR4dXI1U3BQWmVSV0NCamlQL01FSEJXSkNsQkhQDQpHUmNxNXlJZDNFakRrYUV5eFJhK2k2N0x6dmhJNmMyOUVlNks5cFNZd2ppLzdSVWhtbW5Qclh0VHhsTDBsckxyDQptUVFKNnhoRFJhNUczUUE0Q21VZHNITnZicnpnbUNZcHZWRT0NCi0tLS0tRU5EIFg1MDkgQ1JMLS0tLS0NCg0K" 62*760c253cSXin Li 63*760c253cSXin Li--- src/runtime/crash_cgo_test.go 64*760c253cSXin Li+++ src/runtime/crash_cgo_test.go 65*760c253cSXin Li@@ -279,17 +279,17 @@ func testCgoPprof(t *testing.T, buildArg, runArg string) { 66*760c253cSXin Li } 67*760c253cSXin Li testenv.MustHaveGoRun(t) 68*760c253cSXin Li 69*760c253cSXin Li exe, err := buildTestProg(t, "testprogcgo", buildArg) 70*760c253cSXin Li if err != nil { 71*760c253cSXin Li t.Fatal(err) 72*760c253cSXin Li } 73*760c253cSXin Li 74*760c253cSXin Li- got, err := testenv.CleanCmdEnv(exec.Command(exe, runArg)).CombinedOutput() 75*760c253cSXin Li+ got, err := testenv.CleanCmdEnv(goExecCmd(exe, runArg)).CombinedOutput() 76*760c253cSXin Li if err != nil { 77*760c253cSXin Li if testenv.Builder() == "linux-amd64-alpine" { 78*760c253cSXin Li // See Issue 18243 and Issue 19938. 79*760c253cSXin Li t.Skipf("Skipping failing test on Alpine (golang.org/issue/18243). Ignoring error: %v", err) 80*760c253cSXin Li } 81*760c253cSXin Li t.Fatal(err) 82*760c253cSXin Li } 83*760c253cSXin Li fn := strings.TrimSpace(string(got)) 84*760c253cSXin Li--- src/runtime/crash_test.go 85*760c253cSXin Li+++ src/runtime/crash_test.go 86*760c253cSXin Li@@ -17,16 +17,35 @@ import ( 87*760c253cSXin Li "runtime" 88*760c253cSXin Li "strconv" 89*760c253cSXin Li "strings" 90*760c253cSXin Li "sync" 91*760c253cSXin Li "testing" 92*760c253cSXin Li "time" 93*760c253cSXin Li ) 94*760c253cSXin Li 95*760c253cSXin Li+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries") 96*760c253cSXin Li+ 97*760c253cSXin Li+func goCmd(t *testing.T) string { 98*760c253cSXin Li+ if *target != "" { 99*760c253cSXin Li+ return "go_" + *target 100*760c253cSXin Li+ } 101*760c253cSXin Li+ return testenv.GoToolPath(t) 102*760c253cSXin Li+} 103*760c253cSXin Li+ 104*760c253cSXin Li+func goExecCmd(name string, arg ...string) *exec.Cmd { 105*760c253cSXin Li+ var cmd []string 106*760c253cSXin Li+ if *target != "" { 107*760c253cSXin Li+ cmd = append(cmd, "go_"+*target+"_exec") 108*760c253cSXin Li+ } 109*760c253cSXin Li+ cmd = append(cmd, name) 110*760c253cSXin Li+ cmd = append(cmd, arg...) 111*760c253cSXin Li+ return exec.Command(cmd[0], cmd[1:]...) 112*760c253cSXin Li+} 113*760c253cSXin Li+ 114*760c253cSXin Li var toRemove []string 115*760c253cSXin Li 116*760c253cSXin Li func TestMain(m *testing.M) { 117*760c253cSXin Li status := m.Run() 118*760c253cSXin Li for _, file := range toRemove { 119*760c253cSXin Li os.RemoveAll(file) 120*760c253cSXin Li } 121*760c253cSXin Li os.Exit(status) 122*760c253cSXin Li@@ -50,17 +69,17 @@ func runTestProg(t *testing.T, binary, name string, env ...string) string { 123*760c253cSXin Li 124*760c253cSXin Li testenv.MustHaveGoBuild(t) 125*760c253cSXin Li 126*760c253cSXin Li exe, err := buildTestProg(t, binary) 127*760c253cSXin Li if err != nil { 128*760c253cSXin Li t.Fatal(err) 129*760c253cSXin Li } 130*760c253cSXin Li 131*760c253cSXin Li- cmd := testenv.CleanCmdEnv(exec.Command(exe, name)) 132*760c253cSXin Li+ cmd := testenv.CleanCmdEnv(goExecCmd(exe, name)) 133*760c253cSXin Li cmd.Env = append(cmd.Env, env...) 134*760c253cSXin Li if testing.Short() { 135*760c253cSXin Li cmd.Env = append(cmd.Env, "RUNTIME_TEST_SHORT=1") 136*760c253cSXin Li } 137*760c253cSXin Li var b bytes.Buffer 138*760c253cSXin Li cmd.Stdout = &b 139*760c253cSXin Li cmd.Stderr = &b 140*760c253cSXin Li if err := cmd.Start(); err != nil { 141*760c253cSXin Li@@ -125,17 +144,17 @@ func buildTestProg(t *testing.T, binary string, flags ...string) (string, error) 142*760c253cSXin Li name += "_" + strings.Join(flags, "_") 143*760c253cSXin Li } 144*760c253cSXin Li target, ok := testprog.target[name] 145*760c253cSXin Li if ok { 146*760c253cSXin Li return target.exe, target.err 147*760c253cSXin Li } 148*760c253cSXin Li 149*760c253cSXin Li exe := filepath.Join(testprog.dir, name+".exe") 150*760c253cSXin Li- cmd := exec.Command(testenv.GoToolPath(t), append([]string{"build", "-o", exe}, flags...)...) 151*760c253cSXin Li+ cmd := exec.Command(goCmd(t), append([]string{"build", "-o", exe}, flags...)...) 152*760c253cSXin Li cmd.Dir = "testdata/" + binary 153*760c253cSXin Li out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() 154*760c253cSXin Li if err != nil { 155*760c253cSXin Li target.err = fmt.Errorf("building %s %v: %v\n%s", binary, flags, err, out) 156*760c253cSXin Li testprog.target[name] = target 157*760c253cSXin Li return "", target.err 158*760c253cSXin Li } 159*760c253cSXin Li target.exe = exe 160*760c253cSXin Li@@ -456,17 +475,17 @@ func TestPanicLoop(t *testing.T) { 161*760c253cSXin Li func TestMemPprof(t *testing.T) { 162*760c253cSXin Li testenv.MustHaveGoRun(t) 163*760c253cSXin Li 164*760c253cSXin Li exe, err := buildTestProg(t, "testprog") 165*760c253cSXin Li if err != nil { 166*760c253cSXin Li t.Fatal(err) 167*760c253cSXin Li } 168*760c253cSXin Li 169*760c253cSXin Li- got, err := testenv.CleanCmdEnv(exec.Command(exe, "MemProf")).CombinedOutput() 170*760c253cSXin Li+ got, err := testenv.CleanCmdEnv(goExecCmd(exe, "MemProf")).CombinedOutput() 171*760c253cSXin Li if err != nil { 172*760c253cSXin Li t.Fatal(err) 173*760c253cSXin Li } 174*760c253cSXin Li fn := strings.TrimSpace(string(got)) 175*760c253cSXin Li defer os.Remove(fn) 176*760c253cSXin Li 177*760c253cSXin Li for try := 0; try < 2; try++ { 178*760c253cSXin Li cmd := testenv.CleanCmdEnv(exec.Command(testenv.GoToolPath(t), "tool", "pprof", "-alloc_space", "-top")) 179*760c253cSXin Li--- src/runtime/crash_unix_test.go 180*760c253cSXin Li+++ src/runtime/crash_unix_test.go 181*760c253cSXin Li@@ -244,17 +244,17 @@ func testPanicSystemstackInternal() { 182*760c253cSXin Li } 183*760c253cSXin Li 184*760c253cSXin Li func TestSignalExitStatus(t *testing.T) { 185*760c253cSXin Li testenv.MustHaveGoBuild(t) 186*760c253cSXin Li exe, err := buildTestProg(t, "testprog") 187*760c253cSXin Li if err != nil { 188*760c253cSXin Li t.Fatal(err) 189*760c253cSXin Li } 190*760c253cSXin Li- err = testenv.CleanCmdEnv(exec.Command(exe, "SignalExitStatus")).Run() 191*760c253cSXin Li+ err = testenv.CleanCmdEnv(goExecCmd(exe, "SignalExitStatus")).Run() 192*760c253cSXin Li if err == nil { 193*760c253cSXin Li t.Error("test program succeeded unexpectedly") 194*760c253cSXin Li } else if ee, ok := err.(*exec.ExitError); !ok { 195*760c253cSXin Li t.Errorf("error (%v) has type %T; expected exec.ExitError", err, err) 196*760c253cSXin Li } else if ws, ok := ee.Sys().(syscall.WaitStatus); !ok { 197*760c253cSXin Li t.Errorf("error.Sys (%v) has type %T; expected syscall.WaitStatus", ee.Sys(), ee.Sys()) 198*760c253cSXin Li } else if !ws.Signaled() || ws.Signal() != syscall.SIGTERM { 199*760c253cSXin Li t.Errorf("got %v; expected SIGTERM", ee) 200