// 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") } }