|  | // Copyright 2017 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 cc | 
|  |  | 
|  | import ( | 
|  | "io/ioutil" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "testing" | 
|  |  | 
|  | "android/soong/android" | 
|  | ) | 
|  |  | 
|  | type dataFile struct { | 
|  | path string | 
|  | file string | 
|  | } | 
|  |  | 
|  | var testDataTests = []struct { | 
|  | name    string | 
|  | modules string | 
|  | data    []dataFile | 
|  | }{ | 
|  | { | 
|  | name: "data files", | 
|  | modules: ` | 
|  | test { | 
|  | name: "foo", | 
|  | data: [ | 
|  | "baz", | 
|  | "bar/baz", | 
|  | ], | 
|  | }`, | 
|  | data: []dataFile{ | 
|  | {"dir", "baz"}, | 
|  | {"dir", "bar/baz"}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | name: "filegroup", | 
|  | modules: ` | 
|  | filegroup { | 
|  | name: "fg", | 
|  | srcs: [ | 
|  | "baz", | 
|  | "bar/baz", | 
|  | ], | 
|  | } | 
|  |  | 
|  | test { | 
|  | name: "foo", | 
|  | data: [":fg"], | 
|  | }`, | 
|  | data: []dataFile{ | 
|  | {"dir", "baz"}, | 
|  | {"dir", "bar/baz"}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | name: "relative filegroup", | 
|  | modules: ` | 
|  | filegroup { | 
|  | name: "fg", | 
|  | srcs: [ | 
|  | "bar/baz", | 
|  | ], | 
|  | path: "bar", | 
|  | } | 
|  |  | 
|  | test { | 
|  | name: "foo", | 
|  | data: [":fg"], | 
|  | }`, | 
|  | data: []dataFile{ | 
|  | {"dir/bar", "baz"}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | name: "relative filegroup trailing slash", | 
|  | modules: ` | 
|  | filegroup { | 
|  | name: "fg", | 
|  | srcs: [ | 
|  | "bar/baz", | 
|  | ], | 
|  | path: "bar/", | 
|  | } | 
|  |  | 
|  | test { | 
|  | name: "foo", | 
|  | data: [":fg"], | 
|  | }`, | 
|  | data: []dataFile{ | 
|  | {"dir/bar", "baz"}, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | func TestDataTests(t *testing.T) { | 
|  | buildDir, err := ioutil.TempDir("", "soong_test_test") | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | defer os.RemoveAll(buildDir) | 
|  |  | 
|  | config := android.TestConfig(buildDir, nil) | 
|  |  | 
|  | for _, test := range testDataTests { | 
|  | t.Run(test.name, func(t *testing.T) { | 
|  | ctx := android.NewTestContext() | 
|  | ctx.MockFileSystem(map[string][]byte{ | 
|  | "Blueprints":     []byte(`subdirs = ["dir"]`), | 
|  | "dir/Blueprints": []byte(test.modules), | 
|  | "dir/baz":        nil, | 
|  | "dir/bar/baz":    nil, | 
|  | }) | 
|  | ctx.RegisterModuleType("filegroup", | 
|  | android.ModuleFactoryAdaptor(android.FileGroupFactory)) | 
|  | ctx.RegisterModuleType("test", | 
|  | android.ModuleFactoryAdaptor(newTest)) | 
|  | ctx.Register() | 
|  |  | 
|  | _, errs := ctx.ParseBlueprintsFiles("Blueprints") | 
|  | android.FailIfErrored(t, errs) | 
|  | _, errs = ctx.PrepareBuildActions(config) | 
|  | android.FailIfErrored(t, errs) | 
|  |  | 
|  | foo := ctx.ModuleForTests("foo", "") | 
|  |  | 
|  | got := foo.Module().(*testDataTest).data | 
|  | if len(got) != len(test.data) { | 
|  | t.Errorf("expected %d data files, got %d", | 
|  | len(test.data), len(got)) | 
|  | } | 
|  |  | 
|  | for i := range got { | 
|  | if i >= len(test.data) { | 
|  | break | 
|  | } | 
|  |  | 
|  | path := filepath.Join(test.data[i].path, test.data[i].file) | 
|  | if test.data[i].file != got[i].Rel() || | 
|  | path != got[i].String() { | 
|  | t.Errorf("expected %s:%s got %s:%s", | 
|  | path, test.data[i].file, | 
|  | got[i].String(), got[i].Rel()) | 
|  | } | 
|  | } | 
|  | }) | 
|  | } | 
|  | } | 
|  |  | 
|  | type testDataTest struct { | 
|  | android.ModuleBase | 
|  | data       android.Paths | 
|  | Properties struct { | 
|  | Data []string `android:"path"` | 
|  | } | 
|  | } | 
|  |  | 
|  | func newTest() android.Module { | 
|  | m := &testDataTest{} | 
|  | m.AddProperties(&m.Properties) | 
|  | android.InitAndroidModule(m) | 
|  | return m | 
|  | } | 
|  |  | 
|  | func (test *testDataTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { | 
|  | test.data = android.PathsForModuleSrc(ctx, test.Properties.Data) | 
|  | } |