2021-03-12 12:04:21 +01:00
|
|
|
// Copyright 2021 Google Inc. All rights reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package bazel
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestUniqueBazelLabels(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
originalLabels []Label
|
|
|
|
expectedUniqueLabels []Label
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
originalLabels: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
expectedUniqueLabels: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range testCases {
|
2021-04-13 09:14:55 +02:00
|
|
|
actualUniqueLabels := UniqueSortedBazelLabels(tc.originalLabels)
|
2021-03-12 12:04:21 +01:00
|
|
|
if !reflect.DeepEqual(tc.expectedUniqueLabels, actualUniqueLabels) {
|
|
|
|
t.Fatalf("Expected %v, got %v", tc.expectedUniqueLabels, actualUniqueLabels)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-06 22:06:21 +02:00
|
|
|
func TestSubtractStrings(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
haystack []string
|
|
|
|
needle []string
|
|
|
|
expectedResult []string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
haystack: []string{
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
"c",
|
|
|
|
},
|
|
|
|
needle: []string{
|
|
|
|
"a",
|
|
|
|
},
|
|
|
|
expectedResult: []string{
|
|
|
|
"b", "c",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
|
|
actualResult := SubtractStrings(tc.haystack, tc.needle)
|
|
|
|
if !reflect.DeepEqual(tc.expectedResult, actualResult) {
|
|
|
|
t.Fatalf("Expected %v, got %v", tc.expectedResult, actualResult)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSubtractBazelLabelList(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
haystack LabelList
|
|
|
|
needle LabelList
|
|
|
|
expectedResult LabelList
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
haystack: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "y"},
|
|
|
|
{Label: "z"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
needle: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "z"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// NOTE: Excludes are intentionally not subtracted
|
|
|
|
expectedResult: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "y"},
|
|
|
|
{Label: "z"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
|
|
actualResult := SubtractBazelLabelList(tc.haystack, tc.needle)
|
|
|
|
if !reflect.DeepEqual(tc.expectedResult, actualResult) {
|
|
|
|
t.Fatalf("Expected %v, got %v", tc.expectedResult, actualResult)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-05-21 14:37:59 +02:00
|
|
|
func TestFirstUniqueBazelLabelList(t *testing.T) {
|
2021-03-12 12:04:21 +01:00
|
|
|
testCases := []struct {
|
|
|
|
originalLabelList LabelList
|
|
|
|
expectedUniqueLabelList LabelList
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
originalLabelList: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "y"},
|
|
|
|
{Label: "z"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedUniqueLabelList: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "y"},
|
|
|
|
{Label: "z"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range testCases {
|
2021-05-21 14:37:59 +02:00
|
|
|
actualUniqueLabelList := FirstUniqueBazelLabelList(tc.originalLabelList)
|
|
|
|
if !reflect.DeepEqual(tc.expectedUniqueLabelList, actualUniqueLabelList) {
|
|
|
|
t.Fatalf("Expected %v, got %v", tc.expectedUniqueLabelList, actualUniqueLabelList)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUniqueSortedBazelLabelList(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
originalLabelList LabelList
|
|
|
|
expectedUniqueLabelList LabelList
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
originalLabelList: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "c"},
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "y"},
|
|
|
|
{Label: "z"},
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "x"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedUniqueLabelList: LabelList{
|
|
|
|
Includes: []Label{
|
|
|
|
{Label: "a"},
|
|
|
|
{Label: "b"},
|
|
|
|
{Label: "c"},
|
|
|
|
},
|
|
|
|
Excludes: []Label{
|
|
|
|
{Label: "x"},
|
|
|
|
{Label: "y"},
|
|
|
|
{Label: "z"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
|
|
actualUniqueLabelList := UniqueSortedBazelLabelList(tc.originalLabelList)
|
2021-03-12 12:04:21 +01:00
|
|
|
if !reflect.DeepEqual(tc.expectedUniqueLabelList, actualUniqueLabelList) {
|
|
|
|
t.Fatalf("Expected %v, got %v", tc.expectedUniqueLabelList, actualUniqueLabelList)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-02 19:02:03 +02:00
|
|
|
|
|
|
|
func makeLabels(labels ...string) []Label {
|
|
|
|
var ret []Label
|
|
|
|
for _, l := range labels {
|
|
|
|
ret = append(ret, Label{Label: l})
|
|
|
|
}
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeLabelList(includes, excludes []string) LabelList {
|
|
|
|
return LabelList{
|
|
|
|
Includes: makeLabels(includes...),
|
|
|
|
Excludes: makeLabels(excludes...),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestResolveExcludes(t *testing.T) {
|
|
|
|
attr := LabelListAttribute{
|
|
|
|
Value: makeLabelList(
|
|
|
|
[]string{
|
|
|
|
"all_include",
|
|
|
|
"arm_exclude",
|
|
|
|
"android_exclude",
|
|
|
|
},
|
|
|
|
[]string{"all_exclude"},
|
|
|
|
),
|
|
|
|
ConfigurableValues: configurableLabelLists{
|
|
|
|
ArchConfigurationAxis: labelListSelectValues{
|
|
|
|
"arm": makeLabelList([]string{}, []string{"arm_exclude"}),
|
|
|
|
"x86": makeLabelList([]string{"x86_include"}, []string{}),
|
|
|
|
},
|
|
|
|
OsConfigurationAxis: labelListSelectValues{
|
|
|
|
"android": makeLabelList([]string{}, []string{"android_exclude"}),
|
|
|
|
"linux": makeLabelList([]string{"linux_include"}, []string{}),
|
|
|
|
},
|
|
|
|
OsArchConfigurationAxis: labelListSelectValues{
|
|
|
|
"linux_x86": makeLabelList([]string{"linux_x86_include"}, []string{}),
|
|
|
|
},
|
|
|
|
ProductVariableConfigurationAxis("a"): labelListSelectValues{
|
|
|
|
"a": makeLabelList([]string{}, []string{"not_in_value"}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
attr.ResolveExcludes()
|
|
|
|
|
|
|
|
expectedBaseIncludes := []Label{Label{Label: "all_include"}}
|
|
|
|
if !reflect.DeepEqual(expectedBaseIncludes, attr.Value.Includes) {
|
|
|
|
t.Errorf("Expected Value includes %q, got %q", attr.Value.Includes, expectedBaseIncludes)
|
|
|
|
}
|
|
|
|
var nilLabels []Label
|
|
|
|
expectedConfiguredIncludes := map[ConfigurationAxis]map[string][]Label{
|
|
|
|
ArchConfigurationAxis: map[string][]Label{
|
|
|
|
"arm": nilLabels,
|
|
|
|
"x86": makeLabels("arm_exclude", "x86_include"),
|
|
|
|
"conditions_default": makeLabels("arm_exclude"),
|
|
|
|
},
|
|
|
|
OsConfigurationAxis: map[string][]Label{
|
|
|
|
"android": nilLabels,
|
|
|
|
"linux": makeLabels("android_exclude", "linux_include"),
|
|
|
|
"conditions_default": makeLabels("android_exclude"),
|
|
|
|
},
|
|
|
|
OsArchConfigurationAxis: map[string][]Label{
|
|
|
|
"linux_x86": makeLabels("linux_x86_include"),
|
|
|
|
"conditions_default": nilLabels,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, axis := range attr.SortedConfigurationAxes() {
|
|
|
|
if _, ok := expectedConfiguredIncludes[axis]; !ok {
|
|
|
|
t.Errorf("Found unexpected axis %s", axis)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
expectedForAxis := expectedConfiguredIncludes[axis]
|
|
|
|
gotForAxis := attr.ConfigurableValues[axis]
|
|
|
|
if len(expectedForAxis) != len(gotForAxis) {
|
|
|
|
t.Errorf("Expected %d configs for %s, got %d: %s", len(expectedForAxis), axis, len(gotForAxis), gotForAxis)
|
|
|
|
}
|
|
|
|
for config, value := range gotForAxis {
|
|
|
|
if expected, ok := expectedForAxis[config]; ok {
|
|
|
|
if !reflect.DeepEqual(expected, value.Includes) {
|
|
|
|
t.Errorf("For %s, expected: %#v, got %#v", axis, expected, value.Includes)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
t.Errorf("Got unexpected config %q for %s", config, axis)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|