| // 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) |
| } |