1*e5eeaa8eSAndroid Build Coastguard Worker /*
2*e5eeaa8eSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*e5eeaa8eSAndroid Build Coastguard Worker *
4*e5eeaa8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e5eeaa8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e5eeaa8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e5eeaa8eSAndroid Build Coastguard Worker *
8*e5eeaa8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e5eeaa8eSAndroid Build Coastguard Worker *
10*e5eeaa8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e5eeaa8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e5eeaa8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e5eeaa8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e5eeaa8eSAndroid Build Coastguard Worker * limitations under the License.
15*e5eeaa8eSAndroid Build Coastguard Worker */
16*e5eeaa8eSAndroid Build Coastguard Worker
17*e5eeaa8eSAndroid Build Coastguard Worker #include <string>
18*e5eeaa8eSAndroid Build Coastguard Worker #include <vector>
19*e5eeaa8eSAndroid Build Coastguard Worker
20*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/file.h>
21*e5eeaa8eSAndroid Build Coastguard Worker #include <apex_manifest.pb.h>
22*e5eeaa8eSAndroid Build Coastguard Worker #include <gmock/gmock.h>
23*e5eeaa8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
24*e5eeaa8eSAndroid Build Coastguard Worker #include <linker_config.pb.h>
25*e5eeaa8eSAndroid Build Coastguard Worker
26*e5eeaa8eSAndroid Build Coastguard Worker #include "apex_testbase.h"
27*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/apex.h"
28*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/basecontext.h"
29*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configwriter.h"
30*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/namespace.h"
31*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/section.h"
32*e5eeaa8eSAndroid Build Coastguard Worker
33*e5eeaa8eSAndroid Build Coastguard Worker using ::android::base::WriteStringToFile;
34*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::ApexInfo;
35*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::BaseContext;
36*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::ConfigWriter;
37*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::InitializeWithApex;
38*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::Namespace;
39*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::ScanActiveApexes;
40*e5eeaa8eSAndroid Build Coastguard Worker using ::android::linkerconfig::modules::Section;
41*e5eeaa8eSAndroid Build Coastguard Worker using ::apex::proto::ApexManifest;
42*e5eeaa8eSAndroid Build Coastguard Worker using ::testing::Contains;
43*e5eeaa8eSAndroid Build Coastguard Worker
TEST(apex_namespace,build_namespace)44*e5eeaa8eSAndroid Build Coastguard Worker TEST(apex_namespace, build_namespace) {
45*e5eeaa8eSAndroid Build Coastguard Worker Namespace ns("foo");
46*e5eeaa8eSAndroid Build Coastguard Worker InitializeWithApex(ns,
47*e5eeaa8eSAndroid Build Coastguard Worker ApexInfo("com.android.foo",
48*e5eeaa8eSAndroid Build Coastguard Worker "/apex/com.android.foo",
49*e5eeaa8eSAndroid Build Coastguard Worker /*provide_libs=*/{},
50*e5eeaa8eSAndroid Build Coastguard Worker /*require_libs=*/{},
51*e5eeaa8eSAndroid Build Coastguard Worker /*jni_libs=*/{},
52*e5eeaa8eSAndroid Build Coastguard Worker /*permitted_paths=*/{},
53*e5eeaa8eSAndroid Build Coastguard Worker /*has_bin=*/false,
54*e5eeaa8eSAndroid Build Coastguard Worker /*has_lib=*/true,
55*e5eeaa8eSAndroid Build Coastguard Worker /*visible=*/false,
56*e5eeaa8eSAndroid Build Coastguard Worker /*has_shared_lib=*/false));
57*e5eeaa8eSAndroid Build Coastguard Worker
58*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
59*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
60*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(
61*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.isolated = false\n"
62*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.search.paths = /apex/com.android.foo/${LIB}\n"
63*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths = /apex/com.android.foo/${LIB}\n"
64*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths += /system/${LIB}\n"
65*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths += /system_ext/${LIB}\n"
66*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.search.paths = /apex/com.android.foo/${LIB}\n"
67*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths = /apex/com.android.foo/${LIB}\n"
68*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /data/asan/system/${LIB}\n"
69*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /system/${LIB}\n"
70*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /data/asan/system_ext/${LIB}\n"
71*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /system_ext/${LIB}\n"
72*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.search.paths = /apex/com.android.foo/${LIB}/hwasan\n"
73*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.search.paths += /apex/com.android.foo/${LIB}\n"
74*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths = /apex/com.android.foo/${LIB}/hwasan\n"
75*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /apex/com.android.foo/${LIB}\n"
76*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system/${LIB}/hwasan\n"
77*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system/${LIB}\n"
78*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system_ext/${LIB}/hwasan\n"
79*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system_ext/${LIB}\n",
80*e5eeaa8eSAndroid Build Coastguard Worker writer.ToString());
81*e5eeaa8eSAndroid Build Coastguard Worker }
82*e5eeaa8eSAndroid Build Coastguard Worker
TEST(apex_namespace,resolve_between_apex_namespaces)83*e5eeaa8eSAndroid Build Coastguard Worker TEST(apex_namespace, resolve_between_apex_namespaces) {
84*e5eeaa8eSAndroid Build Coastguard Worker BaseContext ctx;
85*e5eeaa8eSAndroid Build Coastguard Worker Namespace foo("foo"), bar("bar");
86*e5eeaa8eSAndroid Build Coastguard Worker InitializeWithApex(foo,
87*e5eeaa8eSAndroid Build Coastguard Worker ApexInfo("com.android.foo",
88*e5eeaa8eSAndroid Build Coastguard Worker "/apex/com.android.foo",
89*e5eeaa8eSAndroid Build Coastguard Worker /*provide_libs=*/{"foo.so"},
90*e5eeaa8eSAndroid Build Coastguard Worker /*require_libs=*/{"bar.so"},
91*e5eeaa8eSAndroid Build Coastguard Worker /*jni_libs=*/{},
92*e5eeaa8eSAndroid Build Coastguard Worker /*permitted_paths=*/{},
93*e5eeaa8eSAndroid Build Coastguard Worker /*has_bin=*/false,
94*e5eeaa8eSAndroid Build Coastguard Worker /*has_lib=*/true,
95*e5eeaa8eSAndroid Build Coastguard Worker /*visible=*/false,
96*e5eeaa8eSAndroid Build Coastguard Worker /*has_shared_lib=*/false));
97*e5eeaa8eSAndroid Build Coastguard Worker InitializeWithApex(bar,
98*e5eeaa8eSAndroid Build Coastguard Worker ApexInfo("com.android.bar",
99*e5eeaa8eSAndroid Build Coastguard Worker "/apex/com.android.bar",
100*e5eeaa8eSAndroid Build Coastguard Worker /*provide_libs=*/{"bar.so"},
101*e5eeaa8eSAndroid Build Coastguard Worker /*require_libs=*/{},
102*e5eeaa8eSAndroid Build Coastguard Worker /*jni_libs=*/{},
103*e5eeaa8eSAndroid Build Coastguard Worker /*permitted_paths=*/{},
104*e5eeaa8eSAndroid Build Coastguard Worker /*has_bin=*/false,
105*e5eeaa8eSAndroid Build Coastguard Worker /*has_lib=*/true,
106*e5eeaa8eSAndroid Build Coastguard Worker /*visible=*/false,
107*e5eeaa8eSAndroid Build Coastguard Worker /*has_shared_lib=*/false));
108*e5eeaa8eSAndroid Build Coastguard Worker
109*e5eeaa8eSAndroid Build Coastguard Worker std::vector<Namespace> namespaces;
110*e5eeaa8eSAndroid Build Coastguard Worker namespaces.push_back(std::move(foo));
111*e5eeaa8eSAndroid Build Coastguard Worker namespaces.push_back(std::move(bar));
112*e5eeaa8eSAndroid Build Coastguard Worker Section section("section", std::move(namespaces));
113*e5eeaa8eSAndroid Build Coastguard Worker
114*e5eeaa8eSAndroid Build Coastguard Worker section.Resolve(ctx);
115*e5eeaa8eSAndroid Build Coastguard Worker
116*e5eeaa8eSAndroid Build Coastguard Worker // See if two namespaces are linked correctly
117*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_THAT(section.GetNamespace("foo")->GetLink("bar").GetSharedLibs(),
118*e5eeaa8eSAndroid Build Coastguard Worker Contains("bar.so"));
119*e5eeaa8eSAndroid Build Coastguard Worker }
120*e5eeaa8eSAndroid Build Coastguard Worker
TEST(apex_namespace,extra_permitted_paths)121*e5eeaa8eSAndroid Build Coastguard Worker TEST(apex_namespace, extra_permitted_paths) {
122*e5eeaa8eSAndroid Build Coastguard Worker Namespace ns("foo");
123*e5eeaa8eSAndroid Build Coastguard Worker InitializeWithApex(ns,
124*e5eeaa8eSAndroid Build Coastguard Worker ApexInfo("com.android.foo",
125*e5eeaa8eSAndroid Build Coastguard Worker "/apex/com.android.foo",
126*e5eeaa8eSAndroid Build Coastguard Worker /*provide_libs=*/{},
127*e5eeaa8eSAndroid Build Coastguard Worker /*require_libs=*/{},
128*e5eeaa8eSAndroid Build Coastguard Worker /*jni_libs=*/{},
129*e5eeaa8eSAndroid Build Coastguard Worker /*permitted_paths=*/{"/a", "/b/c"},
130*e5eeaa8eSAndroid Build Coastguard Worker /*has_bin=*/false,
131*e5eeaa8eSAndroid Build Coastguard Worker /*has_lib=*/true,
132*e5eeaa8eSAndroid Build Coastguard Worker /*visible=*/false,
133*e5eeaa8eSAndroid Build Coastguard Worker /*has_shared_lib=*/false));
134*e5eeaa8eSAndroid Build Coastguard Worker
135*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
136*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
137*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(
138*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.isolated = false\n"
139*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.search.paths = /apex/com.android.foo/${LIB}\n"
140*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths = /apex/com.android.foo/${LIB}\n"
141*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths += /system/${LIB}\n"
142*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths += /system_ext/${LIB}\n"
143*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths += /a\n"
144*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.permitted.paths += /b/c\n"
145*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.search.paths = /apex/com.android.foo/${LIB}\n"
146*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths = /apex/com.android.foo/${LIB}\n"
147*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /data/asan/system/${LIB}\n"
148*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /system/${LIB}\n"
149*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /data/asan/system_ext/${LIB}\n"
150*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /system_ext/${LIB}\n"
151*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /data/asan/a\n"
152*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /a\n"
153*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /data/asan/b/c\n"
154*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.asan.permitted.paths += /b/c\n"
155*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.search.paths = /apex/com.android.foo/${LIB}/hwasan\n"
156*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.search.paths += /apex/com.android.foo/${LIB}\n"
157*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths = /apex/com.android.foo/${LIB}/hwasan\n"
158*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /apex/com.android.foo/${LIB}\n"
159*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system/${LIB}/hwasan\n"
160*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system/${LIB}\n"
161*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system_ext/${LIB}/hwasan\n"
162*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /system_ext/${LIB}\n"
163*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /a/hwasan\n"
164*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /a\n"
165*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /b/c/hwasan\n"
166*e5eeaa8eSAndroid Build Coastguard Worker "namespace.foo.hwasan.permitted.paths += /b/c\n",
167*e5eeaa8eSAndroid Build Coastguard Worker writer.ToString());
168*e5eeaa8eSAndroid Build Coastguard Worker }
169*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,scan_apex_dir)170*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, scan_apex_dir) {
171*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", {}, {"bar.so"}, {});
172*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/bin/foo", "");
173*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("bar", {"bar.so"}, {}, {});
174*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/bar/lib64/bar.so", "");
175*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("baz", {}, {}, {"baz.so"});
176*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/baz/lib64/baz.so", "");
177*e5eeaa8eSAndroid Build Coastguard Worker CreateApexInfoList();
178*e5eeaa8eSAndroid Build Coastguard Worker CreatePublicLibrariesTxt();
179*e5eeaa8eSAndroid Build Coastguard Worker
180*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
181*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << "Failed to scan active APEXes : "
182*e5eeaa8eSAndroid Build Coastguard Worker << apexes.error();
183*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(3U, apexes->size());
184*e5eeaa8eSAndroid Build Coastguard Worker
185*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_THAT((*apexes)["foo"].require_libs, Contains("bar.so"));
186*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE((*apexes)["foo"].has_bin);
187*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE((*apexes)["foo"].has_lib);
188*e5eeaa8eSAndroid Build Coastguard Worker
189*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_THAT((*apexes)["bar"].provide_libs, Contains("bar.so"));
190*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE((*apexes)["bar"].has_bin);
191*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE((*apexes)["bar"].has_lib);
192*e5eeaa8eSAndroid Build Coastguard Worker
193*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_THAT((*apexes)["baz"].jni_libs, Contains("baz.so"));
194*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE((*apexes)["baz"].has_bin);
195*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE((*apexes)["baz"].has_lib);
196*e5eeaa8eSAndroid Build Coastguard Worker }
197*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,validate_path)198*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, validate_path) {
199*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", {}, {}, {});
200*e5eeaa8eSAndroid Build Coastguard Worker CreateApexInfoList();
201*e5eeaa8eSAndroid Build Coastguard Worker CreatePublicLibrariesTxt();
202*e5eeaa8eSAndroid Build Coastguard Worker
203*e5eeaa8eSAndroid Build Coastguard Worker ::android::linkerconfig::proto::LinkerConfig two_slash;
204*e5eeaa8eSAndroid Build Coastguard Worker two_slash.add_permittedpaths("/two//slash");
205*e5eeaa8eSAndroid Build Coastguard Worker
206*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/etc/linker.config.pb", two_slash.SerializeAsString());
207*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
208*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE(apexes.ok()) << "Two slash is not allowed from path string";
209*e5eeaa8eSAndroid Build Coastguard Worker
210*e5eeaa8eSAndroid Build Coastguard Worker ::android::linkerconfig::proto::LinkerConfig invalid_char;
211*e5eeaa8eSAndroid Build Coastguard Worker invalid_char.add_permittedpaths("/path/with*/invalid/char");
212*e5eeaa8eSAndroid Build Coastguard Worker
213*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/etc/linker.config.pb", invalid_char.SerializeAsString());
214*e5eeaa8eSAndroid Build Coastguard Worker apexes = ScanActiveApexes(root);
215*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE(apexes.ok()) << "* is invalid char for path.";
216*e5eeaa8eSAndroid Build Coastguard Worker
217*e5eeaa8eSAndroid Build Coastguard Worker ::android::linkerconfig::proto::LinkerConfig end_with_lib;
218*e5eeaa8eSAndroid Build Coastguard Worker end_with_lib.add_permittedpaths("/somewhere/${LIB}");
219*e5eeaa8eSAndroid Build Coastguard Worker
220*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/etc/linker.config.pb", end_with_lib.SerializeAsString());
221*e5eeaa8eSAndroid Build Coastguard Worker apexes = ScanActiveApexes(root);
222*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << "Path ends with ${LIB} should be accepted. : "
223*e5eeaa8eSAndroid Build Coastguard Worker << apexes.error();
224*e5eeaa8eSAndroid Build Coastguard Worker
225*e5eeaa8eSAndroid Build Coastguard Worker ::android::linkerconfig::proto::LinkerConfig lib_plus_char;
226*e5eeaa8eSAndroid Build Coastguard Worker lib_plus_char.add_permittedpaths("/somewhere/${LIB}x/hw");
227*e5eeaa8eSAndroid Build Coastguard Worker
228*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/etc/linker.config.pb", lib_plus_char.SerializeAsString());
229*e5eeaa8eSAndroid Build Coastguard Worker apexes = ScanActiveApexes(root);
230*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE(apexes.ok())
231*e5eeaa8eSAndroid Build Coastguard Worker << "There should be no extra char after ${LIB} in path.";
232*e5eeaa8eSAndroid Build Coastguard Worker
233*e5eeaa8eSAndroid Build Coastguard Worker ::android::linkerconfig::proto::LinkerConfig char_plus_lib;
234*e5eeaa8eSAndroid Build Coastguard Worker char_plus_lib.add_permittedpaths("/somewhere/x${LIB}/hw");
235*e5eeaa8eSAndroid Build Coastguard Worker
236*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/etc/linker.config.pb", char_plus_lib.SerializeAsString());
237*e5eeaa8eSAndroid Build Coastguard Worker apexes = ScanActiveApexes(root);
238*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE(apexes.ok())
239*e5eeaa8eSAndroid Build Coastguard Worker << "There should be no extra char before ${LIB} in path.";
240*e5eeaa8eSAndroid Build Coastguard Worker
241*e5eeaa8eSAndroid Build Coastguard Worker ::android::linkerconfig::proto::LinkerConfig lib_and_lib64;
242*e5eeaa8eSAndroid Build Coastguard Worker lib_and_lib64.add_permittedpaths("/somewhere/${LIB}/hw");
243*e5eeaa8eSAndroid Build Coastguard Worker
244*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/foo/etc/linker.config.pb", lib_and_lib64.SerializeAsString());
245*e5eeaa8eSAndroid Build Coastguard Worker apexes = ScanActiveApexes(root);
246*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << "Valid path with ${LIB} should be accepted. : "
247*e5eeaa8eSAndroid Build Coastguard Worker << apexes.error();
248*e5eeaa8eSAndroid Build Coastguard Worker }
249*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,skip_sharedlibs_apex)250*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, skip_sharedlibs_apex) {
251*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", {}, {}, {});
252*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/apex-info-list.xml", R"(<apex-info-list>
253*e5eeaa8eSAndroid Build Coastguard Worker <apex-info moduleName="foo"
254*e5eeaa8eSAndroid Build Coastguard Worker partition="SYSTEM"
255*e5eeaa8eSAndroid Build Coastguard Worker modulePath="/data/apex/active/foo.apex"
256*e5eeaa8eSAndroid Build Coastguard Worker isActive="true" />
257*e5eeaa8eSAndroid Build Coastguard Worker <apex-info moduleName="sharedlibs"
258*e5eeaa8eSAndroid Build Coastguard Worker partition="SYSTEM"
259*e5eeaa8eSAndroid Build Coastguard Worker modulePath="/data/apex/active/sharedlibs.apex"
260*e5eeaa8eSAndroid Build Coastguard Worker provideSharedApexLibs="true"
261*e5eeaa8eSAndroid Build Coastguard Worker isActive="true" />
262*e5eeaa8eSAndroid Build Coastguard Worker </apex-info-list>)");
263*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
264*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << apexes.error();
265*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(apexes->find("sharedlibs"), apexes->end());
266*e5eeaa8eSAndroid Build Coastguard Worker }
267*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,public_libraries_txt_malformed_line)268*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, public_libraries_txt_malformed_line) {
269*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", {}, {}, {});
270*e5eeaa8eSAndroid Build Coastguard Worker CreateApexInfoList();
271*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/system/etc/public.libraries.txt", "foo.so blah blah blah");
272*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
273*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_FALSE(apexes.ok());
274*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_THAT(apexes.error().message(), testing::HasSubstr("Malformed line"));
275*e5eeaa8eSAndroid Build Coastguard Worker }
276*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,public_libs_with_public_libraries_txt)277*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, public_libs_with_public_libraries_txt) {
278*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", /*provide_libs=*/{"libfoo.so"}, {}, {});
279*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/apex-info-list.xml", R"(<apex-info-list>
280*e5eeaa8eSAndroid Build Coastguard Worker <apex-info moduleName="foo"
281*e5eeaa8eSAndroid Build Coastguard Worker partition="SYSTEM"
282*e5eeaa8eSAndroid Build Coastguard Worker modulePath="/data/apex/active/foo.apex"
283*e5eeaa8eSAndroid Build Coastguard Worker isActive="true" />
284*e5eeaa8eSAndroid Build Coastguard Worker </apex-info-list>)");
285*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/system/etc/public.libraries.txt", "libfoo.so");
286*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
287*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << apexes.error();
288*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(apexes->at("foo").public_libs,
289*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string>{"libfoo.so"});
290*e5eeaa8eSAndroid Build Coastguard Worker }
291*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,public_libs_should_be_system_apex)292*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, public_libs_should_be_system_apex) {
293*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", /*provide_libs=*/{"libfoo.so"}, {}, {});
294*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/apex-info-list.xml", R"(<apex-info-list>
295*e5eeaa8eSAndroid Build Coastguard Worker <apex-info moduleName="foo"
296*e5eeaa8eSAndroid Build Coastguard Worker partition="VENDOR"
297*e5eeaa8eSAndroid Build Coastguard Worker modulePath="/data/apex/active/foo.apex"
298*e5eeaa8eSAndroid Build Coastguard Worker isActive="true" />
299*e5eeaa8eSAndroid Build Coastguard Worker </apex-info-list>)");
300*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/system/etc/public.libraries.txt", "libfoo.so");
301*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
302*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << apexes.error();
303*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(apexes->at("foo").public_libs, std::vector<std::string>{});
304*e5eeaa8eSAndroid Build Coastguard Worker }
305*e5eeaa8eSAndroid Build Coastguard Worker
TEST_F(ApexTest,system_ext_can_be_linked_to_system_system_ext)306*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexTest, system_ext_can_be_linked_to_system_system_ext) {
307*e5eeaa8eSAndroid Build Coastguard Worker PrepareApex("foo", /*provide_libs=*/{"libfoo.so"}, {}, {});
308*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/apex/apex-info-list.xml", R"(<apex-info-list>
309*e5eeaa8eSAndroid Build Coastguard Worker <apex-info moduleName="foo"
310*e5eeaa8eSAndroid Build Coastguard Worker partition="SYSTEM_EXT"
311*e5eeaa8eSAndroid Build Coastguard Worker modulePath="/data/apex/active/foo.apex"
312*e5eeaa8eSAndroid Build Coastguard Worker isActive="true" />
313*e5eeaa8eSAndroid Build Coastguard Worker </apex-info-list>)");
314*e5eeaa8eSAndroid Build Coastguard Worker WriteFile("/system/etc/public.libraries.txt", "libfoo.so");
315*e5eeaa8eSAndroid Build Coastguard Worker auto apexes = ScanActiveApexes(root);
316*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_TRUE(apexes.ok()) << apexes.error();
317*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(apexes->at("foo").public_libs,
318*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string>{"libfoo.so"});
319*e5eeaa8eSAndroid Build Coastguard Worker }
320