1// Copyright 2020 Google Inc. 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 android 16 17import ( 18 "reflect" 19 "testing" 20) 21 22func Test_mergeApexVariations(t *testing.T) { 23 const ( 24 ForPrebuiltApex = true 25 NotForPrebuiltApex = false 26 ) 27 tests := []struct { 28 name string 29 in []ApexInfo 30 wantMerged []ApexInfo 31 wantAliases [][2]string 32 }{ 33 { 34 name: "single", 35 in: []ApexInfo{ 36 {"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 37 }, 38 wantMerged: []ApexInfo{ 39 {"apex10000", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 40 }, 41 wantAliases: [][2]string{ 42 {"foo", "apex10000"}, 43 }, 44 }, 45 { 46 name: "merge", 47 in: []ApexInfo{ 48 {"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 49 {"bar", FutureApiLevel, false, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 50 }, 51 wantMerged: []ApexInfo{ 52 {"apex10000", FutureApiLevel, false, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, false}}, 53 wantAliases: [][2]string{ 54 {"bar", "apex10000"}, 55 {"foo", "apex10000"}, 56 }, 57 }, 58 { 59 name: "don't merge version", 60 in: []ApexInfo{ 61 {"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 62 {"bar", uncheckedFinalApiLevel(30), false, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 63 }, 64 wantMerged: []ApexInfo{ 65 {"apex30", uncheckedFinalApiLevel(30), false, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 66 {"apex10000", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 67 }, 68 wantAliases: [][2]string{ 69 {"bar", "apex30"}, 70 {"foo", "apex10000"}, 71 }, 72 }, 73 { 74 name: "merge updatable", 75 in: []ApexInfo{ 76 {"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 77 {"bar", FutureApiLevel, true, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 78 }, 79 wantMerged: []ApexInfo{ 80 {"apex10000", FutureApiLevel, true, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, 81 }, 82 wantAliases: [][2]string{ 83 {"bar", "apex10000"}, 84 {"foo", "apex10000"}, 85 }, 86 }, 87 { 88 name: "don't merge when for prebuilt_apex", 89 in: []ApexInfo{ 90 {"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 91 {"bar", FutureApiLevel, true, false, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 92 // This one should not be merged in with the others because it is for 93 // a prebuilt_apex. 94 {"baz", FutureApiLevel, true, false, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex}, 95 }, 96 wantMerged: []ApexInfo{ 97 {"apex10000", FutureApiLevel, true, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, 98 {"baz", FutureApiLevel, true, false, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex}, 99 }, 100 wantAliases: [][2]string{ 101 {"bar", "apex10000"}, 102 {"foo", "apex10000"}, 103 }, 104 }, 105 { 106 name: "merge different UsePlatformApis but don't allow using platform api", 107 in: []ApexInfo{ 108 {"foo", FutureApiLevel, false, false, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 109 {"bar", FutureApiLevel, false, true, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 110 }, 111 wantMerged: []ApexInfo{ 112 {"apex10000", FutureApiLevel, false, false, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, 113 }, 114 wantAliases: [][2]string{ 115 {"bar", "apex10000"}, 116 {"foo", "apex10000"}, 117 }, 118 }, 119 { 120 name: "merge same UsePlatformApis and allow using platform api", 121 in: []ApexInfo{ 122 {"foo", FutureApiLevel, false, true, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, 123 {"bar", FutureApiLevel, false, true, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, 124 }, 125 wantMerged: []ApexInfo{ 126 {"apex10000", FutureApiLevel, false, true, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, 127 }, 128 wantAliases: [][2]string{ 129 {"bar", "apex10000"}, 130 {"foo", "apex10000"}, 131 }, 132 }, 133 } 134 135 for _, tt := range tests { 136 t.Run(tt.name, func(t *testing.T) { 137 config := TestConfig(t.TempDir(), nil, "", nil) 138 ctx := &configErrorWrapper{config: config} 139 gotMerged, gotAliases := mergeApexVariations(ctx, tt.in) 140 if !reflect.DeepEqual(gotMerged, tt.wantMerged) { 141 t.Errorf("mergeApexVariations() gotMerged = %v, want %v", gotMerged, tt.wantMerged) 142 } 143 if !reflect.DeepEqual(gotAliases, tt.wantAliases) { 144 t.Errorf("mergeApexVariations() gotAliases = %v, want %v", gotAliases, tt.wantAliases) 145 } 146 }) 147 } 148} 149