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/namespace.h"
18*e5eeaa8eSAndroid Build Coastguard Worker
19*e5eeaa8eSAndroid Build Coastguard Worker #include <string>
20*e5eeaa8eSAndroid Build Coastguard Worker #include <vector>
21*e5eeaa8eSAndroid Build Coastguard Worker
22*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/strings.h>
23*e5eeaa8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
24*e5eeaa8eSAndroid Build Coastguard Worker
25*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/configwriter.h"
26*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/link.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 using namespace android::base;
31*e5eeaa8eSAndroid Build Coastguard Worker
32*e5eeaa8eSAndroid Build Coastguard Worker constexpr const char* kExpectedSimpleNamespaceConfig =
33*e5eeaa8eSAndroid Build Coastguard Worker R"(namespace.test_namespace.isolated = false
34*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.search.paths = /search_path1
35*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.search.paths += /apex/search_path2
36*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.permitted.paths = /permitted_path1
37*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.permitted.paths += /apex/permitted_path2
38*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths = /data/asan/search_path1
39*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths += /search_path1
40*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths += /apex/search_path2
41*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths = /data/asan/permitted_path1
42*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths += /permitted_path1
43*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths += /apex/permitted_path2
44*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths = /search_path1/hwasan
45*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /search_path1
46*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /apex/search_path2/hwasan
47*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /apex/search_path2
48*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths = /permitted_path1/hwasan
49*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /permitted_path1
50*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /apex/permitted_path2/hwasan
51*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /apex/permitted_path2
52*e5eeaa8eSAndroid Build Coastguard Worker )";
53*e5eeaa8eSAndroid Build Coastguard Worker
54*e5eeaa8eSAndroid Build Coastguard Worker constexpr const char* kExpectedNamespaceWithLinkConfig =
55*e5eeaa8eSAndroid Build Coastguard Worker R"(namespace.test_namespace.isolated = true
56*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.visible = true
57*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.search.paths = /search_path1
58*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.search.paths += /apex/search_path2
59*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.permitted.paths = /permitted_path1
60*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.permitted.paths += /apex/permitted_path2
61*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths = /data/asan/search_path1
62*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths += /search_path1
63*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths += /apex/search_path2
64*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths = /data/asan/permitted_path1
65*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths += /permitted_path1
66*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths += /apex/permitted_path2
67*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths = /search_path1/hwasan
68*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /search_path1
69*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /apex/search_path2/hwasan
70*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /apex/search_path2
71*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths = /permitted_path1/hwasan
72*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /permitted_path1
73*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /apex/permitted_path2/hwasan
74*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /apex/permitted_path2
75*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.links = target_namespace1,target_namespace2
76*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.link.target_namespace1.shared_libs = lib1.so:lib2.so:lib3.so
77*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.link.target_namespace2.allow_all_shared_libs = true
78*e5eeaa8eSAndroid Build Coastguard Worker )";
79*e5eeaa8eSAndroid Build Coastguard Worker
80*e5eeaa8eSAndroid Build Coastguard Worker constexpr const char* kExpectedNamespaceWithAllowedLibs =
81*e5eeaa8eSAndroid Build Coastguard Worker R"(namespace.test_namespace.isolated = false
82*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.search.paths = /search_path1
83*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.search.paths += /apex/search_path2
84*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.permitted.paths = /permitted_path1
85*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.permitted.paths += /apex/permitted_path2
86*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths = /data/asan/search_path1
87*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths += /search_path1
88*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.search.paths += /apex/search_path2
89*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths = /data/asan/permitted_path1
90*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths += /permitted_path1
91*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.asan.permitted.paths += /apex/permitted_path2
92*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths = /search_path1/hwasan
93*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /search_path1
94*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /apex/search_path2/hwasan
95*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.search.paths += /apex/search_path2
96*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths = /permitted_path1/hwasan
97*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /permitted_path1
98*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /apex/permitted_path2/hwasan
99*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.hwasan.permitted.paths += /apex/permitted_path2
100*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.allowed_libs = allowed_libs_path1
101*e5eeaa8eSAndroid Build Coastguard Worker namespace.test_namespace.allowed_libs += allowed_libs_path2
102*e5eeaa8eSAndroid Build Coastguard Worker )";
103*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_namespace,simple_namespace)104*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_namespace, simple_namespace) {
105*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
106*e5eeaa8eSAndroid Build Coastguard Worker auto ns = CreateNamespaceWithPaths("test_namespace", false, false);
107*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
108*e5eeaa8eSAndroid Build Coastguard Worker auto config = writer.ToString();
109*e5eeaa8eSAndroid Build Coastguard Worker
110*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(config, kExpectedSimpleNamespaceConfig);
111*e5eeaa8eSAndroid Build Coastguard Worker }
112*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_namespace,namespace_with_links)113*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_namespace, namespace_with_links) {
114*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
115*e5eeaa8eSAndroid Build Coastguard Worker
116*e5eeaa8eSAndroid Build Coastguard Worker auto ns = CreateNamespaceWithLinks("test_namespace", true, true,
117*e5eeaa8eSAndroid Build Coastguard Worker "target_namespace1", "target_namespace2");
118*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
119*e5eeaa8eSAndroid Build Coastguard Worker auto config = writer.ToString();
120*e5eeaa8eSAndroid Build Coastguard Worker
121*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(config, kExpectedNamespaceWithLinkConfig);
122*e5eeaa8eSAndroid Build Coastguard Worker }
123*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_namespace,namespace_with_allowed_libs)124*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_namespace, namespace_with_allowed_libs) {
125*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
126*e5eeaa8eSAndroid Build Coastguard Worker auto ns = CreateNamespaceWithPaths("test_namespace", false, false);
127*e5eeaa8eSAndroid Build Coastguard Worker ns.AddAllowedLib("allowed_libs_path1");
128*e5eeaa8eSAndroid Build Coastguard Worker ns.AddAllowedLib("allowed_libs_path2");
129*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
130*e5eeaa8eSAndroid Build Coastguard Worker
131*e5eeaa8eSAndroid Build Coastguard Worker auto config = writer.ToString();
132*e5eeaa8eSAndroid Build Coastguard Worker
133*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(config, kExpectedNamespaceWithAllowedLibs);
134*e5eeaa8eSAndroid Build Coastguard Worker }
135*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_namespace,namespace_links_should_be_ordered)136*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_namespace, namespace_links_should_be_ordered) {
137*e5eeaa8eSAndroid Build Coastguard Worker std::vector<std::string> expected_links = {"z", "a", "o"};
138*e5eeaa8eSAndroid Build Coastguard Worker
139*e5eeaa8eSAndroid Build Coastguard Worker Namespace ns("test_namespace");
140*e5eeaa8eSAndroid Build Coastguard Worker for (auto link : expected_links) {
141*e5eeaa8eSAndroid Build Coastguard Worker ns.GetLink(link).AddSharedLib("lib");
142*e5eeaa8eSAndroid Build Coastguard Worker }
143*e5eeaa8eSAndroid Build Coastguard Worker
144*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
145*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
146*e5eeaa8eSAndroid Build Coastguard Worker
147*e5eeaa8eSAndroid Build Coastguard Worker std::string actual_links;
148*e5eeaa8eSAndroid Build Coastguard Worker for (auto line : Split(writer.ToString(), "\n")) {
149*e5eeaa8eSAndroid Build Coastguard Worker if (StartsWith(line, "namespace.test_namespace.links")) {
150*e5eeaa8eSAndroid Build Coastguard Worker actual_links = Split(line, " ").back();
151*e5eeaa8eSAndroid Build Coastguard Worker }
152*e5eeaa8eSAndroid Build Coastguard Worker }
153*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(android::base::Join(expected_links, ","), actual_links);
154*e5eeaa8eSAndroid Build Coastguard Worker }
155*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_namespace,apex_should_not_allow_all_links)156*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_namespace, apex_should_not_allow_all_links) {
157*e5eeaa8eSAndroid Build Coastguard Worker Namespace ns("test_namespace");
158*e5eeaa8eSAndroid Build Coastguard Worker ns.SetApexSource(ApexSource{"com.android.test", false});
159*e5eeaa8eSAndroid Build Coastguard Worker ns.GetLink("target_namespace").AllowAllSharedLibs();
160*e5eeaa8eSAndroid Build Coastguard Worker
161*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
162*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
163*e5eeaa8eSAndroid Build Coastguard Worker
164*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ("", writer.ToString());
165*e5eeaa8eSAndroid Build Coastguard Worker }
166*e5eeaa8eSAndroid Build Coastguard Worker
TEST(linkerconfig_namespace,should_not_add_link_to_self)167*e5eeaa8eSAndroid Build Coastguard Worker TEST(linkerconfig_namespace, should_not_add_link_to_self) {
168*e5eeaa8eSAndroid Build Coastguard Worker ConfigWriter writer;
169*e5eeaa8eSAndroid Build Coastguard Worker
170*e5eeaa8eSAndroid Build Coastguard Worker auto ns = CreateNamespaceWithLinks(
171*e5eeaa8eSAndroid Build Coastguard Worker "test_namespace", true, true, "target_namespace1", "target_namespace2");
172*e5eeaa8eSAndroid Build Coastguard Worker ns.GetLink("test_namespace").AddSharedLib("libtest.so");
173*e5eeaa8eSAndroid Build Coastguard Worker ns.WriteConfig(writer);
174*e5eeaa8eSAndroid Build Coastguard Worker auto config = writer.ToString();
175*e5eeaa8eSAndroid Build Coastguard Worker
176*e5eeaa8eSAndroid Build Coastguard Worker ASSERT_EQ(config, kExpectedNamespaceWithLinkConfig);
177*e5eeaa8eSAndroid Build Coastguard Worker }
178