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 #include <gtest/gtest.h>
17*e5eeaa8eSAndroid Build Coastguard Worker
18*e5eeaa8eSAndroid Build Coastguard Worker #include <vector>
19*e5eeaa8eSAndroid Build Coastguard Worker
20*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configuration.h"
21*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/variables.h"
22*e5eeaa8eSAndroid Build Coastguard Worker #include "modules_testbase.h"
23*e5eeaa8eSAndroid Build Coastguard Worker
24*e5eeaa8eSAndroid Build Coastguard Worker using namespace android::linkerconfig::modules;
25*e5eeaa8eSAndroid Build Coastguard Worker
26*e5eeaa8eSAndroid Build Coastguard Worker constexpr const char* kExpectedConfiguration =
27*e5eeaa8eSAndroid Build Coastguard Worker R"(dir.system = /system/bin
28*e5eeaa8eSAndroid Build Coastguard Worker dir.system = /system/xbin
29*e5eeaa8eSAndroid Build Coastguard Worker dir.system = /product/bin
30*e5eeaa8eSAndroid Build Coastguard Worker dir.vendor = /odm/bin
31*e5eeaa8eSAndroid Build Coastguard Worker dir.vendor = /vendor/bin
32*e5eeaa8eSAndroid Build Coastguard Worker dir.vendor = /system/bin/vendor
33*e5eeaa8eSAndroid Build Coastguard Worker dir.vendor = /product/bin/vendor
34*e5eeaa8eSAndroid Build Coastguard Worker [system]
35*e5eeaa8eSAndroid Build Coastguard Worker additional.namespaces = namespace1,namespace2
36*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.isolated = false
37*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths = /search_path1
38*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths += /apex/search_path2
39*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths = /permitted_path1
40*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths += /apex/permitted_path2
41*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths = /data/asan/search_path1
42*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /search_path1
43*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /apex/search_path2
44*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths = /data/asan/permitted_path1
45*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /permitted_path1
46*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /apex/permitted_path2
47*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths = /search_path1/hwasan
48*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /search_path1
49*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2/hwasan
50*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2
51*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths = /permitted_path1/hwasan
52*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /permitted_path1
53*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2/hwasan
54*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2
55*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.links = namespace1,namespace2
56*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.link.namespace1.shared_libs = lib1.so:lib2.so:lib3.so
57*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.link.namespace2.allow_all_shared_libs = true
58*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.isolated = false
59*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.search.paths = /search_path1
60*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.search.paths += /apex/search_path2
61*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.permitted.paths = /permitted_path1
62*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.permitted.paths += /apex/permitted_path2
63*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.search.paths = /data/asan/search_path1
64*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.search.paths += /search_path1
65*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.search.paths += /apex/search_path2
66*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.permitted.paths = /data/asan/permitted_path1
67*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.permitted.paths += /permitted_path1
68*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.asan.permitted.paths += /apex/permitted_path2
69*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths = /search_path1/hwasan
70*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths += /search_path1
71*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths += /apex/search_path2/hwasan
72*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.search.paths += /apex/search_path2
73*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths = /permitted_path1/hwasan
74*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths += /permitted_path1
75*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths += /apex/permitted_path2/hwasan
76*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace1.hwasan.permitted.paths += /apex/permitted_path2
77*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.isolated = false
78*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.search.paths = /search_path1
79*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.search.paths += /apex/search_path2
80*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.permitted.paths = /permitted_path1
81*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.permitted.paths += /apex/permitted_path2
82*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.search.paths = /data/asan/search_path1
83*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.search.paths += /search_path1
84*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.search.paths += /apex/search_path2
85*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.permitted.paths = /data/asan/permitted_path1
86*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.permitted.paths += /permitted_path1
87*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.asan.permitted.paths += /apex/permitted_path2
88*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths = /search_path1/hwasan
89*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths += /search_path1
90*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths += /apex/search_path2/hwasan
91*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.search.paths += /apex/search_path2
92*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths = /permitted_path1/hwasan
93*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths += /permitted_path1
94*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths += /apex/permitted_path2/hwasan
95*e5eeaa8eSAndroid Build Coastguard Worker namespace.namespace2.hwasan.permitted.paths += /apex/permitted_path2
96*e5eeaa8eSAndroid Build Coastguard Worker [vendor]
97*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.isolated = false
98*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths = /search_path1
99*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.search.paths += /apex/search_path2
100*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths = /permitted_path1
101*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.permitted.paths += /apex/permitted_path2
102*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths = /data/asan/search_path1
103*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /search_path1
104*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.search.paths += /apex/search_path2
105*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths = /data/asan/permitted_path1
106*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /permitted_path1
107*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.asan.permitted.paths += /apex/permitted_path2
108*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths = /search_path1/hwasan
109*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /search_path1
110*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2/hwasan
111*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.search.paths += /apex/search_path2
112*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths = /permitted_path1/hwasan
113*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /permitted_path1
114*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2/hwasan
115*e5eeaa8eSAndroid Build Coastguard Worker namespace.default.hwasan.permitted.paths += /apex/permitted_path2
116*e5eeaa8eSAndroid Build Coastguard Worker )";
117*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_configuration,generate_configuration)118*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_configuration, generate_configuration) {
119*e5eeaa8eSAndroid Build Coastguard Worker std::vector<Section> sections;
120*e5eeaa8eSAndroid Build Coastguard Worker
121*e5eeaa8eSAndroid Build Coastguard Worker std::vector<DirToSection> dir_to_sections = {
122*e5eeaa8eSAndroid Build Coastguard Worker {"/system/bin", "system"},
123*e5eeaa8eSAndroid Build Coastguard Worker {"/system/xbin", "system"},
124*e5eeaa8eSAndroid Build Coastguard Worker {"/product/bin", "system"},
125*e5eeaa8eSAndroid Build Coastguard Worker {"/odm/bin", "vendor"},
126*e5eeaa8eSAndroid Build Coastguard Worker {"/vendor/bin", "vendor"},
127*e5eeaa8eSAndroid Build Coastguard Worker {"/system/bin/vendor", "vendor"},
128*e5eeaa8eSAndroid Build Coastguard Worker {"/product/bin/vendor", "vendor"},
129*e5eeaa8eSAndroid Build Coastguard Worker {"/product/bin", "vendor"}, // note that this is ignored
130*e5eeaa8eSAndroid Build Coastguard Worker };
131*e5eeaa8eSAndroid Build Coastguard Worker
132*e5eeaa8eSAndroid Build Coastguard Worker std::vector<Namespace> system_namespaces;
133*e5eeaa8eSAndroid Build Coastguard Worker
134*e5eeaa8eSAndroid Build Coastguard Worker system_namespaces.emplace_back(CreateNamespaceWithLinks(
135*e5eeaa8eSAndroid Build Coastguard Worker "default", false, false, "namespace1", "namespace2"));
136*e5eeaa8eSAndroid Build Coastguard Worker system_namespaces.emplace_back(
137*e5eeaa8eSAndroid Build Coastguard Worker CreateNamespaceWithPaths("namespace1", false, false));
138*e5eeaa8eSAndroid Build Coastguard Worker system_namespaces.emplace_back(
139*e5eeaa8eSAndroid Build Coastguard Worker CreateNamespaceWithPaths("namespace2", false, false));
140*e5eeaa8eSAndroid Build Coastguard Worker
141*e5eeaa8eSAndroid Build Coastguard Worker Section system_section("system", std::move(system_namespaces));
142*e5eeaa8eSAndroid Build Coastguard Worker sections.emplace_back(std::move(system_section));
143*e5eeaa8eSAndroid Build Coastguard Worker
144*e5eeaa8eSAndroid Build Coastguard Worker std::vector<Namespace> vendor_namespaces;
145*e5eeaa8eSAndroid Build Coastguard Worker
146*e5eeaa8eSAndroid Build Coastguard Worker vendor_namespaces.emplace_back(
147*e5eeaa8eSAndroid Build Coastguard Worker CreateNamespaceWithPaths("default", false, false));
148*e5eeaa8eSAndroid Build Coastguard Worker
149*e5eeaa8eSAndroid Build Coastguard Worker Section vendor_section("vendor", std::move(vendor_namespaces));
150*e5eeaa8eSAndroid Build Coastguard Worker sections.emplace_back(std::move(vendor_section));
151*e5eeaa8eSAndroid Build Coastguard Worker
152*e5eeaa8eSAndroid Build Coastguard Worker Configuration conf(std::move(sections), dir_to_sections);
153*e5eeaa8eSAndroid Build Coastguard Worker
154*e5eeaa8eSAndroid Build Coastguard Worker android::linkerconfig::modules::ConfigWriter writer;
155*e5eeaa8eSAndroid Build Coastguard Worker conf.WriteConfig(writer);
156*e5eeaa8eSAndroid Build Coastguard Worker
157*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedConfiguration, writer.ToString());
158*e5eeaa8eSAndroid Build Coastguard Worker }