github.com/jujuyuki/gospal@v1.0.1-0.20210215170718-af79fae13b20/ssa/build/build_test.go (about)

     1  package build_test
     2  
     3  import (
     4  	"bytes"
     5  	"log"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/jujuyuki/gospal/ssa"
    11  	"github.com/jujuyuki/gospal/ssa/build"
    12  	gossa "golang.org/x/tools/go/ssa"
    13  )
    14  
    15  var (
    16  	helloProg = `
    17  	package main
    18  	import "fmt"
    19  	func main() {
    20  		fmt.Println("hello")
    21  	}`
    22  	emptyProg = `package main; func main() {}`
    23  
    24  	testdir string
    25  )
    26  
    27  func init() {
    28  	testdir, _ = os.Getwd() // Save the dir where the test files are, for the runnable examples.
    29  }
    30  
    31  // Test loading from files.
    32  func TestBuildFromFiles(t *testing.T) {
    33  	conf := build.FromFiles("testdata/main.go", "testdata/foo.go", "testdata/bar.go")
    34  	info, err := conf.Build()
    35  	if err != nil {
    36  		t.Errorf("SSA build failed: %v", err)
    37  	}
    38  	mains, err := ssa.MainPkgs(info.Prog, false)
    39  	if err != nil {
    40  		t.Errorf("cannot find main package: %v", err)
    41  	}
    42  	for _, main := range mains {
    43  		if main.Func("main") == nil {
    44  			t.Errorf("cannot find main.main()")
    45  		}
    46  		if main.Func("foo") == nil {
    47  			t.Errorf("cannot find main.foo()")
    48  		}
    49  		if main.Func("bar") == nil {
    50  			t.Errorf("cannot find main.bar()")
    51  		}
    52  	}
    53  }
    54  
    55  // Test loading from string/reader.
    56  func TestBuildFromReader(t *testing.T) {
    57  	conf := build.FromReader(strings.NewReader(helloProg))
    58  	info, err := conf.Build()
    59  	if err != nil {
    60  		t.Errorf("SSA build failed: %v", err)
    61  	}
    62  	mains, err := ssa.MainPkgs(info.Prog, false)
    63  	if err != nil {
    64  		t.Errorf("cannot find main package: %v", err)
    65  	}
    66  	for _, main := range mains {
    67  		if main.Func("main") == nil {
    68  			t.Errorf("cannot find main.main()")
    69  		}
    70  	}
    71  }
    72  
    73  func TestWithBuildLog(t *testing.T) {
    74  	buf := new(bytes.Buffer)
    75  	conf := build.FromReader(strings.NewReader(helloProg)).WithBuildLog(buf, log.LstdFlags)
    76  	info, err := conf.Build()
    77  	if err != nil {
    78  		t.Errorf("SSA build failed: %v", err)
    79  	}
    80  	if info.BldLog != buf {
    81  		t.Errorf("Expects build log to propagate to built SSA, but got: %v",
    82  			info.BldLog)
    83  	}
    84  	if !strings.Contains(buf.String(), "Program loaded and type checked") {
    85  		t.Errorf("Build log was set but not written to\nlog contains:\n%s",
    86  			buf.String())
    87  	}
    88  }
    89  
    90  func TestWithPtaLog(t *testing.T) {
    91  	conf := build.FromReader(strings.NewReader(helloProg)).WithPtaLog(os.Stdout, log.LstdFlags)
    92  	info, err := conf.Build()
    93  	if err != nil {
    94  		t.Errorf("SSA build failed: %v", err)
    95  	}
    96  	if info.PtaLog != os.Stdout {
    97  		t.Errorf("Expects pta log to propagate to built SSA, but got: %v",
    98  			info.PtaLog)
    99  	}
   100  }
   101  
   102  func TestAddBadPkg(t *testing.T) {
   103  	conf := build.FromReader(strings.NewReader(helloProg))
   104  	info, err := conf.Build()
   105  	if err != nil {
   106  		t.Errorf("SSA build failed: %v", err)
   107  	}
   108  	for _, pkg := range info.Prog.AllPackages() {
   109  		if pkg.Pkg.Name() == "fmt" && pkg.Members["Printf"].(*gossa.Function).Blocks == nil {
   110  			t.Errorf("fmt package is built but fmt.Printf funcbody is not in SSA")
   111  		}
   112  	}
   113  
   114  	confNoFmt := build.FromReader(strings.NewReader(helloProg)).AddBadPkg("fmt", "Fmt adds many pkg dependencies")
   115  	infoNoFmt, err := confNoFmt.Build()
   116  	if err != nil {
   117  		t.Errorf("SSA build failed: %v", err)
   118  	}
   119  	foundFmt := false
   120  	for _, pkg := range infoNoFmt.IgnoredPkgs {
   121  		if pkg == "fmt" {
   122  			foundFmt = true
   123  		}
   124  	}
   125  	if !foundFmt {
   126  		t.Errorf("Expects fmt to be ignored during build (in config.badPkgs)")
   127  	}
   128  
   129  	for _, pkg := range infoNoFmt.Prog.AllPackages() {
   130  		if pkg.Pkg.Name() == "fmt" && pkg.Members["Printf"].(*gossa.Function).Blocks != nil {
   131  			t.Errorf("fmt package is not built but fmt.Printf funcbody is in SSA")
   132  		}
   133  	}
   134  }
   135  
   136  func ExampleFromFiles() {
   137  	os.Chdir(testdir)
   138  	conf := build.FromFiles("testdata/main.go", "testdata/foo.go", "testdata/bar.go")
   139  	info, err := conf.Build()
   140  	if err != nil {
   141  		log.Fatalf("SSA build failed: %v", err)
   142  	}
   143  	_ = info // Use info here
   144  	// output:
   145  }
   146  
   147  func ExampleFromReader() {
   148  	conf := build.FromReader(strings.NewReader("package main; func main() {}"))
   149  	info, err := conf.Build()
   150  	if err != nil {
   151  		log.Fatalf("SSA build failed: %v", err)
   152  	}
   153  	_ = info // Use info here
   154  	// output:
   155  }