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  }