blob: ab9feddfb46303602b699cd8150ce1e2f094f63d [file] [log] [blame]
Rob Seymour925aa092021-08-10 20:42:03 +00001// 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 snapshot
16
17import (
18 "path/filepath"
19 "testing"
20
21 "android/soong/android"
22)
23
24// host_snapshot and host-fake-snapshot test functions
25
26type hostTestModule struct {
27 android.ModuleBase
28 props struct {
29 Deps []string
30 }
31}
32
33func hostTestBinOut(bin string) string {
34 return filepath.Join("out", "bin", bin)
35}
36
37func (c *hostTestModule) HostToolPath() android.OptionalPath {
38 return (android.OptionalPathForPath(android.PathForTesting(hostTestBinOut(c.Name()))))
39}
40
41func hostTestModuleFactory() android.Module {
42 m := &hostTestModule{}
43 m.AddProperties(&m.props)
44 android.InitAndroidArchModule(m, android.HostSupported, android.MultilibFirst)
45 return m
46}
47func (m *hostTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
48 builtFile := android.PathForModuleOut(ctx, m.Name())
49 dir := ctx.Target().Arch.ArchType.Multilib
50 installDir := android.PathForModuleInstall(ctx, dir)
51 ctx.InstallFile(installDir, m.Name(), builtFile)
52}
53
54// Common blueprint used for testing
55var hostTestBp = `
56 license_kind {
57 name: "test_notice",
58 conditions: ["notice"],
59 }
60 license {
61 name: "host_test_license",
62 visibility: ["//visibility:public"],
63 license_kinds: [
64 "test_notice"
65 ],
66 license_text: [
67 "NOTICE",
68 ],
69 }
70 component {
71 name: "foo",
72 deps: ["bar"],
73 }
74 component {
75 name: "bar",
76 licenses: ["host_test_license"],
77 }
78 `
79
80var hostTestModBp = `
81 host_snapshot {
82 name: "test-host-snapshot",
83 deps: [
84 "foo",
85 ],
86 }
87 `
88
89var prepareForHostTest = android.GroupFixturePreparers(
90 android.PrepareForTestWithAndroidBuildComponents,
91 android.PrepareForTestWithLicenses,
92 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
93 ctx.RegisterModuleType("component", hostTestModuleFactory)
94 }),
95)
96
97// Prepare for host_snapshot test
98var prepareForHostModTest = android.GroupFixturePreparers(
99 prepareForHostTest,
100 android.FixtureWithRootAndroidBp(hostTestBp+hostTestModBp),
101 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
102 registerHostBuildComponents(ctx)
103 }),
104)
105
106// Prepare for fake host snapshot test disabled
107var prepareForFakeHostTest = android.GroupFixturePreparers(
108 prepareForHostTest,
109 android.FixtureWithRootAndroidBp(hostTestBp),
110 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
111 registerHostSnapshotComponents(ctx)
112 }),
113)
114
115// Prepare for fake host snapshot test enabled
116var prepareForFakeHostTestEnabled = android.GroupFixturePreparers(
117 prepareForFakeHostTest,
118 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.HostFakeSnapshotEnabled = true
120 }),
121)
122
123// Validate that a hostSnapshot object is created containing zip files and JSON file
124// content of zip file is not validated as this is done by PackagingSpecs
125func TestHostSnapshot(t *testing.T) {
126 result := prepareForHostModTest.RunTest(t)
127 t.Helper()
128 ctx := result.TestContext.ModuleForTests("test-host-snapshot", result.Config.BuildOS.String()+"_common")
129 mod := ctx.Module().(*hostSnapshot)
130 if ctx.MaybeOutput("host_snapshot.json").Rule == nil {
131 t.Error("Manifest file not found")
132 }
133 zips := []string{"_deps.zip", "_mods.zip", ".zip"}
134
135 for _, zip := range zips {
136 zFile := mod.Name() + zip
137 if ctx.MaybeOutput(zFile).Rule == nil {
138 t.Error("Zip file ", zFile, "not found")
139 }
140
141 }
142}
143
144// Validate fake host snapshot contains binary modules as well as the JSON meta file
145func TestFakeHostSnapshotEnable(t *testing.T) {
146 result := prepareForFakeHostTestEnabled.RunTest(t)
147 t.Helper()
148 bins := []string{"foo", "bar"}
149 ctx := result.TestContext.SingletonForTests("host-fake-snapshot")
150 if ctx.MaybeOutput(filepath.Join("host-fake-snapshot", "host_snapshot.json")).Rule == nil {
151 t.Error("Manifest file not found")
152 }
153 for _, bin := range bins {
154 if ctx.MaybeOutput(filepath.Join("host-fake-snapshot", hostTestBinOut(bin))).Rule == nil {
155 t.Error("Binary file ", bin, "not found")
156 }
157
158 }
159}
160
161// Validate not fake host snapshot if HostFakeSnapshotEnabled has not been set to true
162func TestFakeHostSnapshotDisable(t *testing.T) {
163 result := prepareForFakeHostTest.RunTest(t)
164 t.Helper()
165 ctx := result.TestContext.SingletonForTests("host-fake-snapshot")
166 if len(ctx.AllOutputs()) != 0 {
167 t.Error("Fake host snapshot not empty when disabled")
168 }
169
170}