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  }