| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 1 | // Copyright 2017 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 |  | 
|  | 15 | package cc | 
|  | 16 |  | 
|  | 17 | import ( | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 18 | "io/ioutil" | 
|  | 19 | "os" | 
|  | 20 | "path/filepath" | 
|  | 21 | "testing" | 
|  | 22 |  | 
|  | 23 | "android/soong/android" | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 24 | ) | 
|  | 25 |  | 
|  | 26 | type dataFile struct { | 
|  | 27 | path string | 
|  | 28 | file string | 
|  | 29 | } | 
|  | 30 |  | 
|  | 31 | var testDataTests = []struct { | 
|  | 32 | name    string | 
|  | 33 | modules string | 
|  | 34 | data    []dataFile | 
|  | 35 | }{ | 
|  | 36 | { | 
|  | 37 | name: "data files", | 
|  | 38 | modules: ` | 
|  | 39 | test { | 
|  | 40 | name: "foo", | 
|  | 41 | data: [ | 
|  | 42 | "baz", | 
|  | 43 | "bar/baz", | 
|  | 44 | ], | 
|  | 45 | }`, | 
|  | 46 | data: []dataFile{ | 
|  | 47 | {"dir", "baz"}, | 
|  | 48 | {"dir", "bar/baz"}, | 
|  | 49 | }, | 
|  | 50 | }, | 
|  | 51 | { | 
|  | 52 | name: "filegroup", | 
|  | 53 | modules: ` | 
|  | 54 | filegroup { | 
|  | 55 | name: "fg", | 
|  | 56 | srcs: [ | 
|  | 57 | "baz", | 
|  | 58 | "bar/baz", | 
|  | 59 | ], | 
|  | 60 | } | 
|  | 61 |  | 
|  | 62 | test { | 
|  | 63 | name: "foo", | 
|  | 64 | data: [":fg"], | 
|  | 65 | }`, | 
|  | 66 | data: []dataFile{ | 
|  | 67 | {"dir", "baz"}, | 
|  | 68 | {"dir", "bar/baz"}, | 
|  | 69 | }, | 
|  | 70 | }, | 
|  | 71 | { | 
|  | 72 | name: "relative filegroup", | 
|  | 73 | modules: ` | 
|  | 74 | filegroup { | 
|  | 75 | name: "fg", | 
|  | 76 | srcs: [ | 
|  | 77 | "bar/baz", | 
|  | 78 | ], | 
|  | 79 | path: "bar", | 
|  | 80 | } | 
|  | 81 |  | 
|  | 82 | test { | 
|  | 83 | name: "foo", | 
|  | 84 | data: [":fg"], | 
|  | 85 | }`, | 
|  | 86 | data: []dataFile{ | 
|  | 87 | {"dir/bar", "baz"}, | 
|  | 88 | }, | 
|  | 89 | }, | 
|  | 90 | { | 
|  | 91 | name: "relative filegroup trailing slash", | 
|  | 92 | modules: ` | 
|  | 93 | filegroup { | 
|  | 94 | name: "fg", | 
|  | 95 | srcs: [ | 
|  | 96 | "bar/baz", | 
|  | 97 | ], | 
|  | 98 | path: "bar/", | 
|  | 99 | } | 
|  | 100 |  | 
|  | 101 | test { | 
|  | 102 | name: "foo", | 
|  | 103 | data: [":fg"], | 
|  | 104 | }`, | 
|  | 105 | data: []dataFile{ | 
|  | 106 | {"dir/bar", "baz"}, | 
|  | 107 | }, | 
|  | 108 | }, | 
|  | 109 | } | 
|  | 110 |  | 
|  | 111 | func TestDataTests(t *testing.T) { | 
|  | 112 | buildDir, err := ioutil.TempDir("", "soong_test_test") | 
|  | 113 | if err != nil { | 
|  | 114 | t.Fatal(err) | 
|  | 115 | } | 
|  | 116 | defer os.RemoveAll(buildDir) | 
|  | 117 |  | 
| Colin Cross | 6ccbc91 | 2017-10-10 23:07:38 -0700 | [diff] [blame] | 118 | config := android.TestConfig(buildDir, nil) | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 119 |  | 
|  | 120 | for _, test := range testDataTests { | 
|  | 121 | t.Run(test.name, func(t *testing.T) { | 
| Colin Cross | cec8171 | 2017-07-13 14:43:27 -0700 | [diff] [blame] | 122 | ctx := android.NewTestContext() | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 123 | ctx.MockFileSystem(map[string][]byte{ | 
|  | 124 | "Blueprints":     []byte(`subdirs = ["dir"]`), | 
|  | 125 | "dir/Blueprints": []byte(test.modules), | 
|  | 126 | "dir/baz":        nil, | 
|  | 127 | "dir/bar/baz":    nil, | 
|  | 128 | }) | 
| Colin Cross | 3624285 | 2017-06-23 15:06:31 -0700 | [diff] [blame] | 129 | ctx.RegisterModuleType("filegroup", | 
| Pirama Arumuga Nainar | 955dc49 | 2018-04-17 14:58:42 -0700 | [diff] [blame] | 130 | android.ModuleFactoryAdaptor(android.FileGroupFactory)) | 
| Colin Cross | 3624285 | 2017-06-23 15:06:31 -0700 | [diff] [blame] | 131 | ctx.RegisterModuleType("test", | 
|  | 132 | android.ModuleFactoryAdaptor(newTest)) | 
| Colin Cross | cec8171 | 2017-07-13 14:43:27 -0700 | [diff] [blame] | 133 | ctx.Register() | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 134 |  | 
|  | 135 | _, errs := ctx.ParseBlueprintsFiles("Blueprints") | 
| Logan Chien | 4203971 | 2018-03-12 16:29:17 +0800 | [diff] [blame] | 136 | android.FailIfErrored(t, errs) | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 137 | _, errs = ctx.PrepareBuildActions(config) | 
| Logan Chien | 4203971 | 2018-03-12 16:29:17 +0800 | [diff] [blame] | 138 | android.FailIfErrored(t, errs) | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 139 |  | 
| Colin Cross | cec8171 | 2017-07-13 14:43:27 -0700 | [diff] [blame] | 140 | foo := ctx.ModuleForTests("foo", "") | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 141 |  | 
| Colin Cross | cec8171 | 2017-07-13 14:43:27 -0700 | [diff] [blame] | 142 | got := foo.Module().(*testDataTest).data | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 143 | if len(got) != len(test.data) { | 
|  | 144 | t.Errorf("expected %d data files, got %d", | 
|  | 145 | len(test.data), len(got)) | 
|  | 146 | } | 
|  | 147 |  | 
|  | 148 | for i := range got { | 
|  | 149 | if i >= len(test.data) { | 
|  | 150 | break | 
|  | 151 | } | 
|  | 152 |  | 
|  | 153 | path := filepath.Join(test.data[i].path, test.data[i].file) | 
|  | 154 | if test.data[i].file != got[i].Rel() || | 
|  | 155 | path != got[i].String() { | 
| Dan Willemsen | 59339a2 | 2018-07-22 21:18:45 -0700 | [diff] [blame] | 156 | t.Errorf("expected %s:%s got %s:%s", | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 157 | path, test.data[i].file, | 
|  | 158 | got[i].String(), got[i].Rel()) | 
|  | 159 | } | 
|  | 160 | } | 
|  | 161 | }) | 
|  | 162 | } | 
|  | 163 | } | 
|  | 164 |  | 
|  | 165 | type testDataTest struct { | 
|  | 166 | android.ModuleBase | 
|  | 167 | data       android.Paths | 
|  | 168 | Properties struct { | 
| Colin Cross | 27b922f | 2019-03-04 22:35:41 -0800 | [diff] [blame] | 169 | Data []string `android:"path"` | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 170 | } | 
|  | 171 | } | 
|  | 172 |  | 
| Colin Cross | 3624285 | 2017-06-23 15:06:31 -0700 | [diff] [blame] | 173 | func newTest() android.Module { | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 174 | m := &testDataTest{} | 
| Colin Cross | 3624285 | 2017-06-23 15:06:31 -0700 | [diff] [blame] | 175 | m.AddProperties(&m.Properties) | 
|  | 176 | android.InitAndroidModule(m) | 
|  | 177 | return m | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 178 | } | 
|  | 179 |  | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 180 | func (test *testDataTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { | 
| Colin Cross | 8a49795 | 2019-03-05 22:25:09 -0800 | [diff] [blame] | 181 | test.data = android.PathsForModuleSrc(ctx, test.Properties.Data) | 
| Colin Cross | faeb7aa | 2017-02-01 14:12:44 -0800 | [diff] [blame] | 182 | } |