1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <gtest/gtest.h>
17 
18 #include <vector>
19 
20 #include "linkerconfig/configuration.h"
21 #include "linkerconfig/variables.h"
22 #include "modules_testbase.h"
23 
24 using namespace android::linkerconfig::modules;
25 
26 constexpr const char* kExpectedConfiguration =
27     R"(dir.system = /system/bin
28 dir.system = /system/xbin
29 dir.system = /product/bin
30 dir.vendor = /odm/bin
31 dir.vendor = /vendor/bin
32 dir.vendor = /system/bin/vendor
33 dir.vendor = /product/bin/vendor
34 [system]
35 additional.namespaces = namespace1,namespace2
36 namespace.default.isolated = false
37 namespace.default.search.paths = /search_path1
38 namespace.default.search.paths += /apex/search_path2
39 namespace.default.permitted.paths = /permitted_path1
40 namespace.default.permitted.paths += /apex/permitted_path2
41 namespace.default.asan.search.paths = /data/asan/search_path1
42 namespace.default.asan.search.paths += /search_path1
43 namespace.default.asan.search.paths += /apex/search_path2
44 namespace.default.asan.permitted.paths = /data/asan/permitted_path1
45 namespace.default.asan.permitted.paths += /permitted_path1
46 namespace.default.asan.permitted.paths += /apex/permitted_path2
47 namespace.default.hwasan.search.paths = /search_path1/hwasan
48 namespace.default.hwasan.search.paths += /search_path1
49 namespace.default.hwasan.search.paths += /apex/search_path2/hwasan
50 namespace.default.hwasan.search.paths += /apex/search_path2
51 namespace.default.hwasan.permitted.paths = /permitted_path1/hwasan
52 namespace.default.hwasan.permitted.paths += /permitted_path1
53 namespace.default.hwasan.permitted.paths += /apex/permitted_path2/hwasan
54 namespace.default.hwasan.permitted.paths += /apex/permitted_path2
55 namespace.default.links = namespace1,namespace2
56 namespace.default.link.namespace1.shared_libs = lib1.so:lib2.so:lib3.so
57 namespace.default.link.namespace2.allow_all_shared_libs = true
58 namespace.namespace1.isolated = false
59 namespace.namespace1.search.paths = /search_path1
60 namespace.namespace1.search.paths += /apex/search_path2
61 namespace.namespace1.permitted.paths = /permitted_path1
62 namespace.namespace1.permitted.paths += /apex/permitted_path2
63 namespace.namespace1.asan.search.paths = /data/asan/search_path1
64 namespace.namespace1.asan.search.paths += /search_path1
65 namespace.namespace1.asan.search.paths += /apex/search_path2
66 namespace.namespace1.asan.permitted.paths = /data/asan/permitted_path1
67 namespace.namespace1.asan.permitted.paths += /permitted_path1
68 namespace.namespace1.asan.permitted.paths += /apex/permitted_path2
69 namespace.namespace1.hwasan.search.paths = /search_path1/hwasan
70 namespace.namespace1.hwasan.search.paths += /search_path1
71 namespace.namespace1.hwasan.search.paths += /apex/search_path2/hwasan
72 namespace.namespace1.hwasan.search.paths += /apex/search_path2
73 namespace.namespace1.hwasan.permitted.paths = /permitted_path1/hwasan
74 namespace.namespace1.hwasan.permitted.paths += /permitted_path1
75 namespace.namespace1.hwasan.permitted.paths += /apex/permitted_path2/hwasan
76 namespace.namespace1.hwasan.permitted.paths += /apex/permitted_path2
77 namespace.namespace2.isolated = false
78 namespace.namespace2.search.paths = /search_path1
79 namespace.namespace2.search.paths += /apex/search_path2
80 namespace.namespace2.permitted.paths = /permitted_path1
81 namespace.namespace2.permitted.paths += /apex/permitted_path2
82 namespace.namespace2.asan.search.paths = /data/asan/search_path1
83 namespace.namespace2.asan.search.paths += /search_path1
84 namespace.namespace2.asan.search.paths += /apex/search_path2
85 namespace.namespace2.asan.permitted.paths = /data/asan/permitted_path1
86 namespace.namespace2.asan.permitted.paths += /permitted_path1
87 namespace.namespace2.asan.permitted.paths += /apex/permitted_path2
88 namespace.namespace2.hwasan.search.paths = /search_path1/hwasan
89 namespace.namespace2.hwasan.search.paths += /search_path1
90 namespace.namespace2.hwasan.search.paths += /apex/search_path2/hwasan
91 namespace.namespace2.hwasan.search.paths += /apex/search_path2
92 namespace.namespace2.hwasan.permitted.paths = /permitted_path1/hwasan
93 namespace.namespace2.hwasan.permitted.paths += /permitted_path1
94 namespace.namespace2.hwasan.permitted.paths += /apex/permitted_path2/hwasan
95 namespace.namespace2.hwasan.permitted.paths += /apex/permitted_path2
96 [vendor]
97 namespace.default.isolated = false
98 namespace.default.search.paths = /search_path1
99 namespace.default.search.paths += /apex/search_path2
100 namespace.default.permitted.paths = /permitted_path1
101 namespace.default.permitted.paths += /apex/permitted_path2
102 namespace.default.asan.search.paths = /data/asan/search_path1
103 namespace.default.asan.search.paths += /search_path1
104 namespace.default.asan.search.paths += /apex/search_path2
105 namespace.default.asan.permitted.paths = /data/asan/permitted_path1
106 namespace.default.asan.permitted.paths += /permitted_path1
107 namespace.default.asan.permitted.paths += /apex/permitted_path2
108 namespace.default.hwasan.search.paths = /search_path1/hwasan
109 namespace.default.hwasan.search.paths += /search_path1
110 namespace.default.hwasan.search.paths += /apex/search_path2/hwasan
111 namespace.default.hwasan.search.paths += /apex/search_path2
112 namespace.default.hwasan.permitted.paths = /permitted_path1/hwasan
113 namespace.default.hwasan.permitted.paths += /permitted_path1
114 namespace.default.hwasan.permitted.paths += /apex/permitted_path2/hwasan
115 namespace.default.hwasan.permitted.paths += /apex/permitted_path2
116 )";
117 
TEST(linkerconfig_configuration,generate_configuration)118 TEST(linkerconfig_configuration, generate_configuration) {
119   std::vector<Section> sections;
120 
121   std::vector<DirToSection> dir_to_sections = {
122       {"/system/bin", "system"},
123       {"/system/xbin", "system"},
124       {"/product/bin", "system"},
125       {"/odm/bin", "vendor"},
126       {"/vendor/bin", "vendor"},
127       {"/system/bin/vendor", "vendor"},
128       {"/product/bin/vendor", "vendor"},
129       {"/product/bin", "vendor"},  // note that this is ignored
130   };
131 
132   std::vector<Namespace> system_namespaces;
133 
134   system_namespaces.emplace_back(CreateNamespaceWithLinks(
135       "default", false, false, "namespace1", "namespace2"));
136   system_namespaces.emplace_back(
137       CreateNamespaceWithPaths("namespace1", false, false));
138   system_namespaces.emplace_back(
139       CreateNamespaceWithPaths("namespace2", false, false));
140 
141   Section system_section("system", std::move(system_namespaces));
142   sections.emplace_back(std::move(system_section));
143 
144   std::vector<Namespace> vendor_namespaces;
145 
146   vendor_namespaces.emplace_back(
147       CreateNamespaceWithPaths("default", false, false));
148 
149   Section vendor_section("vendor", std::move(vendor_namespaces));
150   sections.emplace_back(std::move(vendor_section));
151 
152   Configuration conf(std::move(sections), dir_to_sections);
153 
154   android::linkerconfig::modules::ConfigWriter writer;
155   conf.WriteConfig(writer);
156 
157   ASSERT_EQ(kExpectedConfiguration, writer.ToString());
158 }