xref: /aosp_15_r20/system/linkerconfig/modules/tests/section_test.cc (revision e5eeaa8e05bc25a862c0c861bda7c8a6bfb42dad)
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 "linkerconfig/section.h"
18*e5eeaa8eSAndroid Build Coastguard Worker 
19*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/result.h>
20*e5eeaa8eSAndroid Build Coastguard Worker #include <gmock/gmock.h>
21*e5eeaa8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*e5eeaa8eSAndroid Build Coastguard Worker 
23*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/apex.h"
24*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/basecontext.h"
25*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configwriter.h"
26*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/variables.h"
27*e5eeaa8eSAndroid Build Coastguard Worker #include "modules_testbase.h"
28*e5eeaa8eSAndroid Build Coastguard Worker 
29*e5eeaa8eSAndroid Build Coastguard Worker using namespace android::linkerconfig::modules;
30*e5eeaa8eSAndroid Build Coastguard Worker 
31*e5eeaa8eSAndroid Build Coastguard Worker constexpr const char* kSectionWithNamespacesExpectedResult =
32*e5eeaa8eSAndroid Build Coastguard Worker     R"([test_section]
33*e5eeaa8eSAndroid Build Coastguard Worker additional.namespaces = namespace1,namespace2
34*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.isolated = true
35*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.visible = true
36*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths = /search_path1
37*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths += /apex/search_path2
38*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths = /permitted_path1
39*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths += /apex/permitted_path2
40*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths = /data/asan/search_path1
41*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /search_path1
42*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /apex/search_path2
43*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths = /data/asan/permitted_path1
44*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /permitted_path1
45*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /apex/permitted_path2
46*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths = /search_path1/hwasan
47*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /search_path1
48*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2/hwasan
49*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2
50*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths = /permitted_path1/hwasan
51*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /permitted_path1
52*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2/hwasan
53*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2
54*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.links = namespace1,namespace2
55*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.link.namespace1.shared_libs = lib1.so:lib2.so:lib3.so
56*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.link.namespace2.allow_all_shared_libs = true
57*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.isolated = false
58*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.search.paths = /search_path1
59*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.search.paths += /apex/search_path2
60*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.permitted.paths = /permitted_path1
61*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.permitted.paths += /apex/permitted_path2
62*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.search.paths = /data/asan/search_path1
63*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.search.paths += /search_path1
64*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.search.paths += /apex/search_path2
65*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.permitted.paths = /data/asan/permitted_path1
66*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.permitted.paths += /permitted_path1
67*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.permitted.paths += /apex/permitted_path2
68*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths = /search_path1/hwasan
69*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths += /search_path1
70*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths += /apex/search_path2/hwasan
71*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths += /apex/search_path2
72*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths = /permitted_path1/hwasan
73*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths += /permitted_path1
74*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths += /apex/permitted_path2/hwasan
75*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths += /apex/permitted_path2
76*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.links = default,namespace2
77*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.link.default.shared_libs = lib1.so:lib2.so:lib3.so
78*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.link.namespace2.allow_all_shared_libs = true
79*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.isolated = false
80*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.search.paths = /search_path1
81*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.search.paths += /apex/search_path2
82*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.permitted.paths = /permitted_path1
83*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.permitted.paths += /apex/permitted_path2
84*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.search.paths = /data/asan/search_path1
85*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.search.paths += /search_path1
86*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.search.paths += /apex/search_path2
87*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.permitted.paths = /data/asan/permitted_path1
88*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.permitted.paths += /permitted_path1
89*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.permitted.paths += /apex/permitted_path2
90*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths = /search_path1/hwasan
91*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths += /search_path1
92*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths += /apex/search_path2/hwasan
93*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths += /apex/search_path2
94*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths = /permitted_path1/hwasan
95*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths += /permitted_path1
96*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths += /apex/permitted_path2/hwasan
97*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths += /apex/permitted_path2
98*e5eeaa8eSAndroid Build Coastguard Worker )";
99*e5eeaa8eSAndroid Build Coastguard Worker 
100*e5eeaa8eSAndroid Build Coastguard Worker constexpr const char* kSectionWithOneNamespaceExpectedResult =
101*e5eeaa8eSAndroid Build Coastguard Worker     R"([test_section]
102*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.isolated = false
103*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths = /search_path1
104*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths += /apex/search_path2
105*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths = /permitted_path1
106*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths += /apex/permitted_path2
107*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths = /data/asan/search_path1
108*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /search_path1
109*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /apex/search_path2
110*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths = /data/asan/permitted_path1
111*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /permitted_path1
112*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /apex/permitted_path2
113*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths = /search_path1/hwasan
114*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /search_path1
115*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2/hwasan
116*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2
117*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths = /permitted_path1/hwasan
118*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /permitted_path1
119*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2/hwasan
120*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2
121*e5eeaa8eSAndroid Build Coastguard Worker )";
122*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,section_with_namespaces)123*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, section_with_namespaces) {
124*e5eeaa8eSAndroid Build Coastguard Worker   ConfigWriter writer;
125*e5eeaa8eSAndroid Build Coastguard Worker 
126*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
127*e5eeaa8eSAndroid Build Coastguard Worker 
128*e5eeaa8eSAndroid Build Coastguard Worker   namespaces.emplace_back(CreateNamespaceWithLinks(
129*e5eeaa8eSAndroid Build Coastguard Worker       "default", true, true, "namespace1", "namespace2"));
130*e5eeaa8eSAndroid Build Coastguard Worker   namespaces.emplace_back(CreateNamespaceWithLinks(
131*e5eeaa8eSAndroid Build Coastguard Worker       "namespace1", false, false, "default", "namespace2"));
132*e5eeaa8eSAndroid Build Coastguard Worker   namespaces.emplace_back(CreateNamespaceWithPaths("namespace2", false, false));
133*e5eeaa8eSAndroid Build Coastguard Worker 
134*e5eeaa8eSAndroid Build Coastguard Worker   Section section("test_section", std::move(namespaces));
135*e5eeaa8eSAndroid Build Coastguard Worker 
136*e5eeaa8eSAndroid Build Coastguard Worker   section.WriteConfig(writer);
137*e5eeaa8eSAndroid Build Coastguard Worker   auto config = writer.ToString();
138*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EQ(kSectionWithNamespacesExpectedResult, config);
139*e5eeaa8eSAndroid Build Coastguard Worker }
140*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,section_with_one_namespace)141*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, section_with_one_namespace) {
142*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::ConfigWriter writer;
143*e5eeaa8eSAndroid Build Coastguard Worker 
144*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
145*e5eeaa8eSAndroid Build Coastguard Worker   namespaces.emplace_back(CreateNamespaceWithPaths("default", false, false));
146*e5eeaa8eSAndroid Build Coastguard Worker 
147*e5eeaa8eSAndroid Build Coastguard Worker   Section section("test_section", std::move(namespaces));
148*e5eeaa8eSAndroid Build Coastguard Worker   section.WriteConfig(writer);
149*e5eeaa8eSAndroid Build Coastguard Worker   auto config = writer.ToString();
150*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EQ(kSectionWithOneNamespaceExpectedResult, config);
151*e5eeaa8eSAndroid Build Coastguard Worker }
152*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,resolve_contraints)153*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, resolve_contraints) {
154*e5eeaa8eSAndroid Build Coastguard Worker   BaseContext ctx;
155*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
156*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& foo = namespaces.emplace_back("foo");
157*e5eeaa8eSAndroid Build Coastguard Worker   foo.AddProvides(std::vector{"libfoo.so"});
158*e5eeaa8eSAndroid Build Coastguard Worker   foo.AddRequires(std::vector{"libbar.so"});
159*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& bar = namespaces.emplace_back("bar");
160*e5eeaa8eSAndroid Build Coastguard Worker   bar.AddProvides(std::vector{"libbar.so"});
161*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& baz = namespaces.emplace_back("baz");
162*e5eeaa8eSAndroid Build Coastguard Worker   baz.AddRequires(std::vector{"libfoo.so"});
163*e5eeaa8eSAndroid Build Coastguard Worker 
164*e5eeaa8eSAndroid Build Coastguard Worker   Section section("section", std::move(namespaces));
165*e5eeaa8eSAndroid Build Coastguard Worker   section.Resolve(ctx);
166*e5eeaa8eSAndroid Build Coastguard Worker 
167*e5eeaa8eSAndroid Build Coastguard Worker   ConfigWriter writer;
168*e5eeaa8eSAndroid Build Coastguard Worker   section.WriteConfig(writer);
169*e5eeaa8eSAndroid Build Coastguard Worker 
170*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EQ(
171*e5eeaa8eSAndroid Build Coastguard Worker       "[section]\n"
172*e5eeaa8eSAndroid Build Coastguard Worker       "additional.namespaces = bar,baz,foo\n"
173*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.bar.isolated = false\n"
174*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.baz.isolated = false\n"
175*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.baz.links = foo\n"
176*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.baz.link.foo.shared_libs = libfoo.so\n"
177*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.foo.isolated = false\n"
178*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.foo.links = bar\n"
179*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.foo.link.bar.shared_libs = libbar.so\n",
180*e5eeaa8eSAndroid Build Coastguard Worker       writer.ToString());
181*e5eeaa8eSAndroid Build Coastguard Worker }
182*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,error_if_duplicate_providing)183*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, error_if_duplicate_providing) {
184*e5eeaa8eSAndroid Build Coastguard Worker   BaseContext ctx;
185*e5eeaa8eSAndroid Build Coastguard Worker   // TODO(b/297821005) : remove vendor / product vndk version set up
186*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::Variables::AddValue("ro.vndk.version", "99");
187*e5eeaa8eSAndroid Build Coastguard Worker   android::linkerconfig::modules::Variables::AddValue("ro.product.vndk.version",
188*e5eeaa8eSAndroid Build Coastguard Worker                                                       "99");
189*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
190*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& foo1 = namespaces.emplace_back("foo1");
191*e5eeaa8eSAndroid Build Coastguard Worker   foo1.AddProvides(std::vector{"libfoo.so"});
192*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& foo2 = namespaces.emplace_back("foo2");
193*e5eeaa8eSAndroid Build Coastguard Worker   foo2.AddProvides(std::vector{"libfoo.so"});
194*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& bar = namespaces.emplace_back("bar");
195*e5eeaa8eSAndroid Build Coastguard Worker   bar.AddRequires(std::vector{"libfoo.so"});
196*e5eeaa8eSAndroid Build Coastguard Worker 
197*e5eeaa8eSAndroid Build Coastguard Worker   Section section("section", std::move(namespaces));
198*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EXIT(section.Resolve(ctx),
199*e5eeaa8eSAndroid Build Coastguard Worker               testing::KilledBySignal(SIGABRT),
200*e5eeaa8eSAndroid Build Coastguard Worker #ifndef __ANDROID__
201*e5eeaa8eSAndroid Build Coastguard Worker               "duplicate: libfoo\\.so is provided by foo1 and foo2"
202*e5eeaa8eSAndroid Build Coastguard Worker #else
203*e5eeaa8eSAndroid Build Coastguard Worker               ""
204*e5eeaa8eSAndroid Build Coastguard Worker #endif
205*e5eeaa8eSAndroid Build Coastguard Worker   );
206*e5eeaa8eSAndroid Build Coastguard Worker }
207*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,error_if_no_providers_in_strict_mode)208*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, error_if_no_providers_in_strict_mode) {
209*e5eeaa8eSAndroid Build Coastguard Worker   BaseContext ctx;
210*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetStrictMode(true);
211*e5eeaa8eSAndroid Build Coastguard Worker 
212*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
213*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& foo = namespaces.emplace_back("foo");
214*e5eeaa8eSAndroid Build Coastguard Worker   foo.AddRequires(std::vector{"libfoo.so"});
215*e5eeaa8eSAndroid Build Coastguard Worker 
216*e5eeaa8eSAndroid Build Coastguard Worker   Section section("section", std::move(namespaces));
217*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EXIT(section.Resolve(ctx),
218*e5eeaa8eSAndroid Build Coastguard Worker               testing::KilledBySignal(SIGABRT),
219*e5eeaa8eSAndroid Build Coastguard Worker #ifndef __ANDROID__
220*e5eeaa8eSAndroid Build Coastguard Worker               "not found: libfoo\\.so is required by foo"
221*e5eeaa8eSAndroid Build Coastguard Worker #else
222*e5eeaa8eSAndroid Build Coastguard Worker               ""
223*e5eeaa8eSAndroid Build Coastguard Worker #endif
224*e5eeaa8eSAndroid Build Coastguard Worker   );
225*e5eeaa8eSAndroid Build Coastguard Worker }
226*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,ignore_unmet_requirements)227*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, ignore_unmet_requirements) {
228*e5eeaa8eSAndroid Build Coastguard Worker   BaseContext ctx;
229*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetStrictMode(false);  // default
230*e5eeaa8eSAndroid Build Coastguard Worker 
231*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
232*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& foo = namespaces.emplace_back("foo");
233*e5eeaa8eSAndroid Build Coastguard Worker   foo.AddRequires(std::vector{"libfoo.so"});
234*e5eeaa8eSAndroid Build Coastguard Worker 
235*e5eeaa8eSAndroid Build Coastguard Worker   Section section("section", std::move(namespaces));
236*e5eeaa8eSAndroid Build Coastguard Worker   section.Resolve(ctx);
237*e5eeaa8eSAndroid Build Coastguard Worker 
238*e5eeaa8eSAndroid Build Coastguard Worker   ConfigWriter writer;
239*e5eeaa8eSAndroid Build Coastguard Worker   section.WriteConfig(writer);
240*e5eeaa8eSAndroid Build Coastguard Worker 
241*e5eeaa8eSAndroid Build Coastguard Worker   ASSERT_EQ(
242*e5eeaa8eSAndroid Build Coastguard Worker       "[section]\n"
243*e5eeaa8eSAndroid Build Coastguard Worker       "namespace.foo.isolated = false\n",
244*e5eeaa8eSAndroid Build Coastguard Worker       writer.ToString());
245*e5eeaa8eSAndroid Build Coastguard Worker }
246*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,resolve_section_with_apex)247*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, resolve_section_with_apex) {
248*e5eeaa8eSAndroid Build Coastguard Worker   BaseContext ctx;
249*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetApexModules(
250*e5eeaa8eSAndroid Build Coastguard Worker       {ApexInfo("foo", "", {"a.so"}, {"b.so"}, {}, {}, true, true, false, false),
251*e5eeaa8eSAndroid Build Coastguard Worker        ApexInfo("bar", "", {"b.so"}, {}, {}, {}, true, true, false, false),
252*e5eeaa8eSAndroid Build Coastguard Worker        ApexInfo(
253*e5eeaa8eSAndroid Build Coastguard Worker            "baz", "", {"c.so"}, {"a.so"}, {}, {}, true, true, false, false)});
254*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
255*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& default_ns = namespaces.emplace_back("default");
256*e5eeaa8eSAndroid Build Coastguard Worker   default_ns.AddRequires(std::vector{"a.so", "b.so"});
257*e5eeaa8eSAndroid Build Coastguard Worker 
258*e5eeaa8eSAndroid Build Coastguard Worker   Section section("section", std::move(namespaces));
259*e5eeaa8eSAndroid Build Coastguard Worker   section.Resolve(ctx);
260*e5eeaa8eSAndroid Build Coastguard Worker 
261*e5eeaa8eSAndroid Build Coastguard Worker   EXPECT_THAT(
262*e5eeaa8eSAndroid Build Coastguard Worker       std::vector<std::string>{"a.so"},
263*e5eeaa8eSAndroid Build Coastguard Worker       ::testing::ContainerEq(
264*e5eeaa8eSAndroid Build Coastguard Worker           section.GetNamespace("default")->GetLink("foo").GetSharedLibs()));
265*e5eeaa8eSAndroid Build Coastguard Worker   EXPECT_THAT(
266*e5eeaa8eSAndroid Build Coastguard Worker       std::vector<std::string>{"b.so"},
267*e5eeaa8eSAndroid Build Coastguard Worker       ::testing::ContainerEq(
268*e5eeaa8eSAndroid Build Coastguard Worker           section.GetNamespace("default")->GetLink("bar").GetSharedLibs()));
269*e5eeaa8eSAndroid Build Coastguard Worker   EXPECT_THAT(std::vector<std::string>{"b.so"},
270*e5eeaa8eSAndroid Build Coastguard Worker               ::testing::ContainerEq(
271*e5eeaa8eSAndroid Build Coastguard Worker                   section.GetNamespace("foo")->GetLink("bar").GetSharedLibs()));
272*e5eeaa8eSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, section.GetNamespace("baz"));
273*e5eeaa8eSAndroid Build Coastguard Worker }
274*e5eeaa8eSAndroid Build Coastguard Worker 
TEST(linkerconfig_section,resolve_link_modifiers)275*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_section, resolve_link_modifiers) {
276*e5eeaa8eSAndroid Build Coastguard Worker   BaseContext ctx;
277*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
278*e5eeaa8eSAndroid Build Coastguard Worker   Namespace& default_ns = namespaces.emplace_back("default");
279*e5eeaa8eSAndroid Build Coastguard Worker   default_ns.AddRequires(std::vector{":foo", ":bar"});
280*e5eeaa8eSAndroid Build Coastguard Worker 
281*e5eeaa8eSAndroid Build Coastguard Worker   LibProviders providers;
282*e5eeaa8eSAndroid Build Coastguard Worker   providers[":foo"].emplace_back(LibProvider{
283*e5eeaa8eSAndroid Build Coastguard Worker       "foo",
284*e5eeaa8eSAndroid Build Coastguard Worker       []() { return Namespace("foo"); },
285*e5eeaa8eSAndroid Build Coastguard Worker       AllowAllSharedLibs{},
286*e5eeaa8eSAndroid Build Coastguard Worker   });
287*e5eeaa8eSAndroid Build Coastguard Worker   providers[":bar"].emplace_back(LibProvider{
288*e5eeaa8eSAndroid Build Coastguard Worker       "bar",
289*e5eeaa8eSAndroid Build Coastguard Worker       []() { return Namespace("bar"); },
290*e5eeaa8eSAndroid Build Coastguard Worker       SharedLibs{{"libbar.so"}},
291*e5eeaa8eSAndroid Build Coastguard Worker   });
292*e5eeaa8eSAndroid Build Coastguard Worker 
293*e5eeaa8eSAndroid Build Coastguard Worker   Section section("section", std::move(namespaces));
294*e5eeaa8eSAndroid Build Coastguard Worker   section.Resolve(ctx, providers);
295*e5eeaa8eSAndroid Build Coastguard Worker 
296*e5eeaa8eSAndroid Build Coastguard Worker   EXPECT_TRUE(
297*e5eeaa8eSAndroid Build Coastguard Worker       section.GetNamespace("default")->GetLink("foo").IsAllSharedLibsAllowed());
298*e5eeaa8eSAndroid Build Coastguard Worker   EXPECT_THAT(section.GetNamespace("default")->GetLink("bar").GetSharedLibs(),
299*e5eeaa8eSAndroid Build Coastguard Worker               ::testing::ContainerEq(std::vector<std::string>{"libbar.so"}));
300*e5eeaa8eSAndroid Build Coastguard Worker }
301