1// Copyright 2019 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 15package runfiles_test 16 17import ( 18 "regexp" 19 "testing" 20 21 "github.com/bazelbuild/rules_go/go/tools/bazel_testing" 22) 23 24func TestMain(m *testing.M) { 25 bazel_testing.TestMain(m, bazel_testing.Args{ 26 Main: ` 27-- other_repo/WORKSPACE -- 28-- other_repo/pkg/BUILD.bazel -- 29load("@io_bazel_rules_go//go:def.bzl", "go_library") 30 31go_library( 32 name = "external_source_lib", 33 srcs = ["external_source_lib.go"], 34 importpath = "example.com/runfiles/external_source_lib", 35 deps = [ 36 "@io_bazel_rules_go//go/runfiles", 37 ], 38 visibility = ["//visibility:public"], 39) 40 41genrule( 42 name = "gen_source", 43 srcs = ["external_source_lib.go"], 44 outs = ["external_generated_lib.go"], 45 cmd = "cat $(location external_source_lib.go) | sed 's/external_source_lib/external_generated_lib/g' > $@", 46) 47 48go_library( 49 name = "external_generated_lib", 50 srcs = [":gen_source"], 51 importpath = "example.com/runfiles/external_generated_lib", 52 deps = [ 53 "@io_bazel_rules_go//go/runfiles", 54 ], 55 visibility = ["//visibility:public"], 56) 57-- other_repo/pkg/external_source_lib.go -- 58package external_source_lib 59 60import ( 61 "fmt" 62 "runtime" 63 64 "github.com/bazelbuild/rules_go/go/runfiles" 65) 66 67func PrintRepo() { 68 _, file, _, _ := runtime.Caller(0) 69 fmt.Printf("%s: '%s'\n", file, runfiles.CurrentRepository()) 70} 71-- pkg/BUILD.bazel -- 72-- pkg/BUILD.bazel -- 73load("@io_bazel_rules_go//go:def.bzl", "go_library") 74 75go_library( 76 name = "internal_source_lib", 77 srcs = ["internal_source_lib.go"], 78 importpath = "example.com/runfiles/internal_source_lib", 79 deps = [ 80 "@io_bazel_rules_go//go/runfiles", 81 ], 82 visibility = ["//visibility:public"], 83) 84 85genrule( 86 name = "gen_source", 87 srcs = ["internal_source_lib.go"], 88 outs = ["internal_generated_lib.go"], 89 cmd = "cat $(location internal_source_lib.go) | sed 's/internal_source_lib/internal_generated_lib/g' > $@", 90) 91 92go_library( 93 name = "internal_generated_lib", 94 srcs = [":gen_source"], 95 importpath = "example.com/runfiles/internal_generated_lib", 96 deps = [ 97 "@io_bazel_rules_go//go/runfiles", 98 ], 99 visibility = ["//visibility:public"], 100) 101-- pkg/internal_source_lib.go -- 102package internal_source_lib 103 104import ( 105 "fmt" 106 "runtime" 107 108 "github.com/bazelbuild/rules_go/go/runfiles" 109) 110 111func PrintRepo() { 112 _, file, _, _ := runtime.Caller(0) 113 fmt.Printf("%s: '%s'\n", file, runfiles.CurrentRepository()) 114} 115-- BUILD.bazel -- 116load("@io_bazel_rules_go//go:def.bzl", "go_binary") 117 118go_binary( 119 name = "main", 120 srcs = ["main.go"], 121 deps = [ 122 "//pkg:internal_source_lib", 123 "//pkg:internal_generated_lib", 124 "@other_repo//pkg:external_source_lib", 125 "@other_repo//pkg:external_generated_lib", 126 ], 127) 128-- main.go -- 129package main 130 131import ( 132 "example.com/runfiles/internal_generated_lib" 133 "example.com/runfiles/internal_source_lib" 134 "example.com/runfiles/external_generated_lib" 135 "example.com/runfiles/external_source_lib" 136) 137 138func main() { 139 internal_source_lib.PrintRepo() 140 internal_generated_lib.PrintRepo() 141 external_source_lib.PrintRepo() 142 external_generated_lib.PrintRepo() 143} 144`, 145 WorkspaceSuffix: ` 146local_repository( 147 name = "other_repo", 148 path = "other_repo", 149) 150`, 151 }) 152} 153 154var expectedOutputLegacy = regexp.MustCompile(`^pkg/internal_source_lib.go: '' 155bazel-out/[^/]+/bin/pkg/internal_generated_lib.go: '' 156external/other_repo/pkg/external_source_lib.go: 'other_repo' 157bazel-out/[^/]+/bin/external/other_repo/pkg/external_generated_lib.go: 'other_repo' 158$`) 159 160func TestCurrentRepository(t *testing.T) { 161 out, err := bazel_testing.BazelOutput("run", "//:main") 162 if err != nil { 163 t.Fatal(err) 164 } 165 if !expectedOutputLegacy.Match(out) { 166 t.Fatalf("got: %q, want: %q", string(out), expectedOutputLegacy.String()) 167 } 168} 169