| // Copyright 2021 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package snapshot |
| |
| import ( |
| "path/filepath" |
| "testing" |
| |
| "android/soong/android" |
| ) |
| |
| // host_snapshot and host-fake-snapshot test functions |
| |
| type hostTestModule struct { |
| android.ModuleBase |
| props struct { |
| Deps []string |
| } |
| } |
| |
| func hostTestBinOut(bin string) string { |
| return filepath.Join("out", "bin", bin) |
| } |
| |
| func (c *hostTestModule) HostToolPath() android.OptionalPath { |
| return (android.OptionalPathForPath(android.PathForTesting(hostTestBinOut(c.Name())))) |
| } |
| |
| func hostTestModuleFactory() android.Module { |
| m := &hostTestModule{} |
| m.AddProperties(&m.props) |
| android.InitAndroidArchModule(m, android.HostSupported, android.MultilibFirst) |
| return m |
| } |
| func (m *hostTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { |
| builtFile := android.PathForModuleOut(ctx, m.Name()) |
| dir := ctx.Target().Arch.ArchType.Multilib |
| installDir := android.PathForModuleInstall(ctx, dir) |
| ctx.InstallFile(installDir, m.Name(), builtFile) |
| } |
| |
| // Common blueprint used for testing |
| var hostTestBp = ` |
| license_kind { |
| name: "test_notice", |
| conditions: ["notice"], |
| } |
| license { |
| name: "host_test_license", |
| visibility: ["//visibility:public"], |
| license_kinds: [ |
| "test_notice" |
| ], |
| license_text: [ |
| "NOTICE", |
| ], |
| } |
| component { |
| name: "foo", |
| deps: ["bar"], |
| } |
| component { |
| name: "bar", |
| licenses: ["host_test_license"], |
| } |
| ` |
| |
| var hostTestModBp = ` |
| host_snapshot { |
| name: "test-host-snapshot", |
| deps: [ |
| "foo", |
| ], |
| } |
| ` |
| |
| var prepareForHostTest = android.GroupFixturePreparers( |
| android.PrepareForTestWithAndroidBuildComponents, |
| android.PrepareForTestWithLicenses, |
| android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { |
| ctx.RegisterModuleType("component", hostTestModuleFactory) |
| }), |
| ) |
| |
| // Prepare for host_snapshot test |
| var prepareForHostModTest = android.GroupFixturePreparers( |
| prepareForHostTest, |
| android.FixtureWithRootAndroidBp(hostTestBp+hostTestModBp), |
| android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { |
| registerHostBuildComponents(ctx) |
| }), |
| ) |
| |
| // Prepare for fake host snapshot test disabled |
| var prepareForFakeHostTest = android.GroupFixturePreparers( |
| prepareForHostTest, |
| android.FixtureWithRootAndroidBp(hostTestBp), |
| android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { |
| registerHostSnapshotComponents(ctx) |
| }), |
| ) |
| |
| // Prepare for fake host snapshot test enabled |
| var prepareForFakeHostTestEnabled = android.GroupFixturePreparers( |
| prepareForFakeHostTest, |
| android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { |
| variables.HostFakeSnapshotEnabled = true |
| }), |
| ) |
| |
| // Validate that a hostSnapshot object is created containing zip files and JSON file |
| // content of zip file is not validated as this is done by PackagingSpecs |
| func TestHostSnapshot(t *testing.T) { |
| result := prepareForHostModTest.RunTest(t) |
| t.Helper() |
| ctx := result.TestContext.ModuleForTests("test-host-snapshot", result.Config.BuildOS.String()+"_common") |
| mod := ctx.Module().(*hostSnapshot) |
| if ctx.MaybeOutput("host_snapshot.json").Rule == nil { |
| t.Error("Manifest file not found") |
| } |
| zips := []string{"_deps.zip", "_mods.zip", ".zip"} |
| |
| for _, zip := range zips { |
| zFile := mod.Name() + zip |
| if ctx.MaybeOutput(zFile).Rule == nil { |
| t.Error("Zip file ", zFile, "not found") |
| } |
| |
| } |
| } |
| |
| // Validate fake host snapshot contains binary modules as well as the JSON meta file |
| func TestFakeHostSnapshotEnable(t *testing.T) { |
| result := prepareForFakeHostTestEnabled.RunTest(t) |
| t.Helper() |
| bins := []string{"foo", "bar"} |
| ctx := result.TestContext.SingletonForTests("host-fake-snapshot") |
| if ctx.MaybeOutput(filepath.Join("host-fake-snapshot", "host_snapshot.json")).Rule == nil { |
| t.Error("Manifest file not found") |
| } |
| for _, bin := range bins { |
| if ctx.MaybeOutput(filepath.Join("host-fake-snapshot", hostTestBinOut(bin))).Rule == nil { |
| t.Error("Binary file ", bin, "not found") |
| } |
| |
| } |
| } |
| |
| // Validate not fake host snapshot if HostFakeSnapshotEnabled has not been set to true |
| func TestFakeHostSnapshotDisable(t *testing.T) { |
| result := prepareForFakeHostTest.RunTest(t) |
| t.Helper() |
| ctx := result.TestContext.SingletonForTests("host-fake-snapshot") |
| if len(ctx.AllOutputs()) != 0 { |
| t.Error("Fake host snapshot not empty when disabled") |
| } |
| |
| } |