github.com/sc0rp1us/gb@v0.4.1-0.20160319180011-4ba8cf1baa5a/test/test_test.go (about) 1 package test 2 3 import ( 4 "os" 5 "path/filepath" 6 "reflect" 7 "runtime" 8 "sort" 9 "strings" 10 "testing" 11 "time" 12 13 "github.com/constabulary/gb" 14 ) 15 16 func TestTest(t *testing.T) { 17 tests := []struct { 18 pkg string 19 testArgs []string 20 ldflags []string 21 err error 22 minversion float64 // minimum go version that supports this feature 23 maxversion float64 // maximum go version that supports this feature 24 }{ 25 { 26 pkg: "a", 27 err: nil, 28 }, { 29 pkg: "b", 30 err: nil, 31 }, { 32 pkg: "c", 33 err: nil, 34 }, { 35 pkg: "e", 36 err: nil, 37 }, { 38 pkg: "cmd/f", 39 err: nil, 40 }, { 41 pkg: "extest", // test external tests 42 err: nil, 43 }, { 44 pkg: "external_only_test", // issue 312 45 err: nil, 46 }, { 47 pkg: "notestfiles", 48 err: nil, 49 }, { 50 pkg: "cgoonlynotest", 51 err: nil, 52 }, { 53 pkg: "testonly", 54 err: nil, 55 }, { 56 pkg: "extestonly", 57 err: nil, 58 }, { 59 pkg: "g", // test that _test files can modify the internal package under test 60 err: nil, 61 }, { 62 pkg: "ldflags", 63 ldflags: []string{"-X", "ldflags.gitTagInfo=banana", "-X", "ldflags.gitRevision=f7926af2"}, 64 minversion: 1.5, 65 }, { 66 pkg: "ldflags", 67 ldflags: []string{"-X", "ldflags.gitTagInfo", "banana", "-X", "ldflags.gitRevision", "f7926af2"}, 68 maxversion: 1.5, 69 }, { 70 pkg: "cgotest", 71 }, { 72 pkg: "testflags", 73 testArgs: []string{"-debug"}, 74 }, { 75 pkg: "main", // issue 375, a package called main 76 }} 77 78 for _, tt := range tests { 79 if tt.minversion != 0 && goversion < tt.minversion { 80 t.Logf("skipping test, goversion %f is below mingoversion %f", goversion, tt.minversion) 81 continue 82 } 83 if tt.maxversion != 0 && goversion > tt.maxversion { 84 t.Logf("skipping test, goversion %f is above maxgoversion %f", goversion, tt.maxversion) 85 continue 86 } 87 ctx := testContext(t, gb.Ldflags(tt.ldflags...)) 88 defer ctx.Destroy() 89 r := TestResolver(ctx) 90 pkg, err := r.ResolvePackage(tt.pkg) 91 if err != nil { 92 t.Errorf("ResolvePackage(%v): want %v, got %v", tt.pkg, tt.err, err) 93 continue 94 } 95 if err := Test(tt.testArgs, pkg); err != tt.err { 96 t.Errorf("Test(%v): want %v, got %v", tt.pkg, tt.err, err) 97 time.Sleep(500 * time.Millisecond) 98 } 99 } 100 } 101 102 func TestTestPackage(t *testing.T) { 103 tests := []struct { 104 pkg string 105 err error 106 }{{ 107 pkg: "a", 108 err: nil, 109 }, { 110 pkg: "b", // actually command 111 err: nil, 112 }, { 113 pkg: "c", 114 err: nil, 115 }, { 116 pkg: "d.v1", 117 err: nil, 118 }, { 119 pkg: "cgomain", 120 err: nil, 121 }, { 122 pkg: "cgotest", 123 err: nil, 124 }, { 125 pkg: "notestfiles", 126 err: nil, 127 }, { 128 pkg: "cgoonlynotest", 129 err: nil, 130 }, { 131 pkg: "testonly", 132 err: nil, 133 }, { 134 pkg: "extestonly", 135 err: nil, 136 }} 137 138 for _, tt := range tests { 139 ctx := testContext(t) 140 defer ctx.Destroy() 141 r := TestResolver(ctx) 142 pkg, err := r.ResolvePackage(tt.pkg) 143 if err != nil { 144 t.Errorf("r.ResolvePackage(%v): %v", tt.pkg, err) 145 continue 146 } 147 targets := make(map[string]*gb.Action) 148 if _, err := TestPackage(targets, pkg, nil); !reflect.DeepEqual(err, tt.err) { 149 t.Errorf("TestPackage(%v): want %v, got %v", tt.pkg, tt.err, err) 150 } 151 } 152 } 153 154 func TestTestPackages(t *testing.T) { 155 tests := []struct { 156 pkgs []string 157 actions []string 158 err error 159 }{{ 160 pkgs: []string{"a", "b", "c"}, 161 actions: []string{ 162 "run: $WORKDIR/a/testmain/_test/a.test$EXE", 163 "run: $WORKDIR/b/testmain/_test/b.test$EXE", 164 "run: $WORKDIR/c/testmain/_test/c.test$EXE", 165 }, 166 }, { 167 pkgs: []string{"cgotest", "cgomain", "notestfiles", "cgoonlynotest", "testonly", "extestonly"}, 168 actions: []string{ 169 "run: $WORKDIR/cgomain/testmain/_test/cgomain.test$EXE", 170 "run: $WORKDIR/cgoonlynotest/testmain/_test/cgoonly.test$EXE", 171 "run: $WORKDIR/cgotest/testmain/_test/cgotest.test$EXE", 172 "run: $WORKDIR/extestonly/testmain/_test/extestonly.test$EXE", 173 "run: $WORKDIR/notestfiles/testmain/_test/notest.test$EXE", 174 "run: $WORKDIR/testonly/testmain/_test/testonly.test$EXE", 175 }, 176 }} 177 178 for i, tt := range tests { 179 ctx := testContext(t) 180 defer ctx.Destroy() 181 var pkgs []*gb.Package 182 t.Logf("testing: %v: pkgs: %v", i+1, tt.pkgs) 183 r := TestResolver(ctx) 184 for _, pkg := range tt.pkgs { 185 pkg, err := r.ResolvePackage(pkg) 186 if err != nil { 187 t.Errorf("r.ResolvePackage(%v): %v", pkg, err) 188 continue 189 } 190 pkgs = append(pkgs, pkg) 191 } 192 a, err := TestPackages(nil, pkgs...) 193 if !reflect.DeepEqual(err, tt.err) { 194 t.Errorf("TestPackages(%v): want %v, got %v", pkgs, tt.err, err) 195 } 196 var actual []string 197 for _, a := range a.Deps { 198 actual = append(actual, a.Name) 199 } 200 sort.Strings(actual) 201 var expected []string 202 exe := "" 203 if runtime.GOOS == "windows" { 204 exe = ".exe" 205 } 206 for _, s := range tt.actions { 207 s = filepath.FromSlash(s) 208 s = strings.Replace(s, "$WORKDIR", ctx.Workdir(), -1) 209 s = strings.Replace(s, "$EXE", exe, -1) 210 expected = append(expected, s) 211 } 212 if !reflect.DeepEqual(expected, actual) { 213 t.Errorf("TestBuildPackages(%v): want %v, got %v", pkgs, expected, actual) 214 } 215 } 216 } 217 218 func getwd(t *testing.T) string { 219 cwd, err := os.Getwd() 220 if err != nil { 221 t.Fatal(err) 222 } 223 return cwd 224 } 225 226 func testProject(t *testing.T) *gb.Project { 227 cwd := getwd(t) 228 root := filepath.Join(cwd, "..", "testdata") 229 return gb.NewProject(root, 230 gb.SourceDir(filepath.Join(root, "src")), 231 ) 232 } 233 234 func testContext(t *testing.T, opts ...func(*gb.Context) error) *gb.Context { 235 prj := testProject(t) 236 opts = append([]func(*gb.Context) error{gb.GcToolchain()}, opts...) 237 ctx, err := prj.NewContext(opts...) 238 if err != nil { 239 t.Fatal(err) 240 } 241 ctx.Force = true 242 return ctx 243 }