• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2021 The Android Open Source Project
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
15package etc
16
17import (
18	"android/soong/android"
19	"testing"
20
21	"github.com/google/blueprint"
22)
23
24var registerSourceModule = func(ctx android.RegistrationContext) {
25	ctx.RegisterModuleType("source", newSourceModule)
26}
27
28type sourceModuleProperties struct {
29	Deps []string `android:"path,arch_variant"`
30}
31
32type sourceModule struct {
33	android.ModuleBase
34	android.OverridableModuleBase
35
36	properties                                     sourceModuleProperties
37	dependsOnSourceModule, dependsOnPrebuiltModule bool
38	deps                                           android.Paths
39	src                                            android.Path
40}
41
42func newSourceModule() android.Module {
43	m := &sourceModule{}
44	m.AddProperties(&m.properties)
45	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibFirst)
46	android.InitOverridableModule(m, nil)
47	return m
48}
49
50func (s *sourceModule) OverridablePropertiesDepsMutator(ctx android.BottomUpMutatorContext) {
51	// s.properties.Deps are annotated with android:path, so they are
52	// automatically added to the dependency by pathDeps mutator
53}
54
55func (s *sourceModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
56	s.deps = android.PathsForModuleSrc(ctx, s.properties.Deps)
57	s.src = android.PathForModuleSrc(ctx, "source_file")
58}
59
60func (s *sourceModule) Srcs() android.Paths {
61	return android.Paths{s.src}
62}
63
64var prepareForSnapshotEtcTest = android.GroupFixturePreparers(
65	android.PrepareForTestWithArchMutator,
66	android.PrepareForTestWithPrebuilts,
67	PrepareForTestWithPrebuiltEtc,
68	android.FixtureRegisterWithContext(RegisterSnapshotEtcModule),
69	android.FixtureRegisterWithContext(registerSourceModule),
70	android.FixtureMergeMockFs(android.MockFS{
71		"foo.conf": nil,
72		"bar.conf": nil,
73	}),
74)
75
76func TestSnapshotWithFilename(t *testing.T) {
77	var androidBp = `
78	snapshot_etc {
79		name: "etc_module",
80		src: "foo.conf",
81		filename: "bar.conf",
82	}
83	`
84
85	result := prepareForSnapshotEtcTest.RunTestWithBp(t, androidBp)
86	for _, variant := range result.ModuleVariantsForTests("etc_module") {
87		module := result.ModuleForTests("etc_module", variant)
88		s, ok := module.Module().(*SnapshotEtc)
89		if !ok {
90			t.Errorf("Expected snapshot_etc module type")
91		}
92		if s.outputFilePath.Base() != "bar.conf" {
93			t.Errorf("Output file path does not match with specified filename")
94		}
95	}
96}
97
98func TestSnapshotEtcWithOrigin(t *testing.T) {
99	var androidBp = `
100	prebuilt_etc {
101		name: "etc_module",
102		src: "foo.conf",
103	}
104
105	snapshot_etc {
106		name: "etc_module",
107		src: "bar.conf",
108	}
109
110	source {
111		name: "source",
112		deps: [":etc_module"],
113	}
114	`
115
116	result := prepareForSnapshotEtcTest.RunTestWithBp(t, androidBp)
117
118	for _, variant := range result.ModuleVariantsForTests("source") {
119		source := result.ModuleForTests("source", variant)
120
121		result.VisitDirectDeps(source.Module(), func(m blueprint.Module) {
122			if _, ok := m.(*PrebuiltEtc); !ok {
123				t.Errorf("Original prebuilt_etc module expected.")
124			}
125		})
126	}
127}
128
129func TestSnapshotEtcWithOriginAndPrefer(t *testing.T) {
130	var androidBp = `
131	prebuilt_etc {
132		name: "etc_module",
133		src: "foo.conf",
134	}
135
136	snapshot_etc {
137		name: "etc_module",
138		src: "bar.conf",
139		prefer: true,
140	}
141
142	source {
143		name: "source",
144		deps: [":etc_module"],
145	}
146	`
147
148	result := prepareForSnapshotEtcTest.RunTestWithBp(t, androidBp)
149
150	for _, variant := range result.ModuleVariantsForTests("source") {
151		source := result.ModuleForTests("source", variant)
152
153		result.VisitDirectDeps(source.Module(), func(m blueprint.Module) {
154			if _, ok := m.(*SnapshotEtc); !ok {
155				t.Errorf("Preferred snapshot_etc module expected.")
156			}
157		})
158	}
159}
160
161func TestSnapshotEtcWithoutOrigin(t *testing.T) {
162	var androidBp = `
163	snapshot_etc {
164		name: "etc_module",
165		src: "bar.conf",
166	}
167
168	source {
169		name: "source",
170		deps: [":etc_module"],
171	}
172	`
173
174	result := prepareForSnapshotEtcTest.RunTestWithBp(t, androidBp)
175
176	for _, variant := range result.ModuleVariantsForTests("source") {
177		source := result.ModuleForTests("source", variant)
178
179		result.VisitDirectDeps(source.Module(), func(m blueprint.Module) {
180			if _, ok := m.(*SnapshotEtc); !ok {
181				t.Errorf("Only source snapshot_etc module expected.")
182			}
183		})
184	}
185}
186