...

Source file src/github.com/bazelbuild/bazel-gazelle/resolve/resolve_test.go

Documentation: github.com/bazelbuild/bazel-gazelle/resolve

     1  package resolve
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/bazelbuild/bazel-gazelle/rule"
     7  	"github.com/bazelbuild/bazel-gazelle/config"
     8  	"github.com/bazelbuild/bazel-gazelle/label"
     9  	"github.com/google/go-cmp/cmp"
    10  )
    11  
    12  func TestFindRuleWithOverride_ParentTraversal(t *testing.T) {
    13  	rootCfg := getConfig(t, "", []rule.Directive{
    14  		{Key: "resolve", Value: "go go github.com/root/repo @com_example//root:replacement"},
    15  		{Key: "resolve_regexp", Value: "go ^github.com/root/(.*)$ @com_example//regexp:replacement"},
    16  	}, nil)
    17  
    18  	childCfg := getConfig(t, "child/rel", []rule.Directive{
    19  		{Key: "resolve", Value: "go github.com/child/repo //some/local/child:replacement"},
    20  		{Key: "resolve_regexp", Value: "go ^github.com/child/(.*)$ relative/child/regexp"},
    21  	}, rootCfg)
    22  
    23  	secondChildCfg := getConfig(t, "second/child/rel", nil, rootCfg)
    24  
    25  	tests := []struct {
    26  		name      string
    27  		cfg       *config.Config
    28  		importSpec ImportSpec
    29  		lang      string
    30  		want      label.Label
    31  		wantFound bool
    32  	}{
    33  		{
    34  			name:      "Child exact match",
    35  			cfg:       childCfg,
    36  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/child/repo"},
    37  			lang:      "go",
    38  			want:      getTestLabel(t, "//some/local/child:replacement"),
    39  			wantFound: true,
    40  		},
    41  		{
    42  			name:      "Child regexp match",
    43  			cfg:       childCfg,
    44  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/child/other"},
    45  			lang:      "go",
    46  			want:      getTestLabel(t, "//child/rel:relative/child/regexp"),
    47  			wantFound: true,
    48  		},
    49  		{
    50  			name:      "Root exact match from child",
    51  			cfg:       childCfg,
    52  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/root/repo"},
    53  			lang:      "go",
    54  			want:      getTestLabel(t, "@com_example//root:replacement"),
    55  			wantFound: true,
    56  		},
    57  		{
    58  			name:      "Root regexp match from child",
    59  			cfg:       childCfg,
    60  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/root/some"},
    61  			lang:      "go",
    62  			want:      getTestLabel(t, "@com_example//regexp:replacement"),
    63  			wantFound: true,
    64  		},
    65  		{
    66  			name:      "No match in child or root",
    67  			cfg:       childCfg,
    68  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/nonexistent/repo"},
    69  			lang:      "go",
    70  			want:      label.NoLabel,
    71  			wantFound: false,
    72  		},
    73  		{
    74  			name:      "Second child does not find child directive",
    75  			cfg:       secondChildCfg,
    76  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/child/repo"},
    77  			lang:      "go",
    78  			want:      label.NoLabel,
    79  			wantFound: false,
    80  		},
    81  		{
    82  			name:      "Second child finds root directive",
    83  			cfg:       secondChildCfg,
    84  			importSpec: ImportSpec{Lang: "go", Imp: "github.com/root/repo"},
    85  			lang:      "go",
    86  			want:      getTestLabel(t, "@com_example//root:replacement"),
    87  			wantFound: true,
    88  		},
    89  	}
    90  
    91  	for _, tt := range tests {
    92  		t.Run(tt.name, func(t *testing.T) {
    93  			got, found := FindRuleWithOverride(tt.cfg, tt.importSpec, tt.lang)
    94  			if found != tt.wantFound {
    95  				t.Fatalf("FindRuleWithOverride() found = %v, wantFound %v", found, tt.wantFound)
    96  			}
    97  			if diff := cmp.Diff(tt.want, got); diff != "" {
    98  				t.Errorf("FindRuleWithOverride() mismatch (-want +got):\n%s", diff)
    99  			}
   100  		})
   101  	}
   102  }
   103  
   104  func getConfig(t *testing.T, path string, directives []rule.Directive, parent *config.Config) *config.Config {
   105  	cfg := &config.Config{
   106  		Exts: map[string]interface{}{},
   107  	}
   108  	configurer := &Configurer{}
   109  	configurer.RegisterFlags(nil, "", cfg)
   110  	configurer.CheckFlags(nil, cfg)
   111  
   112  	if parent != nil {
   113  		cfg.Exts[resolveName] = parent.Exts[resolveName]
   114  	}
   115  
   116  	configurer.Configure(cfg, path, &rule.File{Directives: directives})
   117  	return cfg
   118  }
   119  
   120  func getTestLabel(t *testing.T, str string) label.Label {
   121  	l, err := label.Parse(str)
   122  	if err != nil {
   123  		t.Fatal(err)
   124  	}
   125  	return l
   126  }
   127  

View as plain text