1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "io/ioutil" 19*333d2b36SAndroid Build Coastguard Worker "os" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "testing" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workertype dataFile struct { 27*333d2b36SAndroid Build Coastguard Worker path string 28*333d2b36SAndroid Build Coastguard Worker file string 29*333d2b36SAndroid Build Coastguard Worker} 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workervar testDataTests = []struct { 32*333d2b36SAndroid Build Coastguard Worker name string 33*333d2b36SAndroid Build Coastguard Worker modules string 34*333d2b36SAndroid Build Coastguard Worker data []dataFile 35*333d2b36SAndroid Build Coastguard Worker}{ 36*333d2b36SAndroid Build Coastguard Worker { 37*333d2b36SAndroid Build Coastguard Worker name: "data files", 38*333d2b36SAndroid Build Coastguard Worker modules: ` 39*333d2b36SAndroid Build Coastguard Worker test { 40*333d2b36SAndroid Build Coastguard Worker name: "foo", 41*333d2b36SAndroid Build Coastguard Worker data: [ 42*333d2b36SAndroid Build Coastguard Worker "baz", 43*333d2b36SAndroid Build Coastguard Worker "bar/baz", 44*333d2b36SAndroid Build Coastguard Worker ], 45*333d2b36SAndroid Build Coastguard Worker }`, 46*333d2b36SAndroid Build Coastguard Worker data: []dataFile{ 47*333d2b36SAndroid Build Coastguard Worker {"dir", "baz"}, 48*333d2b36SAndroid Build Coastguard Worker {"dir", "bar/baz"}, 49*333d2b36SAndroid Build Coastguard Worker }, 50*333d2b36SAndroid Build Coastguard Worker }, 51*333d2b36SAndroid Build Coastguard Worker { 52*333d2b36SAndroid Build Coastguard Worker name: "filegroup", 53*333d2b36SAndroid Build Coastguard Worker modules: ` 54*333d2b36SAndroid Build Coastguard Worker filegroup { 55*333d2b36SAndroid Build Coastguard Worker name: "fg", 56*333d2b36SAndroid Build Coastguard Worker srcs: [ 57*333d2b36SAndroid Build Coastguard Worker "baz", 58*333d2b36SAndroid Build Coastguard Worker "bar/baz", 59*333d2b36SAndroid Build Coastguard Worker ], 60*333d2b36SAndroid Build Coastguard Worker } 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker test { 63*333d2b36SAndroid Build Coastguard Worker name: "foo", 64*333d2b36SAndroid Build Coastguard Worker data: [":fg"], 65*333d2b36SAndroid Build Coastguard Worker }`, 66*333d2b36SAndroid Build Coastguard Worker data: []dataFile{ 67*333d2b36SAndroid Build Coastguard Worker {"dir", "baz"}, 68*333d2b36SAndroid Build Coastguard Worker {"dir", "bar/baz"}, 69*333d2b36SAndroid Build Coastguard Worker }, 70*333d2b36SAndroid Build Coastguard Worker }, 71*333d2b36SAndroid Build Coastguard Worker { 72*333d2b36SAndroid Build Coastguard Worker name: "relative filegroup", 73*333d2b36SAndroid Build Coastguard Worker modules: ` 74*333d2b36SAndroid Build Coastguard Worker filegroup { 75*333d2b36SAndroid Build Coastguard Worker name: "fg", 76*333d2b36SAndroid Build Coastguard Worker srcs: [ 77*333d2b36SAndroid Build Coastguard Worker "bar/baz", 78*333d2b36SAndroid Build Coastguard Worker ], 79*333d2b36SAndroid Build Coastguard Worker path: "bar", 80*333d2b36SAndroid Build Coastguard Worker } 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker test { 83*333d2b36SAndroid Build Coastguard Worker name: "foo", 84*333d2b36SAndroid Build Coastguard Worker data: [":fg"], 85*333d2b36SAndroid Build Coastguard Worker }`, 86*333d2b36SAndroid Build Coastguard Worker data: []dataFile{ 87*333d2b36SAndroid Build Coastguard Worker {"dir/bar", "baz"}, 88*333d2b36SAndroid Build Coastguard Worker }, 89*333d2b36SAndroid Build Coastguard Worker }, 90*333d2b36SAndroid Build Coastguard Worker { 91*333d2b36SAndroid Build Coastguard Worker name: "relative filegroup trailing slash", 92*333d2b36SAndroid Build Coastguard Worker modules: ` 93*333d2b36SAndroid Build Coastguard Worker filegroup { 94*333d2b36SAndroid Build Coastguard Worker name: "fg", 95*333d2b36SAndroid Build Coastguard Worker srcs: [ 96*333d2b36SAndroid Build Coastguard Worker "bar/baz", 97*333d2b36SAndroid Build Coastguard Worker ], 98*333d2b36SAndroid Build Coastguard Worker path: "bar/", 99*333d2b36SAndroid Build Coastguard Worker } 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker test { 102*333d2b36SAndroid Build Coastguard Worker name: "foo", 103*333d2b36SAndroid Build Coastguard Worker data: [":fg"], 104*333d2b36SAndroid Build Coastguard Worker }`, 105*333d2b36SAndroid Build Coastguard Worker data: []dataFile{ 106*333d2b36SAndroid Build Coastguard Worker {"dir/bar", "baz"}, 107*333d2b36SAndroid Build Coastguard Worker }, 108*333d2b36SAndroid Build Coastguard Worker }, 109*333d2b36SAndroid Build Coastguard Worker} 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Workerfunc TestDataTests(t *testing.T) { 112*333d2b36SAndroid Build Coastguard Worker buildDir, err := ioutil.TempDir("", "soong_test_test") 113*333d2b36SAndroid Build Coastguard Worker if err != nil { 114*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker defer os.RemoveAll(buildDir) 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Worker for _, test := range testDataTests { 119*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 120*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig(buildDir, nil, "", map[string][]byte{ 121*333d2b36SAndroid Build Coastguard Worker "dir/Android.bp": []byte(test.modules), 122*333d2b36SAndroid Build Coastguard Worker "dir/baz": nil, 123*333d2b36SAndroid Build Coastguard Worker "dir/bar/baz": nil, 124*333d2b36SAndroid Build Coastguard Worker }) 125*333d2b36SAndroid Build Coastguard Worker ctx := android.NewTestContext(config) 126*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("filegroup", android.FileGroupFactory) 127*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", newTest) 128*333d2b36SAndroid Build Coastguard Worker ctx.Register() 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker _, errs := ctx.ParseBlueprintsFiles("Android.bp") 131*333d2b36SAndroid Build Coastguard Worker android.FailIfErrored(t, errs) 132*333d2b36SAndroid Build Coastguard Worker _, errs = ctx.PrepareBuildActions(config) 133*333d2b36SAndroid Build Coastguard Worker android.FailIfErrored(t, errs) 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker foo := ctx.ModuleForTests("foo", "") 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker got := foo.Module().(*testDataTest).data 138*333d2b36SAndroid Build Coastguard Worker if len(got) != len(test.data) { 139*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %d data files, got %d", 140*333d2b36SAndroid Build Coastguard Worker len(test.data), len(got)) 141*333d2b36SAndroid Build Coastguard Worker } 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker for i := range got { 144*333d2b36SAndroid Build Coastguard Worker if i >= len(test.data) { 145*333d2b36SAndroid Build Coastguard Worker break 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker path := filepath.Join(test.data[i].path, test.data[i].file) 149*333d2b36SAndroid Build Coastguard Worker if test.data[i].file != got[i].Rel() || 150*333d2b36SAndroid Build Coastguard Worker path != got[i].String() { 151*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %s:%s got %s:%s", 152*333d2b36SAndroid Build Coastguard Worker path, test.data[i].file, 153*333d2b36SAndroid Build Coastguard Worker got[i].String(), got[i].Rel()) 154*333d2b36SAndroid Build Coastguard Worker } 155*333d2b36SAndroid Build Coastguard Worker } 156*333d2b36SAndroid Build Coastguard Worker }) 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker} 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Workertype testDataTest struct { 161*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 162*333d2b36SAndroid Build Coastguard Worker data android.Paths 163*333d2b36SAndroid Build Coastguard Worker Properties struct { 164*333d2b36SAndroid Build Coastguard Worker Data []string `android:"path"` 165*333d2b36SAndroid Build Coastguard Worker } 166*333d2b36SAndroid Build Coastguard Worker} 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Workerfunc newTest() android.Module { 169*333d2b36SAndroid Build Coastguard Worker m := &testDataTest{} 170*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.Properties) 171*333d2b36SAndroid Build Coastguard Worker android.InitAndroidModule(m) 172*333d2b36SAndroid Build Coastguard Worker return m 173*333d2b36SAndroid Build Coastguard Worker} 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Workerfunc (test *testDataTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { 176*333d2b36SAndroid Build Coastguard Worker test.data = android.PathsForModuleSrc(ctx, test.Properties.Data) 177*333d2b36SAndroid Build Coastguard Worker} 178