xref: /aosp_15_r20/build/soong/cc/test_data_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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