github.com/ajguerrer/rules_go@v0.20.3/go/tools/builders/filter_test.go (about) 1 /* Copyright 2016 The Bazel Authors. All rights reserved. 2 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 */ 15 16 package main 17 18 import ( 19 "go/build" 20 "io/ioutil" 21 "os" 22 "path/filepath" 23 "reflect" 24 "sort" 25 "testing" 26 ) 27 28 var testfiles = map[string]string{ 29 "cgo.go": ` 30 //+build cgo 31 32 package tags 33 34 /* 35 #include <stdio.h> 36 #include <stdlib.h> 37 38 void myprint(char* s) { 39 printf("%s", s); 40 } 41 */ 42 43 import "C" 44 45 func main() { 46 C.myprint("hello") 47 } 48 `, 49 "extra.go": ` 50 //+build a,b b,c 51 52 package tags 53 `, 54 "ignore.go": ` 55 //+build ignore 56 57 package tags 58 `, 59 "normal.go": ` 60 package tags 61 `, 62 "on_darwin.go": ` 63 package tags 64 `, 65 "system.go": ` 66 //+build arm,darwin linux,amd64 67 68 package tags 69 `, 70 } 71 72 func TestTags(t *testing.T) { 73 tempdir, err := ioutil.TempDir("", "goruletest") 74 if err != nil { 75 t.Fatalf("Error creating temporary directory: %v", err) 76 } 77 defer os.RemoveAll(tempdir) 78 79 input := []string{} 80 for k, v := range testfiles { 81 p := filepath.Join(tempdir, k) 82 if err := ioutil.WriteFile(p, []byte(v), 0644); err != nil { 83 t.Fatalf("WriteFile(%s): %v", p, err) 84 } 85 input = append(input, k) 86 } 87 sort.Strings(input) 88 89 wd, err := os.Getwd() 90 if err != nil { 91 t.Fatalf("Getwd: %v", err) 92 } 93 94 err = os.Chdir(tempdir) 95 if err != nil { 96 t.Fatalf("Chdir(%s): %v", tempdir, err) 97 } 98 defer os.Chdir(wd) 99 100 bctx := build.Default 101 // Always fake the os and arch 102 bctx.GOOS = "darwin" 103 bctx.GOARCH = "amd64" 104 bctx.CgoEnabled = false 105 runTest(t, bctx, input, []string{"normal.go", "on_darwin.go"}) 106 bctx.GOOS = "linux" 107 runTest(t, bctx, input, []string{"normal.go", "system.go"}) 108 bctx.GOARCH = "arm" 109 runTest(t, bctx, input, []string{"normal.go"}) 110 bctx.BuildTags = []string{"a", "b"} 111 runTest(t, bctx, input, []string{"extra.go", "normal.go"}) 112 bctx.BuildTags = []string{"a", "c"} 113 runTest(t, bctx, input, []string{"normal.go"}) 114 bctx.CgoEnabled = true 115 runTest(t, bctx, input, []string{"cgo.go", "normal.go"}) 116 } 117 118 func runTest(t *testing.T, bctx build.Context, inputs []string, expect []string) { 119 build.Default = bctx 120 got, err := filterAndSplitFiles(inputs) 121 if err != nil { 122 t.Errorf("filter %v,%v,%v,%v failed: %v", bctx.GOOS, bctx.GOARCH, bctx.CgoEnabled, bctx.BuildTags, err) 123 } 124 gotGoFilenames := make([]string, len(got.goSrcs)) 125 for i, src := range got.goSrcs { 126 gotGoFilenames[i] = src.filename 127 } 128 if !reflect.DeepEqual(expect, gotGoFilenames) { 129 t.Errorf("filter %v,%v,%v,%v: expect %v got %v", bctx.GOOS, bctx.GOARCH, bctx.CgoEnabled, bctx.BuildTags, expect, got) 130 } 131 } 132 133 // abs is a dummy env.go abs to avoid depending on env.go and flags.go. 134 func abs(p string) string { 135 return p 136 }