blob: b9d55047cf658e9b2547d5062114516d924f571b [file] [log] [blame]
Kiyoung Kimab9a31c2021-07-23 15:47:56 +09001// 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}