xref: /aosp_15_r20/system/linkerconfig/contents/tests/configuration/apexconfig_test.cc (revision e5eeaa8e05bc25a862c0c861bda7c8a6bfb42dad)
1*e5eeaa8eSAndroid Build Coastguard Worker /*
2*e5eeaa8eSAndroid Build Coastguard Worker  * Copyright (C) 2020 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 "linkerconfig/apexconfig.h"
18*e5eeaa8eSAndroid Build Coastguard Worker 
19*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/file.h>
20*e5eeaa8eSAndroid Build Coastguard Worker #include <apex_manifest.pb.h>
21*e5eeaa8eSAndroid Build Coastguard Worker #include <gmock/gmock.h>
22*e5eeaa8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*e5eeaa8eSAndroid Build Coastguard Worker #include <vector>
24*e5eeaa8eSAndroid Build Coastguard Worker 
25*e5eeaa8eSAndroid Build Coastguard Worker #include "configurationtest.h"
26*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/apex.h"
27*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configwriter.h"
28*e5eeaa8eSAndroid Build Coastguard Worker #include "mockenv.h"
29*e5eeaa8eSAndroid Build Coastguard Worker 
30*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::contents::Context;
31*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::contents::CreateApexConfiguration;
32*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::ApexInfo;
33*e5eeaa8eSAndroid Build Coastguard Worker using ::testing::Contains;
34*e5eeaa8eSAndroid Build Coastguard Worker 
35*e5eeaa8eSAndroid Build Coastguard Worker namespace {
36*e5eeaa8eSAndroid Build Coastguard Worker struct ApexConfigTest : ::testing::Test {
SetUp__anonfb2e76700111::ApexConfigTest37*e5eeaa8eSAndroid Build Coastguard Worker   void SetUp() override {
38*e5eeaa8eSAndroid Build Coastguard Worker     MockGenericVariables();
39*e5eeaa8eSAndroid Build Coastguard Worker   }
40*e5eeaa8eSAndroid Build Coastguard Worker 
PrepareApex__anonfb2e76700111::ApexConfigTest41*e5eeaa8eSAndroid Build Coastguard Worker   ApexInfo PrepareApex(const std::string& apex_name,
42*e5eeaa8eSAndroid Build Coastguard Worker                        const std::vector<std::string>& provide_libs,
43*e5eeaa8eSAndroid Build Coastguard Worker                        const std::vector<std::string>& require_libs) {
44*e5eeaa8eSAndroid Build Coastguard Worker     return ApexInfo(apex_name,
45*e5eeaa8eSAndroid Build Coastguard Worker                     "/apex/" + apex_name,
46*e5eeaa8eSAndroid Build Coastguard Worker                     provide_libs,
47*e5eeaa8eSAndroid Build Coastguard Worker                     require_libs,
48*e5eeaa8eSAndroid Build Coastguard Worker                     /*jni_libs=*/{},
49*e5eeaa8eSAndroid Build Coastguard Worker                     /*permitted_paths=*/{},
50*e5eeaa8eSAndroid Build Coastguard Worker                     /*has_bin=*/true,
51*e5eeaa8eSAndroid Build Coastguard Worker                     /*has_lib=*/true,
52*e5eeaa8eSAndroid Build Coastguard Worker                     /*visible=*/false,
53*e5eeaa8eSAndroid Build Coastguard Worker                     /*has_shared_lib=*/false);
54*e5eeaa8eSAndroid Build Coastguard Worker   }
55*e5eeaa8eSAndroid Build Coastguard Worker };
56*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace
57*e5eeaa8eSAndroid Build Coastguard Worker 
TEST_F(ApexConfigTest,apex_no_dependency)58*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, apex_no_dependency) {
59*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::contents::Context ctx;
60*e5eeaa8eSAndroid Build Coastguard Worker   auto target_apex = PrepareApex("target", {}, {});
61*e5eeaa8eSAndroid Build Coastguard Worker   auto config = android::linkerconfig::contents::CreateApexConfiguration(
62*e5eeaa8eSAndroid Build Coastguard Worker       ctx, target_apex);
63*e5eeaa8eSAndroid Build Coastguard Worker 
64*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::ConfigWriter config_writer;
65*e5eeaa8eSAndroid Build Coastguard Worker   config.WriteConfig(config_writer);
66*e5eeaa8eSAndroid Build Coastguard Worker 
67*e5eeaa8eSAndroid Build Coastguard Worker   VerifyConfiguration(config_writer.ToString());
68*e5eeaa8eSAndroid Build Coastguard Worker }
69*e5eeaa8eSAndroid Build Coastguard Worker 
TEST_F(ApexConfigTest,apex_with_required)70*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, apex_with_required) {
71*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::contents::Context ctx;
72*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules({PrepareApex("foo", {"a.so"}, {"b.so"}),
73*e5eeaa8eSAndroid Build Coastguard Worker                       PrepareApex("bar", {"b.so"}, {}),
74*e5eeaa8eSAndroid Build Coastguard Worker                       PrepareApex("baz", {"c.so"}, {"a.so"})});
75*e5eeaa8eSAndroid Build Coastguard Worker   auto target_apex = PrepareApex("target", {}, {"a.so", "b.so"});
76*e5eeaa8eSAndroid Build Coastguard Worker   auto config = android::linkerconfig::contents::CreateApexConfiguration(
77*e5eeaa8eSAndroid Build Coastguard Worker       ctx, target_apex);
78*e5eeaa8eSAndroid Build Coastguard Worker 
79*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::ConfigWriter config_writer;
80*e5eeaa8eSAndroid Build Coastguard Worker   config.WriteConfig(config_writer);
81*e5eeaa8eSAndroid Build Coastguard Worker 
82*e5eeaa8eSAndroid Build Coastguard Worker   VerifyConfiguration(config_writer.ToString());
83*e5eeaa8eSAndroid Build Coastguard Worker }
84*e5eeaa8eSAndroid Build Coastguard Worker 
TEST_F(ApexConfigTest,vndk_in_system_vendor_apex)85*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, vndk_in_system_vendor_apex) {
86*e5eeaa8eSAndroid Build Coastguard Worker   MockVndkUsingCoreVariant();
87*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::contents::Context ctx;
88*e5eeaa8eSAndroid Build Coastguard Worker 
89*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::proto::LinkerConfig vendor_config;
90*e5eeaa8eSAndroid Build Coastguard Worker   vendor_config.add_providelibs("libvendorprovide.so");
91*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetVendorConfig(vendor_config);
92*e5eeaa8eSAndroid Build Coastguard Worker 
93*e5eeaa8eSAndroid Build Coastguard Worker   auto vendor_apex =
94*e5eeaa8eSAndroid Build Coastguard Worker       PrepareApex("vendor_apex", {}, {":vndk", "libvendorprovide.so"});
95*e5eeaa8eSAndroid Build Coastguard Worker   vendor_apex.partition = "VENDOR";
96*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules({vendor_apex, CreateTestVndkApex()});
97*e5eeaa8eSAndroid Build Coastguard Worker   auto config = android::linkerconfig::contents::CreateApexConfiguration(
98*e5eeaa8eSAndroid Build Coastguard Worker       ctx, vendor_apex);
99*e5eeaa8eSAndroid Build Coastguard Worker 
100*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::ConfigWriter config_writer;
101*e5eeaa8eSAndroid Build Coastguard Worker   config.WriteConfig(config_writer);
102*e5eeaa8eSAndroid Build Coastguard Worker 
103*e5eeaa8eSAndroid Build Coastguard Worker   VerifyConfiguration(config_writer.ToString());
104*e5eeaa8eSAndroid Build Coastguard Worker }
105*e5eeaa8eSAndroid Build Coastguard Worker 
TEST_F(ApexConfigTest,vndk_in_system_product_apex)106*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, vndk_in_system_product_apex) {
107*e5eeaa8eSAndroid Build Coastguard Worker   MockVndkUsingCoreVariant();
108*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::contents::Context ctx;
109*e5eeaa8eSAndroid Build Coastguard Worker 
110*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::proto::LinkerConfig product_config;
111*e5eeaa8eSAndroid Build Coastguard Worker   product_config.add_providelibs("libproductprovide.so");
112*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetProductConfig(product_config);
113*e5eeaa8eSAndroid Build Coastguard Worker 
114*e5eeaa8eSAndroid Build Coastguard Worker   auto product_apex =
115*e5eeaa8eSAndroid Build Coastguard Worker       PrepareApex("product_apex", {}, {":vndksp", "libproductprovide.so"});
116*e5eeaa8eSAndroid Build Coastguard Worker   product_apex.partition = "PRODUCT";
117*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules({product_apex, CreateTestVndkApex()});
118*e5eeaa8eSAndroid Build Coastguard Worker   auto config = android::linkerconfig::contents::CreateApexConfiguration(
119*e5eeaa8eSAndroid Build Coastguard Worker       ctx, product_apex);
120*e5eeaa8eSAndroid Build Coastguard Worker 
121*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::ConfigWriter config_writer;
122*e5eeaa8eSAndroid Build Coastguard Worker   config.WriteConfig(config_writer);
123*e5eeaa8eSAndroid Build Coastguard Worker 
124*e5eeaa8eSAndroid Build Coastguard Worker   VerifyConfiguration(config_writer.ToString());
125*e5eeaa8eSAndroid Build Coastguard Worker }
126*e5eeaa8eSAndroid Build Coastguard Worker 
TEST_F(ApexConfigTest,vendor_apex_without_use_vndk_as_stable)127*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, vendor_apex_without_use_vndk_as_stable) {
128*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::contents::Context ctx;
129*e5eeaa8eSAndroid Build Coastguard Worker 
130*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::proto::LinkerConfig vendor_config;
131*e5eeaa8eSAndroid Build Coastguard Worker   vendor_config.add_requirelibs("libapexprovide.so");
132*e5eeaa8eSAndroid Build Coastguard Worker   vendor_config.add_providelibs("libvendorprovide.so");
133*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetVendorConfig(vendor_config);
134*e5eeaa8eSAndroid Build Coastguard Worker 
135*e5eeaa8eSAndroid Build Coastguard Worker   // Vendor apex requires :vndk
136*e5eeaa8eSAndroid Build Coastguard Worker   auto vendor_apex = PrepareApex(
137*e5eeaa8eSAndroid Build Coastguard Worker       "com.android.vendor", {"libapexprovide.so"}, {"libvendorprovide.so"});
138*e5eeaa8eSAndroid Build Coastguard Worker   vendor_apex.partition = "VENDOR";
139*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules({vendor_apex, CreateTestVndkApex()});
140*e5eeaa8eSAndroid Build Coastguard Worker 
141*e5eeaa8eSAndroid Build Coastguard Worker   auto config = CreateApexConfiguration(ctx, vendor_apex);
142*e5eeaa8eSAndroid Build Coastguard Worker 
143*e5eeaa8eSAndroid Build Coastguard Worker   auto* section = config.GetSection("com.android.vendor");
144*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_TRUE(section);
145*e5eeaa8eSAndroid Build Coastguard Worker 
146*e5eeaa8eSAndroid Build Coastguard Worker   // vendor apex should be able to load vndk libraries
147*e5eeaa8eSAndroid Build Coastguard Worker   auto vndk_namespace = section->GetNamespace("vndk");
148*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_TRUE(vndk_namespace);
149*e5eeaa8eSAndroid Build Coastguard Worker 
150*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::ConfigWriter config_writer;
151*e5eeaa8eSAndroid Build Coastguard Worker   config.WriteConfig(config_writer);
152*e5eeaa8eSAndroid Build Coastguard Worker   VerifyConfiguration(config_writer.ToString());
153*e5eeaa8eSAndroid Build Coastguard Worker }
154*e5eeaa8eSAndroid Build Coastguard Worker 
155*e5eeaa8eSAndroid Build Coastguard Worker // [apex]com.android.target --(require)--> missing.so
TEST_F(ApexConfigTest,StrictModeRejects_MissingRequiredLibs)156*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, StrictModeRejects_MissingRequiredLibs) {
157*e5eeaa8eSAndroid Build Coastguard Worker   const std::string apex_name = "com.android.target";
158*e5eeaa8eSAndroid Build Coastguard Worker   Context ctx;
159*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules({CreateTestVndkApex()});
160*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetStrictMode(true);
161*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetTargetApex(apex_name);
162*e5eeaa8eSAndroid Build Coastguard Worker   auto apex = PrepareApex(apex_name, {}, /*require_libs=*/{"missing.so"});
163*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EXIT(CreateApexConfiguration(ctx, apex),
164*e5eeaa8eSAndroid Build Coastguard Worker               testing::KilledBySignal(SIGABRT),
165*e5eeaa8eSAndroid Build Coastguard Worker #ifndef __ANDROID__
166*e5eeaa8eSAndroid Build Coastguard Worker               "not found:.*missing\\.so"
167*e5eeaa8eSAndroid Build Coastguard Worker #else
168*e5eeaa8eSAndroid Build Coastguard Worker               ""
169*e5eeaa8eSAndroid Build Coastguard Worker #endif
170*e5eeaa8eSAndroid Build Coastguard Worker   );
171*e5eeaa8eSAndroid Build Coastguard Worker }
172*e5eeaa8eSAndroid Build Coastguard Worker 
173*e5eeaa8eSAndroid Build Coastguard Worker // [apex]com.android.target                          [apex]com.android.other
174*e5eeaa8eSAndroid Build Coastguard Worker //                  `--(require)--> other.so <--(provide)--'  |
175*e5eeaa8eSAndroid Build Coastguard Worker //                                                            `-(require)--> missing.so
TEST_F(ApexConfigTest,StrictModeAccepts_MissingRequiredLibsInOtherApex)176*e5eeaa8eSAndroid Build Coastguard Worker TEST_F(ApexConfigTest, StrictModeAccepts_MissingRequiredLibsInOtherApex) {
177*e5eeaa8eSAndroid Build Coastguard Worker   const std::string apex_name = "com.android.target";
178*e5eeaa8eSAndroid Build Coastguard Worker   Context ctx;
179*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetStrictMode(true);
180*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetTargetApex(apex_name);
181*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules({PrepareApex("com.android.other",
182*e5eeaa8eSAndroid Build Coastguard Worker                                   /*provide_libs=*/{"other.so"},
183*e5eeaa8eSAndroid Build Coastguard Worker                                   /*require_libs=*/{"missing.so"}),
184*e5eeaa8eSAndroid Build Coastguard Worker                       CreateTestVndkApex()});
185*e5eeaa8eSAndroid Build Coastguard Worker   auto apex = PrepareApex(apex_name, {}, /*require_libs=*/{"other.so"});
186*e5eeaa8eSAndroid Build Coastguard Worker   auto config = CreateApexConfiguration(ctx, apex);
187*e5eeaa8eSAndroid Build Coastguard Worker   auto section = config.GetSection("com.android.target");
188*e5eeaa8eSAndroid Build Coastguard Worker   auto ns = section->GetNamespace("default");
189*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_THAT(ns->GetLink("com_android_other").GetSharedLibs(),
190*e5eeaa8eSAndroid Build Coastguard Worker               Contains("other.so"));
191*e5eeaa8eSAndroid Build Coastguard Worker }
192