1package apex
2
3import (
4	"testing"
5
6	"github.com/google/blueprint/proptools"
7
8	"android/soong/android"
9)
10
11func TestVndkApexForVndkLite(t *testing.T) {
12	ctx := testApex(t, `
13		apex_vndk {
14			name: "com.android.vndk.current",
15			key: "com.android.vndk.current.key",
16			updatable: false,
17		}
18
19		apex_key {
20			name: "com.android.vndk.current.key",
21			public_key: "testkey.avbpubkey",
22			private_key: "testkey.pem",
23		}
24
25		cc_library {
26			name: "libvndk",
27			srcs: ["mylib.cpp"],
28			vendor_available: true,
29			product_available: true,
30			vndk: {
31				enabled: true,
32			},
33			system_shared_libs: [],
34			stl: "none",
35			apex_available: [ "com.android.vndk.current" ],
36		}
37
38		cc_library {
39			name: "libvndksp",
40			srcs: ["mylib.cpp"],
41			vendor_available: true,
42			product_available: true,
43			vndk: {
44				enabled: true,
45				support_system_process: true,
46			},
47			system_shared_libs: [],
48			stl: "none",
49			apex_available: [ "com.android.vndk.current" ],
50		}
51	`+vndkLibrariesTxtFiles("current"),
52		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
53			variables.DeviceVndkVersion = proptools.StringPtr("")
54		}),
55	)
56	// VNDK-Lite contains only core variants of VNDK-Sp libraries
57	ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
58		"lib/libvndksp.so",
59		"lib/libc++.so",
60		"lib64/libvndksp.so",
61		"lib64/libc++.so",
62		"etc/llndk.libraries.29.txt",
63		"etc/vndkcore.libraries.29.txt",
64		"etc/vndksp.libraries.29.txt",
65		"etc/vndkprivate.libraries.29.txt",
66		"etc/vndkproduct.libraries.29.txt",
67	})
68}
69
70func TestVndkApexUsesVendorVariant(t *testing.T) {
71	bp := `
72		apex_vndk {
73			name: "com.android.vndk.current",
74			key: "mykey",
75			updatable: false,
76		}
77		apex_key {
78			name: "mykey",
79		}
80		cc_library {
81			name: "libfoo",
82			vendor_available: true,
83			product_available: true,
84			vndk: {
85				enabled: true,
86			},
87			system_shared_libs: [],
88			stl: "none",
89			notice: "custom_notice",
90		}
91		` + vndkLibrariesTxtFiles("current")
92
93	ensureFileSrc := func(t *testing.T, files []fileInApex, path, src string) {
94		t.Helper()
95		for _, f := range files {
96			if f.path == path {
97				ensureContains(t, f.src, src)
98				return
99			}
100		}
101		t.Errorf("expected path %q not found", path)
102	}
103
104	t.Run("VNDK lib doesn't have an apex variant", func(t *testing.T) {
105		ctx := testApex(t, bp)
106
107		// libfoo doesn't have apex variants
108		for _, variant := range ctx.ModuleVariantsForTests("libfoo") {
109			ensureNotContains(t, variant, "_myapex")
110		}
111
112		// VNDK APEX doesn't create apex variant
113		files := getFiles(t, ctx, "com.android.vndk.current", "android_common_image")
114		ensureFileSrc(t, files, "lib/libfoo.so", "libfoo/android_vendor.29_arm_armv7-a-neon_shared/libfoo.so")
115	})
116
117	t.Run("VNDK APEX gathers only vendor variants even if product variants are available", func(t *testing.T) {
118		ctx := testApex(t, bp,
119			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
120				// Now product variant is available
121				variables.ProductVndkVersion = proptools.StringPtr("current")
122			}),
123		)
124
125		files := getFiles(t, ctx, "com.android.vndk.current", "android_common_image")
126		ensureFileSrc(t, files, "lib/libfoo.so", "libfoo/android_vendor.29_arm_armv7-a-neon_shared/libfoo.so")
127	})
128
129	t.Run("VNDK APEX supports coverage variants", func(t *testing.T) {
130		ctx := testApex(t, bp,
131			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
132				variables.GcovCoverage = proptools.BoolPtr(true)
133				variables.Native_coverage = proptools.BoolPtr(true)
134			}),
135		)
136
137		files := getFiles(t, ctx, "com.android.vndk.current", "android_common_image")
138		ensureFileSrc(t, files, "lib/libfoo.so", "libfoo/android_vendor.29_arm_armv7-a-neon_shared/libfoo.so")
139
140		files = getFiles(t, ctx, "com.android.vndk.current", "android_common_cov_image")
141		ensureFileSrc(t, files, "lib/libfoo.so", "libfoo/android_vendor.29_arm_armv7-a-neon_shared_cov/libfoo.so")
142	})
143}
144