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