modernc.org/ccgo/v3@v3.16.14/lib/windows_test.go (about) 1 // Copyright 2021 The CCGO Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build windows 6 // +build windows 7 8 package ccgo // import "modernc.org/ccgo/v3/lib" 9 10 import ( 11 "bytes" 12 "context" 13 "fmt" 14 "io/ioutil" 15 "os" 16 "os/exec" 17 "path/filepath" 18 "strings" 19 "testing" 20 ) 21 22 func testSingle(t *testing.T, main, path string, ccgoArgs []string, runargs []string) (r bool) { 23 defer func() { 24 if err := recover(); err != nil { 25 if *oStackTrace { 26 fmt.Printf("%s\n", stack()) 27 } 28 if *oTrace { 29 fmt.Println(err) 30 } 31 t.Errorf("%s: %v", path, err) 32 r = false 33 } 34 }() 35 36 ccgoArgs = append(ccgoArgs, "-D__ccgo_test__") 37 ccgoArgs = append(ccgoArgs, path) 38 if err := NewTask(ccgoArgs, nil, nil).Main(); err != nil { 39 if *oTrace { 40 fmt.Println(err) 41 } 42 err = cpp(*oCpp, ccgoArgs, err) 43 t.Errorf("%s: %v", path, err) 44 return false 45 } 46 47 out, err := func() ([]byte, error) { 48 ctx, cancel := context.WithTimeout(context.Background(), execTimeout) 49 defer cancel() 50 51 return exec.CommandContext(ctx, "go", append([]string{"run", main}, runargs...)...).CombinedOutput() 52 }() 53 if err != nil { 54 if *oTrace { 55 fmt.Println(err) 56 } 57 b, _ := ioutil.ReadFile(main) 58 t.Errorf("\n%s\n%v: %s\n%v", b, path, out, err) 59 return false 60 } 61 62 if *oTraceF { 63 b, _ := ioutil.ReadFile(main) 64 fmt.Printf("\n----\n%s\n----\n", b) 65 } 66 if *oTraceO { 67 fmt.Printf("%s\n", out) 68 } 69 exp, err := ioutil.ReadFile(noExt(path) + ".expect") 70 if err != nil { 71 if os.IsNotExist(err) { 72 return true 73 } 74 75 return false 76 } 77 78 out = trim(out) 79 exp = trim(exp) 80 switch base := filepath.Base(path); base { 81 case "70_floating_point_literals.c": //TODO TCC binary extension 82 a := strings.Split(string(exp), "\n") 83 exp = []byte(strings.Join(a[:35], "\n")) 84 } 85 86 if !bytes.Equal(out, exp) { 87 if *oTrace { 88 fmt.Println(err) 89 } 90 t.Errorf("%v: out\n%s\nexp\n%s", path, out, exp) 91 return false 92 } 93 94 return true 95 } 96 97 func testSingleCombinedoutput(ctx context.Context, cmd *exec.Cmd) ([]byte, error) { 98 var b bytes.Buffer 99 cmd.Stdout = &b 100 cmd.Stderr = &b 101 102 err := testSingleRun(ctx, cmd) 103 return b.Bytes(), err 104 } 105 106 func testSingleRun(ctx context.Context, cmd *exec.Cmd) error { 107 err := cmd.Start() 108 if err == nil { 109 waitDone := make(chan struct{}) 110 go func() { 111 select { 112 case <-ctx.Done(): 113 cmd.Process.Kill() 114 case <-waitDone: 115 } 116 }() 117 err = cmd.Wait() 118 close(waitDone) 119 } 120 return err 121 }