github.com/JorgeGCoelho/gospal@v0.0.1/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/nickng/gospal/ssa" 11 "github.com/nickng/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 }