aboutsummaryrefslogtreecommitdiffstats
path: root/cc/test_data_test.go
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2017-02-01 14:12:44 -0800
committerColin Cross <ccross@android.com>2017-02-02 16:23:30 -0800
commitfaeb7aa1351df6f1d7eae990d0e3d4c68f5c4abf (patch)
treefe410a9a1925ecc8b9492864555cde041d7d9e8d /cc/test_data_test.go
parent294941bee9566e76047a230acea451cbc188210b (diff)
downloadbuild_soong-faeb7aa1351df6f1d7eae990d0e3d4c68f5c4abf.tar.gz
build_soong-faeb7aa1351df6f1d7eae990d0e3d4c68f5c4abf.tar.bz2
build_soong-faeb7aa1351df6f1d7eae990d0e3d4c68f5c4abf.zip
Support data properties for test binaries
Allow tests to specify a data property that lists files or filegroup modules that will be packaged alongside the test. Also add a path property to filegroup modules to allow shifting the path of the packaged files, and add ExpandSourcesSubDir to expand the filegroup sources while including a shifted relative path in the Paths objects. Test: soong tests, manually adding data to a module Change-Id: I52a48942660e12755d313ef13279313361b4fc35
Diffstat (limited to 'cc/test_data_test.go')
-rw-r--r--cc/test_data_test.go204
1 files changed, 204 insertions, 0 deletions
diff --git a/cc/test_data_test.go b/cc/test_data_test.go
new file mode 100644
index 00000000..e3b1214f
--- /dev/null
+++ b/cc/test_data_test.go
@@ -0,0 +1,204 @@
+// 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 (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "android/soong/android"
+ "github.com/google/blueprint"
+)
+
+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)
+
+ for _, test := range testDataTests {
+ t.Run(test.name, func(t *testing.T) {
+ ctx := android.NewContext()
+ ctx.MockFileSystem(map[string][]byte{
+ "Blueprints": []byte(`subdirs = ["dir"]`),
+ "dir/Blueprints": []byte(test.modules),
+ "dir/baz": nil,
+ "dir/bar/baz": nil,
+ })
+ ctx.RegisterModuleType("test", newTest)
+
+ _, errs := ctx.ParseBlueprintsFiles("Blueprints")
+ fail(t, errs)
+ _, errs = ctx.PrepareBuildActions(config)
+ fail(t, errs)
+
+ foo := findModule(ctx, "foo")
+ if foo == nil {
+ t.Fatalf("failed to find module foo")
+ }
+
+ got := foo.(*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() {
+ fmt.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
+ }
+}
+
+func newTest() (blueprint.Module, []interface{}) {
+ m := &testDataTest{}
+ return android.InitAndroidModule(m, &m.Properties)
+}
+
+func (test *testDataTest) DepsMutator(ctx android.BottomUpMutatorContext) {
+ android.ExtractSourcesDeps(ctx, test.Properties.Data)
+}
+
+func (test *testDataTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ test.data = ctx.ExpandSources(test.Properties.Data, nil)
+}
+
+func findModule(ctx *blueprint.Context, name string) blueprint.Module {
+ var ret blueprint.Module
+ ctx.VisitAllModules(func(m blueprint.Module) {
+ if ctx.ModuleName(m) == name {
+ ret = m
+ }
+ })
+ return ret
+}
+
+func fail(t *testing.T, errs []error) {
+ if len(errs) > 0 {
+ for _, err := range errs {
+ t.Error(err)
+ }
+ t.FailNow()
+ }
+}