xref: /aosp_15_r20/build/soong/android/androidmk_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 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 android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"io"
20*333d2b36SAndroid Build Coastguard Worker	"reflect"
21*333d2b36SAndroid Build Coastguard Worker	"runtime"
22*333d2b36SAndroid Build Coastguard Worker	"strings"
23*333d2b36SAndroid Build Coastguard Worker	"testing"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workertype customModule struct {
29*333d2b36SAndroid Build Coastguard Worker	ModuleBase
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	properties struct {
32*333d2b36SAndroid Build Coastguard Worker		Default_dist_files *string
33*333d2b36SAndroid Build Coastguard Worker		Dist_output_file   *bool
34*333d2b36SAndroid Build Coastguard Worker	}
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Worker	data       AndroidMkData
37*333d2b36SAndroid Build Coastguard Worker	distFiles  TaggedDistFiles
38*333d2b36SAndroid Build Coastguard Worker	outputFile OptionalPath
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workerconst (
42*333d2b36SAndroid Build Coastguard Worker	defaultDistFiles_None    = "none"
43*333d2b36SAndroid Build Coastguard Worker	defaultDistFiles_Default = "default"
44*333d2b36SAndroid Build Coastguard Worker	defaultDistFiles_Tagged  = "tagged"
45*333d2b36SAndroid Build Coastguard Worker)
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Workerfunc (m *customModule) GenerateAndroidBuildActions(ctx ModuleContext) {
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Worker	var defaultDistPaths Paths
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker	// If the dist_output_file: true then create an output file that is stored in
52*333d2b36SAndroid Build Coastguard Worker	// the OutputFile property of the AndroidMkEntry.
53*333d2b36SAndroid Build Coastguard Worker	if proptools.BoolDefault(m.properties.Dist_output_file, true) {
54*333d2b36SAndroid Build Coastguard Worker		path := PathForTesting("dist-output-file.out")
55*333d2b36SAndroid Build Coastguard Worker		m.outputFile = OptionalPathForPath(path)
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker		// Previous code would prioritize the DistFiles property over the OutputFile
58*333d2b36SAndroid Build Coastguard Worker		// property in AndroidMkEntry when determining the default dist paths.
59*333d2b36SAndroid Build Coastguard Worker		// Setting this first allows it to be overridden based on the
60*333d2b36SAndroid Build Coastguard Worker		// default_dist_files setting replicating that previous behavior.
61*333d2b36SAndroid Build Coastguard Worker		defaultDistPaths = Paths{path}
62*333d2b36SAndroid Build Coastguard Worker	}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	// Based on the setting of the default_dist_files property possibly create a
65*333d2b36SAndroid Build Coastguard Worker	// TaggedDistFiles structure that will be stored in the DistFiles property of
66*333d2b36SAndroid Build Coastguard Worker	// the AndroidMkEntry.
67*333d2b36SAndroid Build Coastguard Worker	defaultDistFiles := proptools.StringDefault(m.properties.Default_dist_files, defaultDistFiles_Tagged)
68*333d2b36SAndroid Build Coastguard Worker	switch defaultDistFiles {
69*333d2b36SAndroid Build Coastguard Worker	case defaultDistFiles_None:
70*333d2b36SAndroid Build Coastguard Worker		m.setOutputFiles(ctx, defaultDistPaths)
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker	case defaultDistFiles_Default:
73*333d2b36SAndroid Build Coastguard Worker		path := PathForTesting("default-dist.out")
74*333d2b36SAndroid Build Coastguard Worker		defaultDistPaths = Paths{path}
75*333d2b36SAndroid Build Coastguard Worker		m.setOutputFiles(ctx, defaultDistPaths)
76*333d2b36SAndroid Build Coastguard Worker		m.distFiles = MakeDefaultDistFiles(path)
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	case defaultDistFiles_Tagged:
79*333d2b36SAndroid Build Coastguard Worker		// Module types that set AndroidMkEntry.DistFiles to the result of calling
80*333d2b36SAndroid Build Coastguard Worker		// GenerateTaggedDistFiles(ctx) relied on no tag being treated as "" which
81*333d2b36SAndroid Build Coastguard Worker		// meant that the default dist paths would be the same as empty-string-tag
82*333d2b36SAndroid Build Coastguard Worker		// output files. In order to preserve that behavior when treating no tag
83*333d2b36SAndroid Build Coastguard Worker		// as being equal to DefaultDistTag this ensures that DefaultDistTag output
84*333d2b36SAndroid Build Coastguard Worker		// will be the same as empty-string-tag output.
85*333d2b36SAndroid Build Coastguard Worker		defaultDistPaths = PathsForTesting("one.out")
86*333d2b36SAndroid Build Coastguard Worker		m.setOutputFiles(ctx, defaultDistPaths)
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker		// This must be called after setting defaultDistPaths/outputFile as
89*333d2b36SAndroid Build Coastguard Worker		// GenerateTaggedDistFiles calls into outputFiles property which may use
90*333d2b36SAndroid Build Coastguard Worker		// those fields.
91*333d2b36SAndroid Build Coastguard Worker		m.distFiles = m.GenerateTaggedDistFiles(ctx)
92*333d2b36SAndroid Build Coastguard Worker	}
93*333d2b36SAndroid Build Coastguard Worker}
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Workerfunc (m *customModule) setOutputFiles(ctx ModuleContext, defaultDistPaths Paths) {
96*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(PathsForTesting("one.out"), "")
97*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(PathsForTesting("two.out", "three/four.out"), ".multiple")
98*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(PathsForTesting("another.out"), ".another-tag")
99*333d2b36SAndroid Build Coastguard Worker	if defaultDistPaths != nil {
100*333d2b36SAndroid Build Coastguard Worker		ctx.SetOutputFiles(defaultDistPaths, DefaultDistTag)
101*333d2b36SAndroid Build Coastguard Worker	}
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Workerfunc (m *customModule) AndroidMk() AndroidMkData {
105*333d2b36SAndroid Build Coastguard Worker	return AndroidMkData{
106*333d2b36SAndroid Build Coastguard Worker		Custom: func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) {
107*333d2b36SAndroid Build Coastguard Worker			m.data = data
108*333d2b36SAndroid Build Coastguard Worker		},
109*333d2b36SAndroid Build Coastguard Worker	}
110*333d2b36SAndroid Build Coastguard Worker}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Workerfunc (m *customModule) AndroidMkEntries() []AndroidMkEntries {
113*333d2b36SAndroid Build Coastguard Worker	return []AndroidMkEntries{
114*333d2b36SAndroid Build Coastguard Worker		{
115*333d2b36SAndroid Build Coastguard Worker			Class:      "CUSTOM_MODULE",
116*333d2b36SAndroid Build Coastguard Worker			DistFiles:  m.distFiles,
117*333d2b36SAndroid Build Coastguard Worker			OutputFile: m.outputFile,
118*333d2b36SAndroid Build Coastguard Worker		},
119*333d2b36SAndroid Build Coastguard Worker	}
120*333d2b36SAndroid Build Coastguard Worker}
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Workerfunc customModuleFactory() Module {
123*333d2b36SAndroid Build Coastguard Worker	module := &customModule{}
124*333d2b36SAndroid Build Coastguard Worker
125*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker	InitAndroidModule(module)
128*333d2b36SAndroid Build Coastguard Worker	return module
129*333d2b36SAndroid Build Coastguard Worker}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker// buildContextAndCustomModuleFoo creates a config object, processes the supplied
132*333d2b36SAndroid Build Coastguard Worker// bp module and then returns the config and the custom module called "foo".
133*333d2b36SAndroid Build Coastguard Workerfunc buildContextAndCustomModuleFoo(t *testing.T, bp string) (*TestContext, *customModule) {
134*333d2b36SAndroid Build Coastguard Worker	t.Helper()
135*333d2b36SAndroid Build Coastguard Worker	result := GroupFixturePreparers(
136*333d2b36SAndroid Build Coastguard Worker		// Enable androidmk Singleton
137*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithAndroidMk,
138*333d2b36SAndroid Build Coastguard Worker		FixtureRegisterWithContext(func(ctx RegistrationContext) {
139*333d2b36SAndroid Build Coastguard Worker			ctx.RegisterModuleType("custom", customModuleFactory)
140*333d2b36SAndroid Build Coastguard Worker		}),
141*333d2b36SAndroid Build Coastguard Worker		FixtureModifyProductVariables(func(variables FixtureProductVariables) {
142*333d2b36SAndroid Build Coastguard Worker			variables.DeviceProduct = proptools.StringPtr("bar")
143*333d2b36SAndroid Build Coastguard Worker		}),
144*333d2b36SAndroid Build Coastguard Worker		FixtureWithRootAndroidBp(bp),
145*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
146*333d2b36SAndroid Build Coastguard Worker
147*333d2b36SAndroid Build Coastguard Worker	module := result.ModuleForTests("foo", "").Module().(*customModule)
148*333d2b36SAndroid Build Coastguard Worker	return result.TestContext, module
149*333d2b36SAndroid Build Coastguard Worker}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMkSingleton_PassesUpdatedAndroidMkDataToCustomCallback(t *testing.T) {
152*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS == "darwin" {
153*333d2b36SAndroid Build Coastguard Worker		// Device modules are not exported on Mac, so this test doesn't work.
154*333d2b36SAndroid Build Coastguard Worker		t.SkipNow()
155*333d2b36SAndroid Build Coastguard Worker	}
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Worker	bp := `
158*333d2b36SAndroid Build Coastguard Worker	custom {
159*333d2b36SAndroid Build Coastguard Worker		name: "foo",
160*333d2b36SAndroid Build Coastguard Worker		required: ["bar"],
161*333d2b36SAndroid Build Coastguard Worker		host_required: ["baz"],
162*333d2b36SAndroid Build Coastguard Worker		target_required: ["qux"],
163*333d2b36SAndroid Build Coastguard Worker	}
164*333d2b36SAndroid Build Coastguard Worker	`
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker	_, m := buildContextAndCustomModuleFoo(t, bp)
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker	assertEqual := func(expected interface{}, actual interface{}) {
169*333d2b36SAndroid Build Coastguard Worker		if !reflect.DeepEqual(expected, actual) {
170*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q expected, but got %q", expected, actual)
171*333d2b36SAndroid Build Coastguard Worker		}
172*333d2b36SAndroid Build Coastguard Worker	}
173*333d2b36SAndroid Build Coastguard Worker	assertEqual([]string{"bar"}, m.data.Required)
174*333d2b36SAndroid Build Coastguard Worker	assertEqual([]string{"baz"}, m.data.Host_required)
175*333d2b36SAndroid Build Coastguard Worker	assertEqual([]string{"qux"}, m.data.Target_required)
176*333d2b36SAndroid Build Coastguard Worker}
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Workerfunc TestGenerateDistContributionsForMake(t *testing.T) {
179*333d2b36SAndroid Build Coastguard Worker	dc := &distContributions{
180*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
181*333d2b36SAndroid Build Coastguard Worker			{
182*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
183*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
184*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("one.out", "one.out"),
185*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "other.out"),
186*333d2b36SAndroid Build Coastguard Worker				},
187*333d2b36SAndroid Build Coastguard Worker			},
188*333d2b36SAndroid Build Coastguard Worker		},
189*333d2b36SAndroid Build Coastguard Worker	}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	dc.licenseMetadataFile = PathForTesting("meta_lic")
192*333d2b36SAndroid Build Coastguard Worker	makeOutput := generateDistContributionsForMake(dc)
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker	assertStringEquals(t, `.PHONY: my_goal
195*333d2b36SAndroid Build Coastguard Worker$(if $(strip $(ALL_TARGETS.one.out.META_LIC)),,$(eval ALL_TARGETS.one.out.META_LIC := meta_lic))
196*333d2b36SAndroid Build Coastguard Worker$(call dist-for-goals,my_goal,one.out:one.out)
197*333d2b36SAndroid Build Coastguard Worker$(if $(strip $(ALL_TARGETS.two.out.META_LIC)),,$(eval ALL_TARGETS.two.out.META_LIC := meta_lic))
198*333d2b36SAndroid Build Coastguard Worker$(call dist-for-goals,my_goal,two.out:other.out)`, strings.Join(makeOutput, "\n"))
199*333d2b36SAndroid Build Coastguard Worker}
200*333d2b36SAndroid Build Coastguard Worker
201*333d2b36SAndroid Build Coastguard Workerfunc TestGetDistForGoals(t *testing.T) {
202*333d2b36SAndroid Build Coastguard Worker	bp := `
203*333d2b36SAndroid Build Coastguard Worker			custom {
204*333d2b36SAndroid Build Coastguard Worker				name: "foo",
205*333d2b36SAndroid Build Coastguard Worker				dist: {
206*333d2b36SAndroid Build Coastguard Worker					targets: ["my_goal", "my_other_goal"],
207*333d2b36SAndroid Build Coastguard Worker					tag: ".multiple",
208*333d2b36SAndroid Build Coastguard Worker				},
209*333d2b36SAndroid Build Coastguard Worker				dists: [
210*333d2b36SAndroid Build Coastguard Worker					{
211*333d2b36SAndroid Build Coastguard Worker						targets: ["my_second_goal"],
212*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
213*333d2b36SAndroid Build Coastguard Worker					},
214*333d2b36SAndroid Build Coastguard Worker					{
215*333d2b36SAndroid Build Coastguard Worker						targets: ["my_third_goal"],
216*333d2b36SAndroid Build Coastguard Worker						dir: "test/dir",
217*333d2b36SAndroid Build Coastguard Worker					},
218*333d2b36SAndroid Build Coastguard Worker					{
219*333d2b36SAndroid Build Coastguard Worker						targets: ["my_fourth_goal"],
220*333d2b36SAndroid Build Coastguard Worker						suffix: ".suffix",
221*333d2b36SAndroid Build Coastguard Worker					},
222*333d2b36SAndroid Build Coastguard Worker					{
223*333d2b36SAndroid Build Coastguard Worker						targets: ["my_fifth_goal"],
224*333d2b36SAndroid Build Coastguard Worker						dest: "new-name",
225*333d2b36SAndroid Build Coastguard Worker					},
226*333d2b36SAndroid Build Coastguard Worker					{
227*333d2b36SAndroid Build Coastguard Worker						targets: ["my_sixth_goal"],
228*333d2b36SAndroid Build Coastguard Worker						dest: "new-name",
229*333d2b36SAndroid Build Coastguard Worker						dir: "some/dir",
230*333d2b36SAndroid Build Coastguard Worker						suffix: ".suffix",
231*333d2b36SAndroid Build Coastguard Worker					},
232*333d2b36SAndroid Build Coastguard Worker				],
233*333d2b36SAndroid Build Coastguard Worker			}
234*333d2b36SAndroid Build Coastguard Worker			`
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Worker	expectedAndroidMkLines := []string{
237*333d2b36SAndroid Build Coastguard Worker		".PHONY: my_second_goal",
238*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.two.out.META_LIC)),,$(eval ALL_TARGETS.two.out.META_LIC := meta_lic))",
239*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_second_goal,two.out:two.out)",
240*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.three/four.out.META_LIC)),,$(eval ALL_TARGETS.three/four.out.META_LIC := meta_lic))",
241*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_second_goal,three/four.out:four.out)",
242*333d2b36SAndroid Build Coastguard Worker		".PHONY: my_third_goal",
243*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.one.out.META_LIC)),,$(eval ALL_TARGETS.one.out.META_LIC := meta_lic))",
244*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_third_goal,one.out:test/dir/one.out)",
245*333d2b36SAndroid Build Coastguard Worker		".PHONY: my_fourth_goal",
246*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.one.out.META_LIC)),,$(eval ALL_TARGETS.one.out.META_LIC := meta_lic))",
247*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_fourth_goal,one.out:one.suffix.out)",
248*333d2b36SAndroid Build Coastguard Worker		".PHONY: my_fifth_goal",
249*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.one.out.META_LIC)),,$(eval ALL_TARGETS.one.out.META_LIC := meta_lic))",
250*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_fifth_goal,one.out:new-name)",
251*333d2b36SAndroid Build Coastguard Worker		".PHONY: my_sixth_goal",
252*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.one.out.META_LIC)),,$(eval ALL_TARGETS.one.out.META_LIC := meta_lic))",
253*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_sixth_goal,one.out:some/dir/new-name.suffix)",
254*333d2b36SAndroid Build Coastguard Worker		".PHONY: my_goal my_other_goal",
255*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.two.out.META_LIC)),,$(eval ALL_TARGETS.two.out.META_LIC := meta_lic))",
256*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_goal my_other_goal,two.out:two.out)",
257*333d2b36SAndroid Build Coastguard Worker		"$(if $(strip $(ALL_TARGETS.three/four.out.META_LIC)),,$(eval ALL_TARGETS.three/four.out.META_LIC := meta_lic))",
258*333d2b36SAndroid Build Coastguard Worker		"$(call dist-for-goals,my_goal my_other_goal,three/four.out:four.out)",
259*333d2b36SAndroid Build Coastguard Worker	}
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Worker	ctx, module := buildContextAndCustomModuleFoo(t, bp)
262*333d2b36SAndroid Build Coastguard Worker	entries := AndroidMkEntriesForTest(t, ctx, module)
263*333d2b36SAndroid Build Coastguard Worker	if len(entries) != 1 {
264*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected a single AndroidMk entry, got %d", len(entries))
265*333d2b36SAndroid Build Coastguard Worker	}
266*333d2b36SAndroid Build Coastguard Worker	androidMkLines := entries[0].GetDistForGoals(module)
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker	if len(androidMkLines) != len(expectedAndroidMkLines) {
269*333d2b36SAndroid Build Coastguard Worker		t.Errorf(
270*333d2b36SAndroid Build Coastguard Worker			"Expected %d AndroidMk lines, got %d:\n%v",
271*333d2b36SAndroid Build Coastguard Worker			len(expectedAndroidMkLines),
272*333d2b36SAndroid Build Coastguard Worker			len(androidMkLines),
273*333d2b36SAndroid Build Coastguard Worker			androidMkLines,
274*333d2b36SAndroid Build Coastguard Worker		)
275*333d2b36SAndroid Build Coastguard Worker	}
276*333d2b36SAndroid Build Coastguard Worker	for idx, line := range androidMkLines {
277*333d2b36SAndroid Build Coastguard Worker		expectedLine := strings.ReplaceAll(expectedAndroidMkLines[idx], "meta_lic",
278*333d2b36SAndroid Build Coastguard Worker			OtherModuleProviderOrDefault(ctx, module, InstallFilesProvider).LicenseMetadataFile.String())
279*333d2b36SAndroid Build Coastguard Worker		if line != expectedLine {
280*333d2b36SAndroid Build Coastguard Worker			t.Errorf(
281*333d2b36SAndroid Build Coastguard Worker				"Expected AndroidMk line to be '%s', got '%s'",
282*333d2b36SAndroid Build Coastguard Worker				expectedLine,
283*333d2b36SAndroid Build Coastguard Worker				line,
284*333d2b36SAndroid Build Coastguard Worker			)
285*333d2b36SAndroid Build Coastguard Worker		}
286*333d2b36SAndroid Build Coastguard Worker	}
287*333d2b36SAndroid Build Coastguard Worker}
288*333d2b36SAndroid Build Coastguard Worker
289*333d2b36SAndroid Build Coastguard Workerfunc distCopyForTest(from, to string) distCopy {
290*333d2b36SAndroid Build Coastguard Worker	return distCopy{PathForTesting(from), to}
291*333d2b36SAndroid Build Coastguard Worker}
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Workerfunc TestGetDistContributions(t *testing.T) {
294*333d2b36SAndroid Build Coastguard Worker	compareContributions := func(d1 *distContributions, d2 *distContributions) error {
295*333d2b36SAndroid Build Coastguard Worker		if d1 == nil || d2 == nil {
296*333d2b36SAndroid Build Coastguard Worker			if d1 != d2 {
297*333d2b36SAndroid Build Coastguard Worker				return fmt.Errorf("pointer mismatch, expected both to be nil but they were %p and %p", d1, d2)
298*333d2b36SAndroid Build Coastguard Worker			} else {
299*333d2b36SAndroid Build Coastguard Worker				return nil
300*333d2b36SAndroid Build Coastguard Worker			}
301*333d2b36SAndroid Build Coastguard Worker		}
302*333d2b36SAndroid Build Coastguard Worker		if expected, actual := len(d1.copiesForGoals), len(d2.copiesForGoals); expected != actual {
303*333d2b36SAndroid Build Coastguard Worker			return fmt.Errorf("length mismatch, expected %d found %d", expected, actual)
304*333d2b36SAndroid Build Coastguard Worker		}
305*333d2b36SAndroid Build Coastguard Worker
306*333d2b36SAndroid Build Coastguard Worker		for i, copies1 := range d1.copiesForGoals {
307*333d2b36SAndroid Build Coastguard Worker			copies2 := d2.copiesForGoals[i]
308*333d2b36SAndroid Build Coastguard Worker			if expected, actual := copies1.goals, copies2.goals; expected != actual {
309*333d2b36SAndroid Build Coastguard Worker				return fmt.Errorf("goals mismatch at position %d: expected %q found %q", i, expected, actual)
310*333d2b36SAndroid Build Coastguard Worker			}
311*333d2b36SAndroid Build Coastguard Worker
312*333d2b36SAndroid Build Coastguard Worker			if expected, actual := len(copies1.copies), len(copies2.copies); expected != actual {
313*333d2b36SAndroid Build Coastguard Worker				return fmt.Errorf("length mismatch in copy instructions at position %d, expected %d found %d", i, expected, actual)
314*333d2b36SAndroid Build Coastguard Worker			}
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Worker			for j, c1 := range copies1.copies {
317*333d2b36SAndroid Build Coastguard Worker				c2 := copies2.copies[j]
318*333d2b36SAndroid Build Coastguard Worker				if expected, actual := NormalizePathForTesting(c1.from), NormalizePathForTesting(c2.from); expected != actual {
319*333d2b36SAndroid Build Coastguard Worker					return fmt.Errorf("paths mismatch at position %d.%d: expected %q found %q", i, j, expected, actual)
320*333d2b36SAndroid Build Coastguard Worker				}
321*333d2b36SAndroid Build Coastguard Worker
322*333d2b36SAndroid Build Coastguard Worker				if expected, actual := c1.dest, c2.dest; expected != actual {
323*333d2b36SAndroid Build Coastguard Worker					return fmt.Errorf("dest mismatch at position %d.%d: expected %q found %q", i, j, expected, actual)
324*333d2b36SAndroid Build Coastguard Worker				}
325*333d2b36SAndroid Build Coastguard Worker			}
326*333d2b36SAndroid Build Coastguard Worker		}
327*333d2b36SAndroid Build Coastguard Worker
328*333d2b36SAndroid Build Coastguard Worker		return nil
329*333d2b36SAndroid Build Coastguard Worker	}
330*333d2b36SAndroid Build Coastguard Worker
331*333d2b36SAndroid Build Coastguard Worker	formatContributions := func(d *distContributions) string {
332*333d2b36SAndroid Build Coastguard Worker		buf := &strings.Builder{}
333*333d2b36SAndroid Build Coastguard Worker		if d == nil {
334*333d2b36SAndroid Build Coastguard Worker			fmt.Fprint(buf, "nil")
335*333d2b36SAndroid Build Coastguard Worker		} else {
336*333d2b36SAndroid Build Coastguard Worker			for _, copiesForGoals := range d.copiesForGoals {
337*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintf(buf, "    Goals: %q {\n", copiesForGoals.goals)
338*333d2b36SAndroid Build Coastguard Worker				for _, c := range copiesForGoals.copies {
339*333d2b36SAndroid Build Coastguard Worker					fmt.Fprintf(buf, "        %s -> %s\n", NormalizePathForTesting(c.from), c.dest)
340*333d2b36SAndroid Build Coastguard Worker				}
341*333d2b36SAndroid Build Coastguard Worker				fmt.Fprint(buf, "    }\n")
342*333d2b36SAndroid Build Coastguard Worker			}
343*333d2b36SAndroid Build Coastguard Worker		}
344*333d2b36SAndroid Build Coastguard Worker		return buf.String()
345*333d2b36SAndroid Build Coastguard Worker	}
346*333d2b36SAndroid Build Coastguard Worker
347*333d2b36SAndroid Build Coastguard Worker	testHelper := func(t *testing.T, name, bp string, expectedContributions *distContributions) {
348*333d2b36SAndroid Build Coastguard Worker		t.Helper()
349*333d2b36SAndroid Build Coastguard Worker		t.Run(name, func(t *testing.T) {
350*333d2b36SAndroid Build Coastguard Worker			t.Helper()
351*333d2b36SAndroid Build Coastguard Worker
352*333d2b36SAndroid Build Coastguard Worker			ctx, module := buildContextAndCustomModuleFoo(t, bp)
353*333d2b36SAndroid Build Coastguard Worker			entries := AndroidMkEntriesForTest(t, ctx, module)
354*333d2b36SAndroid Build Coastguard Worker			if len(entries) != 1 {
355*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Expected a single AndroidMk entry, got %d", len(entries))
356*333d2b36SAndroid Build Coastguard Worker			}
357*333d2b36SAndroid Build Coastguard Worker			distContributions := entries[0].getDistContributions(module)
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker			if err := compareContributions(expectedContributions, distContributions); err != nil {
360*333d2b36SAndroid Build Coastguard Worker				t.Errorf("%s\nExpected Contributions\n%sActualContributions\n%s",
361*333d2b36SAndroid Build Coastguard Worker					err,
362*333d2b36SAndroid Build Coastguard Worker					formatContributions(expectedContributions),
363*333d2b36SAndroid Build Coastguard Worker					formatContributions(distContributions))
364*333d2b36SAndroid Build Coastguard Worker			}
365*333d2b36SAndroid Build Coastguard Worker		})
366*333d2b36SAndroid Build Coastguard Worker	}
367*333d2b36SAndroid Build Coastguard Worker
368*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "dist-without-tag", `
369*333d2b36SAndroid Build Coastguard Worker			custom {
370*333d2b36SAndroid Build Coastguard Worker				name: "foo",
371*333d2b36SAndroid Build Coastguard Worker				dist: {
372*333d2b36SAndroid Build Coastguard Worker					targets: ["my_goal"]
373*333d2b36SAndroid Build Coastguard Worker				}
374*333d2b36SAndroid Build Coastguard Worker			}
375*333d2b36SAndroid Build Coastguard Worker`,
376*333d2b36SAndroid Build Coastguard Worker		&distContributions{
377*333d2b36SAndroid Build Coastguard Worker			copiesForGoals: []*copiesForGoals{
378*333d2b36SAndroid Build Coastguard Worker				{
379*333d2b36SAndroid Build Coastguard Worker					goals: "my_goal",
380*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
381*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "one.out"),
382*333d2b36SAndroid Build Coastguard Worker					},
383*333d2b36SAndroid Build Coastguard Worker				},
384*333d2b36SAndroid Build Coastguard Worker			},
385*333d2b36SAndroid Build Coastguard Worker		})
386*333d2b36SAndroid Build Coastguard Worker
387*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "dist-with-tag", `
388*333d2b36SAndroid Build Coastguard Worker			custom {
389*333d2b36SAndroid Build Coastguard Worker				name: "foo",
390*333d2b36SAndroid Build Coastguard Worker				dist: {
391*333d2b36SAndroid Build Coastguard Worker					targets: ["my_goal"],
392*333d2b36SAndroid Build Coastguard Worker					tag: ".another-tag",
393*333d2b36SAndroid Build Coastguard Worker				}
394*333d2b36SAndroid Build Coastguard Worker			}
395*333d2b36SAndroid Build Coastguard Worker`,
396*333d2b36SAndroid Build Coastguard Worker		&distContributions{
397*333d2b36SAndroid Build Coastguard Worker			copiesForGoals: []*copiesForGoals{
398*333d2b36SAndroid Build Coastguard Worker				{
399*333d2b36SAndroid Build Coastguard Worker					goals: "my_goal",
400*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
401*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("another.out", "another.out"),
402*333d2b36SAndroid Build Coastguard Worker					},
403*333d2b36SAndroid Build Coastguard Worker				},
404*333d2b36SAndroid Build Coastguard Worker			},
405*333d2b36SAndroid Build Coastguard Worker		})
406*333d2b36SAndroid Build Coastguard Worker
407*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "append-artifact-with-product", `
408*333d2b36SAndroid Build Coastguard Worker			custom {
409*333d2b36SAndroid Build Coastguard Worker				name: "foo",
410*333d2b36SAndroid Build Coastguard Worker				dist: {
411*333d2b36SAndroid Build Coastguard Worker					targets: ["my_goal"],
412*333d2b36SAndroid Build Coastguard Worker					append_artifact_with_product: true,
413*333d2b36SAndroid Build Coastguard Worker				}
414*333d2b36SAndroid Build Coastguard Worker			}
415*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
416*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
417*333d2b36SAndroid Build Coastguard Worker			{
418*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
419*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
420*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("one.out", "one_bar.out"),
421*333d2b36SAndroid Build Coastguard Worker				},
422*333d2b36SAndroid Build Coastguard Worker			},
423*333d2b36SAndroid Build Coastguard Worker		},
424*333d2b36SAndroid Build Coastguard Worker	})
425*333d2b36SAndroid Build Coastguard Worker
426*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "dists-with-tag", `
427*333d2b36SAndroid Build Coastguard Worker			custom {
428*333d2b36SAndroid Build Coastguard Worker				name: "foo",
429*333d2b36SAndroid Build Coastguard Worker				dists: [
430*333d2b36SAndroid Build Coastguard Worker					{
431*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
432*333d2b36SAndroid Build Coastguard Worker						tag: ".another-tag",
433*333d2b36SAndroid Build Coastguard Worker					},
434*333d2b36SAndroid Build Coastguard Worker				],
435*333d2b36SAndroid Build Coastguard Worker			}
436*333d2b36SAndroid Build Coastguard Worker`,
437*333d2b36SAndroid Build Coastguard Worker		&distContributions{
438*333d2b36SAndroid Build Coastguard Worker			copiesForGoals: []*copiesForGoals{
439*333d2b36SAndroid Build Coastguard Worker				{
440*333d2b36SAndroid Build Coastguard Worker					goals: "my_goal",
441*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
442*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("another.out", "another.out"),
443*333d2b36SAndroid Build Coastguard Worker					},
444*333d2b36SAndroid Build Coastguard Worker				},
445*333d2b36SAndroid Build Coastguard Worker			},
446*333d2b36SAndroid Build Coastguard Worker		})
447*333d2b36SAndroid Build Coastguard Worker
448*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "multiple-dists-with-and-without-tag", `
449*333d2b36SAndroid Build Coastguard Worker			custom {
450*333d2b36SAndroid Build Coastguard Worker				name: "foo",
451*333d2b36SAndroid Build Coastguard Worker				dists: [
452*333d2b36SAndroid Build Coastguard Worker					{
453*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
454*333d2b36SAndroid Build Coastguard Worker					},
455*333d2b36SAndroid Build Coastguard Worker					{
456*333d2b36SAndroid Build Coastguard Worker						targets: ["my_second_goal", "my_third_goal"],
457*333d2b36SAndroid Build Coastguard Worker					},
458*333d2b36SAndroid Build Coastguard Worker				],
459*333d2b36SAndroid Build Coastguard Worker			}
460*333d2b36SAndroid Build Coastguard Worker`,
461*333d2b36SAndroid Build Coastguard Worker		&distContributions{
462*333d2b36SAndroid Build Coastguard Worker			copiesForGoals: []*copiesForGoals{
463*333d2b36SAndroid Build Coastguard Worker				{
464*333d2b36SAndroid Build Coastguard Worker					goals: "my_goal",
465*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
466*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "one.out"),
467*333d2b36SAndroid Build Coastguard Worker					},
468*333d2b36SAndroid Build Coastguard Worker				},
469*333d2b36SAndroid Build Coastguard Worker				{
470*333d2b36SAndroid Build Coastguard Worker					goals: "my_second_goal my_third_goal",
471*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
472*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "one.out"),
473*333d2b36SAndroid Build Coastguard Worker					},
474*333d2b36SAndroid Build Coastguard Worker				},
475*333d2b36SAndroid Build Coastguard Worker			},
476*333d2b36SAndroid Build Coastguard Worker		})
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "dist-plus-dists-without-tags", `
479*333d2b36SAndroid Build Coastguard Worker			custom {
480*333d2b36SAndroid Build Coastguard Worker				name: "foo",
481*333d2b36SAndroid Build Coastguard Worker				dist: {
482*333d2b36SAndroid Build Coastguard Worker					targets: ["my_goal"],
483*333d2b36SAndroid Build Coastguard Worker				},
484*333d2b36SAndroid Build Coastguard Worker				dists: [
485*333d2b36SAndroid Build Coastguard Worker					{
486*333d2b36SAndroid Build Coastguard Worker						targets: ["my_second_goal", "my_third_goal"],
487*333d2b36SAndroid Build Coastguard Worker					},
488*333d2b36SAndroid Build Coastguard Worker				],
489*333d2b36SAndroid Build Coastguard Worker			}
490*333d2b36SAndroid Build Coastguard Worker`,
491*333d2b36SAndroid Build Coastguard Worker		&distContributions{
492*333d2b36SAndroid Build Coastguard Worker			copiesForGoals: []*copiesForGoals{
493*333d2b36SAndroid Build Coastguard Worker				{
494*333d2b36SAndroid Build Coastguard Worker					goals: "my_second_goal my_third_goal",
495*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
496*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "one.out"),
497*333d2b36SAndroid Build Coastguard Worker					},
498*333d2b36SAndroid Build Coastguard Worker				},
499*333d2b36SAndroid Build Coastguard Worker				{
500*333d2b36SAndroid Build Coastguard Worker					goals: "my_goal",
501*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
502*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "one.out"),
503*333d2b36SAndroid Build Coastguard Worker					},
504*333d2b36SAndroid Build Coastguard Worker				},
505*333d2b36SAndroid Build Coastguard Worker			},
506*333d2b36SAndroid Build Coastguard Worker		})
507*333d2b36SAndroid Build Coastguard Worker
508*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "dist-plus-dists-with-tags", `
509*333d2b36SAndroid Build Coastguard Worker			custom {
510*333d2b36SAndroid Build Coastguard Worker				name: "foo",
511*333d2b36SAndroid Build Coastguard Worker				dist: {
512*333d2b36SAndroid Build Coastguard Worker					targets: ["my_goal", "my_other_goal"],
513*333d2b36SAndroid Build Coastguard Worker					tag: ".multiple",
514*333d2b36SAndroid Build Coastguard Worker				},
515*333d2b36SAndroid Build Coastguard Worker				dists: [
516*333d2b36SAndroid Build Coastguard Worker					{
517*333d2b36SAndroid Build Coastguard Worker						targets: ["my_second_goal"],
518*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
519*333d2b36SAndroid Build Coastguard Worker					},
520*333d2b36SAndroid Build Coastguard Worker					{
521*333d2b36SAndroid Build Coastguard Worker						targets: ["my_third_goal"],
522*333d2b36SAndroid Build Coastguard Worker						dir: "test/dir",
523*333d2b36SAndroid Build Coastguard Worker					},
524*333d2b36SAndroid Build Coastguard Worker					{
525*333d2b36SAndroid Build Coastguard Worker						targets: ["my_fourth_goal"],
526*333d2b36SAndroid Build Coastguard Worker						suffix: ".suffix",
527*333d2b36SAndroid Build Coastguard Worker					},
528*333d2b36SAndroid Build Coastguard Worker					{
529*333d2b36SAndroid Build Coastguard Worker						targets: ["my_fifth_goal"],
530*333d2b36SAndroid Build Coastguard Worker						dest: "new-name",
531*333d2b36SAndroid Build Coastguard Worker					},
532*333d2b36SAndroid Build Coastguard Worker					{
533*333d2b36SAndroid Build Coastguard Worker						targets: ["my_sixth_goal"],
534*333d2b36SAndroid Build Coastguard Worker						dest: "new-name",
535*333d2b36SAndroid Build Coastguard Worker						dir: "some/dir",
536*333d2b36SAndroid Build Coastguard Worker						suffix: ".suffix",
537*333d2b36SAndroid Build Coastguard Worker					},
538*333d2b36SAndroid Build Coastguard Worker				],
539*333d2b36SAndroid Build Coastguard Worker			}
540*333d2b36SAndroid Build Coastguard Worker`,
541*333d2b36SAndroid Build Coastguard Worker		&distContributions{
542*333d2b36SAndroid Build Coastguard Worker			copiesForGoals: []*copiesForGoals{
543*333d2b36SAndroid Build Coastguard Worker				{
544*333d2b36SAndroid Build Coastguard Worker					goals: "my_second_goal",
545*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
546*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("two.out", "two.out"),
547*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("three/four.out", "four.out"),
548*333d2b36SAndroid Build Coastguard Worker					},
549*333d2b36SAndroid Build Coastguard Worker				},
550*333d2b36SAndroid Build Coastguard Worker				{
551*333d2b36SAndroid Build Coastguard Worker					goals: "my_third_goal",
552*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
553*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "test/dir/one.out"),
554*333d2b36SAndroid Build Coastguard Worker					},
555*333d2b36SAndroid Build Coastguard Worker				},
556*333d2b36SAndroid Build Coastguard Worker				{
557*333d2b36SAndroid Build Coastguard Worker					goals: "my_fourth_goal",
558*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
559*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "one.suffix.out"),
560*333d2b36SAndroid Build Coastguard Worker					},
561*333d2b36SAndroid Build Coastguard Worker				},
562*333d2b36SAndroid Build Coastguard Worker				{
563*333d2b36SAndroid Build Coastguard Worker					goals: "my_fifth_goal",
564*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
565*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "new-name"),
566*333d2b36SAndroid Build Coastguard Worker					},
567*333d2b36SAndroid Build Coastguard Worker				},
568*333d2b36SAndroid Build Coastguard Worker				{
569*333d2b36SAndroid Build Coastguard Worker					goals: "my_sixth_goal",
570*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
571*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("one.out", "some/dir/new-name.suffix"),
572*333d2b36SAndroid Build Coastguard Worker					},
573*333d2b36SAndroid Build Coastguard Worker				},
574*333d2b36SAndroid Build Coastguard Worker				{
575*333d2b36SAndroid Build Coastguard Worker					goals: "my_goal my_other_goal",
576*333d2b36SAndroid Build Coastguard Worker					copies: []distCopy{
577*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("two.out", "two.out"),
578*333d2b36SAndroid Build Coastguard Worker						distCopyForTest("three/four.out", "four.out"),
579*333d2b36SAndroid Build Coastguard Worker					},
580*333d2b36SAndroid Build Coastguard Worker				},
581*333d2b36SAndroid Build Coastguard Worker			},
582*333d2b36SAndroid Build Coastguard Worker		})
583*333d2b36SAndroid Build Coastguard Worker
584*333d2b36SAndroid Build Coastguard Worker	// The above test the default values of default_dist_files and use_output_file.
585*333d2b36SAndroid Build Coastguard Worker
586*333d2b36SAndroid Build Coastguard Worker	// The following tests explicitly test the different combinations of those settings.
587*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "tagged-dist-files-no-output", `
588*333d2b36SAndroid Build Coastguard Worker			custom {
589*333d2b36SAndroid Build Coastguard Worker				name: "foo",
590*333d2b36SAndroid Build Coastguard Worker				default_dist_files: "tagged",
591*333d2b36SAndroid Build Coastguard Worker				dist_output_file: false,
592*333d2b36SAndroid Build Coastguard Worker				dists: [
593*333d2b36SAndroid Build Coastguard Worker					{
594*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
595*333d2b36SAndroid Build Coastguard Worker					},
596*333d2b36SAndroid Build Coastguard Worker					{
597*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
598*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
599*333d2b36SAndroid Build Coastguard Worker					},
600*333d2b36SAndroid Build Coastguard Worker				],
601*333d2b36SAndroid Build Coastguard Worker			}
602*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
603*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
604*333d2b36SAndroid Build Coastguard Worker			{
605*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
606*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
607*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("one.out", "one.out"),
608*333d2b36SAndroid Build Coastguard Worker				},
609*333d2b36SAndroid Build Coastguard Worker			},
610*333d2b36SAndroid Build Coastguard Worker			{
611*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
612*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
613*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "two.out"),
614*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("three/four.out", "four.out"),
615*333d2b36SAndroid Build Coastguard Worker				},
616*333d2b36SAndroid Build Coastguard Worker			},
617*333d2b36SAndroid Build Coastguard Worker		},
618*333d2b36SAndroid Build Coastguard Worker	})
619*333d2b36SAndroid Build Coastguard Worker
620*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "default-dist-files-no-output", `
621*333d2b36SAndroid Build Coastguard Worker			custom {
622*333d2b36SAndroid Build Coastguard Worker				name: "foo",
623*333d2b36SAndroid Build Coastguard Worker				default_dist_files: "default",
624*333d2b36SAndroid Build Coastguard Worker				dist_output_file: false,
625*333d2b36SAndroid Build Coastguard Worker				dists: [
626*333d2b36SAndroid Build Coastguard Worker					{
627*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
628*333d2b36SAndroid Build Coastguard Worker					},
629*333d2b36SAndroid Build Coastguard Worker					{
630*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
631*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
632*333d2b36SAndroid Build Coastguard Worker					},
633*333d2b36SAndroid Build Coastguard Worker				],
634*333d2b36SAndroid Build Coastguard Worker			}
635*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
636*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
637*333d2b36SAndroid Build Coastguard Worker			{
638*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
639*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
640*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("default-dist.out", "default-dist.out"),
641*333d2b36SAndroid Build Coastguard Worker				},
642*333d2b36SAndroid Build Coastguard Worker			},
643*333d2b36SAndroid Build Coastguard Worker			{
644*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
645*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
646*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "two.out"),
647*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("three/four.out", "four.out"),
648*333d2b36SAndroid Build Coastguard Worker				},
649*333d2b36SAndroid Build Coastguard Worker			},
650*333d2b36SAndroid Build Coastguard Worker		},
651*333d2b36SAndroid Build Coastguard Worker	})
652*333d2b36SAndroid Build Coastguard Worker
653*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "no-dist-files-no-output", `
654*333d2b36SAndroid Build Coastguard Worker			custom {
655*333d2b36SAndroid Build Coastguard Worker				name: "foo",
656*333d2b36SAndroid Build Coastguard Worker				default_dist_files: "none",
657*333d2b36SAndroid Build Coastguard Worker				dist_output_file: false,
658*333d2b36SAndroid Build Coastguard Worker				dists: [
659*333d2b36SAndroid Build Coastguard Worker					// The following is silently ignored because there is not default file
660*333d2b36SAndroid Build Coastguard Worker					// in either the dist files or the output file.
661*333d2b36SAndroid Build Coastguard Worker					{
662*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
663*333d2b36SAndroid Build Coastguard Worker					},
664*333d2b36SAndroid Build Coastguard Worker					{
665*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
666*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
667*333d2b36SAndroid Build Coastguard Worker					},
668*333d2b36SAndroid Build Coastguard Worker				],
669*333d2b36SAndroid Build Coastguard Worker			}
670*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
671*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
672*333d2b36SAndroid Build Coastguard Worker			{
673*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
674*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
675*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "two.out"),
676*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("three/four.out", "four.out"),
677*333d2b36SAndroid Build Coastguard Worker				},
678*333d2b36SAndroid Build Coastguard Worker			},
679*333d2b36SAndroid Build Coastguard Worker		},
680*333d2b36SAndroid Build Coastguard Worker	})
681*333d2b36SAndroid Build Coastguard Worker
682*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "tagged-dist-files-default-output", `
683*333d2b36SAndroid Build Coastguard Worker			custom {
684*333d2b36SAndroid Build Coastguard Worker				name: "foo",
685*333d2b36SAndroid Build Coastguard Worker				default_dist_files: "tagged",
686*333d2b36SAndroid Build Coastguard Worker				dist_output_file: true,
687*333d2b36SAndroid Build Coastguard Worker				dists: [
688*333d2b36SAndroid Build Coastguard Worker					{
689*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
690*333d2b36SAndroid Build Coastguard Worker					},
691*333d2b36SAndroid Build Coastguard Worker					{
692*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
693*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
694*333d2b36SAndroid Build Coastguard Worker					},
695*333d2b36SAndroid Build Coastguard Worker				],
696*333d2b36SAndroid Build Coastguard Worker			}
697*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
698*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
699*333d2b36SAndroid Build Coastguard Worker			{
700*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
701*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
702*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("one.out", "one.out"),
703*333d2b36SAndroid Build Coastguard Worker				},
704*333d2b36SAndroid Build Coastguard Worker			},
705*333d2b36SAndroid Build Coastguard Worker			{
706*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
707*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
708*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "two.out"),
709*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("three/four.out", "four.out"),
710*333d2b36SAndroid Build Coastguard Worker				},
711*333d2b36SAndroid Build Coastguard Worker			},
712*333d2b36SAndroid Build Coastguard Worker		},
713*333d2b36SAndroid Build Coastguard Worker	})
714*333d2b36SAndroid Build Coastguard Worker
715*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "default-dist-files-default-output", `
716*333d2b36SAndroid Build Coastguard Worker			custom {
717*333d2b36SAndroid Build Coastguard Worker				name: "foo",
718*333d2b36SAndroid Build Coastguard Worker				default_dist_files: "default",
719*333d2b36SAndroid Build Coastguard Worker				dist_output_file: true,
720*333d2b36SAndroid Build Coastguard Worker				dists: [
721*333d2b36SAndroid Build Coastguard Worker					{
722*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
723*333d2b36SAndroid Build Coastguard Worker					},
724*333d2b36SAndroid Build Coastguard Worker					{
725*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
726*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
727*333d2b36SAndroid Build Coastguard Worker					},
728*333d2b36SAndroid Build Coastguard Worker				],
729*333d2b36SAndroid Build Coastguard Worker			}
730*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
731*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
732*333d2b36SAndroid Build Coastguard Worker			{
733*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
734*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
735*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("default-dist.out", "default-dist.out"),
736*333d2b36SAndroid Build Coastguard Worker				},
737*333d2b36SAndroid Build Coastguard Worker			},
738*333d2b36SAndroid Build Coastguard Worker			{
739*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
740*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
741*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "two.out"),
742*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("three/four.out", "four.out"),
743*333d2b36SAndroid Build Coastguard Worker				},
744*333d2b36SAndroid Build Coastguard Worker			},
745*333d2b36SAndroid Build Coastguard Worker		},
746*333d2b36SAndroid Build Coastguard Worker	})
747*333d2b36SAndroid Build Coastguard Worker
748*333d2b36SAndroid Build Coastguard Worker	testHelper(t, "no-dist-files-default-output", `
749*333d2b36SAndroid Build Coastguard Worker			custom {
750*333d2b36SAndroid Build Coastguard Worker				name: "foo",
751*333d2b36SAndroid Build Coastguard Worker				default_dist_files: "none",
752*333d2b36SAndroid Build Coastguard Worker				dist_output_file: true,
753*333d2b36SAndroid Build Coastguard Worker				dists: [
754*333d2b36SAndroid Build Coastguard Worker					{
755*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
756*333d2b36SAndroid Build Coastguard Worker					},
757*333d2b36SAndroid Build Coastguard Worker					{
758*333d2b36SAndroid Build Coastguard Worker						targets: ["my_goal"],
759*333d2b36SAndroid Build Coastguard Worker						tag: ".multiple",
760*333d2b36SAndroid Build Coastguard Worker					},
761*333d2b36SAndroid Build Coastguard Worker				],
762*333d2b36SAndroid Build Coastguard Worker			}
763*333d2b36SAndroid Build Coastguard Worker`, &distContributions{
764*333d2b36SAndroid Build Coastguard Worker		copiesForGoals: []*copiesForGoals{
765*333d2b36SAndroid Build Coastguard Worker			{
766*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
767*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
768*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("dist-output-file.out", "dist-output-file.out"),
769*333d2b36SAndroid Build Coastguard Worker				},
770*333d2b36SAndroid Build Coastguard Worker			},
771*333d2b36SAndroid Build Coastguard Worker			{
772*333d2b36SAndroid Build Coastguard Worker				goals: "my_goal",
773*333d2b36SAndroid Build Coastguard Worker				copies: []distCopy{
774*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("two.out", "two.out"),
775*333d2b36SAndroid Build Coastguard Worker					distCopyForTest("three/four.out", "four.out"),
776*333d2b36SAndroid Build Coastguard Worker				},
777*333d2b36SAndroid Build Coastguard Worker			},
778*333d2b36SAndroid Build Coastguard Worker		},
779*333d2b36SAndroid Build Coastguard Worker	})
780*333d2b36SAndroid Build Coastguard Worker}
781