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 
17 #include <gtest/gtest.h>
18 
19 #include "linkerconfig/apex.h"
20 #include "linkerconfig/baseconfig.h"
21 #include "linkerconfig/variables.h"
22 #include "testbase.h"
23 
24 using android::linkerconfig::contents::Context;
25 using android::linkerconfig::modules::ApexInfo;
26 using android::linkerconfig::modules::AsanPath;
27 
28 struct linkerconfig_default_backward_compatibility : ::testing::Test {
29   void SetUp() override {
30     MockVariables("Q");
31     ApexInfo vndk_apex;
32     vndk_apex.name = "com.android.vndk.vQ";
33     ctx.AddApexModule(vndk_apex);
34   }
35   Context ctx;
36 };
37 
38 TEST_F(linkerconfig_default_backward_compatibility, common_system_section) {
39   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
40 
41   auto system_section = config.GetSection("system");
42   ASSERT_TRUE(system_section);
43 
44   auto default_namespace = system_section->GetNamespace("default");
45   ASSERT_TRUE(default_namespace);
46 
47   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/vendor/framework",
48                                                        AsanPath::SAME_PATH));
49   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/vendor/app",
50                                                        AsanPath::SAME_PATH));
51   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/vendor/priv-app",
52                                                        AsanPath::SAME_PATH));
53   ASSERT_TRUE(default_namespace->ContainsPermittedPath(
54       "/system/vendor/framework", AsanPath::SAME_PATH));
55   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/system/vendor/app",
56                                                        AsanPath::SAME_PATH));
57   ASSERT_TRUE(default_namespace->ContainsPermittedPath(
58       "/system/vendor/priv-app", AsanPath::SAME_PATH));
59   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/odm/framework",
60                                                        AsanPath::SAME_PATH));
61   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/odm/app",
62                                                        AsanPath::SAME_PATH));
63   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/odm/priv-app",
64                                                        AsanPath::SAME_PATH));
65 
66   auto sphal_namespace = system_section->GetNamespace("sphal");
67   ASSERT_TRUE(sphal_namespace);
68 
69   ASSERT_TRUE(sphal_namespace->ContainsSearchPath("/odm/${LIB}",
70                                                   AsanPath::WITH_DATA_ASAN));
71   ASSERT_TRUE(sphal_namespace->ContainsSearchPath("/vendor/${LIB}",
72                                                   AsanPath::WITH_DATA_ASAN));
73   ASSERT_TRUE(
74       sphal_namespace->ContainsSearchPath("/vendor/${LIB}/hw", AsanPath::NONE));
75 
76   ASSERT_TRUE(sphal_namespace->ContainsPermittedPath("/odm/${LIB}",
77                                                      AsanPath::WITH_DATA_ASAN));
78   ASSERT_TRUE(sphal_namespace->ContainsPermittedPath("/vendor/${LIB}",
79                                                      AsanPath::WITH_DATA_ASAN));
80   ASSERT_TRUE(sphal_namespace->ContainsPermittedPath("/system/vendor/${LIB}",
81                                                      AsanPath::NONE));
82 
83   auto rs_namespace = system_section->GetNamespace("rs");
84   ASSERT_TRUE(rs_namespace);
85 
86   ASSERT_TRUE(rs_namespace->ContainsSearchPath("/odm/${LIB}/vndk-sp",
87                                                AsanPath::WITH_DATA_ASAN));
88   ASSERT_TRUE(rs_namespace->ContainsSearchPath("/vendor/${LIB}/vndk-sp",
89                                                AsanPath::WITH_DATA_ASAN));
90   ASSERT_TRUE(rs_namespace->ContainsSearchPath("/odm/${LIB}",
91                                                AsanPath::WITH_DATA_ASAN));
92   ASSERT_TRUE(rs_namespace->ContainsSearchPath("/vendor/${LIB}",
93                                                AsanPath::WITH_DATA_ASAN));
94 
95   ASSERT_TRUE(rs_namespace->ContainsPermittedPath("/odm/${LIB}",
96                                                   AsanPath::WITH_DATA_ASAN));
97   ASSERT_TRUE(rs_namespace->ContainsPermittedPath("/vendor/${LIB}",
98                                                   AsanPath::WITH_DATA_ASAN));
99   ASSERT_TRUE(rs_namespace->ContainsPermittedPath("/system/vendor/${LIB}",
100                                                   AsanPath::NONE));
101 
102   auto vndk_namespace = system_section->GetNamespace("vndk");
103   ASSERT_TRUE(vndk_namespace);
104 
105   ASSERT_TRUE(vndk_namespace->ContainsSearchPath("/odm/${LIB}/vndk-sp",
106                                                  AsanPath::WITH_DATA_ASAN));
107   ASSERT_TRUE(vndk_namespace->ContainsSearchPath("/vendor/${LIB}/vndk-sp",
108                                                  AsanPath::WITH_DATA_ASAN));
109 
110   ASSERT_TRUE(vndk_namespace->ContainsPermittedPath("/odm/${LIB}/hw",
111                                                     AsanPath::WITH_DATA_ASAN));
112   ASSERT_TRUE(vndk_namespace->ContainsPermittedPath("/odm/${LIB}/egl",
113                                                     AsanPath::WITH_DATA_ASAN));
114   ASSERT_TRUE(vndk_namespace->ContainsPermittedPath("/vendor/${LIB}/hw",
115                                                     AsanPath::WITH_DATA_ASAN));
116   ASSERT_TRUE(vndk_namespace->ContainsPermittedPath("/vendor/${LIB}/egl",
117                                                     AsanPath::WITH_DATA_ASAN));
118 }
119 
120 TEST_F(linkerconfig_default_backward_compatibility, common_vendor_section) {
121   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
122 
123   auto vendor_section = config.GetSection("vendor");
124   ASSERT_TRUE(vendor_section);
125 
126   auto default_namespace = vendor_section->GetNamespace("default");
127   ASSERT_TRUE(default_namespace);
128 
129   ASSERT_TRUE(default_namespace->ContainsSearchPath("/odm/${LIB}",
130                                                     AsanPath::WITH_DATA_ASAN));
131   ASSERT_TRUE(default_namespace->ContainsSearchPath("/vendor/${LIB}",
132                                                     AsanPath::WITH_DATA_ASAN));
133   ASSERT_TRUE(default_namespace->ContainsPermittedPath(
134       "/odm", AsanPath::WITH_DATA_ASAN));
135   ASSERT_TRUE(default_namespace->ContainsPermittedPath(
136       "/vendor", AsanPath::WITH_DATA_ASAN));
137   ASSERT_TRUE(default_namespace->ContainsPermittedPath("/system/vendor",
138                                                        AsanPath::NONE));
139 
140   auto vndk_namespace = vendor_section->GetNamespace("vndk");
141   ASSERT_TRUE(vndk_namespace);
142 
143   ASSERT_TRUE(vndk_namespace->ContainsSearchPath("/odm/${LIB}/vndk",
144                                                  AsanPath::WITH_DATA_ASAN));
145   ASSERT_TRUE(vndk_namespace->ContainsSearchPath("/odm/${LIB}/vndk-sp",
146                                                  AsanPath::WITH_DATA_ASAN));
147   ASSERT_TRUE(vndk_namespace->ContainsSearchPath("/vendor/${LIB}/vndk",
148                                                  AsanPath::WITH_DATA_ASAN));
149   ASSERT_TRUE(vndk_namespace->ContainsSearchPath("/vendor/${LIB}/vndk-sp",
150                                                  AsanPath::WITH_DATA_ASAN));
151 }
152 
153 TEST_F(linkerconfig_default_backward_compatibility,
154        common_unrestricted_section) {
155   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
156 
157   auto unrestricted_section = config.GetSection("unrestricted");
158   ASSERT_TRUE(unrestricted_section);
159 
160   auto default_namespace = unrestricted_section->GetNamespace("default");
161   ASSERT_TRUE(default_namespace);
162 
163   ASSERT_TRUE(default_namespace->ContainsSearchPath("/odm/${LIB}",
164                                                     AsanPath::WITH_DATA_ASAN));
165   ASSERT_TRUE(default_namespace->ContainsSearchPath("/vendor/${LIB}",
166                                                     AsanPath::WITH_DATA_ASAN));
167 }
168 
169 TEST_F(linkerconfig_default_backward_compatibility, vndk_27) {
170   android::linkerconfig::modules::Variables::AddValue("ro.vndk.version", "27");
171 
172   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
173 
174   auto vendor_section = config.GetSection("vendor");
175   ASSERT_TRUE(vendor_section);
176 
177   auto default_namespace = vendor_section->GetNamespace("default");
178   ASSERT_TRUE(default_namespace);
179 
180   ASSERT_TRUE(default_namespace->ContainsSearchPath("/vendor/${LIB}/hw",
181                                                     AsanPath::WITH_DATA_ASAN));
182   ASSERT_TRUE(default_namespace->ContainsSearchPath("/vendor/${LIB}/egl",
183                                                     AsanPath::WITH_DATA_ASAN));
184 }
185