|  | // Copyright (C) 2019 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 sdk | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "testing" | 
|  |  | 
|  | "android/soong/android" | 
|  | "android/soong/cc" | 
|  | ) | 
|  |  | 
|  | var ccTestFs = android.MockFS{ | 
|  | "Test.cpp":                        nil, | 
|  | "myinclude/Test.h":                nil, | 
|  | "myinclude-android/AndroidTest.h": nil, | 
|  | "myinclude-host/HostTest.h":       nil, | 
|  | "arm64/include/Arm64Test.h":       nil, | 
|  | "libfoo.so":                       nil, | 
|  | "aidl/foo/bar/Test.aidl":          nil, | 
|  | "some/where/stubslib.map.txt":     nil, | 
|  | } | 
|  |  | 
|  | // Adds a native bridge target to the configured list of targets. | 
|  | var prepareForTestWithNativeBridgeTarget = android.FixtureModifyConfig(func(config android.Config) { | 
|  | config.Targets[android.Android] = append(config.Targets[android.Android], android.Target{ | 
|  | Os: android.Android, | 
|  | Arch: android.Arch{ | 
|  | ArchType:     android.Arm64, | 
|  | ArchVariant:  "armv8-a", | 
|  | CpuVariant:   "cpu", | 
|  | Abi:          nil, | 
|  | ArchFeatures: nil, | 
|  | }, | 
|  | NativeBridge:             android.NativeBridgeEnabled, | 
|  | NativeBridgeHostArchName: "x86_64", | 
|  | NativeBridgeRelativePath: "native_bridge", | 
|  | }) | 
|  | }) | 
|  |  | 
|  | func testSdkWithCc(t *testing.T, bp string) *android.TestResult { | 
|  | t.Helper() | 
|  | return testSdkWithFs(t, bp, ccTestFs) | 
|  | } | 
|  |  | 
|  | // Contains tests for SDK members provided by the cc package. | 
|  |  | 
|  | func TestSingleDeviceOsAssumption(t *testing.T) { | 
|  | // Mock a module with DeviceSupported() == true. | 
|  | s := &sdk{} | 
|  | android.InitAndroidArchModule(s, android.DeviceSupported, android.MultilibCommon) | 
|  |  | 
|  | osTypes := s.getPossibleOsTypes() | 
|  | if len(osTypes) != 1 { | 
|  | // The snapshot generation assumes there is a single device OS. If more are | 
|  | // added it might need to disable them by default, like it does for host | 
|  | // OS'es. | 
|  | t.Errorf("expected a single device OS, got %v", osTypes) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestSdkIsCompileMultilibBoth(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["sdkmember"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "sdkmember", | 
|  | srcs: ["Test.cpp"], | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | armOutput := result.Module("sdkmember", "android_arm_armv7-a-neon_shared").(*cc.Module).OutputFile() | 
|  | arm64Output := result.Module("sdkmember", "android_arm64_armv8-a_shared").(*cc.Module).OutputFile() | 
|  |  | 
|  | var inputs []string | 
|  | buildParams := result.Module("mysdk", android.CommonOS.Name).BuildParamsForTests() | 
|  | for _, bp := range buildParams { | 
|  | if bp.Input != nil { | 
|  | inputs = append(inputs, bp.Input.String()) | 
|  | } | 
|  | } | 
|  |  | 
|  | // ensure that both 32/64 outputs are inputs of the sdk snapshot | 
|  | ensureListContains(t, inputs, armOutput.String()) | 
|  | ensureListContains(t, inputs, arm64Output.String()) | 
|  | } | 
|  |  | 
|  | func TestSdkCompileMultilibOverride(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | host_supported: true, | 
|  | native_shared_libs: ["sdkmember"], | 
|  | compile_multilib: "64", | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "sdkmember", | 
|  | host_supported: true, | 
|  | srcs: ["Test.cpp"], | 
|  | stl: "none", | 
|  | compile_multilib: "64", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_sdkmember"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "sdkmember", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "64", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android_arm64: { | 
|  | srcs: ["android/arm64/lib/sdkmember.so"], | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86_64/lib/sdkmember.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/sdkmember/android_arm64_armv8-a_shared/sdkmember.so -> android/arm64/lib/sdkmember.so | 
|  | .intermediates/sdkmember/linux_glibc_x86_64_shared/sdkmember.so -> linux_glibc/x86_64/lib/sdkmember.so | 
|  | `)) | 
|  | } | 
|  |  | 
|  | // Make sure the sdk can use host specific cc libraries static/shared and both. | 
|  | func TestHostSdkWithCc(t *testing.T) { | 
|  | testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | native_shared_libs: ["sdkshared"], | 
|  | native_static_libs: ["sdkstatic"], | 
|  | } | 
|  |  | 
|  | cc_library_host_shared { | 
|  | name: "sdkshared", | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library_host_static { | 
|  | name: "sdkstatic", | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  | } | 
|  |  | 
|  | // Make sure the sdk can use cc libraries static/shared and both. | 
|  | func TestSdkWithCc(t *testing.T) { | 
|  | testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["sdkshared", "sdkboth1"], | 
|  | native_static_libs: ["sdkstatic", "sdkboth2"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "sdkshared", | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library_static { | 
|  | name: "sdkstatic", | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "sdkboth1", | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "sdkboth2", | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithObject(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_objects: ["crtobj"], | 
|  | } | 
|  |  | 
|  | cc_object { | 
|  | name: "crtobj", | 
|  | stl: "none", | 
|  | system_shared_libs: [], | 
|  | sanitize: { | 
|  | never: true, | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_crtobj"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_object { | 
|  | name: "crtobj", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | system_shared_libs: [], | 
|  | sanitize: { | 
|  | never: true, | 
|  | }, | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/crtobj.o"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/crtobj.o"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/crtobj/android_arm64_armv8-a/crtobj.o -> arm64/lib/crtobj.o | 
|  | .intermediates/crtobj/android_arm_armv7-a-neon/crtobj.o -> arm/lib/crtobj.o | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcDuplicateHeaders(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["mynativelib1", "mynativelib2"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib1", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib2", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib1/android_arm64_armv8-a_shared/mynativelib1.so -> arm64/lib/mynativelib1.so | 
|  | .intermediates/mynativelib1/android_arm_armv7-a-neon_shared/mynativelib1.so -> arm/lib/mynativelib1.so | 
|  | .intermediates/mynativelib2/android_arm64_armv8-a_shared/mynativelib2.so -> arm64/lib/mynativelib2.so | 
|  | .intermediates/mynativelib2/android_arm_armv7-a-neon_shared/mynativelib2.so -> arm/lib/mynativelib2.so | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcExportGeneratedHeaders(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | generated_headers: [ | 
|  | "generated_foo", | 
|  | ], | 
|  | export_generated_headers: [ | 
|  | "generated_foo", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | genrule { | 
|  | name: "generated_foo", | 
|  | cmd: "generate-foo", | 
|  | out: [ | 
|  | "generated_foo/protos/foo/bar.h", | 
|  | ], | 
|  | export_include_dirs: [ | 
|  | ".", | 
|  | "protos", | 
|  | ], | 
|  | } | 
|  | `) | 
|  |  | 
|  | // TODO(b/183322862): Remove this and fix the issue. | 
|  | errorHandler := android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module source path "snapshot/include_gen/generated_foo/gen/protos" does not exist`) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: [ | 
|  | "include/myinclude", | 
|  | "include_gen/generated_foo/gen", | 
|  | "include_gen/generated_foo/gen/protos", | 
|  | ], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/mynativelib.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/generated_foo/gen/generated_foo/protos/foo/bar.h -> include_gen/generated_foo/gen/generated_foo/protos/foo/bar.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so | 
|  | `), | 
|  | snapshotTestErrorHandler(checkSnapshotWithoutSource, errorHandler), | 
|  | snapshotTestErrorHandler(checkSnapshotWithSourcePreferred, errorHandler), | 
|  | snapshotTestErrorHandler(checkSnapshotPreferredWithSource, errorHandler), | 
|  | ) | 
|  | } | 
|  |  | 
|  | // Verify that when the shared library has some common and some arch specific | 
|  | // properties that the generated snapshot is optimized properly. Substruct | 
|  | // handling is tested with the sanitize clauses (but note there's a lot of | 
|  | // built-in logic in sanitize.go that can affect those flags). | 
|  | func TestSnapshotWithCcSharedLibraryCommonProperties(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | "aidl/foo/bar/Test.aidl", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | sanitize: { | 
|  | fuzzer: false, | 
|  | integer_overflow: true, | 
|  | diag: { undefined: false }, | 
|  | }, | 
|  | arch: { | 
|  | arm64: { | 
|  | export_system_include_dirs: ["arm64/include"], | 
|  | sanitize: { | 
|  | integer_overflow: false, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | sanitize: { | 
|  | fuzzer: false, | 
|  | diag: { | 
|  | undefined: false, | 
|  | }, | 
|  | }, | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/mynativelib.so"], | 
|  | export_system_include_dirs: ["arm64/include/arm64/include"], | 
|  | sanitize: { | 
|  | integer_overflow: false, | 
|  | }, | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mynativelib.so"], | 
|  | sanitize: { | 
|  | integer_overflow: true, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so | 
|  | arm64/include/Arm64Test.h -> arm64/include/arm64/include/Arm64Test.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so`), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcBinary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "mymodule_exports", | 
|  | native_binaries: ["mynativebinary"], | 
|  | } | 
|  |  | 
|  | cc_binary { | 
|  | name: "mynativebinary", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | compile_multilib: "both", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mymodule_exports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mymodule_exports.contributions", | 
|  | contents: ["prebuilt_mynativebinary"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_binary { | 
|  | name: "mynativebinary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | compile_multilib: "both", | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/bin/mynativebinary"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/bin/mynativebinary"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativebinary/android_arm64_armv8-a/mynativebinary -> arm64/bin/mynativebinary | 
|  | .intermediates/mynativebinary/android_arm_armv7-a-neon/mynativebinary -> arm/bin/mynativebinary | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestMultipleHostOsTypesSnapshotWithCcBinary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "myexports", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | native_binaries: ["mynativebinary"], | 
|  | target: { | 
|  | windows: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_binary { | 
|  | name: "mynativebinary", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | compile_multilib: "both", | 
|  | stl: "none", | 
|  | target: { | 
|  | windows: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativebinary"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_binary { | 
|  | name: "mynativebinary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc: { | 
|  | compile_multilib: "both", | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86_64/bin/mynativebinary"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86/bin/mynativebinary"], | 
|  | }, | 
|  | windows: { | 
|  | compile_multilib: "64", | 
|  | }, | 
|  | windows_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["windows/x86_64/bin/mynativebinary.exe"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativebinary/linux_glibc_x86_64/mynativebinary -> linux_glibc/x86_64/bin/mynativebinary | 
|  | .intermediates/mynativebinary/linux_glibc_x86/mynativebinary -> linux_glibc/x86/bin/mynativebinary | 
|  | .intermediates/mynativebinary/windows_x86_64/mynativebinary.exe -> windows/x86_64/bin/mynativebinary.exe | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithSingleHostOsType(t *testing.T) { | 
|  | result := android.GroupFixturePreparers( | 
|  | prepareForSdkTest, | 
|  | ccTestFs.AddToFixture(), | 
|  | cc.PrepareForTestOnLinuxBionic, | 
|  | android.FixtureModifyConfig(func(config android.Config) { | 
|  | config.Targets[android.LinuxBionic] = []android.Target{ | 
|  | {android.LinuxBionic, android.Arch{ArchType: android.X86_64}, android.NativeBridgeDisabled, "", "", false}, | 
|  | } | 
|  | }), | 
|  | ).RunTestWithBp(t, ` | 
|  | cc_defaults { | 
|  | name: "mydefaults", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | compile_multilib: "64", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_bionic: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | module_exports { | 
|  | name: "myexports", | 
|  | defaults: ["mydefaults"], | 
|  | native_shared_libs: ["mynativelib"], | 
|  | native_binaries: ["mynativebinary"], | 
|  | compile_multilib: "64",  // The built-in default in sdk.go overrides mydefaults. | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mynativelib", | 
|  | defaults: ["mydefaults"], | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_binary { | 
|  | name: "mynativebinary", | 
|  | defaults: ["mydefaults"], | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: [ | 
|  | "prebuilt_mynativebinary", | 
|  | "prebuilt_mynativelib", | 
|  | ], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_binary { | 
|  | name: "mynativebinary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "64", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_bionic_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["x86_64/bin/mynativebinary"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "64", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_bionic_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["x86_64/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativebinary/linux_bionic_x86_64/mynativebinary -> x86_64/bin/mynativebinary | 
|  | .intermediates/mynativelib/linux_bionic_x86_64_shared/mynativelib.so -> x86_64/lib/mynativelib.so | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | // Test that we support the necessary flags for the linker binary, which is | 
|  | // special in several ways. | 
|  | func TestSnapshotWithCcStaticNocrtBinary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "mymodule_exports", | 
|  | host_supported: true, | 
|  | device_supported: false, | 
|  | native_binaries: ["linker"], | 
|  | } | 
|  |  | 
|  | cc_binary { | 
|  | name: "linker", | 
|  | host_supported: true, | 
|  | static_executable: true, | 
|  | nocrt: true, | 
|  | stl: "none", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | compile_multilib: "both", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mymodule_exports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mymodule_exports.contributions", | 
|  | contents: ["prebuilt_linker"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_binary { | 
|  | name: "linker", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | static_executable: true, | 
|  | nocrt: true, | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["x86_64/bin/linker"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["x86/bin/linker"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/linker/linux_glibc_x86_64/linker -> x86_64/bin/linker | 
|  | .intermediates/linker/linux_glibc_x86/linker -> x86/bin/linker | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcSharedLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | "aidl/foo/bar/Test.aidl", | 
|  | ], | 
|  | apex_available: ["apex1", "apex2"], | 
|  | export_include_dirs: ["myinclude"], | 
|  | aidl: { | 
|  | export_aidl_headers: true, | 
|  | }, | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: [ | 
|  | "apex1", | 
|  | "apex2", | 
|  | ], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/mynativelib.so"], | 
|  | export_include_dirs: ["arm64/include_gen/mynativelib/android_arm64_armv8-a_shared/gen/aidl"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mynativelib.so"], | 
|  | export_include_dirs: ["arm/include_gen/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/gen/aidl/aidl/foo/bar/Test.h -> arm64/include_gen/mynativelib/android_arm64_armv8-a_shared/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/gen/aidl/aidl/foo/bar/BnTest.h -> arm64/include_gen/mynativelib/android_arm64_armv8-a_shared/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/gen/aidl/aidl/foo/bar/BpTest.h -> arm64/include_gen/mynativelib/android_arm64_armv8-a_shared/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl/aidl/foo/bar/Test.h -> arm/include_gen/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl/aidl/foo/bar/BnTest.h -> arm/include_gen/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl/aidl/foo/bar/BpTest.h -> arm/include_gen/mynativelib/android_arm_armv7-a-neon_shared/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcSharedLibrarySharedLibs(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: [ | 
|  | "mynativelib", | 
|  | "myothernativelib", | 
|  | "mysystemnativelib", | 
|  | ], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mysystemnativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "myothernativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | system_shared_libs: [ | 
|  | // A reference to a library that is not an sdk member. Uses libm as that | 
|  | // is in the default set of modules available to this test and so is available | 
|  | // both here and also when the generated Android.bp file is tested in | 
|  | // CheckSnapshot(). This ensures that the system_shared_libs property correctly | 
|  | // handles references to modules that are not sdk members. | 
|  | "libm", | 
|  | ], | 
|  | stl: "none", | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mynativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | shared_libs: [ | 
|  | // A reference to another sdk member. | 
|  | "myothernativelib", | 
|  | ], | 
|  | target: { | 
|  | android: { | 
|  | shared: { | 
|  | shared_libs: [ | 
|  | // A reference to a library that is not an sdk member. The libc library | 
|  | // is used here to check that the shared_libs property is handled correctly | 
|  | // in a similar way to how libm is used to check system_shared_libs above. | 
|  | "libc", | 
|  | ], | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: [ | 
|  | "prebuilt_mynativelib", | 
|  | "prebuilt_myothernativelib", | 
|  | "prebuilt_mysystemnativelib", | 
|  | ], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | shared_libs: [ | 
|  | "myothernativelib", | 
|  | "libc", | 
|  | ], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/mynativelib.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "myothernativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | system_shared_libs: ["libm"], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/myothernativelib.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/myothernativelib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mysystemnativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/mysystemnativelib.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mysystemnativelib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so | 
|  | .intermediates/myothernativelib/android_arm64_armv8-a_shared/myothernativelib.so -> arm64/lib/myothernativelib.so | 
|  | .intermediates/myothernativelib/android_arm_armv7-a-neon_shared/myothernativelib.so -> arm/lib/myothernativelib.so | 
|  | .intermediates/mysystemnativelib/android_arm64_armv8-a_shared/mysystemnativelib.so -> arm64/lib/mysystemnativelib.so | 
|  | .intermediates/mysystemnativelib/android_arm_armv7-a-neon_shared/mysystemnativelib.so -> arm/lib/mysystemnativelib.so | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestHostSnapshotWithCcSharedLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | native_shared_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | "aidl/foo/bar/Test.aidl", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | aidl: { | 
|  | export_aidl_headers: true, | 
|  | }, | 
|  | stl: "none", | 
|  | sdk_version: "minimum", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | sdk_version: "minimum", | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["x86_64/lib/mynativelib.so"], | 
|  | export_include_dirs: ["x86_64/include_gen/mynativelib/linux_glibc_x86_64_shared/gen/aidl"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["x86/lib/mynativelib.so"], | 
|  | export_include_dirs: ["x86/include_gen/mynativelib/linux_glibc_x86_shared/gen/aidl"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> x86_64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/Test.h -> x86_64/include_gen/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BnTest.h -> x86_64/include_gen/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BpTest.h -> x86_64/include_gen/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> x86/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/Test.h -> x86/include_gen/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/BnTest.h -> x86/include_gen/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/BpTest.h -> x86/include_gen/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestMultipleHostOsTypesSnapshotWithCcSharedLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | native_shared_libs: ["mynativelib"], | 
|  | target: { | 
|  | windows: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | stl: "none", | 
|  | target: { | 
|  | windows: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc: { | 
|  | compile_multilib: "both", | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86_64/lib/mynativelib.so"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86/lib/mynativelib.so"], | 
|  | }, | 
|  | windows: { | 
|  | compile_multilib: "64", | 
|  | }, | 
|  | windows_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["windows/x86_64/lib/mynativelib.dll"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> linux_glibc/x86_64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> linux_glibc/x86/lib/mynativelib.so | 
|  | .intermediates/mynativelib/windows_x86_64_shared/mynativelib.dll -> windows/x86_64/lib/mynativelib.dll | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcStaticLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "myexports", | 
|  | native_static_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_static { | 
|  | name: "mynativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | "aidl/foo/bar/Test.aidl", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | aidl: { | 
|  | export_aidl_headers: true, | 
|  | }, | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_static { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/mynativelib.a"], | 
|  | export_include_dirs: ["arm64/include_gen/mynativelib/android_arm64_armv8-a_static/gen/aidl"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mynativelib.a"], | 
|  | export_include_dirs: ["arm/include_gen/mynativelib/android_arm_armv7-a-neon_static/gen/aidl"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> arm64/lib/mynativelib.a | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_static/gen/aidl/aidl/foo/bar/Test.h -> arm64/include_gen/mynativelib/android_arm64_armv8-a_static/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_static/gen/aidl/aidl/foo/bar/BnTest.h -> arm64/include_gen/mynativelib/android_arm64_armv8-a_static/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_static/gen/aidl/aidl/foo/bar/BpTest.h -> arm64/include_gen/mynativelib/android_arm64_armv8-a_static/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_static/gen/aidl/aidl/foo/bar/Test.h -> arm/include_gen/mynativelib/android_arm_armv7-a-neon_static/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_static/gen/aidl/aidl/foo/bar/BnTest.h -> arm/include_gen/mynativelib/android_arm_armv7-a-neon_static/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_static/gen/aidl/aidl/foo/bar/BpTest.h -> arm/include_gen/mynativelib/android_arm_armv7-a-neon_static/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestHostSnapshotWithCcStaticLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "myexports", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | native_static_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_static { | 
|  | name: "mynativelib", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | "aidl/foo/bar/Test.aidl", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | aidl: { | 
|  | export_aidl_headers: true, | 
|  | }, | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_static { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["x86_64/lib/mynativelib.a"], | 
|  | export_include_dirs: ["x86_64/include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["x86/lib/mynativelib.a"], | 
|  | export_include_dirs: ["x86/include_gen/mynativelib/linux_glibc_x86_static/gen/aidl"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/mynativelib.a -> x86_64/lib/mynativelib.a | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h -> x86_64/include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BnTest.h -> x86_64/include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BpTest.h -> x86_64/include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_static/mynativelib.a -> x86/lib/mynativelib.a | 
|  | .intermediates/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/Test.h -> x86/include_gen/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/BnTest.h -> x86/include_gen/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/BpTest.h -> x86/include_gen/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "myexports", | 
|  | native_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mynativelib", | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | recovery_available: true, | 
|  | vendor_available: true, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | vendor_available: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | arch: { | 
|  | arm64: { | 
|  | static: { | 
|  | srcs: ["arm64/lib/mynativelib.a"], | 
|  | }, | 
|  | shared: { | 
|  | srcs: ["arm64/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | arm: { | 
|  | static: { | 
|  | srcs: ["arm/lib/mynativelib.a"], | 
|  | }, | 
|  | shared: { | 
|  | srcs: ["arm/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> arm64/lib/mynativelib.a | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so | 
|  | `), | 
|  | // TODO(b/183315522): Remove this and fix the issue. | 
|  | snapshotTestErrorHandler(checkSnapshotPreferredWithSource, android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\Qunrecognized property "arch.arm.shared.export_include_dirs"\E`)), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotSameLibraryWithNativeLibsAndNativeSharedLib(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | host_supported: true, | 
|  | name: "myexports", | 
|  | target: { | 
|  | android: { | 
|  | native_shared_libs: [ | 
|  | "mynativelib", | 
|  | ], | 
|  | }, | 
|  | not_windows: { | 
|  | native_libs: [ | 
|  | "mynativelib", | 
|  | ], | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mynativelib", | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | stl: "none", | 
|  | recovery_available: true, | 
|  | vendor_available: true, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | vendor_available: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android_arm64: { | 
|  | shared: { | 
|  | srcs: ["android/arm64/lib/mynativelib.so"], | 
|  | }, | 
|  | static: { | 
|  | enabled: false, | 
|  | }, | 
|  | }, | 
|  | android_arm: { | 
|  | shared: { | 
|  | srcs: ["android/arm/lib/mynativelib.so"], | 
|  | }, | 
|  | static: { | 
|  | enabled: false, | 
|  | }, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | static: { | 
|  | srcs: ["linux_glibc/x86_64/lib/mynativelib.a"], | 
|  | }, | 
|  | shared: { | 
|  | srcs: ["linux_glibc/x86_64/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | static: { | 
|  | srcs: ["linux_glibc/x86/lib/mynativelib.a"], | 
|  | }, | 
|  | shared: { | 
|  | srcs: ["linux_glibc/x86/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> android/arm64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> android/arm/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/mynativelib.a -> linux_glibc/x86_64/lib/mynativelib.a | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> linux_glibc/x86_64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_static/mynativelib.a -> linux_glibc/x86/lib/mynativelib.a | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> linux_glibc/x86/lib/mynativelib.so | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotSameLibraryWithAndroidNativeLibsAndHostNativeSharedLib(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | host_supported: true, | 
|  | name: "myexports", | 
|  | target: { | 
|  | android: { | 
|  | native_libs: [ | 
|  | "mynativelib", | 
|  | ], | 
|  | }, | 
|  | not_windows: { | 
|  | native_shared_libs: [ | 
|  | "mynativelib", | 
|  | ], | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mynativelib", | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | ], | 
|  | stl: "none", | 
|  | recovery_available: true, | 
|  | vendor_available: true, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | vendor_available: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android_arm64: { | 
|  | static: { | 
|  | srcs: ["android/arm64/lib/mynativelib.a"], | 
|  | }, | 
|  | shared: { | 
|  | srcs: ["android/arm64/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | android_arm: { | 
|  | static: { | 
|  | srcs: ["android/arm/lib/mynativelib.a"], | 
|  | }, | 
|  | shared: { | 
|  | srcs: ["android/arm/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | shared: { | 
|  | srcs: ["linux_glibc/x86_64/lib/mynativelib.so"], | 
|  | }, | 
|  | static: { | 
|  | enabled: false, | 
|  | }, | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | shared: { | 
|  | srcs: ["linux_glibc/x86/lib/mynativelib.so"], | 
|  | }, | 
|  | static: { | 
|  | enabled: false, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> android/arm64/lib/mynativelib.a | 
|  | .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> android/arm64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> android/arm/lib/mynativelib.a | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> android/arm/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> linux_glibc/x86_64/lib/mynativelib.so | 
|  | .intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> linux_glibc/x86/lib/mynativelib.so | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotSameLibraryWithNativeStaticLibsAndNativeSharedLib(t *testing.T) { | 
|  | testSdkError(t, "Incompatible member types", ` | 
|  | module_exports { | 
|  | host_supported: true, | 
|  | name: "myexports", | 
|  | target: { | 
|  | android: { | 
|  | native_shared_libs: [ | 
|  | "mynativelib", | 
|  | ], | 
|  | }, | 
|  | not_windows: { | 
|  | native_static_libs: [ | 
|  | "mynativelib", | 
|  | ], | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mynativelib", | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | ], | 
|  | stl: "none", | 
|  | recovery_available: true, | 
|  | vendor_available: true, | 
|  | } | 
|  | `) | 
|  | } | 
|  |  | 
|  | func TestHostSnapshotWithMultiLib64(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | module_exports { | 
|  | name: "myexports", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | target: { | 
|  | host: { | 
|  | compile_multilib: "64", | 
|  | }, | 
|  | }, | 
|  | native_static_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_static { | 
|  | name: "mynativelib", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | srcs: [ | 
|  | "Test.cpp", | 
|  | "aidl/foo/bar/Test.aidl", | 
|  | ], | 
|  | export_include_dirs: ["myinclude"], | 
|  | aidl: { | 
|  | export_aidl_headers: true, | 
|  | }, | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "myexports", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "myexports.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_static { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "64", | 
|  | export_include_dirs: [ | 
|  | "include/myinclude", | 
|  | "include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl", | 
|  | ], | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["x86_64/lib/mynativelib.a"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h -> include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BnTest.h -> include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BnTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BpTest.h -> include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BpTest.h | 
|  | .intermediates/mynativelib/linux_glibc_x86_64_static/mynativelib.a -> x86_64/lib/mynativelib.a | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcHeadersLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_header_libs: ["mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_library_headers { | 
|  | name: "mynativeheaders", | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_headers { | 
|  | name: "mynativeheaders", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcHeadersLibraryAndNativeBridgeSupport(t *testing.T) { | 
|  | result := android.GroupFixturePreparers( | 
|  | cc.PrepareForTestWithCcDefaultModules, | 
|  | PrepareForTestWithSdkBuildComponents, | 
|  | ccTestFs.AddToFixture(), | 
|  | prepareForTestWithNativeBridgeTarget, | 
|  | android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { | 
|  | android.RegisterApexContributionsBuildComponents(ctx) | 
|  | }), | 
|  | ).RunTestWithBp(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_header_libs: ["mynativeheaders"], | 
|  | traits: { | 
|  | native_bridge_support: ["mynativeheaders"], | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library_headers { | 
|  | name: "mynativeheaders", | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | system_shared_libs: [], | 
|  | native_bridge_supported: true, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_headers { | 
|  | name: "mynativeheaders", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | native_bridge_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | system_shared_libs: [], | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | // TestSnapshotWithCcHeadersLibrary_DetectsNativeBridgeSpecificProperties verifies that when a | 
|  | // module that has different output files for a native bridge target requests the native bridge | 
|  | // variants are copied into the sdk snapshot that it reports an error. | 
|  | func TestSnapshotWithCcHeadersLibrary_DetectsNativeBridgeSpecificProperties(t *testing.T) { | 
|  | android.GroupFixturePreparers( | 
|  | cc.PrepareForTestWithCcDefaultModules, | 
|  | PrepareForTestWithSdkBuildComponents, | 
|  | ccTestFs.AddToFixture(), | 
|  | prepareForTestWithNativeBridgeTarget, | 
|  | ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( | 
|  | `\QArchitecture variant "arm64_native_bridge" of sdk member "mynativeheaders" has properties distinct from other variants; this is not yet supported. The properties are: | 
|  | export_include_dirs: [ | 
|  | "arm64_native_bridge/include/myinclude_nativebridge", | 
|  | "arm64_native_bridge/include/myinclude", | 
|  | ],\E`)). | 
|  | RunTestWithBp(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_header_libs: ["mynativeheaders"], | 
|  | traits: { | 
|  | native_bridge_support: ["mynativeheaders"], | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library_headers { | 
|  | name: "mynativeheaders", | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | system_shared_libs: [], | 
|  | native_bridge_supported: true, | 
|  | target: { | 
|  | native_bridge: { | 
|  | export_include_dirs: ["myinclude_nativebridge"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithCcHeadersLibraryAndImageVariants(t *testing.T) { | 
|  | testImageVariant := func(t *testing.T, property, trait string) { | 
|  | result := android.GroupFixturePreparers( | 
|  | cc.PrepareForTestWithCcDefaultModules, | 
|  | PrepareForTestWithSdkBuildComponents, | 
|  | ccTestFs.AddToFixture(), | 
|  | android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { | 
|  | android.RegisterApexContributionsBuildComponents(ctx) | 
|  | }), | 
|  | ).RunTestWithBp(t, fmt.Sprintf(` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_header_libs: ["mynativeheaders"], | 
|  | traits: { | 
|  | %s: ["mynativeheaders"], | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_library_headers { | 
|  | name: "mynativeheaders", | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | system_shared_libs: [], | 
|  | %s: true, | 
|  | } | 
|  | `, trait, property)) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(fmt.Sprintf(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_headers { | 
|  | name: "mynativeheaders", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | %s: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | system_shared_libs: [], | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | } | 
|  | `, property)), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | t.Run("ramdisk", func(t *testing.T) { | 
|  | testImageVariant(t, "ramdisk_available", "ramdisk_image_required") | 
|  | }) | 
|  |  | 
|  | t.Run("recovery", func(t *testing.T) { | 
|  | testImageVariant(t, "recovery_available", "recovery_image_required") | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestHostSnapshotWithCcHeadersLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | native_header_libs: ["mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_library_headers { | 
|  | name: "mynativeheaders", | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | export_include_dirs: ["myinclude"], | 
|  | stl: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_headers { | 
|  | name: "mynativeheaders", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | device_supported: false, | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestDeviceAndHostSnapshotWithCcHeadersLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | host_supported: true, | 
|  | native_header_libs: ["mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_library_headers { | 
|  | name: "mynativeheaders", | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | export_system_include_dirs: ["myinclude"], | 
|  | target: { | 
|  | android: { | 
|  | export_include_dirs: ["myinclude-android"], | 
|  | }, | 
|  | host: { | 
|  | export_include_dirs: ["myinclude-host"], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativeheaders"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_headers { | 
|  | name: "mynativeheaders", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | export_system_include_dirs: ["common_os/include/myinclude"], | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android: { | 
|  | export_include_dirs: ["android/include/myinclude-android"], | 
|  | }, | 
|  | linux_glibc: { | 
|  | export_include_dirs: ["linux_glibc/include/myinclude-host"], | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> common_os/include/myinclude/Test.h | 
|  | myinclude-android/AndroidTest.h -> android/include/myinclude-android/AndroidTest.h | 
|  | myinclude-host/HostTest.h -> linux_glibc/include/myinclude-host/HostTest.h | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSystemSharedLibPropagation(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["sslnil", "sslempty", "sslnonempty"], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "sslnil", | 
|  | host_supported: true, | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "sslempty", | 
|  | system_shared_libs: [], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "sslnonempty", | 
|  | system_shared_libs: ["sslnil"], | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: [ | 
|  | "prebuilt_sslnil", | 
|  | "prebuilt_sslempty", | 
|  | "prebuilt_sslnonempty", | 
|  | ], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "sslnil", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | compile_multilib: "both", | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/sslnil.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/sslnil.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "sslempty", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | compile_multilib: "both", | 
|  | system_shared_libs: [], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/sslempty.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/sslempty.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "sslnonempty", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | compile_multilib: "both", | 
|  | system_shared_libs: ["sslnil"], | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/sslnonempty.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/sslnonempty.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `)) | 
|  |  | 
|  | result = testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | host_supported: true, | 
|  | native_shared_libs: ["sslvariants"], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "sslvariants", | 
|  | host_supported: true, | 
|  | target: { | 
|  | android: { | 
|  | system_shared_libs: [], | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_sslvariants"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "sslvariants", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | compile_multilib: "both", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android: { | 
|  | system_shared_libs: [], | 
|  | }, | 
|  | android_arm64: { | 
|  | srcs: ["android/arm64/lib/sslvariants.so"], | 
|  | }, | 
|  | android_arm: { | 
|  | srcs: ["android/arm/lib/sslvariants.so"], | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86_64/lib/sslvariants.so"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86/lib/sslvariants.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestStubsLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["stubslib"], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "internaldep", | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "stubslib", | 
|  | shared_libs: ["internaldep"], | 
|  | stubs: { | 
|  | symbol_file: "some/where/stubslib.map.txt", | 
|  | versions: ["1", "2", "3"], | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_stubslib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "stubslib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | stl: "none", | 
|  | compile_multilib: "both", | 
|  | stubs: { | 
|  | versions: [ | 
|  | "1", | 
|  | "2", | 
|  | "3", | 
|  | "current", | 
|  | ], | 
|  | symbol_file: "stubslib.map.txt", | 
|  | }, | 
|  | arch: { | 
|  | arm64: { | 
|  | srcs: ["arm64/lib/stubslib.so"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/stubslib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `)) | 
|  | } | 
|  |  | 
|  | func TestDeviceAndHostSnapshotWithStubsLibrary(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | host_supported: true, | 
|  | native_shared_libs: ["stubslib"], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "internaldep", | 
|  | host_supported: true, | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "stubslib", | 
|  | host_supported: true, | 
|  | shared_libs: ["internaldep"], | 
|  | stubs: { | 
|  | symbol_file: "some/where/stubslib.map.txt", | 
|  | versions: ["1", "2", "3"], | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_stubslib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "stubslib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | compile_multilib: "both", | 
|  | stubs: { | 
|  | versions: [ | 
|  | "1", | 
|  | "2", | 
|  | "3", | 
|  | "current", | 
|  | ], | 
|  | symbol_file: "stubslib.map.txt", | 
|  | }, | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android_arm64: { | 
|  | srcs: ["android/arm64/lib/stubslib.so"], | 
|  | }, | 
|  | android_arm: { | 
|  | srcs: ["android/arm/lib/stubslib.so"], | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86_64/lib/stubslib.so"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86/lib/stubslib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestUniqueHostSoname(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | host_supported: true, | 
|  | native_shared_libs: ["mylib"], | 
|  | } | 
|  |  | 
|  | cc_library { | 
|  | name: "mylib", | 
|  | host_supported: true, | 
|  | unique_host_soname: true, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mylib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mylib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | host_supported: true, | 
|  | unique_host_soname: true, | 
|  | compile_multilib: "both", | 
|  | target: { | 
|  | host: { | 
|  | enabled: false, | 
|  | }, | 
|  | android_arm64: { | 
|  | srcs: ["android/arm64/lib/mylib.so"], | 
|  | }, | 
|  | android_arm: { | 
|  | srcs: ["android/arm/lib/mylib.so"], | 
|  | }, | 
|  | linux_glibc_x86_64: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86_64/lib/mylib-host.so"], | 
|  | }, | 
|  | linux_glibc_x86: { | 
|  | enabled: true, | 
|  | srcs: ["linux_glibc/x86/lib/mylib-host.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | .intermediates/mylib/android_arm64_armv8-a_shared/mylib.so -> android/arm64/lib/mylib.so | 
|  | .intermediates/mylib/android_arm_armv7-a-neon_shared/mylib.so -> android/arm/lib/mylib.so | 
|  | .intermediates/mylib/linux_glibc_x86_64_shared/mylib-host.so -> linux_glibc/x86_64/lib/mylib-host.so | 
|  | .intermediates/mylib/linux_glibc_x86_shared/mylib-host.so -> linux_glibc/x86/lib/mylib-host.so | 
|  | `), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestNoSanitizerMembers(t *testing.T) { | 
|  | result := testSdkWithCc(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | native_shared_libs: ["mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_library_shared { | 
|  | name: "mynativelib", | 
|  | srcs: ["Test.cpp"], | 
|  | export_include_dirs: ["myinclude"], | 
|  | arch: { | 
|  | arm64: { | 
|  | export_system_include_dirs: ["arm64/include"], | 
|  | sanitize: { | 
|  | hwaddress: true, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | apex_contributions_defaults { | 
|  | name: "mysdk.contributions", | 
|  | contents: ["prebuilt_mynativelib"], | 
|  | } | 
|  |  | 
|  | cc_prebuilt_library_shared { | 
|  | name: "mynativelib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["//apex_available:platform"], | 
|  | compile_multilib: "both", | 
|  | export_include_dirs: ["include/myinclude"], | 
|  | arch: { | 
|  | arm64: { | 
|  | export_system_include_dirs: ["arm64/include/arm64/include"], | 
|  | }, | 
|  | arm: { | 
|  | srcs: ["arm/lib/mynativelib.so"], | 
|  | }, | 
|  | }, | 
|  | strip: { | 
|  | none: true, | 
|  | }, | 
|  | } | 
|  | `), | 
|  | checkAllCopyRules(` | 
|  | myinclude/Test.h -> include/myinclude/Test.h | 
|  | arm64/include/Arm64Test.h -> arm64/include/arm64/include/Arm64Test.h | 
|  | .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so | 
|  | `), | 
|  | ) | 
|  | } |