xref: /aosp_15_r20/system/libvintf/test/vintf_object_tests.cpp (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*70a7ec85SAndroid Build Coastguard Worker  *
4*70a7ec85SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*70a7ec85SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*70a7ec85SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*70a7ec85SAndroid Build Coastguard Worker  *
8*70a7ec85SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*70a7ec85SAndroid Build Coastguard Worker  *
10*70a7ec85SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*70a7ec85SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*70a7ec85SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*70a7ec85SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*70a7ec85SAndroid Build Coastguard Worker  * limitations under the License.
15*70a7ec85SAndroid Build Coastguard Worker  */
16*70a7ec85SAndroid Build Coastguard Worker 
17*70a7ec85SAndroid Build Coastguard Worker // This needs to be on top of the file to work.
18*70a7ec85SAndroid Build Coastguard Worker #include "gmock-logging-compat.h"
19*70a7ec85SAndroid Build Coastguard Worker 
20*70a7ec85SAndroid Build Coastguard Worker #include <stdio.h>
21*70a7ec85SAndroid Build Coastguard Worker #include <optional>
22*70a7ec85SAndroid Build Coastguard Worker 
23*70a7ec85SAndroid Build Coastguard Worker #include <android-base/file.h>
24*70a7ec85SAndroid Build Coastguard Worker #include <android-base/logging.h>
25*70a7ec85SAndroid Build Coastguard Worker #include <android-base/result-gmock.h>
26*70a7ec85SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
27*70a7ec85SAndroid Build Coastguard Worker #include <android-base/strings.h>
28*70a7ec85SAndroid Build Coastguard Worker #include <gtest/gtest.h>
29*70a7ec85SAndroid Build Coastguard Worker 
30*70a7ec85SAndroid Build Coastguard Worker #include <vintf/VintfObject.h>
31*70a7ec85SAndroid Build Coastguard Worker #include <vintf/parse_string.h>
32*70a7ec85SAndroid Build Coastguard Worker #include <vintf/parse_xml.h>
33*70a7ec85SAndroid Build Coastguard Worker #include "constants-private.h"
34*70a7ec85SAndroid Build Coastguard Worker #include "parse_xml_internal.h"
35*70a7ec85SAndroid Build Coastguard Worker #include "test_constants.h"
36*70a7ec85SAndroid Build Coastguard Worker #include "utils-fake.h"
37*70a7ec85SAndroid Build Coastguard Worker 
38*70a7ec85SAndroid Build Coastguard Worker using namespace ::testing;
39*70a7ec85SAndroid Build Coastguard Worker using namespace std::literals;
40*70a7ec85SAndroid Build Coastguard Worker 
41*70a7ec85SAndroid Build Coastguard Worker using android::base::testing::HasError;
42*70a7ec85SAndroid Build Coastguard Worker using android::base::testing::HasValue;
43*70a7ec85SAndroid Build Coastguard Worker using android::base::testing::Ok;
44*70a7ec85SAndroid Build Coastguard Worker using android::base::testing::WithCode;
45*70a7ec85SAndroid Build Coastguard Worker using android::base::testing::WithMessage;
46*70a7ec85SAndroid Build Coastguard Worker using android::vintf::FqInstance;
47*70a7ec85SAndroid Build Coastguard Worker 
48*70a7ec85SAndroid Build Coastguard Worker #define EXPECT_IN(sub, str) EXPECT_THAT(str, HasSubstr(sub))
49*70a7ec85SAndroid Build Coastguard Worker #define EXPECT_NOT_IN(sub, str) EXPECT_THAT(str, Not(HasSubstr(sub)))
50*70a7ec85SAndroid Build Coastguard Worker 
51*70a7ec85SAndroid Build Coastguard Worker namespace android {
52*70a7ec85SAndroid Build Coastguard Worker namespace vintf {
53*70a7ec85SAndroid Build Coastguard Worker namespace testing {
54*70a7ec85SAndroid Build Coastguard Worker 
55*70a7ec85SAndroid Build Coastguard Worker using namespace ::android::vintf::details;
56*70a7ec85SAndroid Build Coastguard Worker 
57*70a7ec85SAndroid Build Coastguard Worker // clang-format off
58*70a7ec85SAndroid Build Coastguard Worker 
59*70a7ec85SAndroid Build Coastguard Worker //
60*70a7ec85SAndroid Build Coastguard Worker // Set of Xml1 metadata compatible with each other.
61*70a7ec85SAndroid Build Coastguard Worker //
62*70a7ec85SAndroid Build Coastguard Worker 
63*70a7ec85SAndroid Build Coastguard Worker const std::string systemMatrixXml1 =
64*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
65*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
66*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.camera</name>\n"
67*70a7ec85SAndroid Build Coastguard Worker     "        <version>2.0-5</version>\n"
68*70a7ec85SAndroid Build Coastguard Worker     "        <version>3.4-16</version>\n"
69*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
70*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
71*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.nfc</name>\n"
72*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
73*70a7ec85SAndroid Build Coastguard Worker     "        <version>2.0</version>\n"
74*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
75*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
76*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
77*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
78*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
79*70a7ec85SAndroid Build Coastguard Worker     "    <kernel version=\"3.18.31\"></kernel>\n"
80*70a7ec85SAndroid Build Coastguard Worker     "    <sepolicy>\n"
81*70a7ec85SAndroid Build Coastguard Worker     "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
82*70a7ec85SAndroid Build Coastguard Worker     "        <sepolicy-version>25.5</sepolicy-version>\n"
83*70a7ec85SAndroid Build Coastguard Worker     "        <sepolicy-version>26.0-3</sepolicy-version>\n"
84*70a7ec85SAndroid Build Coastguard Worker     "    </sepolicy>\n"
85*70a7ec85SAndroid Build Coastguard Worker     "    <avb>\n"
86*70a7ec85SAndroid Build Coastguard Worker     "        <vbmeta-version>0.0</vbmeta-version>\n"
87*70a7ec85SAndroid Build Coastguard Worker     "    </avb>\n"
88*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
89*70a7ec85SAndroid Build Coastguard Worker 
90*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifestXml1 =
91*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
92*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
93*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.camera</name>\n"
94*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
95*70a7ec85SAndroid Build Coastguard Worker     "        <version>3.5</version>\n"
96*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
97*70a7ec85SAndroid Build Coastguard Worker     "            <name>IBetterCamera</name>\n"
98*70a7ec85SAndroid Build Coastguard Worker     "            <instance>camera</instance>\n"
99*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
100*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
101*70a7ec85SAndroid Build Coastguard Worker     "            <name>ICamera</name>\n"
102*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
103*70a7ec85SAndroid Build Coastguard Worker     "            <instance>legacy/0</instance>\n"
104*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
105*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
106*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
107*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.nfc</name>\n"
108*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
109*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
110*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
111*70a7ec85SAndroid Build Coastguard Worker     "            <name>INfc</name>\n"
112*70a7ec85SAndroid Build Coastguard Worker     "            <instance>nfc_nci</instance>\n"
113*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
114*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
115*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
116*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.nfc</name>\n"
117*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
118*70a7ec85SAndroid Build Coastguard Worker     "        <version>2.0</version>\n"
119*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
120*70a7ec85SAndroid Build Coastguard Worker     "            <name>INfc</name>\n"
121*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
122*70a7ec85SAndroid Build Coastguard Worker     "            <instance>nfc_nci</instance>\n"
123*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
124*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
125*70a7ec85SAndroid Build Coastguard Worker     "    <sepolicy>\n"
126*70a7ec85SAndroid Build Coastguard Worker     "        <version>25.5</version>\n"
127*70a7ec85SAndroid Build Coastguard Worker     "    </sepolicy>\n"
128*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
129*70a7ec85SAndroid Build Coastguard Worker 
130*70a7ec85SAndroid Build Coastguard Worker const std::string systemManifestXml1 =
131*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
132*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
133*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hidl.manager</name>\n"
134*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
135*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
136*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
137*70a7ec85SAndroid Build Coastguard Worker     "            <name>IServiceManager</name>\n"
138*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
139*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
140*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
141*70a7ec85SAndroid Build Coastguard Worker     "    <vndk>\n"
142*70a7ec85SAndroid Build Coastguard Worker     "        <version>25.0.5</version>\n"
143*70a7ec85SAndroid Build Coastguard Worker     "        <library>libbase.so</library>\n"
144*70a7ec85SAndroid Build Coastguard Worker     "        <library>libjpeg.so</library>\n"
145*70a7ec85SAndroid Build Coastguard Worker     "    </vndk>\n"
146*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
147*70a7ec85SAndroid Build Coastguard Worker 
148*70a7ec85SAndroid Build Coastguard Worker const std::string vendorMatrixXml1 =
149*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
150*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
151*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hidl.manager</name>\n"
152*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
153*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
154*70a7ec85SAndroid Build Coastguard Worker     "    <vndk>\n"
155*70a7ec85SAndroid Build Coastguard Worker     "        <version>25.0.1-5</version>\n"
156*70a7ec85SAndroid Build Coastguard Worker     "        <library>libbase.so</library>\n"
157*70a7ec85SAndroid Build Coastguard Worker     "        <library>libjpeg.so</library>\n"
158*70a7ec85SAndroid Build Coastguard Worker     "    </vndk>\n"
159*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
160*70a7ec85SAndroid Build Coastguard Worker 
161*70a7ec85SAndroid Build Coastguard Worker //
162*70a7ec85SAndroid Build Coastguard Worker // Set of Xml2 metadata compatible with each other.
163*70a7ec85SAndroid Build Coastguard Worker //
164*70a7ec85SAndroid Build Coastguard Worker 
165*70a7ec85SAndroid Build Coastguard Worker const std::string systemMatrixXml2 =
166*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
167*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
168*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
169*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
170*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
171*70a7ec85SAndroid Build Coastguard Worker     "    <kernel version=\"3.18.31\"></kernel>\n"
172*70a7ec85SAndroid Build Coastguard Worker     "    <sepolicy>\n"
173*70a7ec85SAndroid Build Coastguard Worker     "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
174*70a7ec85SAndroid Build Coastguard Worker     "        <sepolicy-version>25.5</sepolicy-version>\n"
175*70a7ec85SAndroid Build Coastguard Worker     "        <sepolicy-version>26.0-3</sepolicy-version>\n"
176*70a7ec85SAndroid Build Coastguard Worker     "    </sepolicy>\n"
177*70a7ec85SAndroid Build Coastguard Worker     "    <avb>\n"
178*70a7ec85SAndroid Build Coastguard Worker     "        <vbmeta-version>0.0</vbmeta-version>\n"
179*70a7ec85SAndroid Build Coastguard Worker     "    </avb>\n"
180*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
181*70a7ec85SAndroid Build Coastguard Worker 
182*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifestXml2 =
183*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">"
184*70a7ec85SAndroid Build Coastguard Worker     "    <hal>"
185*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>"
186*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>"
187*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>"
188*70a7ec85SAndroid Build Coastguard Worker     "    </hal>"
189*70a7ec85SAndroid Build Coastguard Worker     "    <sepolicy>\n"
190*70a7ec85SAndroid Build Coastguard Worker     "        <version>25.5</version>\n"
191*70a7ec85SAndroid Build Coastguard Worker     "    </sepolicy>\n"
192*70a7ec85SAndroid Build Coastguard Worker     "</manifest>";
193*70a7ec85SAndroid Build Coastguard Worker 
194*70a7ec85SAndroid Build Coastguard Worker //
195*70a7ec85SAndroid Build Coastguard Worker // Set of framework matrices of different FCM version.
196*70a7ec85SAndroid Build Coastguard Worker //
197*70a7ec85SAndroid Build Coastguard Worker 
198*70a7ec85SAndroid Build Coastguard Worker const std::string systemMatrixLevel1 =
199*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
200*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
201*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.major</name>\n"
202*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
203*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
204*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMajor</name>\n"
205*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
206*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
207*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
208*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
209*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.removed</name>\n"
210*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
211*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
212*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRemoved</name>\n"
213*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
214*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
215*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
216*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
217*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.minor</name>\n"
218*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
219*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
220*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMinor</name>\n"
221*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
222*70a7ec85SAndroid Build Coastguard Worker     "            <instance>legacy</instance>\n"
223*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
224*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
225*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"aidl\" optional=\"true\">\n"
226*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.minor</name>\n"
227*70a7ec85SAndroid Build Coastguard Worker     "        <version>101</version>\n"
228*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
229*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMinor</name>\n"
230*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
231*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
232*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
233*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"aidl\" optional=\"true\">\n"
234*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.removed</name>\n"
235*70a7ec85SAndroid Build Coastguard Worker     "        <version>101</version>\n"
236*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
237*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRemoved</name>\n"
238*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
239*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
240*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
241*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"aidl\" exclusive-to=\"virtual-machine\">\n"
242*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.vm.removed</name>\n"
243*70a7ec85SAndroid Build Coastguard Worker     "        <version>2</version>\n"
244*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
245*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRemoved</name>\n"
246*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
247*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
248*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
249*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
250*70a7ec85SAndroid Build Coastguard Worker 
251*70a7ec85SAndroid Build Coastguard Worker const std::string systemMatrixLevel2 =
252*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
253*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
254*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.major</name>\n"
255*70a7ec85SAndroid Build Coastguard Worker     "        <version>2.0</version>\n"
256*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
257*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMajor</name>\n"
258*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
259*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
260*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
261*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
262*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.minor</name>\n"
263*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.1</version>\n"
264*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
265*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMinor</name>\n"
266*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
267*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
268*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
269*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"aidl\" optional=\"true\">\n"
270*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.minor</name>\n"
271*70a7ec85SAndroid Build Coastguard Worker     "        <version>102</version>\n"
272*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
273*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMinor</name>\n"
274*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
275*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
276*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
277*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"aidl\" exclusive-to=\"virtual-machine\">\n"
278*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.vm.removed</name>\n"
279*70a7ec85SAndroid Build Coastguard Worker     "        <version>3</version>\n"
280*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
281*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRemoved</name>\n"
282*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
283*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
284*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
285*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
286*70a7ec85SAndroid Build Coastguard Worker 
287*70a7ec85SAndroid Build Coastguard Worker //
288*70a7ec85SAndroid Build Coastguard Worker // Smaller product FCMs at different levels to test that framework and product
289*70a7ec85SAndroid Build Coastguard Worker // FCMs are combined when checking deprecation.
290*70a7ec85SAndroid Build Coastguard Worker //
291*70a7ec85SAndroid Build Coastguard Worker 
292*70a7ec85SAndroid Build Coastguard Worker const std::string productMatrixLevel1 =
293*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
294*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
295*70a7ec85SAndroid Build Coastguard Worker     "        <name>product.removed</name>\n"
296*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
297*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
298*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRemoved</name>\n"
299*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
300*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
301*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
302*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
303*70a7ec85SAndroid Build Coastguard Worker     "        <name>product.minor</name>\n"
304*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
305*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
306*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMinor</name>\n"
307*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
308*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
309*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
310*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
311*70a7ec85SAndroid Build Coastguard Worker 
312*70a7ec85SAndroid Build Coastguard Worker const std::string productMatrixLevel2 =
313*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
314*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"true\">\n"
315*70a7ec85SAndroid Build Coastguard Worker     "        <name>product.minor</name>\n"
316*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.1</version>\n"
317*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
318*70a7ec85SAndroid Build Coastguard Worker     "            <name>IMinor</name>\n"
319*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
320*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
321*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
322*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
323*70a7ec85SAndroid Build Coastguard Worker 
324*70a7ec85SAndroid Build Coastguard Worker //
325*70a7ec85SAndroid Build Coastguard Worker // Set of framework matrices of different FCM version with regex.
326*70a7ec85SAndroid Build Coastguard Worker //
327*70a7ec85SAndroid Build Coastguard Worker 
328*70a7ec85SAndroid Build Coastguard Worker const static std::vector<std::string> systemMatrixRegexXmls = {
329*70a7ec85SAndroid Build Coastguard Worker     // 1.xml
330*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
331*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
332*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.regex</name>\n"
333*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0-1</version>\n"
334*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
335*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRegex</name>\n"
336*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
337*70a7ec85SAndroid Build Coastguard Worker     "            <instance>special/1.0</instance>\n"
338*70a7ec85SAndroid Build Coastguard Worker     "            <regex-instance>regex/1.0/[0-9]+</regex-instance>\n"
339*70a7ec85SAndroid Build Coastguard Worker     "            <regex-instance>regex_common/[0-9]+</regex-instance>\n"
340*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
341*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
342*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
343*70a7ec85SAndroid Build Coastguard Worker     // 2.xml
344*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
345*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
346*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.regex</name>\n"
347*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.1-2</version>\n"
348*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
349*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRegex</name>\n"
350*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
351*70a7ec85SAndroid Build Coastguard Worker     "            <instance>special/1.1</instance>\n"
352*70a7ec85SAndroid Build Coastguard Worker     "            <regex-instance>regex/1.1/[0-9]+</regex-instance>\n"
353*70a7ec85SAndroid Build Coastguard Worker     "            <regex-instance>[a-z]+_[a-z]+/[0-9]+</regex-instance>\n"
354*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
355*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
356*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
357*70a7ec85SAndroid Build Coastguard Worker     // 3.xml
358*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"3\">\n"
359*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
360*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.regex</name>\n"
361*70a7ec85SAndroid Build Coastguard Worker     "        <version>2.0</version>\n"
362*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
363*70a7ec85SAndroid Build Coastguard Worker     "            <name>IRegex</name>\n"
364*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
365*70a7ec85SAndroid Build Coastguard Worker     "            <instance>special/2.0</instance>\n"
366*70a7ec85SAndroid Build Coastguard Worker     "            <regex-instance>regex/2.0/[0-9]+</regex-instance>\n"
367*70a7ec85SAndroid Build Coastguard Worker     "            <regex-instance>regex_[a-z]+/[0-9]+</regex-instance>\n"
368*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
369*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
370*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n"};
371*70a7ec85SAndroid Build Coastguard Worker 
372*70a7ec85SAndroid Build Coastguard Worker //
373*70a7ec85SAndroid Build Coastguard Worker // Set of metadata at different FCM version that has requirements
374*70a7ec85SAndroid Build Coastguard Worker //
375*70a7ec85SAndroid Build Coastguard Worker 
376*70a7ec85SAndroid Build Coastguard Worker const std::vector<std::string> systemMatrixRequire = {
377*70a7ec85SAndroid Build Coastguard Worker     // 1.xml
378*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
379*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
380*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
381*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
382*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
383*70a7ec85SAndroid Build Coastguard Worker     "            <name>IFoo</name>\n"
384*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
385*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
386*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
387*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
388*70a7ec85SAndroid Build Coastguard Worker     // 2.xml
389*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
390*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" optional=\"false\">\n"
391*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.bar</name>\n"
392*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
393*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
394*70a7ec85SAndroid Build Coastguard Worker     "            <name>IBar</name>\n"
395*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
396*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
397*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
398*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n"};
399*70a7ec85SAndroid Build Coastguard Worker 
400*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifestRequire1 =
401*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\">\n"
402*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
403*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
404*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
405*70a7ec85SAndroid Build Coastguard Worker     "        <fqname>@1.0::IFoo/default</fqname>\n"
406*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
407*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
408*70a7ec85SAndroid Build Coastguard Worker 
409*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifestRequire2 =
410*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"2\">\n"
411*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
412*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.bar</name>\n"
413*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
414*70a7ec85SAndroid Build Coastguard Worker     "        <fqname>@1.0::IBar/default</fqname>\n"
415*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
416*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
417*70a7ec85SAndroid Build Coastguard Worker 
418*70a7ec85SAndroid Build Coastguard Worker //
419*70a7ec85SAndroid Build Coastguard Worker // Set of metadata for kernel requirements
420*70a7ec85SAndroid Build Coastguard Worker //
421*70a7ec85SAndroid Build Coastguard Worker 
422*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifestKernel318 =
423*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
424*70a7ec85SAndroid Build Coastguard Worker     "    <kernel version=\"3.18.999\" />\n"
425*70a7ec85SAndroid Build Coastguard Worker     "    <sepolicy>\n"
426*70a7ec85SAndroid Build Coastguard Worker     "        <version>25.5</version>\n"
427*70a7ec85SAndroid Build Coastguard Worker     "    </sepolicy>\n"
428*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
429*70a7ec85SAndroid Build Coastguard Worker 
430*70a7ec85SAndroid Build Coastguard Worker const std::string systemMatrixKernel318 =
431*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
432*70a7ec85SAndroid Build Coastguard Worker     "    <kernel version=\"3.18.999\"></kernel>\n"
433*70a7ec85SAndroid Build Coastguard Worker     "    <sepolicy>\n"
434*70a7ec85SAndroid Build Coastguard Worker     "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
435*70a7ec85SAndroid Build Coastguard Worker     "        <sepolicy-version>25.5</sepolicy-version>\n"
436*70a7ec85SAndroid Build Coastguard Worker     "    </sepolicy>\n"
437*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n";
438*70a7ec85SAndroid Build Coastguard Worker 
439*70a7ec85SAndroid Build Coastguard Worker const std::string apexHalName = "android.hardware.apex.foo";
440*70a7ec85SAndroid Build Coastguard Worker const std::string apexHalManifest =
441*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
442*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"aidl\">\n"
443*70a7ec85SAndroid Build Coastguard Worker     "        <name>" + apexHalName + "</name>\n"
444*70a7ec85SAndroid Build Coastguard Worker     "        <fqname>IApex/default</fqname>\n"
445*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
446*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
447*70a7ec85SAndroid Build Coastguard Worker 
448*70a7ec85SAndroid Build Coastguard Worker class VintfObjectTestBase : public ::testing::Test {
449*70a7ec85SAndroid Build Coastguard Worker    protected:
fetcher()450*70a7ec85SAndroid Build Coastguard Worker     MockFileSystem& fetcher() {
451*70a7ec85SAndroid Build Coastguard Worker         return static_cast<MockFileSystem&>(*vintfObject->getFileSystem());
452*70a7ec85SAndroid Build Coastguard Worker     }
propertyFetcher()453*70a7ec85SAndroid Build Coastguard Worker     MockPropertyFetcher& propertyFetcher() {
454*70a7ec85SAndroid Build Coastguard Worker         return static_cast<MockPropertyFetcher&>(*vintfObject->getPropertyFetcher());
455*70a7ec85SAndroid Build Coastguard Worker     }
456*70a7ec85SAndroid Build Coastguard Worker 
setCheckAidlFCM(bool check)457*70a7ec85SAndroid Build Coastguard Worker     void setCheckAidlFCM(bool check) { vintfObject->setFakeCheckAidlCompatMatrix(check); }
useEmptyFileSystem()458*70a7ec85SAndroid Build Coastguard Worker     void useEmptyFileSystem() {
459*70a7ec85SAndroid Build Coastguard Worker         // By default, no files exist in the file system.
460*70a7ec85SAndroid Build Coastguard Worker         // Use EXPECT_CALL because more specific expectation of fetch and listFiles will come along.
461*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(_, _, _)).Times(AnyNumber())
462*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Return(::android::NAME_NOT_FOUND));
463*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(_, _)).Times(AnyNumber())
464*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Return(::android::NAME_NOT_FOUND));
465*70a7ec85SAndroid Build Coastguard Worker     }
466*70a7ec85SAndroid Build Coastguard Worker 
467*70a7ec85SAndroid Build Coastguard Worker     // Setup the MockFileSystem used by the fetchAllInformation template
468*70a7ec85SAndroid Build Coastguard Worker     // so it returns the given metadata info instead of fetching from device.
setupMockFetcher(const std::string & vendorManifestXml,const std::string & systemMatrixXml,const std::string & systemManifestXml,const std::string & vendorMatrixXml)469*70a7ec85SAndroid Build Coastguard Worker     void setupMockFetcher(const std::string& vendorManifestXml, const std::string& systemMatrixXml,
470*70a7ec85SAndroid Build Coastguard Worker                           const std::string& systemManifestXml, const std::string& vendorMatrixXml) {
471*70a7ec85SAndroid Build Coastguard Worker 
472*70a7ec85SAndroid Build Coastguard Worker         useEmptyFileSystem();
473*70a7ec85SAndroid Build Coastguard Worker 
474*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), fetch(StrEq(kVendorLegacyManifest), _))
475*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(
476*70a7ec85SAndroid Build Coastguard Worker                 Invoke([vendorManifestXml](const std::string& path, std::string& fetched) {
477*70a7ec85SAndroid Build Coastguard Worker                     (void)path;
478*70a7ec85SAndroid Build Coastguard Worker                     fetched = vendorManifestXml;
479*70a7ec85SAndroid Build Coastguard Worker                     return 0;
480*70a7ec85SAndroid Build Coastguard Worker                 }));
481*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), fetch(StrEq(kSystemManifest), _))
482*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(
483*70a7ec85SAndroid Build Coastguard Worker                 Invoke([systemManifestXml](const std::string& path, std::string& fetched) {
484*70a7ec85SAndroid Build Coastguard Worker                     (void)path;
485*70a7ec85SAndroid Build Coastguard Worker                     fetched = systemManifestXml;
486*70a7ec85SAndroid Build Coastguard Worker                     return 0;
487*70a7ec85SAndroid Build Coastguard Worker                 }));
488*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), fetch(StrEq(kVendorLegacyMatrix), _))
489*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Invoke([vendorMatrixXml](const std::string& path, std::string& fetched) {
490*70a7ec85SAndroid Build Coastguard Worker                 (void)path;
491*70a7ec85SAndroid Build Coastguard Worker                 fetched = vendorMatrixXml;
492*70a7ec85SAndroid Build Coastguard Worker                 return 0;
493*70a7ec85SAndroid Build Coastguard Worker             }));
494*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), fetch(StrEq(kSystemLegacyMatrix), _))
495*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Invoke([systemMatrixXml](const std::string& path, std::string& fetched) {
496*70a7ec85SAndroid Build Coastguard Worker                 (void)path;
497*70a7ec85SAndroid Build Coastguard Worker                 fetched = systemMatrixXml;
498*70a7ec85SAndroid Build Coastguard Worker                 return 0;
499*70a7ec85SAndroid Build Coastguard Worker             }));
500*70a7ec85SAndroid Build Coastguard Worker     }
SetUp()501*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
502*70a7ec85SAndroid Build Coastguard Worker         vintfObject = VintfObject::Builder()
503*70a7ec85SAndroid Build Coastguard Worker                           .setFileSystem(std::make_unique<NiceMock<MockFileSystem>>())
504*70a7ec85SAndroid Build Coastguard Worker                           .setRuntimeInfoFactory(std::make_unique<NiceMock<MockRuntimeInfoFactory>>(
505*70a7ec85SAndroid Build Coastguard Worker                               std::make_shared<NiceMock<MockRuntimeInfo>>()))
506*70a7ec85SAndroid Build Coastguard Worker                           .setPropertyFetcher(std::make_unique<NiceMock<MockPropertyFetcher>>())
507*70a7ec85SAndroid Build Coastguard Worker                           .build();
508*70a7ec85SAndroid Build Coastguard Worker 
509*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(propertyFetcher(), getBoolProperty("apex.all.ready", _))
510*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Return(true));
511*70a7ec85SAndroid Build Coastguard Worker     }
TearDown()512*70a7ec85SAndroid Build Coastguard Worker     virtual void TearDown() {
513*70a7ec85SAndroid Build Coastguard Worker         Mock::VerifyAndClear(&fetcher());
514*70a7ec85SAndroid Build Coastguard Worker     }
515*70a7ec85SAndroid Build Coastguard Worker 
expectVendorManifest(size_t times=1)516*70a7ec85SAndroid Build Coastguard Worker     void expectVendorManifest(size_t times = 1) {
517*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(kVendorLegacyManifest), _)).Times(times);
518*70a7ec85SAndroid Build Coastguard Worker     }
519*70a7ec85SAndroid Build Coastguard Worker 
expectSystemManifest(size_t times=1)520*70a7ec85SAndroid Build Coastguard Worker     void expectSystemManifest(size_t times = 1) {
521*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(kSystemManifest), _)).Times(times);
522*70a7ec85SAndroid Build Coastguard Worker     }
523*70a7ec85SAndroid Build Coastguard Worker 
expectVendorMatrix(size_t times=1)524*70a7ec85SAndroid Build Coastguard Worker     void expectVendorMatrix(size_t times = 1) {
525*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(kVendorLegacyMatrix), _)).Times(times);
526*70a7ec85SAndroid Build Coastguard Worker     }
527*70a7ec85SAndroid Build Coastguard Worker 
expectSystemMatrix(size_t times=1)528*70a7ec85SAndroid Build Coastguard Worker     void expectSystemMatrix(size_t times = 1) {
529*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(kSystemLegacyMatrix), _)).Times(times);
530*70a7ec85SAndroid Build Coastguard Worker     }
531*70a7ec85SAndroid Build Coastguard Worker 
532*70a7ec85SAndroid Build Coastguard Worker     // Expect that a file exist and should be fetched once.
expectFetch(const std::string & path,const std::string & content)533*70a7ec85SAndroid Build Coastguard Worker     void expectFetch(const std::string& path, const std::string& content) {
534*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(path), _))
535*70a7ec85SAndroid Build Coastguard Worker             .WillOnce(Invoke([content](const auto&, auto& out) {
536*70a7ec85SAndroid Build Coastguard Worker                 out = content;
537*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
538*70a7ec85SAndroid Build Coastguard Worker             }));
539*70a7ec85SAndroid Build Coastguard Worker     }
540*70a7ec85SAndroid Build Coastguard Worker 
541*70a7ec85SAndroid Build Coastguard Worker     // Expect that a file exist and can be fetched 0 or more times.
expectFetchRepeatedly(const std::string & path,const std::string & content)542*70a7ec85SAndroid Build Coastguard Worker     void expectFetchRepeatedly(const std::string& path, const std::string& content) {
543*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(path), _))
544*70a7ec85SAndroid Build Coastguard Worker             .Times(AnyNumber())
545*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([content](const auto&, auto& out) {
546*70a7ec85SAndroid Build Coastguard Worker                 out = content;
547*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
548*70a7ec85SAndroid Build Coastguard Worker             }));
549*70a7ec85SAndroid Build Coastguard Worker     }
550*70a7ec85SAndroid Build Coastguard Worker 
551*70a7ec85SAndroid Build Coastguard Worker     // Expect that the file should never be fetched (whether it exists or not).
expectNeverFetch(const std::string & path)552*70a7ec85SAndroid Build Coastguard Worker     void expectNeverFetch(const std::string& path) {
553*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(StrEq(path), _)).Times(0);
554*70a7ec85SAndroid Build Coastguard Worker     }
555*70a7ec85SAndroid Build Coastguard Worker 
556*70a7ec85SAndroid Build Coastguard Worker     // Expect that the file does not exist, and can be fetched 0 or more times.
557*70a7ec85SAndroid Build Coastguard Worker     template <typename Matcher>
expectFileNotExist(const Matcher & matcher)558*70a7ec85SAndroid Build Coastguard Worker     void expectFileNotExist(const Matcher& matcher) {
559*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), fetch(matcher, _))
560*70a7ec85SAndroid Build Coastguard Worker             .Times(AnyNumber())
561*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Return(::android::NAME_NOT_FOUND));
562*70a7ec85SAndroid Build Coastguard Worker     }
563*70a7ec85SAndroid Build Coastguard Worker 
564*70a7ec85SAndroid Build Coastguard Worker     // clang-format on
expectVendorManifest(Level level,const std::vector<std::string> & fqInstances,const std::vector<FqInstance> & aidlInstances={},ExclusiveTo exclusiveTo=ExclusiveTo::EMPTY)565*70a7ec85SAndroid Build Coastguard Worker     void expectVendorManifest(Level level, const std::vector<std::string>& fqInstances,
566*70a7ec85SAndroid Build Coastguard Worker                               const std::vector<FqInstance>& aidlInstances = {},
567*70a7ec85SAndroid Build Coastguard Worker                               ExclusiveTo exclusiveTo = ExclusiveTo::EMPTY) {
568*70a7ec85SAndroid Build Coastguard Worker         std::string xml =
569*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(R"(<manifest %s type="device" target-level="%s">)",
570*70a7ec85SAndroid Build Coastguard Worker                                         kMetaVersionStr.c_str(), to_string(level).c_str());
571*70a7ec85SAndroid Build Coastguard Worker         for (const auto& fqInstanceString : fqInstances) {
572*70a7ec85SAndroid Build Coastguard Worker             auto fqInstance = FqInstance::from(fqInstanceString);
573*70a7ec85SAndroid Build Coastguard Worker             ASSERT_TRUE(fqInstance.has_value());
574*70a7ec85SAndroid Build Coastguard Worker             xml += android::base::StringPrintf(
575*70a7ec85SAndroid Build Coastguard Worker                 R"(
576*70a7ec85SAndroid Build Coastguard Worker                     <hal format="hidl">
577*70a7ec85SAndroid Build Coastguard Worker                         <name>%s</name>
578*70a7ec85SAndroid Build Coastguard Worker                         <transport>hwbinder</transport>
579*70a7ec85SAndroid Build Coastguard Worker                         <fqname>%s</fqname>
580*70a7ec85SAndroid Build Coastguard Worker                     </hal>
581*70a7ec85SAndroid Build Coastguard Worker                 )",
582*70a7ec85SAndroid Build Coastguard Worker                 fqInstance->getPackage().c_str(),
583*70a7ec85SAndroid Build Coastguard Worker                 toFQNameString(fqInstance->getVersion(), fqInstance->getInterface(),
584*70a7ec85SAndroid Build Coastguard Worker                                fqInstance->getInstance())
585*70a7ec85SAndroid Build Coastguard Worker                     .c_str());
586*70a7ec85SAndroid Build Coastguard Worker         }
587*70a7ec85SAndroid Build Coastguard Worker         for (const auto& fqInstance : aidlInstances) {
588*70a7ec85SAndroid Build Coastguard Worker             xml += android::base::StringPrintf(
589*70a7ec85SAndroid Build Coastguard Worker                 R"(
590*70a7ec85SAndroid Build Coastguard Worker                     <hal format="aidl" exclusive-to="%s">
591*70a7ec85SAndroid Build Coastguard Worker                         <name>%s</name>
592*70a7ec85SAndroid Build Coastguard Worker                         <version>%zu</version>
593*70a7ec85SAndroid Build Coastguard Worker                         <fqname>%s</fqname>
594*70a7ec85SAndroid Build Coastguard Worker                     </hal>
595*70a7ec85SAndroid Build Coastguard Worker                 )",
596*70a7ec85SAndroid Build Coastguard Worker                 gExclusiveToStrings.at(static_cast<size_t>(exclusiveTo)),
597*70a7ec85SAndroid Build Coastguard Worker                 fqInstance.getPackage().c_str(), fqInstance.getMinorVersion(),
598*70a7ec85SAndroid Build Coastguard Worker                 toFQNameString(fqInstance.getInterface(), fqInstance.getInstance()).c_str());
599*70a7ec85SAndroid Build Coastguard Worker         }
600*70a7ec85SAndroid Build Coastguard Worker         xml += "</manifest>";
601*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kVendorManifest, xml);
602*70a7ec85SAndroid Build Coastguard Worker     }
603*70a7ec85SAndroid Build Coastguard Worker     // clang-format off
604*70a7ec85SAndroid Build Coastguard Worker 
runtimeInfoFactory()605*70a7ec85SAndroid Build Coastguard Worker     MockRuntimeInfoFactory& runtimeInfoFactory() {
606*70a7ec85SAndroid Build Coastguard Worker         return static_cast<MockRuntimeInfoFactory&>(*vintfObject->getRuntimeInfoFactory());
607*70a7ec85SAndroid Build Coastguard Worker     }
608*70a7ec85SAndroid Build Coastguard Worker 
noApex()609*70a7ec85SAndroid Build Coastguard Worker     void noApex() {
610*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StartsWith("/apex/"));
611*70a7ec85SAndroid Build Coastguard Worker     }
612*70a7ec85SAndroid Build Coastguard Worker 
613*70a7ec85SAndroid Build Coastguard Worker     std::unique_ptr<VintfObject> vintfObject;
614*70a7ec85SAndroid Build Coastguard Worker };
615*70a7ec85SAndroid Build Coastguard Worker 
616*70a7ec85SAndroid Build Coastguard Worker // Test fixture that provides compatible metadata from the mock device.
617*70a7ec85SAndroid Build Coastguard Worker class VintfObjectCompatibleTest : public VintfObjectTestBase {
618*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()619*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
620*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
621*70a7ec85SAndroid Build Coastguard Worker         setupMockFetcher(vendorManifestXml1, systemMatrixXml1, systemManifestXml1, vendorMatrixXml1);
622*70a7ec85SAndroid Build Coastguard Worker         noApex();
623*70a7ec85SAndroid Build Coastguard Worker     }
624*70a7ec85SAndroid Build Coastguard Worker };
625*70a7ec85SAndroid Build Coastguard Worker 
626*70a7ec85SAndroid Build Coastguard Worker // Tests that local info is checked.
TEST_F(VintfObjectCompatibleTest,TestDeviceCompatibility)627*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectCompatibleTest, TestDeviceCompatibility) {
628*70a7ec85SAndroid Build Coastguard Worker     std::string error;
629*70a7ec85SAndroid Build Coastguard Worker 
630*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
631*70a7ec85SAndroid Build Coastguard Worker     expectSystemManifest();
632*70a7ec85SAndroid Build Coastguard Worker     expectVendorMatrix();
633*70a7ec85SAndroid Build Coastguard Worker     expectSystemMatrix();
634*70a7ec85SAndroid Build Coastguard Worker 
635*70a7ec85SAndroid Build Coastguard Worker     int result = vintfObject->checkCompatibility(&error);
636*70a7ec85SAndroid Build Coastguard Worker 
637*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(result, 0) << "Fail message:" << error.c_str();
638*70a7ec85SAndroid Build Coastguard Worker     // Check that nothing was ignored.
639*70a7ec85SAndroid Build Coastguard Worker     ASSERT_STREQ(error.c_str(), "");
640*70a7ec85SAndroid Build Coastguard Worker }
641*70a7ec85SAndroid Build Coastguard Worker 
642*70a7ec85SAndroid Build Coastguard Worker // Test fixture that provides incompatible metadata from the mock device.
643*70a7ec85SAndroid Build Coastguard Worker class VintfObjectIncompatibleTest : public VintfObjectTestBase {
644*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()645*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
646*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
647*70a7ec85SAndroid Build Coastguard Worker         setupMockFetcher(vendorManifestXml1, systemMatrixXml2, systemManifestXml1, vendorMatrixXml1);
648*70a7ec85SAndroid Build Coastguard Worker     }
649*70a7ec85SAndroid Build Coastguard Worker };
650*70a7ec85SAndroid Build Coastguard Worker 
651*70a7ec85SAndroid Build Coastguard Worker // Fetch all metadata from device and ensure that it fails.
TEST_F(VintfObjectIncompatibleTest,TestDeviceCompatibility)652*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectIncompatibleTest, TestDeviceCompatibility) {
653*70a7ec85SAndroid Build Coastguard Worker     std::string error;
654*70a7ec85SAndroid Build Coastguard Worker 
655*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
656*70a7ec85SAndroid Build Coastguard Worker     expectSystemManifest();
657*70a7ec85SAndroid Build Coastguard Worker     expectVendorMatrix();
658*70a7ec85SAndroid Build Coastguard Worker     expectSystemMatrix();
659*70a7ec85SAndroid Build Coastguard Worker 
660*70a7ec85SAndroid Build Coastguard Worker     int result = vintfObject->checkCompatibility(&error);
661*70a7ec85SAndroid Build Coastguard Worker 
662*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(result, 1) << "Should have failed:" << error.c_str();
663*70a7ec85SAndroid Build Coastguard Worker }
664*70a7ec85SAndroid Build Coastguard Worker 
665*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifestKernelFcm =
666*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + " type=\"device\">\n"
667*70a7ec85SAndroid Build Coastguard Worker         "    <kernel version=\"3.18.999\" target-level=\"8\"/>\n"
668*70a7ec85SAndroid Build Coastguard Worker         "</manifest>\n";
669*70a7ec85SAndroid Build Coastguard Worker 
670*70a7ec85SAndroid Build Coastguard Worker // Test fixture that provides compatible metadata from the mock device.
671*70a7ec85SAndroid Build Coastguard Worker class VintfObjectRuntimeInfoTest : public VintfObjectTestBase {
672*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()673*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
674*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
675*70a7ec85SAndroid Build Coastguard Worker     }
TearDown()676*70a7ec85SAndroid Build Coastguard Worker     virtual void TearDown() {
677*70a7ec85SAndroid Build Coastguard Worker         Mock::VerifyAndClear(&runtimeInfoFactory());
678*70a7ec85SAndroid Build Coastguard Worker         Mock::VerifyAndClear(runtimeInfoFactory().getInfo().get());
679*70a7ec85SAndroid Build Coastguard Worker     }
680*70a7ec85SAndroid Build Coastguard Worker };
681*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectRuntimeInfoTest,GetRuntimeInfo)682*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectRuntimeInfoTest, GetRuntimeInfo) {
683*70a7ec85SAndroid Build Coastguard Worker     setupMockFetcher(vendorManifestKernelFcm, "", "", "");
684*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
685*70a7ec85SAndroid Build Coastguard Worker     InSequence s;
686*70a7ec85SAndroid Build Coastguard Worker 
687*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(*runtimeInfoFactory().getInfo(),
688*70a7ec85SAndroid Build Coastguard Worker                 fetchAllInformation(RuntimeInfo::FetchFlag::CPU_VERSION));
689*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(*runtimeInfoFactory().getInfo(), fetchAllInformation(RuntimeInfo::FetchFlag::NONE));
690*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(
691*70a7ec85SAndroid Build Coastguard Worker         *runtimeInfoFactory().getInfo(),
692*70a7ec85SAndroid Build Coastguard Worker         fetchAllInformation(RuntimeInfo::FetchFlag::ALL & ~RuntimeInfo::FetchFlag::CPU_VERSION));
693*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(*runtimeInfoFactory().getInfo(), fetchAllInformation(RuntimeInfo::FetchFlag::NONE));
694*70a7ec85SAndroid Build Coastguard Worker 
695*70a7ec85SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, vintfObject->getRuntimeInfo(
696*70a7ec85SAndroid Build Coastguard Worker                                                    RuntimeInfo::FetchFlag::CPU_VERSION));
697*70a7ec85SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, vintfObject->getRuntimeInfo(
698*70a7ec85SAndroid Build Coastguard Worker                                                    RuntimeInfo::FetchFlag::CPU_VERSION));
699*70a7ec85SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, vintfObject->getRuntimeInfo(
700*70a7ec85SAndroid Build Coastguard Worker                                                    RuntimeInfo::FetchFlag::ALL));
701*70a7ec85SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, vintfObject->getRuntimeInfo(
702*70a7ec85SAndroid Build Coastguard Worker                                                    RuntimeInfo::FetchFlag::ALL));
703*70a7ec85SAndroid Build Coastguard Worker }
704*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectRuntimeInfoTest,GetRuntimeInfoHost)705*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectRuntimeInfoTest, GetRuntimeInfoHost) {
706*70a7ec85SAndroid Build Coastguard Worker     runtimeInfoFactory().getInfo()->failNextFetch();
707*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, vintfObject->getRuntimeInfo(RuntimeInfo::FetchFlag::ALL));
708*70a7ec85SAndroid Build Coastguard Worker }
709*70a7ec85SAndroid Build Coastguard Worker 
710*70a7ec85SAndroid Build Coastguard Worker class VintfObjectKernelFcmTest : public VintfObjectTestBase,
711*70a7ec85SAndroid Build Coastguard Worker                                  public WithParamInterface<std::tuple<bool, bool>> {
712*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()713*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
714*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
715*70a7ec85SAndroid Build Coastguard Worker         auto [isHost, hasDeviceManifest] = GetParam();
716*70a7ec85SAndroid Build Coastguard Worker         if (hasDeviceManifest) {
717*70a7ec85SAndroid Build Coastguard Worker             setupMockFetcher(vendorManifestKernelFcm, "", "", "");
718*70a7ec85SAndroid Build Coastguard Worker             expectVendorManifest();
719*70a7ec85SAndroid Build Coastguard Worker         }
720*70a7ec85SAndroid Build Coastguard Worker 
721*70a7ec85SAndroid Build Coastguard Worker         if (isHost) {
722*70a7ec85SAndroid Build Coastguard Worker             runtimeInfoFactory().getInfo()->failNextFetch();
723*70a7ec85SAndroid Build Coastguard Worker         } else {
724*70a7ec85SAndroid Build Coastguard Worker             runtimeInfoFactory().getInfo()->setNextFetchKernelLevel(Level{8});
725*70a7ec85SAndroid Build Coastguard Worker         }
726*70a7ec85SAndroid Build Coastguard Worker     }
727*70a7ec85SAndroid Build Coastguard Worker 
expectedKernelFcm()728*70a7ec85SAndroid Build Coastguard Worker     Level expectedKernelFcm() {
729*70a7ec85SAndroid Build Coastguard Worker         auto [isHost, hasDeviceManifest] = GetParam();
730*70a7ec85SAndroid Build Coastguard Worker         return !isHost || hasDeviceManifest ? Level{8} : Level::UNSPECIFIED;
731*70a7ec85SAndroid Build Coastguard Worker     }
732*70a7ec85SAndroid Build Coastguard Worker };
733*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(VintfObjectKernelFcmTest,GetKernelLevel)734*70a7ec85SAndroid Build Coastguard Worker TEST_P(VintfObjectKernelFcmTest, GetKernelLevel) {
735*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(expectedKernelFcm(), vintfObject->getKernelLevel());
736*70a7ec85SAndroid Build Coastguard Worker }
737*70a7ec85SAndroid Build Coastguard Worker 
738*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(KernelFcm, VintfObjectKernelFcmTest,
739*70a7ec85SAndroid Build Coastguard Worker     ::testing::Combine(::testing::Bool(), ::testing::Bool()));
740*70a7ec85SAndroid Build Coastguard Worker 
741*70a7ec85SAndroid Build Coastguard Worker // Test fixture that provides incompatible metadata from the mock device.
742*70a7ec85SAndroid Build Coastguard Worker class VintfObjectTest : public VintfObjectTestBase {
743*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()744*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
745*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
746*70a7ec85SAndroid Build Coastguard Worker         useEmptyFileSystem();
747*70a7ec85SAndroid Build Coastguard Worker     }
748*70a7ec85SAndroid Build Coastguard Worker };
749*70a7ec85SAndroid Build Coastguard Worker 
750*70a7ec85SAndroid Build Coastguard Worker // Test framework compatibility matrix is combined at runtime
TEST_F(VintfObjectTest,FrameworkCompatibilityMatrixCombine)751*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectTest, FrameworkCompatibilityMatrixCombine) {
752*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), listFiles(StrEq(kSystemVintfDir), _, _))
753*70a7ec85SAndroid Build Coastguard Worker         .WillOnce(Invoke([](const auto&, auto* out, auto*) {
754*70a7ec85SAndroid Build Coastguard Worker             *out = {
755*70a7ec85SAndroid Build Coastguard Worker                 "compatibility_matrix.1.xml",
756*70a7ec85SAndroid Build Coastguard Worker                 "compatibility_matrix.empty.xml",
757*70a7ec85SAndroid Build Coastguard Worker             };
758*70a7ec85SAndroid Build Coastguard Worker             return ::android::OK;
759*70a7ec85SAndroid Build Coastguard Worker         }));
760*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kSystemVintfDir + "compatibility_matrix.1.xml"s,
761*70a7ec85SAndroid Build Coastguard Worker                 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\"/>");
762*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kSystemVintfDir + "compatibility_matrix.empty.xml"s,
763*70a7ec85SAndroid Build Coastguard Worker                 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\"/>");
764*70a7ec85SAndroid Build Coastguard Worker     expectFileNotExist(StrEq(kProductMatrix));
765*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kVendorManifest, "<manifest " + kMetaVersionStr + " type=\"device\" />\n");
766*70a7ec85SAndroid Build Coastguard Worker     expectNeverFetch(kSystemLegacyMatrix);
767*70a7ec85SAndroid Build Coastguard Worker 
768*70a7ec85SAndroid Build Coastguard Worker     EXPECT_NE(nullptr, vintfObject->getFrameworkCompatibilityMatrix());
769*70a7ec85SAndroid Build Coastguard Worker }
770*70a7ec85SAndroid Build Coastguard Worker 
771*70a7ec85SAndroid Build Coastguard Worker // Test product compatibility matrix is fetched
TEST_F(VintfObjectTest,ProductCompatibilityMatrix)772*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectTest, ProductCompatibilityMatrix) {
773*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), listFiles(StrEq(kSystemVintfDir), _, _))
774*70a7ec85SAndroid Build Coastguard Worker         .WillOnce(Invoke([](const auto&, auto* out, auto*) {
775*70a7ec85SAndroid Build Coastguard Worker             *out = {
776*70a7ec85SAndroid Build Coastguard Worker                 "compatibility_matrix.1.xml",
777*70a7ec85SAndroid Build Coastguard Worker                 "compatibility_matrix.empty.xml",
778*70a7ec85SAndroid Build Coastguard Worker             };
779*70a7ec85SAndroid Build Coastguard Worker             return ::android::OK;
780*70a7ec85SAndroid Build Coastguard Worker         }));
781*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), listFiles(StrEq(kProductVintfDir), _, _))
782*70a7ec85SAndroid Build Coastguard Worker         .WillRepeatedly(Invoke([](const auto&, auto* out, auto*) {
783*70a7ec85SAndroid Build Coastguard Worker             *out = {android::base::Basename(kProductMatrix)};
784*70a7ec85SAndroid Build Coastguard Worker             return ::android::OK;
785*70a7ec85SAndroid Build Coastguard Worker         }));
786*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kSystemVintfDir + "compatibility_matrix.1.xml"s,
787*70a7ec85SAndroid Build Coastguard Worker                 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\"/>");
788*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kSystemVintfDir + "compatibility_matrix.empty.xml"s,
789*70a7ec85SAndroid Build Coastguard Worker                 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\"/>");
790*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kProductMatrix,
791*70a7ec85SAndroid Build Coastguard Worker                 "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
792*70a7ec85SAndroid Build Coastguard Worker                 "    <hal format=\"hidl\" optional=\"true\">\n"
793*70a7ec85SAndroid Build Coastguard Worker                 "        <name>android.hardware.foo</name>\n"
794*70a7ec85SAndroid Build Coastguard Worker                 "        <version>1.0</version>\n"
795*70a7ec85SAndroid Build Coastguard Worker                 "        <interface>\n"
796*70a7ec85SAndroid Build Coastguard Worker                 "            <name>IFoo</name>\n"
797*70a7ec85SAndroid Build Coastguard Worker                 "            <instance>default</instance>\n"
798*70a7ec85SAndroid Build Coastguard Worker                 "        </interface>\n"
799*70a7ec85SAndroid Build Coastguard Worker                 "    </hal>\n"
800*70a7ec85SAndroid Build Coastguard Worker                 "</compatibility-matrix>\n");
801*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kVendorManifest, "<manifest " + kMetaVersionStr + " type=\"device\" />\n");
802*70a7ec85SAndroid Build Coastguard Worker     expectNeverFetch(kSystemLegacyMatrix);
803*70a7ec85SAndroid Build Coastguard Worker 
804*70a7ec85SAndroid Build Coastguard Worker     auto fcm = vintfObject->getFrameworkCompatibilityMatrix();
805*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, fcm);
806*70a7ec85SAndroid Build Coastguard Worker 
807*70a7ec85SAndroid Build Coastguard Worker     FqInstance expectInstance;
808*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(expectInstance.setTo("[email protected]::IFoo/default"));
809*70a7ec85SAndroid Build Coastguard Worker     bool found = false;
810*70a7ec85SAndroid Build Coastguard Worker     fcm->forEachHidlInstance([&found, &expectInstance](const auto& matrixInstance) {
811*70a7ec85SAndroid Build Coastguard Worker         found |= matrixInstance.isSatisfiedBy(expectInstance);
812*70a7ec85SAndroid Build Coastguard Worker         return !found;  // continue if not found
813*70a7ec85SAndroid Build Coastguard Worker     });
814*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(found) << "[email protected]::IFoo/default should be found in matrix:\n"
815*70a7ec85SAndroid Build Coastguard Worker                        << toXml(*fcm);
816*70a7ec85SAndroid Build Coastguard Worker }
817*70a7ec85SAndroid Build Coastguard Worker 
818*70a7ec85SAndroid Build Coastguard Worker const std::string vendorEtcManifest =
819*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
820*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
821*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
822*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
823*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
824*70a7ec85SAndroid Build Coastguard Worker     "        <version>2.0</version>\n"
825*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
826*70a7ec85SAndroid Build Coastguard Worker     "            <name>IVendorEtc</name>\n"
827*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
828*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
829*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
830*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
831*70a7ec85SAndroid Build Coastguard Worker 
832*70a7ec85SAndroid Build Coastguard Worker const std::string vendorManifest =
833*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
834*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\">\n"
835*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
836*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
837*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.0</version>\n"
838*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
839*70a7ec85SAndroid Build Coastguard Worker     "            <name>IVendor</name>\n"
840*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
841*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
842*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
843*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
844*70a7ec85SAndroid Build Coastguard Worker 
845*70a7ec85SAndroid Build Coastguard Worker const std::string odmProductManifest =
846*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
847*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" override=\"true\">\n"
848*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
849*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
850*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.1</version>\n"
851*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
852*70a7ec85SAndroid Build Coastguard Worker     "            <name>IOdmProduct</name>\n"
853*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
854*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
855*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
856*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
857*70a7ec85SAndroid Build Coastguard Worker 
858*70a7ec85SAndroid Build Coastguard Worker const std::string odmManifest =
859*70a7ec85SAndroid Build Coastguard Worker     "<manifest " + kMetaVersionStr + " type=\"device\">\n"
860*70a7ec85SAndroid Build Coastguard Worker     "    <hal format=\"hidl\" override=\"true\">\n"
861*70a7ec85SAndroid Build Coastguard Worker     "        <name>android.hardware.foo</name>\n"
862*70a7ec85SAndroid Build Coastguard Worker     "        <transport>hwbinder</transport>\n"
863*70a7ec85SAndroid Build Coastguard Worker     "        <version>1.1</version>\n"
864*70a7ec85SAndroid Build Coastguard Worker     "        <interface>\n"
865*70a7ec85SAndroid Build Coastguard Worker     "            <name>IOdm</name>\n"
866*70a7ec85SAndroid Build Coastguard Worker     "            <instance>default</instance>\n"
867*70a7ec85SAndroid Build Coastguard Worker     "        </interface>\n"
868*70a7ec85SAndroid Build Coastguard Worker     "    </hal>\n"
869*70a7ec85SAndroid Build Coastguard Worker     "</manifest>\n";
870*70a7ec85SAndroid Build Coastguard Worker 
containsVendorManifest(const std::shared_ptr<const HalManifest> & p)871*70a7ec85SAndroid Build Coastguard Worker bool containsVendorManifest(const std::shared_ptr<const HalManifest>& p) {
872*70a7ec85SAndroid Build Coastguard Worker     return !p->getHidlInstances("android.hardware.foo", {1, 0}, "IVendor").empty();
873*70a7ec85SAndroid Build Coastguard Worker }
874*70a7ec85SAndroid Build Coastguard Worker 
containsVendorEtcManifest(const std::shared_ptr<const HalManifest> & p)875*70a7ec85SAndroid Build Coastguard Worker bool containsVendorEtcManifest(const std::shared_ptr<const HalManifest>& p) {
876*70a7ec85SAndroid Build Coastguard Worker     return !p->getHidlInstances("android.hardware.foo", {2, 0}, "IVendorEtc").empty();
877*70a7ec85SAndroid Build Coastguard Worker }
878*70a7ec85SAndroid Build Coastguard Worker 
vendorEtcManifestOverridden(const std::shared_ptr<const HalManifest> & p)879*70a7ec85SAndroid Build Coastguard Worker bool vendorEtcManifestOverridden(const std::shared_ptr<const HalManifest>& p) {
880*70a7ec85SAndroid Build Coastguard Worker     return p->getHidlInstances("android.hardware.foo", {1, 0}, "IVendorEtc").empty();
881*70a7ec85SAndroid Build Coastguard Worker }
882*70a7ec85SAndroid Build Coastguard Worker 
containsOdmManifest(const std::shared_ptr<const HalManifest> & p)883*70a7ec85SAndroid Build Coastguard Worker bool containsOdmManifest(const std::shared_ptr<const HalManifest>& p) {
884*70a7ec85SAndroid Build Coastguard Worker     return !p->getHidlInstances("android.hardware.foo", {1, 1}, "IOdm").empty();
885*70a7ec85SAndroid Build Coastguard Worker }
886*70a7ec85SAndroid Build Coastguard Worker 
containsOdmProductManifest(const std::shared_ptr<const HalManifest> & p)887*70a7ec85SAndroid Build Coastguard Worker bool containsOdmProductManifest(const std::shared_ptr<const HalManifest>& p) {
888*70a7ec85SAndroid Build Coastguard Worker     return !p->getHidlInstances("android.hardware.foo", {1, 1}, "IOdmProduct").empty();
889*70a7ec85SAndroid Build Coastguard Worker }
890*70a7ec85SAndroid Build Coastguard Worker 
containsApexManifest(const std::shared_ptr<const HalManifest> & p)891*70a7ec85SAndroid Build Coastguard Worker bool containsApexManifest(const std::shared_ptr<const HalManifest>& p) {
892*70a7ec85SAndroid Build Coastguard Worker     return !p->getAidlInstances(apexHalName, "IApex").empty();
893*70a7ec85SAndroid Build Coastguard Worker }
894*70a7ec85SAndroid Build Coastguard Worker 
895*70a7ec85SAndroid Build Coastguard Worker class DeviceManifestTest : public VintfObjectTestBase {
896*70a7ec85SAndroid Build Coastguard Worker    protected:
expectApex(const std::string & halManifest=apexHalManifest)897*70a7ec85SAndroid Build Coastguard Worker     void expectApex(const std::string& halManifest = apexHalManifest) {
898*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kApexInfoFile, R"(<apex-info-list>
899*70a7ec85SAndroid Build Coastguard Worker             <apex-info moduleName="com.test"
900*70a7ec85SAndroid Build Coastguard Worker                 partition="VENDOR" isActive="true"/>
901*70a7ec85SAndroid Build Coastguard Worker             <apex-info moduleName="com.novintf"
902*70a7ec85SAndroid Build Coastguard Worker                 partition="VENDOR" isActive="true"/>
903*70a7ec85SAndroid Build Coastguard Worker         </apex-info-list>)");
904*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), modifiedTime(kApexInfoFile, _, _))
905*70a7ec85SAndroid Build Coastguard Worker             .WillOnce(Invoke([](auto, timespec* out, auto){
906*70a7ec85SAndroid Build Coastguard Worker                 *out = {};
907*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
908*70a7ec85SAndroid Build Coastguard Worker             }))
909*70a7ec85SAndroid Build Coastguard Worker             // Update once, but no more.
910*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](auto, timespec* out, auto){
911*70a7ec85SAndroid Build Coastguard Worker                 *out = {1,};
912*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
913*70a7ec85SAndroid Build Coastguard Worker             }))
914*70a7ec85SAndroid Build Coastguard Worker             ;
915*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), listFiles("/apex/com.test/etc/vintf/", _, _))
916*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Invoke([](auto, std::vector<std::string>* out, auto){
917*70a7ec85SAndroid Build Coastguard Worker                 *out = {"manifest.xml"};
918*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
919*70a7ec85SAndroid Build Coastguard Worker             }));
920*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly("/apex/com.test/etc/vintf/manifest.xml", halManifest);
921*70a7ec85SAndroid Build Coastguard Worker     }
922*70a7ec85SAndroid Build Coastguard Worker 
923*70a7ec85SAndroid Build Coastguard Worker     // Expect that /vendor/etc/vintf/manifest.xml is fetched.
expectVendorManifest()924*70a7ec85SAndroid Build Coastguard Worker     void expectVendorManifest() {
925*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kVendorManifest, vendorEtcManifest);
926*70a7ec85SAndroid Build Coastguard Worker     }
927*70a7ec85SAndroid Build Coastguard Worker     // /vendor/etc/vintf/manifest.xml does not exist.
noVendorManifest()928*70a7ec85SAndroid Build Coastguard Worker     void noVendorManifest() { expectFileNotExist(StrEq(kVendorManifest)); }
929*70a7ec85SAndroid Build Coastguard Worker     // Expect some ODM manifest is fetched.
expectOdmManifest()930*70a7ec85SAndroid Build Coastguard Worker     void expectOdmManifest() {
931*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kOdmManifest, odmManifest);
932*70a7ec85SAndroid Build Coastguard Worker     }
noOdmManifest()933*70a7ec85SAndroid Build Coastguard Worker     void noOdmManifest() { expectFileNotExist(StartsWith("/odm/")); }
get()934*70a7ec85SAndroid Build Coastguard Worker     std::shared_ptr<const HalManifest> get() {
935*70a7ec85SAndroid Build Coastguard Worker         return vintfObject->getDeviceHalManifest();
936*70a7ec85SAndroid Build Coastguard Worker     }
937*70a7ec85SAndroid Build Coastguard Worker };
938*70a7ec85SAndroid Build Coastguard Worker 
939*70a7ec85SAndroid Build Coastguard Worker // Test /vendor/etc/vintf/manifest.xml + ODM manifest
TEST_F(DeviceManifestTest,Combine1)940*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, Combine1) {
941*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
942*70a7ec85SAndroid Build Coastguard Worker     expectOdmManifest();
943*70a7ec85SAndroid Build Coastguard Worker     noApex();
944*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
945*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
946*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsVendorEtcManifest(p));
947*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(vendorEtcManifestOverridden(p));
948*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmManifest(p));
949*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsVendorManifest(p));
950*70a7ec85SAndroid Build Coastguard Worker }
951*70a7ec85SAndroid Build Coastguard Worker 
952*70a7ec85SAndroid Build Coastguard Worker // Test /vendor/etc/vintf/manifest.xml
TEST_F(DeviceManifestTest,Combine2)953*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, Combine2) {
954*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
955*70a7ec85SAndroid Build Coastguard Worker     noOdmManifest();
956*70a7ec85SAndroid Build Coastguard Worker     noApex();
957*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
958*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
959*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsVendorEtcManifest(p));
960*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(vendorEtcManifestOverridden(p));
961*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsOdmManifest(p));
962*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsVendorManifest(p));
963*70a7ec85SAndroid Build Coastguard Worker }
964*70a7ec85SAndroid Build Coastguard Worker 
965*70a7ec85SAndroid Build Coastguard Worker // Test ODM manifest
TEST_F(DeviceManifestTest,Combine3)966*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, Combine3) {
967*70a7ec85SAndroid Build Coastguard Worker     noVendorManifest();
968*70a7ec85SAndroid Build Coastguard Worker     expectOdmManifest();
969*70a7ec85SAndroid Build Coastguard Worker     noApex();
970*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
971*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
972*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsVendorEtcManifest(p));
973*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(vendorEtcManifestOverridden(p));
974*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmManifest(p));
975*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsVendorManifest(p));
976*70a7ec85SAndroid Build Coastguard Worker }
977*70a7ec85SAndroid Build Coastguard Worker 
978*70a7ec85SAndroid Build Coastguard Worker // Test /vendor/manifest.xml
TEST_F(DeviceManifestTest,Combine4)979*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, Combine4) {
980*70a7ec85SAndroid Build Coastguard Worker     noVendorManifest();
981*70a7ec85SAndroid Build Coastguard Worker     noOdmManifest();
982*70a7ec85SAndroid Build Coastguard Worker     noApex();
983*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kVendorLegacyManifest, vendorManifest);
984*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
985*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
986*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsVendorEtcManifest(p));
987*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(vendorEtcManifestOverridden(p));
988*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsOdmManifest(p));
989*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsVendorManifest(p));
990*70a7ec85SAndroid Build Coastguard Worker }
991*70a7ec85SAndroid Build Coastguard Worker 
992*70a7ec85SAndroid Build Coastguard Worker // Run the same tests as above (Combine1,2,3,4) including APEX data.
993*70a7ec85SAndroid Build Coastguard Worker 
994*70a7ec85SAndroid Build Coastguard Worker // Test /vendor/etc/vintf/manifest.xml + ODM manifest + APEX
TEST_F(DeviceManifestTest,Combine5)995*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, Combine5) {
996*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
997*70a7ec85SAndroid Build Coastguard Worker     expectOdmManifest();
998*70a7ec85SAndroid Build Coastguard Worker     expectApex();
999*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1000*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1001*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsVendorEtcManifest(p));
1002*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(vendorEtcManifestOverridden(p));
1003*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmManifest(p));
1004*70a7ec85SAndroid Build Coastguard Worker     EXPECT_FALSE(containsVendorManifest(p));
1005*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsApexManifest(p));
1006*70a7ec85SAndroid Build Coastguard Worker 
1007*70a7ec85SAndroid Build Coastguard Worker     // Second call should create new maninfest containing APEX info.
1008*70a7ec85SAndroid Build Coastguard Worker     auto p2 = get();
1009*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p2);
1010*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(p, p2);
1011*70a7ec85SAndroid Build Coastguard Worker 
1012*70a7ec85SAndroid Build Coastguard Worker     // Third call expect no update and no call to DeviceVintfDirs.
1013*70a7ec85SAndroid Build Coastguard Worker     auto p3 = get();
1014*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(p2,p3);
1015*70a7ec85SAndroid Build Coastguard Worker }
1016*70a7ec85SAndroid Build Coastguard Worker 
1017*70a7ec85SAndroid Build Coastguard Worker // Tests for valid/invalid APEX defined HAL
1018*70a7ec85SAndroid Build Coastguard Worker // For a HAL to be defined within an APEX it must not have
1019*70a7ec85SAndroid Build Coastguard Worker // the update-via-apex attribute defined in the HAL manifest
1020*70a7ec85SAndroid Build Coastguard Worker 
1021*70a7ec85SAndroid Build Coastguard Worker // Valid APEX HAL definition
TEST_F(DeviceManifestTest,ValidApexHal)1022*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, ValidApexHal) {
1023*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
1024*70a7ec85SAndroid Build Coastguard Worker     noOdmManifest();
1025*70a7ec85SAndroid Build Coastguard Worker     expectApex();
1026*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1027*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1028*70a7ec85SAndroid Build Coastguard Worker     // HALs defined in APEX should set updatable-via-apex
1029*70a7ec85SAndroid Build Coastguard Worker     bool found = false;
1030*70a7ec85SAndroid Build Coastguard Worker     p->forEachInstance([&found](const ManifestInstance& instance){
1031*70a7ec85SAndroid Build Coastguard Worker         if (instance.package() == apexHalName) {
1032*70a7ec85SAndroid Build Coastguard Worker             std::optional<std::string> apexName = "com.test";
1033*70a7ec85SAndroid Build Coastguard Worker             EXPECT_EQ(apexName, instance.updatableViaApex());
1034*70a7ec85SAndroid Build Coastguard Worker             found = true;
1035*70a7ec85SAndroid Build Coastguard Worker         }
1036*70a7ec85SAndroid Build Coastguard Worker         return true;
1037*70a7ec85SAndroid Build Coastguard Worker     });
1038*70a7ec85SAndroid Build Coastguard Worker     ASSERT_TRUE(found) << "should found android.apex.foo";
1039*70a7ec85SAndroid Build Coastguard Worker }
1040*70a7ec85SAndroid Build Coastguard Worker // Invalid APEX HAL definition
TEST_F(DeviceManifestTest,InvalidApexHal)1041*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceManifestTest, InvalidApexHal) {
1042*70a7ec85SAndroid Build Coastguard Worker     const std::string apexInvalidManifest =
1043*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1044*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"aidl\" updatable-via-apex=\"com.android.apex.foo\">\n"
1045*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.apex.foo</name>\n"
1046*70a7ec85SAndroid Build Coastguard Worker         "        <fqname>IApex/default</fqname>\n"
1047*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n"
1048*70a7ec85SAndroid Build Coastguard Worker         "</manifest>\n";
1049*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
1050*70a7ec85SAndroid Build Coastguard Worker     noOdmManifest();
1051*70a7ec85SAndroid Build Coastguard Worker     expectApex(apexInvalidManifest);
1052*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1053*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, p);
1054*70a7ec85SAndroid Build Coastguard Worker }
1055*70a7ec85SAndroid Build Coastguard Worker 
1056*70a7ec85SAndroid Build Coastguard Worker struct VendorApexTest : DeviceManifestTest {
SetUpandroid::vintf::testing::VendorApexTest1057*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() override {
1058*70a7ec85SAndroid Build Coastguard Worker         // Use actual Apex implementation
1059*70a7ec85SAndroid Build Coastguard Worker         vintfObject = VintfObject::Builder()
1060*70a7ec85SAndroid Build Coastguard Worker                           .setFileSystem(std::make_unique<NiceMock<MockFileSystem>>())
1061*70a7ec85SAndroid Build Coastguard Worker                           .setRuntimeInfoFactory(std::make_unique<NiceMock<MockRuntimeInfoFactory>>(
1062*70a7ec85SAndroid Build Coastguard Worker                               std::make_shared<NiceMock<MockRuntimeInfo>>()))
1063*70a7ec85SAndroid Build Coastguard Worker                           .setPropertyFetcher(std::make_unique<NiceMock<MockPropertyFetcher>>())
1064*70a7ec85SAndroid Build Coastguard Worker                           .build();
1065*70a7ec85SAndroid Build Coastguard Worker         expectVendorManifest();
1066*70a7ec85SAndroid Build Coastguard Worker         noOdmManifest();
1067*70a7ec85SAndroid Build Coastguard Worker 
1068*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(_, _, _))
1069*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](const auto&, auto*, auto*) {
1070*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
1071*70a7ec85SAndroid Build Coastguard Worker             }));
1072*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), modifiedTime(_, _, _))
1073*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](const auto&, auto*, auto*) {
1074*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
1075*70a7ec85SAndroid Build Coastguard Worker             }));
1076*70a7ec85SAndroid Build Coastguard Worker     }
1077*70a7ec85SAndroid Build Coastguard Worker };
1078*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VendorApexTest,ReadBootstrapApexBeforeApexReady)1079*70a7ec85SAndroid Build Coastguard Worker TEST_F(VendorApexTest, ReadBootstrapApexBeforeApexReady) {
1080*70a7ec85SAndroid Build Coastguard Worker     // When APEXes are not ready,
1081*70a7ec85SAndroid Build Coastguard Worker     ON_CALL(propertyFetcher(), getBoolProperty("apex.all.ready", _))
1082*70a7ec85SAndroid Build Coastguard Worker         .WillByDefault(Return(false));
1083*70a7ec85SAndroid Build Coastguard Worker     // Should read bootstrap APEXes from /bootstrap-apex
1084*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), fetch(kBootstrapApexInfoFile, _))
1085*70a7ec85SAndroid Build Coastguard Worker         .WillOnce(Invoke([](const auto&, auto& out) {
1086*70a7ec85SAndroid Build Coastguard Worker             out = R"(<?xml version="1.0" encoding="utf-8"?>
1087*70a7ec85SAndroid Build Coastguard Worker                 <apex-info-list>
1088*70a7ec85SAndroid Build Coastguard Worker                     <apex-info moduleName="com.vendor.foo"
1089*70a7ec85SAndroid Build Coastguard Worker                             partition="VENDOR"
1090*70a7ec85SAndroid Build Coastguard Worker                             isActive="true" />
1091*70a7ec85SAndroid Build Coastguard Worker                 </apex-info-list>)";
1092*70a7ec85SAndroid Build Coastguard Worker             return ::android::OK;
1093*70a7ec85SAndroid Build Coastguard Worker         }));
1094*70a7ec85SAndroid Build Coastguard Worker     // ... and read VINTF directory in it.
1095*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), listFiles("/bootstrap-apex/com.vendor.foo/etc/vintf/", _, _))
1096*70a7ec85SAndroid Build Coastguard Worker         .WillOnce(Invoke([](const auto&, auto*, auto*) {
1097*70a7ec85SAndroid Build Coastguard Worker             return ::android::OK;
1098*70a7ec85SAndroid Build Coastguard Worker         }));
1099*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1100*70a7ec85SAndroid Build Coastguard Worker     (void) p;
1101*70a7ec85SAndroid Build Coastguard Worker }
1102*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VendorApexTest,OkayIfBootstrapApexDirDoesntExist)1103*70a7ec85SAndroid Build Coastguard Worker TEST_F(VendorApexTest, OkayIfBootstrapApexDirDoesntExist) {
1104*70a7ec85SAndroid Build Coastguard Worker     // When APEXes are not ready,
1105*70a7ec85SAndroid Build Coastguard Worker     ON_CALL(propertyFetcher(), getBoolProperty("apex.all.ready", _))
1106*70a7ec85SAndroid Build Coastguard Worker         .WillByDefault(Return(false));
1107*70a7ec85SAndroid Build Coastguard Worker     // Should try to read bootstrap APEXes from /bootstrap-apex
1108*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), fetch(kBootstrapApexInfoFile, _))
1109*70a7ec85SAndroid Build Coastguard Worker         .WillOnce(Invoke([](const auto&, auto&) {
1110*70a7ec85SAndroid Build Coastguard Worker             return NAME_NOT_FOUND;
1111*70a7ec85SAndroid Build Coastguard Worker         }));
1112*70a7ec85SAndroid Build Coastguard Worker     // Doesn't fallback to normal APEX if APEXes are not ready.
1113*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), fetch(kApexInfoFile, _)).Times(0);
1114*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1115*70a7ec85SAndroid Build Coastguard Worker     (void) p;
1116*70a7ec85SAndroid Build Coastguard Worker }
1117*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VendorApexTest,DoNotReadBootstrapApexWhenApexesAreReady)1118*70a7ec85SAndroid Build Coastguard Worker TEST_F(VendorApexTest, DoNotReadBootstrapApexWhenApexesAreReady) {
1119*70a7ec85SAndroid Build Coastguard Worker     // When APEXes are ready,
1120*70a7ec85SAndroid Build Coastguard Worker     ON_CALL(propertyFetcher(), getBoolProperty("apex.all.ready", _))
1121*70a7ec85SAndroid Build Coastguard Worker         .WillByDefault(Return(true));
1122*70a7ec85SAndroid Build Coastguard Worker     // Should NOT read bootstrap APEXes
1123*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), fetch(kBootstrapApexInfoFile, _))
1124*70a7ec85SAndroid Build Coastguard Worker         .Times(0);
1125*70a7ec85SAndroid Build Coastguard Worker     // Instead, read /apex/apex-info-list.xml
1126*70a7ec85SAndroid Build Coastguard Worker     EXPECT_CALL(fetcher(), fetch(kApexInfoFile, _));
1127*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1128*70a7ec85SAndroid Build Coastguard Worker     (void) p;
1129*70a7ec85SAndroid Build Coastguard Worker }
1130*70a7ec85SAndroid Build Coastguard Worker 
1131*70a7ec85SAndroid Build Coastguard Worker class OdmManifestTest : public VintfObjectTestBase,
1132*70a7ec85SAndroid Build Coastguard Worker                          public ::testing::WithParamInterface<const char*> {
1133*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()1134*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() override {
1135*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
1136*70a7ec85SAndroid Build Coastguard Worker         // Assume /vendor/etc/vintf/manifest.xml does not exist to simplify
1137*70a7ec85SAndroid Build Coastguard Worker         // testing logic.
1138*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StrEq(kVendorManifest));
1139*70a7ec85SAndroid Build Coastguard Worker         // Expect that the legacy /vendor/manifest.xml is never fetched.
1140*70a7ec85SAndroid Build Coastguard Worker         expectNeverFetch(kVendorLegacyManifest);
1141*70a7ec85SAndroid Build Coastguard Worker         // Assume no files exist under /odm/ unless otherwise specified.
1142*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StartsWith("/odm/"));
1143*70a7ec85SAndroid Build Coastguard Worker         noApex();
1144*70a7ec85SAndroid Build Coastguard Worker         // set SKU
1145*70a7ec85SAndroid Build Coastguard Worker         productModel = GetParam();
1146*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(propertyFetcher(), getProperty("ro.boot.product.hardware.sku", _))
1147*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Return(productModel));
1148*70a7ec85SAndroid Build Coastguard Worker     }
get()1149*70a7ec85SAndroid Build Coastguard Worker     std::shared_ptr<const HalManifest> get() {
1150*70a7ec85SAndroid Build Coastguard Worker         return vintfObject->getDeviceHalManifest();
1151*70a7ec85SAndroid Build Coastguard Worker     }
1152*70a7ec85SAndroid Build Coastguard Worker     std::string productModel;
1153*70a7ec85SAndroid Build Coastguard Worker };
1154*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(OdmManifestTest,OdmProductManifest)1155*70a7ec85SAndroid Build Coastguard Worker TEST_P(OdmManifestTest, OdmProductManifest) {
1156*70a7ec85SAndroid Build Coastguard Worker     if (productModel.empty()) return;
1157*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kOdmVintfDir + "manifest_"s + productModel + ".xml", odmProductManifest);
1158*70a7ec85SAndroid Build Coastguard Worker     // /odm/etc/vintf/manifest.xml should not be fetched when the product variant exists.
1159*70a7ec85SAndroid Build Coastguard Worker     expectNeverFetch(kOdmManifest);
1160*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1161*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1162*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmProductManifest(p));
1163*70a7ec85SAndroid Build Coastguard Worker }
1164*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(OdmManifestTest,OdmManifest)1165*70a7ec85SAndroid Build Coastguard Worker TEST_P(OdmManifestTest, OdmManifest) {
1166*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kOdmManifest, odmManifest);
1167*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1168*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1169*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmManifest(p));
1170*70a7ec85SAndroid Build Coastguard Worker }
1171*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(OdmManifestTest,OdmLegacyProductManifest)1172*70a7ec85SAndroid Build Coastguard Worker TEST_P(OdmManifestTest, OdmLegacyProductManifest) {
1173*70a7ec85SAndroid Build Coastguard Worker     if (productModel.empty()) return;
1174*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kOdmLegacyVintfDir + "manifest_"s + productModel + ".xml", odmProductManifest);
1175*70a7ec85SAndroid Build Coastguard Worker     // /odm/manifest.xml should not be fetched when the product variant exists.
1176*70a7ec85SAndroid Build Coastguard Worker     expectNeverFetch(kOdmLegacyManifest);
1177*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1178*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1179*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmProductManifest(p));
1180*70a7ec85SAndroid Build Coastguard Worker }
1181*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(OdmManifestTest,OdmLegacyManifest)1182*70a7ec85SAndroid Build Coastguard Worker TEST_P(OdmManifestTest, OdmLegacyManifest) {
1183*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kOdmLegacyManifest, odmManifest);
1184*70a7ec85SAndroid Build Coastguard Worker     auto p = get();
1185*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1186*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(containsOdmManifest(p));
1187*70a7ec85SAndroid Build Coastguard Worker }
1188*70a7ec85SAndroid Build Coastguard Worker 
1189*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(OdmManifest, OdmManifestTest, ::testing::Values("", "fake_sku"));
1190*70a7ec85SAndroid Build Coastguard Worker 
1191*70a7ec85SAndroid Build Coastguard Worker struct ManifestOverrideTest : public VintfObjectTestBase {
1192*70a7ec85SAndroid Build Coastguard Worker   protected:
SetUpandroid::vintf::testing::ManifestOverrideTest1193*70a7ec85SAndroid Build Coastguard Worker     void SetUp() override {
1194*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
1195*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), fetch(_, _))
1196*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Invoke([&](auto path, std::string& out) {
1197*70a7ec85SAndroid Build Coastguard Worker                 auto dirIt = dirs_.find(base::Dirname(path) + "/");
1198*70a7ec85SAndroid Build Coastguard Worker                 if (dirIt != dirs_.end()) {
1199*70a7ec85SAndroid Build Coastguard Worker                     auto fileIt = dirIt->second.find(base::Basename(path));
1200*70a7ec85SAndroid Build Coastguard Worker                     if (fileIt != dirIt->second.end()) {
1201*70a7ec85SAndroid Build Coastguard Worker                         out = fileIt->second;
1202*70a7ec85SAndroid Build Coastguard Worker                         return OK;
1203*70a7ec85SAndroid Build Coastguard Worker                     }
1204*70a7ec85SAndroid Build Coastguard Worker                 }
1205*70a7ec85SAndroid Build Coastguard Worker                 return NAME_NOT_FOUND;
1206*70a7ec85SAndroid Build Coastguard Worker             }));
1207*70a7ec85SAndroid Build Coastguard Worker         ON_CALL(fetcher(), listFiles(_, _, _))
1208*70a7ec85SAndroid Build Coastguard Worker             .WillByDefault(Invoke([&](auto path, std::vector<std::string>* out, auto) {
1209*70a7ec85SAndroid Build Coastguard Worker                 auto dirIt = dirs_.find(path);
1210*70a7ec85SAndroid Build Coastguard Worker                 if (dirIt != dirs_.end()) {
1211*70a7ec85SAndroid Build Coastguard Worker                     for (const auto& [f, _]: dirIt->second) {
1212*70a7ec85SAndroid Build Coastguard Worker                         out->push_back(f);
1213*70a7ec85SAndroid Build Coastguard Worker                     }
1214*70a7ec85SAndroid Build Coastguard Worker                     return OK;
1215*70a7ec85SAndroid Build Coastguard Worker                 }
1216*70a7ec85SAndroid Build Coastguard Worker                 return NAME_NOT_FOUND;
1217*70a7ec85SAndroid Build Coastguard Worker             }));
1218*70a7ec85SAndroid Build Coastguard Worker     }
expectandroid::vintf::testing::ManifestOverrideTest1219*70a7ec85SAndroid Build Coastguard Worker     void expect(std::string path, std::string content) {
1220*70a7ec85SAndroid Build Coastguard Worker         dirs_[base::Dirname(path) + "/"][base::Basename(path)] = content;
1221*70a7ec85SAndroid Build Coastguard Worker     }
1222*70a7ec85SAndroid Build Coastguard Worker   private:
1223*70a7ec85SAndroid Build Coastguard Worker     std::map<std::string, std::map<std::string, std::string>> dirs_;
1224*70a7ec85SAndroid Build Coastguard Worker };
1225*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(ManifestOverrideTest,NoOverrideForVendor)1226*70a7ec85SAndroid Build Coastguard Worker TEST_F(ManifestOverrideTest, NoOverrideForVendor) {
1227*70a7ec85SAndroid Build Coastguard Worker     expect(kVendorManifest,
1228*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + " type=\"device\">"
1229*70a7ec85SAndroid Build Coastguard Worker         "  <hal format=\"aidl\">"
1230*70a7ec85SAndroid Build Coastguard Worker         "    <name>android.hardware.foo</name>"
1231*70a7ec85SAndroid Build Coastguard Worker         "    <fqname>IFoo/default</fqname>"
1232*70a7ec85SAndroid Build Coastguard Worker         "  </hal>"
1233*70a7ec85SAndroid Build Coastguard Worker         "</manifest>");
1234*70a7ec85SAndroid Build Coastguard Worker     auto p = vintfObject->getDeviceHalManifest();
1235*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1236*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(p->getAidlInstances("android.hardware.foo", "IFoo"),
1237*70a7ec85SAndroid Build Coastguard Worker         std::set<std::string>({"default"}));
1238*70a7ec85SAndroid Build Coastguard Worker }
1239*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(ManifestOverrideTest,OdmOverridesVendor)1240*70a7ec85SAndroid Build Coastguard Worker TEST_F(ManifestOverrideTest, OdmOverridesVendor) {
1241*70a7ec85SAndroid Build Coastguard Worker     expect(kVendorManifest, "<manifest " + kMetaVersionStr + " type=\"device\">"
1242*70a7ec85SAndroid Build Coastguard Worker         "  <hal format=\"aidl\">"
1243*70a7ec85SAndroid Build Coastguard Worker         "    <name>android.hardware.foo</name>"
1244*70a7ec85SAndroid Build Coastguard Worker         "    <fqname>IFoo/default</fqname>"
1245*70a7ec85SAndroid Build Coastguard Worker         "  </hal>"
1246*70a7ec85SAndroid Build Coastguard Worker         "</manifest>");
1247*70a7ec85SAndroid Build Coastguard Worker     // ODM overrides(disables) HAL in Vendor
1248*70a7ec85SAndroid Build Coastguard Worker     expect(kOdmManifest, "<manifest " + kMetaVersionStr + " type=\"device\">"
1249*70a7ec85SAndroid Build Coastguard Worker         "  <hal override=\"true\" format=\"aidl\">"
1250*70a7ec85SAndroid Build Coastguard Worker         "    <name>android.hardware.foo</name>"
1251*70a7ec85SAndroid Build Coastguard Worker         "  </hal>"
1252*70a7ec85SAndroid Build Coastguard Worker         "</manifest>");
1253*70a7ec85SAndroid Build Coastguard Worker     auto p = vintfObject->getDeviceHalManifest();
1254*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1255*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(p->getAidlInstances("android.hardware.foo", "IFoo"), std::set<std::string>({}));
1256*70a7ec85SAndroid Build Coastguard Worker }
1257*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(ManifestOverrideTest,NoOverrideForVendorApex)1258*70a7ec85SAndroid Build Coastguard Worker TEST_F(ManifestOverrideTest, NoOverrideForVendorApex) {
1259*70a7ec85SAndroid Build Coastguard Worker     expect(kVendorManifest,
1260*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + " type=\"device\" />");
1261*70a7ec85SAndroid Build Coastguard Worker     expect(kApexInfoFile,
1262*70a7ec85SAndroid Build Coastguard Worker         R"(<apex-info-list>
1263*70a7ec85SAndroid Build Coastguard Worker           <apex-info
1264*70a7ec85SAndroid Build Coastguard Worker             moduleName="com.android.foo"
1265*70a7ec85SAndroid Build Coastguard Worker             partition="VENDOR"
1266*70a7ec85SAndroid Build Coastguard Worker             isActive="true"/>
1267*70a7ec85SAndroid Build Coastguard Worker         </apex-info-list>)");
1268*70a7ec85SAndroid Build Coastguard Worker     expect("/apex/com.android.foo/etc/vintf/foo.xml",
1269*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + "type=\"device\">"
1270*70a7ec85SAndroid Build Coastguard Worker         "  <hal format=\"aidl\">"
1271*70a7ec85SAndroid Build Coastguard Worker         "    <name>android.hardware.foo</name>"
1272*70a7ec85SAndroid Build Coastguard Worker         "    <fqname>IFoo/default</fqname>"
1273*70a7ec85SAndroid Build Coastguard Worker         "  </hal>"
1274*70a7ec85SAndroid Build Coastguard Worker         "</manifest>");
1275*70a7ec85SAndroid Build Coastguard Worker     auto p = vintfObject->getDeviceHalManifest();
1276*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1277*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(p->getAidlInstances("android.hardware.foo", "IFoo"),
1278*70a7ec85SAndroid Build Coastguard Worker         std::set<std::string>({"default"}));
1279*70a7ec85SAndroid Build Coastguard Worker }
1280*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(ManifestOverrideTest,OdmOverridesVendorApex)1281*70a7ec85SAndroid Build Coastguard Worker TEST_F(ManifestOverrideTest, OdmOverridesVendorApex) {
1282*70a7ec85SAndroid Build Coastguard Worker     expect(kVendorManifest,
1283*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + " type=\"device\" />");
1284*70a7ec85SAndroid Build Coastguard Worker     expect(kApexInfoFile,
1285*70a7ec85SAndroid Build Coastguard Worker         R"(<apex-info-list>
1286*70a7ec85SAndroid Build Coastguard Worker             <apex-info
1287*70a7ec85SAndroid Build Coastguard Worker                 moduleName="com.android.foo"
1288*70a7ec85SAndroid Build Coastguard Worker                 partition="VENDOR"
1289*70a7ec85SAndroid Build Coastguard Worker                 isActive="true"/>
1290*70a7ec85SAndroid Build Coastguard Worker             </apex-info-list>)");
1291*70a7ec85SAndroid Build Coastguard Worker     expect("/apex/com.android.foo/etc/vintf/foo.xml",
1292*70a7ec85SAndroid Build Coastguard Worker         "<manifest " + kMetaVersionStr + "type=\"device\">"
1293*70a7ec85SAndroid Build Coastguard Worker         "  <hal format=\"aidl\">"
1294*70a7ec85SAndroid Build Coastguard Worker         "    <name>android.hardware.foo</name>"
1295*70a7ec85SAndroid Build Coastguard Worker         "    <fqname>IFoo/default</fqname>"
1296*70a7ec85SAndroid Build Coastguard Worker         "  </hal>"
1297*70a7ec85SAndroid Build Coastguard Worker         "</manifest>");
1298*70a7ec85SAndroid Build Coastguard Worker     // ODM overrides(disables) HAL in Vendor APEX
1299*70a7ec85SAndroid Build Coastguard Worker     expect(kOdmManifest, "<manifest " + kMetaVersionStr + " type=\"device\">"
1300*70a7ec85SAndroid Build Coastguard Worker         "  <hal override=\"true\" format=\"aidl\">"
1301*70a7ec85SAndroid Build Coastguard Worker         "    <name>android.hardware.foo</name>"
1302*70a7ec85SAndroid Build Coastguard Worker         "  </hal>"
1303*70a7ec85SAndroid Build Coastguard Worker         "</manifest>");
1304*70a7ec85SAndroid Build Coastguard Worker     auto p = vintfObject->getDeviceHalManifest();
1305*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, p);
1306*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(p->getAidlInstances("android.hardware.foo", "IFoo"),
1307*70a7ec85SAndroid Build Coastguard Worker         std::set<std::string>({}));
1308*70a7ec85SAndroid Build Coastguard Worker }
1309*70a7ec85SAndroid Build Coastguard Worker 
1310*70a7ec85SAndroid Build Coastguard Worker struct CheckedFqInstance : FqInstance {
CheckedFqInstanceandroid::vintf::testing::CheckedFqInstance1311*70a7ec85SAndroid Build Coastguard Worker     CheckedFqInstance(const char* s) : CheckedFqInstance(std::string(s)) {}
CheckedFqInstanceandroid::vintf::testing::CheckedFqInstance1312*70a7ec85SAndroid Build Coastguard Worker     CheckedFqInstance(const std::string& s) { CHECK(setTo(s)) << s; }
1313*70a7ec85SAndroid Build Coastguard Worker 
getVersionandroid::vintf::testing::CheckedFqInstance1314*70a7ec85SAndroid Build Coastguard Worker     Version getVersion() const { return FqInstance::getVersion(); }
1315*70a7ec85SAndroid Build Coastguard Worker };
1316*70a7ec85SAndroid Build Coastguard Worker 
1317*70a7ec85SAndroid Build Coastguard Worker class DeprecateTest : public VintfObjectTestBase {
1318*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()1319*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() override {
1320*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
1321*70a7ec85SAndroid Build Coastguard Worker         useEmptyFileSystem();
1322*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(StrEq(kSystemVintfDir), _, _))
1323*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](const auto&, auto* out, auto*) {
1324*70a7ec85SAndroid Build Coastguard Worker                 *out = {
1325*70a7ec85SAndroid Build Coastguard Worker                     "compatibility_matrix.1.xml",
1326*70a7ec85SAndroid Build Coastguard Worker                     "compatibility_matrix.2.xml",
1327*70a7ec85SAndroid Build Coastguard Worker                 };
1328*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
1329*70a7ec85SAndroid Build Coastguard Worker             }));
1330*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kSystemVintfDir + "compatibility_matrix.1.xml"s, systemMatrixLevel1);
1331*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kSystemVintfDir + "compatibility_matrix.2.xml"s, systemMatrixLevel2);
1332*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(StrEq(kProductVintfDir), _, _))
1333*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](const auto&, auto* out, auto*) {
1334*70a7ec85SAndroid Build Coastguard Worker                 *out = {
1335*70a7ec85SAndroid Build Coastguard Worker                     "compatibility_matrix.1.xml",
1336*70a7ec85SAndroid Build Coastguard Worker                     "compatibility_matrix.2.xml",
1337*70a7ec85SAndroid Build Coastguard Worker                 };
1338*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
1339*70a7ec85SAndroid Build Coastguard Worker             }));
1340*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kProductVintfDir + "compatibility_matrix.1.xml"s,
1341*70a7ec85SAndroid Build Coastguard Worker                               productMatrixLevel1);
1342*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kProductVintfDir + "compatibility_matrix.2.xml"s,
1343*70a7ec85SAndroid Build Coastguard Worker                               productMatrixLevel2);
1344*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StrEq(kProductMatrix));
1345*70a7ec85SAndroid Build Coastguard Worker         expectNeverFetch(kSystemLegacyMatrix);
1346*70a7ec85SAndroid Build Coastguard Worker 
1347*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StartsWith("/odm/"));
1348*70a7ec85SAndroid Build Coastguard Worker     }
1349*70a7ec85SAndroid Build Coastguard Worker };
1350*70a7ec85SAndroid Build Coastguard Worker 
1351*70a7ec85SAndroid Build Coastguard Worker // clang-format on
1352*70a7ec85SAndroid Build Coastguard Worker 
aidlFqInstance(const std::string & package,size_t version,const std::string & interface,const std::string & instance)1353*70a7ec85SAndroid Build Coastguard Worker FqInstance aidlFqInstance(const std::string& package, size_t version, const std::string& interface,
1354*70a7ec85SAndroid Build Coastguard Worker                           const std::string& instance) {
1355*70a7ec85SAndroid Build Coastguard Worker     auto ret = FqInstance::from(package, kFakeAidlMajorVersion, version, interface, instance);
1356*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.has_value());
1357*70a7ec85SAndroid Build Coastguard Worker     return ret.value_or(FqInstance());
1358*70a7ec85SAndroid Build Coastguard Worker }
1359*70a7ec85SAndroid Build Coastguard Worker 
1360*70a7ec85SAndroid Build Coastguard Worker // clang-format off
1361*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckNoDeprecate)1362*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckNoDeprecate) {
1363*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1364*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1365*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1366*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1367*70a7ec85SAndroid Build Coastguard Worker     }, {
1368*70a7ec85SAndroid Build Coastguard Worker         aidlFqInstance("android.hardware.minor", 102, "IMinor", "default"),
1369*70a7ec85SAndroid Build Coastguard Worker     });
1370*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1371*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation({}, &error)) << error;
1372*70a7ec85SAndroid Build Coastguard Worker }
1373*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckRemovedSystem)1374*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckRemovedSystem) {
1375*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1376*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IRemoved/default",
1377*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1378*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1379*70a7ec85SAndroid Build Coastguard Worker     });
1380*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1381*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1382*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1383*70a7ec85SAndroid Build Coastguard Worker }
1384*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckRemovedVersionAccess)1385*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckRemovedVersionAccess) {
1386*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {}, {aidlFqInstance("android.hardware.vm.removed", 2, "IRemoved",
1387*70a7ec85SAndroid Build Coastguard Worker                                                        "default")}, ExclusiveTo::VM);
1388*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1389*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1390*70a7ec85SAndroid Build Coastguard Worker         << "removed@2 should be deprecated. " << error;
1391*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN("android.hardware.vm.removed", error);
1392*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN("is deprecated; requires at least", error);
1393*70a7ec85SAndroid Build Coastguard Worker }
1394*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckOkVersionSystemAccess)1395*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckOkVersionSystemAccess) {
1396*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {}, {aidlFqInstance("android.hardware.vm.removed", 3, "IRemoved",
1397*70a7ec85SAndroid Build Coastguard Worker                                                        "default")}, ExclusiveTo::VM);
1398*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1399*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation({}, &error))
1400*70a7ec85SAndroid Build Coastguard Worker         << "V3 should be allowed at level 2" << error;
1401*70a7ec85SAndroid Build Coastguard Worker }
1402*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckRemovedSystemAccessWrong)1403*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckRemovedSystemAccessWrong) {
1404*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {}, {aidlFqInstance("android.hardware.vm.removed", 2, "IRemoved",
1405*70a7ec85SAndroid Build Coastguard Worker                                                        "default")}, ExclusiveTo::EMPTY);
1406*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1407*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation({}, &error))
1408*70a7ec85SAndroid Build Coastguard Worker         << "There is no entry for this HAL with ExclusiveTo::EMPTY so it "
1409*70a7ec85SAndroid Build Coastguard Worker         << "should not show as deprecated." << error;
1410*70a7ec85SAndroid Build Coastguard Worker }
1411*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckRemovedSystemAidl)1412*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckRemovedSystemAidl) {
1413*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {}, {
1414*70a7ec85SAndroid Build Coastguard Worker         aidlFqInstance("android.hardware.removed", 101, "IRemoved", "default"),
1415*70a7ec85SAndroid Build Coastguard Worker     });
1416*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1417*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1418*70a7ec85SAndroid Build Coastguard Worker         << "removed@101 should be deprecated. " << error;
1419*70a7ec85SAndroid Build Coastguard Worker }
1420*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckRemovedProduct)1421*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckRemovedProduct) {
1422*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1423*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IRemoved/default",
1424*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1425*70a7ec85SAndroid Build Coastguard Worker     });
1426*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1427*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1428*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1429*70a7ec85SAndroid Build Coastguard Worker }
1430*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMinorSystem)1431*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMinorSystem) {
1432*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1433*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1434*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1435*70a7ec85SAndroid Build Coastguard Worker     });
1436*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1437*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1438*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1439*70a7ec85SAndroid Build Coastguard Worker }
1440*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMinorSystemAidl)1441*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMinorSystemAidl) {
1442*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {}, {
1443*70a7ec85SAndroid Build Coastguard Worker         aidlFqInstance("android.hardware.minor", 101, "IMinor", "default"),
1444*70a7ec85SAndroid Build Coastguard Worker     });
1445*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1446*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1447*70a7ec85SAndroid Build Coastguard Worker         << "minor@101 should be deprecated. " << error;
1448*70a7ec85SAndroid Build Coastguard Worker }
1449*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMinorProduct)1450*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMinorProduct) {
1451*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1452*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1453*70a7ec85SAndroid Build Coastguard Worker     });
1454*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1455*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1456*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1457*70a7ec85SAndroid Build Coastguard Worker }
1458*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMinorDeprecatedInstance1)1459*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMinorDeprecatedInstance1) {
1460*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1461*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/legacy",
1462*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1463*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1464*70a7ec85SAndroid Build Coastguard Worker     });
1465*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1466*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1467*70a7ec85SAndroid Build Coastguard Worker         << "[email protected]::IMinor/legacy should be deprecated. " << error;
1468*70a7ec85SAndroid Build Coastguard Worker }
1469*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMinorDeprecatedInstance2)1470*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMinorDeprecatedInstance2) {
1471*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1472*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1473*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/legacy",
1474*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1475*70a7ec85SAndroid Build Coastguard Worker     });
1476*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1477*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1478*70a7ec85SAndroid Build Coastguard Worker         << "[email protected]::IMinor/legacy should be deprecated. " << error;
1479*70a7ec85SAndroid Build Coastguard Worker }
1480*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMajor1)1481*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMajor1) {
1482*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1483*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1484*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1485*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1486*70a7ec85SAndroid Build Coastguard Worker     });
1487*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1488*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1489*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1490*70a7ec85SAndroid Build Coastguard Worker }
1491*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,CheckMajor2)1492*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, CheckMajor2) {
1493*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1494*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/default",
1495*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1496*70a7ec85SAndroid Build Coastguard Worker     });
1497*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1498*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1499*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1500*70a7ec85SAndroid Build Coastguard Worker }
1501*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,HidlMetadataNotDeprecate)1502*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, HidlMetadataNotDeprecate) {
1503*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1504*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1505*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1506*70a7ec85SAndroid Build Coastguard Worker     });
1507*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1508*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1509*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1510*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidlMetadata{
1511*70a7ec85SAndroid Build Coastguard Worker       {"[email protected]::IMajor", {"[email protected]::IMajor"}},
1512*70a7ec85SAndroid Build Coastguard Worker     };
1513*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation(hidlMetadata, &error))
1514*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should not be deprecated because it extends from 2.0: " << error;
1515*70a7ec85SAndroid Build Coastguard Worker }
1516*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(DeprecateTest,HidlMetadataDeprecate)1517*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeprecateTest, HidlMetadataDeprecate) {
1518*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1519*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMajor/default",
1520*70a7ec85SAndroid Build Coastguard Worker     });
1521*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1522*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1523*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1524*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidlMetadata{
1525*70a7ec85SAndroid Build Coastguard Worker       {"[email protected]::IMajor", {"[email protected]::IMajor"}},
1526*70a7ec85SAndroid Build Coastguard Worker     };
1527*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation(hidlMetadata, &error))
1528*70a7ec85SAndroid Build Coastguard Worker         << "[email protected] should be deprecated. " << error;
1529*70a7ec85SAndroid Build Coastguard Worker }
1530*70a7ec85SAndroid Build Coastguard Worker 
1531*70a7ec85SAndroid Build Coastguard Worker class RegexInstanceDeprecateTest : public VintfObjectTestBase {
1532*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()1533*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() override {
1534*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
1535*70a7ec85SAndroid Build Coastguard Worker         useEmptyFileSystem();
1536*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(StrEq(kSystemVintfDir), _, _))
1537*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](const auto&, auto* out, auto*) {
1538*70a7ec85SAndroid Build Coastguard Worker                 *out = {
1539*70a7ec85SAndroid Build Coastguard Worker                     "compatibility_matrix.1.xml",
1540*70a7ec85SAndroid Build Coastguard Worker                     "compatibility_matrix.2.xml",
1541*70a7ec85SAndroid Build Coastguard Worker                 };
1542*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
1543*70a7ec85SAndroid Build Coastguard Worker             }));
1544*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kSystemVintfDir + "compatibility_matrix.1.xml"s,
1545*70a7ec85SAndroid Build Coastguard Worker             "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
1546*70a7ec85SAndroid Build Coastguard Worker             "    <hal format=\"hidl\" optional=\"true\">\n"
1547*70a7ec85SAndroid Build Coastguard Worker             "        <name>android.hardware.minor</name>\n"
1548*70a7ec85SAndroid Build Coastguard Worker             "        <version>1.1</version>\n"
1549*70a7ec85SAndroid Build Coastguard Worker             "        <interface>\n"
1550*70a7ec85SAndroid Build Coastguard Worker             "            <name>IMinor</name>\n"
1551*70a7ec85SAndroid Build Coastguard Worker             "            <regex-instance>instance.*</regex-instance>\n"
1552*70a7ec85SAndroid Build Coastguard Worker             "        </interface>\n"
1553*70a7ec85SAndroid Build Coastguard Worker             "    </hal>\n"
1554*70a7ec85SAndroid Build Coastguard Worker             "    <hal format=\"aidl\" optional=\"true\">\n"
1555*70a7ec85SAndroid Build Coastguard Worker             "        <name>android.hardware.minor</name>\n"
1556*70a7ec85SAndroid Build Coastguard Worker             "        <version>101</version>\n"
1557*70a7ec85SAndroid Build Coastguard Worker             "        <interface>\n"
1558*70a7ec85SAndroid Build Coastguard Worker             "            <name>IMinor</name>\n"
1559*70a7ec85SAndroid Build Coastguard Worker             "            <regex-instance>instance.*</regex-instance>\n"
1560*70a7ec85SAndroid Build Coastguard Worker             "        </interface>\n"
1561*70a7ec85SAndroid Build Coastguard Worker             "    </hal>\n"
1562*70a7ec85SAndroid Build Coastguard Worker             "</compatibility-matrix>\n"
1563*70a7ec85SAndroid Build Coastguard Worker         );
1564*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kSystemVintfDir + "compatibility_matrix.2.xml"s,
1565*70a7ec85SAndroid Build Coastguard Worker             "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
1566*70a7ec85SAndroid Build Coastguard Worker             "    <hal format=\"hidl\" optional=\"true\">\n"
1567*70a7ec85SAndroid Build Coastguard Worker             "        <name>android.hardware.minor</name>\n"
1568*70a7ec85SAndroid Build Coastguard Worker             "        <version>1.2</version>\n"
1569*70a7ec85SAndroid Build Coastguard Worker             "        <interface>\n"
1570*70a7ec85SAndroid Build Coastguard Worker             "            <name>IMinor</name>\n"
1571*70a7ec85SAndroid Build Coastguard Worker             "            <regex-instance>instance.*</regex-instance>\n"
1572*70a7ec85SAndroid Build Coastguard Worker             "        </interface>\n"
1573*70a7ec85SAndroid Build Coastguard Worker             "    </hal>\n"
1574*70a7ec85SAndroid Build Coastguard Worker             "    <hal format=\"aidl\" optional=\"true\">\n"
1575*70a7ec85SAndroid Build Coastguard Worker             "        <name>android.hardware.minor</name>\n"
1576*70a7ec85SAndroid Build Coastguard Worker             "        <version>102</version>\n"
1577*70a7ec85SAndroid Build Coastguard Worker             "        <interface>\n"
1578*70a7ec85SAndroid Build Coastguard Worker             "            <name>IMinor</name>\n"
1579*70a7ec85SAndroid Build Coastguard Worker             "            <regex-instance>instance.*</regex-instance>\n"
1580*70a7ec85SAndroid Build Coastguard Worker             "        </interface>\n"
1581*70a7ec85SAndroid Build Coastguard Worker             "    </hal>\n"
1582*70a7ec85SAndroid Build Coastguard Worker             "</compatibility-matrix>\n");
1583*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StrEq(kProductMatrix));
1584*70a7ec85SAndroid Build Coastguard Worker         expectNeverFetch(kSystemLegacyMatrix);
1585*70a7ec85SAndroid Build Coastguard Worker 
1586*70a7ec85SAndroid Build Coastguard Worker         expectFileNotExist(StartsWith("/odm/"));
1587*70a7ec85SAndroid Build Coastguard Worker     }
1588*70a7ec85SAndroid Build Coastguard Worker };
1589*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexInstanceDeprecateTest,HidlNoDeprecate)1590*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexInstanceDeprecateTest, HidlNoDeprecate) {
1591*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1592*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/instance1",
1593*70a7ec85SAndroid Build Coastguard Worker     }, {
1594*70a7ec85SAndroid Build Coastguard Worker         aidlFqInstance("android.hardware.minor", 102, "IMinor", "instance1"),
1595*70a7ec85SAndroid Build Coastguard Worker     });
1596*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1597*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation({}, &error)) << error;
1598*70a7ec85SAndroid Build Coastguard Worker }
1599*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexInstanceDeprecateTest,HidlDeprecate)1600*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexInstanceDeprecateTest, HidlDeprecate) {
1601*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1602*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/instance1",
1603*70a7ec85SAndroid Build Coastguard Worker         "[email protected]::IMinor/instance2",
1604*70a7ec85SAndroid Build Coastguard Worker     }, {});
1605*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1606*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1607*70a7ec85SAndroid Build Coastguard Worker         << "[email protected]::IMinor/instance2 is deprecated";
1608*70a7ec85SAndroid Build Coastguard Worker }
1609*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexInstanceDeprecateTest,AidlDeprecate)1610*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexInstanceDeprecateTest, AidlDeprecate) {
1611*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {}, {
1612*70a7ec85SAndroid Build Coastguard Worker         aidlFqInstance("android.hardware.minor", 102, "IMinor", "instance1"),
1613*70a7ec85SAndroid Build Coastguard Worker         aidlFqInstance("android.hardware.minor", 101, "IMinor", "instance2"),
1614*70a7ec85SAndroid Build Coastguard Worker     });
1615*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1616*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1617*70a7ec85SAndroid Build Coastguard Worker         << "minor@101::IMinor/instance2 is deprecated";
1618*70a7ec85SAndroid Build Coastguard Worker }
1619*70a7ec85SAndroid Build Coastguard Worker 
1620*70a7ec85SAndroid Build Coastguard Worker class MultiMatrixTest : public VintfObjectTestBase {
1621*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()1622*70a7ec85SAndroid Build Coastguard Worker     void SetUp() override {
1623*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
1624*70a7ec85SAndroid Build Coastguard Worker         useEmptyFileSystem();
1625*70a7ec85SAndroid Build Coastguard Worker     }
getFileName(size_t i)1626*70a7ec85SAndroid Build Coastguard Worker     static std::string getFileName(size_t i) {
1627*70a7ec85SAndroid Build Coastguard Worker         return "compatibility_matrix." + to_string(static_cast<Level>(i)) + ".xml";
1628*70a7ec85SAndroid Build Coastguard Worker     }
SetUpMockSystemMatrices(const std::vector<std::string> & xmls)1629*70a7ec85SAndroid Build Coastguard Worker     void SetUpMockSystemMatrices(const std::vector<std::string>& xmls) {
1630*70a7ec85SAndroid Build Coastguard Worker         SetUpMockMatrices(kSystemVintfDir, xmls);
1631*70a7ec85SAndroid Build Coastguard Worker     }
SetUpMockMatrices(const std::string & dir,const std::vector<std::string> & xmls)1632*70a7ec85SAndroid Build Coastguard Worker     void SetUpMockMatrices(const std::string& dir, const std::vector<std::string>& xmls) {
1633*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(StrEq(dir), _, _))
1634*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([=](const auto&, auto* out, auto*) {
1635*70a7ec85SAndroid Build Coastguard Worker                 size_t i = 1;
1636*70a7ec85SAndroid Build Coastguard Worker                 for (const auto& content : xmls) {
1637*70a7ec85SAndroid Build Coastguard Worker                     (void)content;
1638*70a7ec85SAndroid Build Coastguard Worker                     out->push_back(getFileName(i));
1639*70a7ec85SAndroid Build Coastguard Worker                     ++i;
1640*70a7ec85SAndroid Build Coastguard Worker                 }
1641*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
1642*70a7ec85SAndroid Build Coastguard Worker             }));
1643*70a7ec85SAndroid Build Coastguard Worker         size_t i = 1;
1644*70a7ec85SAndroid Build Coastguard Worker         for (const auto& content : xmls) {
1645*70a7ec85SAndroid Build Coastguard Worker             expectFetchRepeatedly(dir + getFileName(i), content);
1646*70a7ec85SAndroid Build Coastguard Worker             ++i;
1647*70a7ec85SAndroid Build Coastguard Worker         }
1648*70a7ec85SAndroid Build Coastguard Worker     }
expectTargetFcmVersion(size_t level)1649*70a7ec85SAndroid Build Coastguard Worker     void expectTargetFcmVersion(size_t level) {
1650*70a7ec85SAndroid Build Coastguard Worker         expectVendorManifest(Level{level}, {});
1651*70a7ec85SAndroid Build Coastguard Worker     }
1652*70a7ec85SAndroid Build Coastguard Worker };
1653*70a7ec85SAndroid Build Coastguard Worker 
1654*70a7ec85SAndroid Build Coastguard Worker class RegexTest : public MultiMatrixTest {
1655*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()1656*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
1657*70a7ec85SAndroid Build Coastguard Worker         MultiMatrixTest::SetUp();
1658*70a7ec85SAndroid Build Coastguard Worker         SetUpMockSystemMatrices(systemMatrixRegexXmls);
1659*70a7ec85SAndroid Build Coastguard Worker     }
1660*70a7ec85SAndroid Build Coastguard Worker };
1661*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexTest,CombineLevel1)1662*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexTest, CombineLevel1) {
1663*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(1);
1664*70a7ec85SAndroid Build Coastguard Worker     auto matrix = vintfObject->getFrameworkCompatibilityMatrix();
1665*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, matrix);
1666*70a7ec85SAndroid Build Coastguard Worker     std::string xml = toXml(*matrix);
1667*70a7ec85SAndroid Build Coastguard Worker 
1668*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1669*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"false\">\n"
1670*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1671*70a7ec85SAndroid Build Coastguard Worker         "        <version>1.0-2</version>\n"
1672*70a7ec85SAndroid Build Coastguard Worker         "        <version>2.0</version>\n"
1673*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1674*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1675*70a7ec85SAndroid Build Coastguard Worker         "            <instance>default</instance>\n"
1676*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1677*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1678*70a7ec85SAndroid Build Coastguard Worker         xml);
1679*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1680*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"false\">\n"
1681*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1682*70a7ec85SAndroid Build Coastguard Worker         "        <version>1.0-1</version>\n"
1683*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1684*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1685*70a7ec85SAndroid Build Coastguard Worker         "            <instance>special/1.0</instance>\n"
1686*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex/1.0/[0-9]+</regex-instance>\n"
1687*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex_common/[0-9]+</regex-instance>\n"
1688*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1689*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1690*70a7ec85SAndroid Build Coastguard Worker         xml);
1691*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1692*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"true\">\n"
1693*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1694*70a7ec85SAndroid Build Coastguard Worker         "        <version>1.1-2</version>\n"
1695*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1696*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1697*70a7ec85SAndroid Build Coastguard Worker         "            <instance>special/1.1</instance>\n"
1698*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>[a-z]+_[a-z]+/[0-9]+</regex-instance>\n"
1699*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex/1.1/[0-9]+</regex-instance>\n"
1700*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1701*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1702*70a7ec85SAndroid Build Coastguard Worker         xml);
1703*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1704*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"true\">\n"
1705*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1706*70a7ec85SAndroid Build Coastguard Worker         "        <version>2.0</version>\n"
1707*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1708*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1709*70a7ec85SAndroid Build Coastguard Worker         "            <instance>special/2.0</instance>\n"
1710*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex/2.0/[0-9]+</regex-instance>\n"
1711*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex_[a-z]+/[0-9]+</regex-instance>\n"
1712*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1713*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1714*70a7ec85SAndroid Build Coastguard Worker         xml);
1715*70a7ec85SAndroid Build Coastguard Worker }
1716*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexTest,CombineLevel2)1717*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexTest, CombineLevel2) {
1718*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(2);
1719*70a7ec85SAndroid Build Coastguard Worker     auto matrix = vintfObject->getFrameworkCompatibilityMatrix();
1720*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, matrix);
1721*70a7ec85SAndroid Build Coastguard Worker     std::string xml = toXml(*matrix);
1722*70a7ec85SAndroid Build Coastguard Worker 
1723*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1724*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"false\">\n"
1725*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1726*70a7ec85SAndroid Build Coastguard Worker         "        <version>1.1-2</version>\n"
1727*70a7ec85SAndroid Build Coastguard Worker         "        <version>2.0</version>\n"
1728*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1729*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1730*70a7ec85SAndroid Build Coastguard Worker         "            <instance>default</instance>\n"
1731*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1732*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1733*70a7ec85SAndroid Build Coastguard Worker         xml);
1734*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1735*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"false\">\n"
1736*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1737*70a7ec85SAndroid Build Coastguard Worker         "        <version>1.1-2</version>\n"
1738*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1739*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1740*70a7ec85SAndroid Build Coastguard Worker         "            <instance>special/1.1</instance>\n"
1741*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>[a-z]+_[a-z]+/[0-9]+</regex-instance>\n"
1742*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex/1.1/[0-9]+</regex-instance>\n"
1743*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1744*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1745*70a7ec85SAndroid Build Coastguard Worker         xml);
1746*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(
1747*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"true\">\n"
1748*70a7ec85SAndroid Build Coastguard Worker         "        <name>android.hardware.regex</name>\n"
1749*70a7ec85SAndroid Build Coastguard Worker         "        <version>2.0</version>\n"
1750*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
1751*70a7ec85SAndroid Build Coastguard Worker         "            <name>IRegex</name>\n"
1752*70a7ec85SAndroid Build Coastguard Worker         "            <instance>special/2.0</instance>\n"
1753*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex/2.0/[0-9]+</regex-instance>\n"
1754*70a7ec85SAndroid Build Coastguard Worker         "            <regex-instance>regex_[a-z]+/[0-9]+</regex-instance>\n"
1755*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
1756*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n",
1757*70a7ec85SAndroid Build Coastguard Worker         xml);
1758*70a7ec85SAndroid Build Coastguard Worker }
1759*70a7ec85SAndroid Build Coastguard Worker 
1760*70a7ec85SAndroid Build Coastguard Worker // clang-format on
1761*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexTest,DeprecateLevel2)1762*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexTest, DeprecateLevel2) {
1763*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1764*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1765*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/default",
1766*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/special/1.1",
1767*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/regex/1.1/1",
1768*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/regex_common/0",
1769*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/default",
1770*70a7ec85SAndroid Build Coastguard Worker                                    });
1771*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation({}, &error)) << error;
1772*70a7ec85SAndroid Build Coastguard Worker }
1773*70a7ec85SAndroid Build Coastguard Worker 
1774*70a7ec85SAndroid Build Coastguard Worker class RegexTestDeprecateLevel2P : public RegexTest, public WithParamInterface<const char*> {};
TEST_P(RegexTestDeprecateLevel2P,Test)1775*70a7ec85SAndroid Build Coastguard Worker TEST_P(RegexTestDeprecateLevel2P, Test) {
1776*70a7ec85SAndroid Build Coastguard Worker     auto deprecated = GetParam();
1777*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1778*70a7ec85SAndroid Build Coastguard Worker     // 2.0/default ensures compatibility.
1779*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{2}, {
1780*70a7ec85SAndroid Build Coastguard Worker                                        deprecated,
1781*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/default",
1782*70a7ec85SAndroid Build Coastguard Worker                                    });
1783*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1784*70a7ec85SAndroid Build Coastguard Worker         << deprecated << " should be deprecated. " << error;
1785*70a7ec85SAndroid Build Coastguard Worker }
1786*70a7ec85SAndroid Build Coastguard Worker 
1787*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(RegexTest, RegexTestDeprecateLevel2P,
1788*70a7ec85SAndroid Build Coastguard Worker                          ::testing::Values("[email protected]::IRegex/default",
1789*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/special/1.0",
1790*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex/1.0/1",
1791*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex_common/0",
1792*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/special/1.0",
1793*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex/1.0/1"));
1794*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(RegexTest,DeprecateLevel3)1795*70a7ec85SAndroid Build Coastguard Worker TEST_F(RegexTest, DeprecateLevel3) {
1796*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1797*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{3}, {
1798*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/special/2.0",
1799*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/regex/2.0/1",
1800*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/default",
1801*70a7ec85SAndroid Build Coastguard Worker                                    });
1802*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(NO_DEPRECATED_HALS, vintfObject->checkDeprecation({}, &error)) << error;
1803*70a7ec85SAndroid Build Coastguard Worker }
1804*70a7ec85SAndroid Build Coastguard Worker 
1805*70a7ec85SAndroid Build Coastguard Worker class RegexTestDeprecateLevel3P : public RegexTest, public WithParamInterface<const char*> {};
TEST_P(RegexTestDeprecateLevel3P,Test)1806*70a7ec85SAndroid Build Coastguard Worker TEST_P(RegexTestDeprecateLevel3P, Test) {
1807*70a7ec85SAndroid Build Coastguard Worker     auto deprecated = GetParam();
1808*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1809*70a7ec85SAndroid Build Coastguard Worker     // 2.0/default ensures compatibility.
1810*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest(Level{3}, {
1811*70a7ec85SAndroid Build Coastguard Worker                                        deprecated,
1812*70a7ec85SAndroid Build Coastguard Worker                                        "[email protected]::IRegex/default",
1813*70a7ec85SAndroid Build Coastguard Worker                                    });
1814*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(DEPRECATED, vintfObject->checkDeprecation({}, &error))
1815*70a7ec85SAndroid Build Coastguard Worker         << deprecated << " should be deprecated.";
1816*70a7ec85SAndroid Build Coastguard Worker }
1817*70a7ec85SAndroid Build Coastguard Worker 
1818*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(RegexTest, RegexTestDeprecateLevel3P,
1819*70a7ec85SAndroid Build Coastguard Worker                          ::testing::Values("[email protected]::IRegex/default",
1820*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/special/1.0",
1821*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex/1.0/1",
1822*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex_common/0",
1823*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/special/1.0",
1824*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex/1.0/1",
1825*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/special/1.1",
1826*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex/1.1/1",
1827*70a7ec85SAndroid Build Coastguard Worker                                            "[email protected]::IRegex/regex_common/0"));
1828*70a7ec85SAndroid Build Coastguard Worker 
1829*70a7ec85SAndroid Build Coastguard Worker // clang-format off
1830*70a7ec85SAndroid Build Coastguard Worker 
1831*70a7ec85SAndroid Build Coastguard Worker //
1832*70a7ec85SAndroid Build Coastguard Worker // Set of framework matrices of different FCM version with <kernel>.
1833*70a7ec85SAndroid Build Coastguard Worker //
1834*70a7ec85SAndroid Build Coastguard Worker 
1835*70a7ec85SAndroid Build Coastguard Worker #define FAKE_KERNEL(__version__, __key__, __level__)                   \
1836*70a7ec85SAndroid Build Coastguard Worker     "    <kernel version=\"" __version__ "\" level=\"" #__level__ "\">\n"            \
1837*70a7ec85SAndroid Build Coastguard Worker     "        <config>\n"                                    \
1838*70a7ec85SAndroid Build Coastguard Worker     "            <key>CONFIG_" __key__ "</key>\n"           \
1839*70a7ec85SAndroid Build Coastguard Worker     "            <value type=\"tristate\">y</value>\n"      \
1840*70a7ec85SAndroid Build Coastguard Worker     "        </config>\n"                                   \
1841*70a7ec85SAndroid Build Coastguard Worker     "    </kernel>\n"
1842*70a7ec85SAndroid Build Coastguard Worker 
1843*70a7ec85SAndroid Build Coastguard Worker const static std::vector<std::string> systemMatrixKernelXmls = {
1844*70a7ec85SAndroid Build Coastguard Worker     // 1.xml
1845*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
1846*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("1.0.0", "A1", 1)
1847*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("2.0.0", "B1", 1)
1848*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1849*70a7ec85SAndroid Build Coastguard Worker     // 2.xml
1850*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
1851*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("2.0.0", "B2", 2)
1852*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("3.0.0", "C2", 2)
1853*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("4.0.0", "D2", 2)
1854*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1855*70a7ec85SAndroid Build Coastguard Worker     // 3.xml
1856*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"3\">\n"
1857*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("4.0.0", "D3", 3)
1858*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.0.0", "E3", 3)
1859*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1860*70a7ec85SAndroid Build Coastguard Worker     // 4.xml
1861*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"4\">\n"
1862*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.0.0", "E4", 4)
1863*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("6.0.0", "F4", 4)
1864*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1865*70a7ec85SAndroid Build Coastguard Worker     // 5.xml
1866*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"5\">\n"
1867*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("6.0.0", "F5", 5)
1868*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("7.0.0", "G5", 5)
1869*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1870*70a7ec85SAndroid Build Coastguard Worker };
1871*70a7ec85SAndroid Build Coastguard Worker 
1872*70a7ec85SAndroid Build Coastguard Worker const static std::vector<std::string> systemMatrixKernelXmlsGki = {
1873*70a7ec85SAndroid Build Coastguard Worker     // 5.xml
1874*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"5\">\n"
1875*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("4.14.0", "R_4_14", 5)
1876*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("4.19.0", "R_4_19", 5)
1877*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.4.0", "R_5_4", 5)
1878*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1879*70a7ec85SAndroid Build Coastguard Worker     // 6.xml
1880*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"6\">\n"
1881*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("4.19.0", "S_4_19", 6)
1882*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.4.0", "S_5_4", 6)
1883*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.10.0", "S_5_10", 6)
1884*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1885*70a7ec85SAndroid Build Coastguard Worker     // 7.xml
1886*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"7\">\n"
1887*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.10.0", "T_5_10", 7)
1888*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.15.0", "T_5_15", 7)
1889*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1890*70a7ec85SAndroid Build Coastguard Worker     // 8.xml
1891*70a7ec85SAndroid Build Coastguard Worker     "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"8\">\n"
1892*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("5.15.0", "U_5_15", 8)
1893*70a7ec85SAndroid Build Coastguard Worker     FAKE_KERNEL("6.1.0", "U_6_1", 8)
1894*70a7ec85SAndroid Build Coastguard Worker     "</compatibility-matrix>\n",
1895*70a7ec85SAndroid Build Coastguard Worker };
1896*70a7ec85SAndroid Build Coastguard Worker 
1897*70a7ec85SAndroid Build Coastguard Worker class KernelTest : public MultiMatrixTest {
1898*70a7ec85SAndroid Build Coastguard Worker    public:
expectKernelFcmVersion(size_t targetFcm,Level kernelFcm)1899*70a7ec85SAndroid Build Coastguard Worker     void expectKernelFcmVersion(size_t targetFcm, Level kernelFcm) {
1900*70a7ec85SAndroid Build Coastguard Worker         std::string xml = "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"" +
1901*70a7ec85SAndroid Build Coastguard Worker                           to_string(static_cast<Level>(targetFcm)) + "\">\n";
1902*70a7ec85SAndroid Build Coastguard Worker         if (kernelFcm != Level::UNSPECIFIED) {
1903*70a7ec85SAndroid Build Coastguard Worker             xml += "    <kernel target-level=\"" + to_string(kernelFcm) + "\"/>\n";
1904*70a7ec85SAndroid Build Coastguard Worker         }
1905*70a7ec85SAndroid Build Coastguard Worker         xml += "</manifest>";
1906*70a7ec85SAndroid Build Coastguard Worker         expectFetch(kVendorManifest, xml);
1907*70a7ec85SAndroid Build Coastguard Worker     }
1908*70a7ec85SAndroid Build Coastguard Worker };
1909*70a7ec85SAndroid Build Coastguard Worker 
1910*70a7ec85SAndroid Build Coastguard Worker // Assume that we are developing level 2. Test that old <kernel> requirements should
1911*70a7ec85SAndroid Build Coastguard Worker // not change and new <kernel> versions are added.
TEST_F(KernelTest,Level1AndLevel2)1912*70a7ec85SAndroid Build Coastguard Worker TEST_F(KernelTest, Level1AndLevel2) {
1913*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({systemMatrixKernelXmls[0], systemMatrixKernelXmls[1]});
1914*70a7ec85SAndroid Build Coastguard Worker 
1915*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(1);
1916*70a7ec85SAndroid Build Coastguard Worker     auto matrix = vintfObject->getFrameworkCompatibilityMatrix();
1917*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, matrix);
1918*70a7ec85SAndroid Build Coastguard Worker     std::string xml = toXml(*matrix);
1919*70a7ec85SAndroid Build Coastguard Worker 
1920*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("1.0.0", "A1", 1), xml) << "\nOld requirements must not change.";
1921*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("2.0.0", "B1", 1), xml) << "\nOld requirements must not change.";
1922*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("3.0.0", "C2", 2), xml) << "\nShould see <kernel> from new matrices";
1923*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("4.0.0", "D2", 2), xml) << "\nShould see <kernel> from new matrices";
1924*70a7ec85SAndroid Build Coastguard Worker 
1925*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("2.0.0", "B2", 2), xml) << "\nShould see <kernel> from new matrices";
1926*70a7ec85SAndroid Build Coastguard Worker }
1927*70a7ec85SAndroid Build Coastguard Worker 
1928*70a7ec85SAndroid Build Coastguard Worker // Assume that we are developing level 3. Test that old <kernel> requirements should
1929*70a7ec85SAndroid Build Coastguard Worker // not change and new <kernel> versions are added.
TEST_F(KernelTest,Level1AndMore)1930*70a7ec85SAndroid Build Coastguard Worker TEST_F(KernelTest, Level1AndMore) {
1931*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({systemMatrixKernelXmls});
1932*70a7ec85SAndroid Build Coastguard Worker 
1933*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(1);
1934*70a7ec85SAndroid Build Coastguard Worker     auto matrix = vintfObject->getFrameworkCompatibilityMatrix();
1935*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, matrix);
1936*70a7ec85SAndroid Build Coastguard Worker     std::string xml = toXml(*matrix);
1937*70a7ec85SAndroid Build Coastguard Worker 
1938*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("1.0.0", "A1", 1), xml) << "\nOld requirements must not change.";
1939*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("2.0.0", "B1", 1), xml) << "\nOld requirements must not change.";
1940*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("3.0.0", "C2", 2), xml) << "\nOld requirements must not change.";
1941*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("4.0.0", "D2", 2), xml) << "\nOld requirements must not change.";
1942*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("5.0.0", "E3", 3), xml) << "\nShould see <kernel> from new matrices";
1943*70a7ec85SAndroid Build Coastguard Worker 
1944*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("2.0.0", "B2", 2), xml) << "\nShould see <kernel> from new matrices";
1945*70a7ec85SAndroid Build Coastguard Worker     EXPECT_IN(FAKE_KERNEL("4.0.0", "D3", 3), xml) << "\nShould see <kernel> from new matrices";
1946*70a7ec85SAndroid Build Coastguard Worker }
1947*70a7ec85SAndroid Build Coastguard Worker 
MakeKernelInfo(const std::string & version,const std::string & key)1948*70a7ec85SAndroid Build Coastguard Worker KernelInfo MakeKernelInfo(const std::string& version, const std::string& key) {
1949*70a7ec85SAndroid Build Coastguard Worker     KernelInfo info;
1950*70a7ec85SAndroid Build Coastguard Worker     CHECK(fromXml(&info,
1951*70a7ec85SAndroid Build Coastguard Worker                                "    <kernel version=\"" + version + "\">\n"
1952*70a7ec85SAndroid Build Coastguard Worker                                "        <config>\n"
1953*70a7ec85SAndroid Build Coastguard Worker                                "            <key>CONFIG_" + key + "</key>\n"
1954*70a7ec85SAndroid Build Coastguard Worker                                "            <value type=\"tristate\">y</value>\n"
1955*70a7ec85SAndroid Build Coastguard Worker                                "        </config>\n"
1956*70a7ec85SAndroid Build Coastguard Worker                                "    </kernel>\n"));
1957*70a7ec85SAndroid Build Coastguard Worker     return info;
1958*70a7ec85SAndroid Build Coastguard Worker }
1959*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(KernelTest,Compatible)1960*70a7ec85SAndroid Build Coastguard Worker TEST_F(KernelTest, Compatible) {
1961*70a7ec85SAndroid Build Coastguard Worker     setupMockFetcher(vendorManifestXml1, systemMatrixXml1, systemManifestXml1, vendorMatrixXml1);
1962*70a7ec85SAndroid Build Coastguard Worker 
1963*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({
1964*70a7ec85SAndroid Build Coastguard Worker         "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
1965*70a7ec85SAndroid Build Coastguard Worker         FAKE_KERNEL("1.0.0", "A1", 1)
1966*70a7ec85SAndroid Build Coastguard Worker         FAKE_KERNEL("2.0.0", "B1", 1)
1967*70a7ec85SAndroid Build Coastguard Worker         "    <sepolicy>\n"
1968*70a7ec85SAndroid Build Coastguard Worker         "        <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
1969*70a7ec85SAndroid Build Coastguard Worker         "        <sepolicy-version>0</sepolicy-version>\n"
1970*70a7ec85SAndroid Build Coastguard Worker         "    </sepolicy>\n"
1971*70a7ec85SAndroid Build Coastguard Worker         "</compatibility-matrix>\n"});
1972*70a7ec85SAndroid Build Coastguard Worker     expectKernelFcmVersion(1, Level{1});
1973*70a7ec85SAndroid Build Coastguard Worker     expectSystemManifest();
1974*70a7ec85SAndroid Build Coastguard Worker     expectVendorMatrix();
1975*70a7ec85SAndroid Build Coastguard Worker 
1976*70a7ec85SAndroid Build Coastguard Worker     auto info = MakeKernelInfo("1.0.0", "A1");
1977*70a7ec85SAndroid Build Coastguard Worker     runtimeInfoFactory().getInfo()->setNextFetchKernelInfo(info.version(), info.configs());
1978*70a7ec85SAndroid Build Coastguard Worker     std::string error;
1979*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(COMPATIBLE, vintfObject->checkCompatibility(&error)) << error;
1980*70a7ec85SAndroid Build Coastguard Worker }
1981*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(KernelTest,Level)1982*70a7ec85SAndroid Build Coastguard Worker TEST_F(KernelTest, Level) {
1983*70a7ec85SAndroid Build Coastguard Worker     expectKernelFcmVersion(1, Level{8});
1984*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(Level{8}, vintfObject->getKernelLevel());
1985*70a7ec85SAndroid Build Coastguard Worker }
1986*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(KernelTest,LevelUnspecified)1987*70a7ec85SAndroid Build Coastguard Worker TEST_F(KernelTest, LevelUnspecified) {
1988*70a7ec85SAndroid Build Coastguard Worker     expectKernelFcmVersion(1, Level::UNSPECIFIED);
1989*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(Level::UNSPECIFIED, vintfObject->getKernelLevel());
1990*70a7ec85SAndroid Build Coastguard Worker }
1991*70a7ec85SAndroid Build Coastguard Worker 
1992*70a7ec85SAndroid Build Coastguard Worker class KernelTestP : public KernelTest, public WithParamInterface<
1993*70a7ec85SAndroid Build Coastguard Worker     std::tuple<std::vector<std::string>, KernelInfo, Level, Level, bool>> {};
1994*70a7ec85SAndroid Build Coastguard Worker // Assume that we are developing level 2. Test that old <kernel> requirements should
1995*70a7ec85SAndroid Build Coastguard Worker // not change and new <kernel> versions are added.
TEST_P(KernelTestP,Test)1996*70a7ec85SAndroid Build Coastguard Worker TEST_P(KernelTestP, Test) {
1997*70a7ec85SAndroid Build Coastguard Worker     auto&& [matrices, info, targetFcm, kernelFcm, pass] = GetParam();
1998*70a7ec85SAndroid Build Coastguard Worker 
1999*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices(matrices);
2000*70a7ec85SAndroid Build Coastguard Worker     expectKernelFcmVersion(static_cast<size_t>(targetFcm), kernelFcm);
2001*70a7ec85SAndroid Build Coastguard Worker     runtimeInfoFactory().getInfo()->setNextFetchKernelInfo(info.version(), info.configs());
2002*70a7ec85SAndroid Build Coastguard Worker     auto matrix = vintfObject->getFrameworkCompatibilityMatrix();
2003*70a7ec85SAndroid Build Coastguard Worker     auto runtime = vintfObject->getRuntimeInfo();
2004*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, matrix);
2005*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, runtime);
2006*70a7ec85SAndroid Build Coastguard Worker     std::string fallbackError = "Matrix is compatible with kernel info, but it shouldn't. Matrix:\n"
2007*70a7ec85SAndroid Build Coastguard Worker         + toXml(*matrix) + "\nKernelInfo:\n" + toXml(info);
2008*70a7ec85SAndroid Build Coastguard Worker     std::string error;
2009*70a7ec85SAndroid Build Coastguard Worker     ASSERT_EQ(pass, runtime->checkCompatibility(*matrix, &error))
2010*70a7ec85SAndroid Build Coastguard Worker             << (pass ? error : fallbackError);
2011*70a7ec85SAndroid Build Coastguard Worker }
2012*70a7ec85SAndroid Build Coastguard Worker 
2013*70a7ec85SAndroid Build Coastguard Worker 
KernelTestParamValues()2014*70a7ec85SAndroid Build Coastguard Worker std::vector<KernelTestP::ParamType> KernelTestParamValues() {
2015*70a7ec85SAndroid Build Coastguard Worker     std::vector<KernelTestP::ParamType> ret;
2016*70a7ec85SAndroid Build Coastguard Worker     std::vector<std::string> matrices = {systemMatrixKernelXmls[0], systemMatrixKernelXmls[1]};
2017*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("1.0.0", "A1"), Level{1}, Level::UNSPECIFIED, true);
2018*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B1"), Level{1}, Level::UNSPECIFIED, true);
2019*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C2"), Level{1}, Level::UNSPECIFIED, true);
2020*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D2"), Level{1}, Level::UNSPECIFIED, true);
2021*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B2"), Level{1}, Level::UNSPECIFIED, false);
2022*70a7ec85SAndroid Build Coastguard Worker 
2023*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("1.0.0", "A1"), Level{1}, Level{1}, true);
2024*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B1"), Level{1}, Level{1}, true);
2025*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C2"), Level{1}, Level{1}, false);
2026*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D2"), Level{1}, Level{1}, false);
2027*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B2"), Level{1}, Level{1}, true);
2028*70a7ec85SAndroid Build Coastguard Worker 
2029*70a7ec85SAndroid Build Coastguard Worker     // Kernel FCM lower than target FCM
2030*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("1.0.0", "A1"), Level{2}, Level{1}, true);
2031*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B1"), Level{2}, Level{1}, true);
2032*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B2"), Level{2}, Level{1}, true);
2033*70a7ec85SAndroid Build Coastguard Worker 
2034*70a7ec85SAndroid Build Coastguard Worker     matrices = systemMatrixKernelXmls;
2035*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("1.0.0", "A1"), Level{1}, Level::UNSPECIFIED, true);
2036*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B1"), Level{1}, Level::UNSPECIFIED, true);
2037*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C2"), Level{1}, Level::UNSPECIFIED, true);
2038*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D2"), Level{1}, Level::UNSPECIFIED, true);
2039*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.0.0", "E3"), Level{1}, Level::UNSPECIFIED, true);
2040*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{1}, Level::UNSPECIFIED, true);
2041*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B2"), Level{1}, Level::UNSPECIFIED, false);
2042*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D3"), Level{1}, Level::UNSPECIFIED, false);
2043*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.0.0", "E4"), Level{1}, Level::UNSPECIFIED, false);
2044*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F5"), Level{1}, Level::UNSPECIFIED, false);
2045*70a7ec85SAndroid Build Coastguard Worker 
2046*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{2}, Level::UNSPECIFIED, true);
2047*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{3}, Level::UNSPECIFIED, true);
2048*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{4}, Level::UNSPECIFIED, true);
2049*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{5}, Level::UNSPECIFIED, false);
2050*70a7ec85SAndroid Build Coastguard Worker 
2051*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("1.0.0", "A1"), Level{1}, Level{1}, true);
2052*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B1"), Level{1}, Level{1}, true);
2053*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B2"), Level{1}, Level{1}, true);
2054*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C2"), Level{1}, Level{1}, false);
2055*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C3"), Level{1}, Level{1}, false);
2056*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D2"), Level{1}, Level{1}, false);
2057*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D3"), Level{1}, Level{1}, false);
2058*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.0.0", "E3"), Level{1}, Level{1}, false);
2059*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.0.0", "E4"), Level{1}, Level{1}, false);
2060*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{1}, Level{1}, false);
2061*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F5"), Level{1}, Level{1}, false);
2062*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{1}, Level{1}, false);
2063*70a7ec85SAndroid Build Coastguard Worker 
2064*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{2}, Level{2}, false);
2065*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{3}, Level{3}, false);
2066*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{4}, Level{4}, true);
2067*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{5}, Level{5}, false);
2068*70a7ec85SAndroid Build Coastguard Worker 
2069*70a7ec85SAndroid Build Coastguard Worker     // Kernel FCM lower than target FCM
2070*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("1.0.0", "A1"), Level{2}, Level{1}, true);
2071*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B1"), Level{2}, Level{1}, true);
2072*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("2.0.0", "B2"), Level{2}, Level{1}, true);
2073*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C2"), Level{2}, Level{1}, false);
2074*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("3.0.0", "C3"), Level{2}, Level{1}, false);
2075*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D2"), Level{2}, Level{1}, false);
2076*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.0.0", "D3"), Level{2}, Level{1}, false);
2077*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.0.0", "E3"), Level{2}, Level{1}, false);
2078*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.0.0", "E4"), Level{2}, Level{1}, false);
2079*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{2}, Level{1}, false);
2080*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F5"), Level{2}, Level{1}, false);
2081*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{2}, Level{1}, false);
2082*70a7ec85SAndroid Build Coastguard Worker 
2083*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{3}, Level{2}, false);
2084*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{4}, Level{3}, false);
2085*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("6.0.0", "F4"), Level{5}, Level{4}, true);
2086*70a7ec85SAndroid Build Coastguard Worker     // We don't have device FCM 6 in systemMatrixKernelXmls, skip
2087*70a7ec85SAndroid Build Coastguard Worker 
2088*70a7ec85SAndroid Build Coastguard Worker     return ret;
2089*70a7ec85SAndroid Build Coastguard Worker }
2090*70a7ec85SAndroid Build Coastguard Worker 
RKernelTestParamValues()2091*70a7ec85SAndroid Build Coastguard Worker std::vector<KernelTestP::ParamType> RKernelTestParamValues() {
2092*70a7ec85SAndroid Build Coastguard Worker     std::vector<KernelTestP::ParamType> ret;
2093*70a7ec85SAndroid Build Coastguard Worker     std::vector<std::string> matrices = systemMatrixKernelXmls;
2094*70a7ec85SAndroid Build Coastguard Worker 
2095*70a7ec85SAndroid Build Coastguard Worker     // Devices launching O~Q: Must not use *-r+ kernels without specifying kernel FCM version
2096*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{1}, Level::UNSPECIFIED, false);
2097*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{2}, Level::UNSPECIFIED, false);
2098*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{3}, Level::UNSPECIFIED, false);
2099*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{4}, Level::UNSPECIFIED, false);
2100*70a7ec85SAndroid Build Coastguard Worker 
2101*70a7ec85SAndroid Build Coastguard Worker     // Devices launching R: may use r kernel without specifying kernel FCM version because
2102*70a7ec85SAndroid Build Coastguard Worker     // assemble_vintf does not insert <kernel> tags to device manifest any more.
2103*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{5}, Level::UNSPECIFIED, true);
2104*70a7ec85SAndroid Build Coastguard Worker 
2105*70a7ec85SAndroid Build Coastguard Worker     // May use *-r+ kernels with kernel FCM version
2106*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{1}, Level{5}, true);
2107*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{2}, Level{5}, true);
2108*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{3}, Level{5}, true);
2109*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{4}, Level{5}, true);
2110*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("7.0.0", "G5"), Level{5}, Level{5}, true);
2111*70a7ec85SAndroid Build Coastguard Worker 
2112*70a7ec85SAndroid Build Coastguard Worker     return ret;
2113*70a7ec85SAndroid Build Coastguard Worker }
2114*70a7ec85SAndroid Build Coastguard Worker 
PrintKernelTestParam(const TestParamInfo<KernelTestP::ParamType> & info)2115*70a7ec85SAndroid Build Coastguard Worker std::string PrintKernelTestParam(const TestParamInfo<KernelTestP::ParamType>& info) {
2116*70a7ec85SAndroid Build Coastguard Worker     const auto& [matrices, kernelInfo, targetFcm, kernelFcm, pass] = info.param;
2117*70a7ec85SAndroid Build Coastguard Worker     return (matrices.size() == 2 ? "Level1AndLevel2_" : "Level1AndMore_") +
2118*70a7ec85SAndroid Build Coastguard Worker            android::base::StringReplace(to_string(kernelInfo.version()), ".", "_", true) + "_" +
2119*70a7ec85SAndroid Build Coastguard Worker            android::base::StringReplace(kernelInfo.configs().begin()->first, "CONFIG_", "", false) +
2120*70a7ec85SAndroid Build Coastguard Worker            "_TargetFcm" +
2121*70a7ec85SAndroid Build Coastguard Worker            (targetFcm == Level::UNSPECIFIED ? "Unspecified" : to_string(targetFcm)) +
2122*70a7ec85SAndroid Build Coastguard Worker            "_KernelFcm" +
2123*70a7ec85SAndroid Build Coastguard Worker            (kernelFcm == Level::UNSPECIFIED ? "Unspecified" : to_string(kernelFcm)) +
2124*70a7ec85SAndroid Build Coastguard Worker            "_Should" + (pass ? "Pass" : "Fail");
2125*70a7ec85SAndroid Build Coastguard Worker }
2126*70a7ec85SAndroid Build Coastguard Worker 
2127*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(KernelTest, KernelTestP, ValuesIn(KernelTestParamValues()),
2128*70a7ec85SAndroid Build Coastguard Worker                          &PrintKernelTestParam);
2129*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NoRKernelWithoutFcm, KernelTestP, ValuesIn(RKernelTestParamValues()),
2130*70a7ec85SAndroid Build Coastguard Worker                          &PrintKernelTestParam);
2131*70a7ec85SAndroid Build Coastguard Worker 
2132*70a7ec85SAndroid Build Coastguard Worker // clang-format on
2133*70a7ec85SAndroid Build Coastguard Worker 
GkiKernelTestParamValues()2134*70a7ec85SAndroid Build Coastguard Worker std::vector<KernelTestP::ParamType> GkiKernelTestParamValues() {
2135*70a7ec85SAndroid Build Coastguard Worker     std::vector<KernelTestP::ParamType> ret;
2136*70a7ec85SAndroid Build Coastguard Worker     std::vector<std::string> matrices = systemMatrixKernelXmlsGki;
2137*70a7ec85SAndroid Build Coastguard Worker 
2138*70a7ec85SAndroid Build Coastguard Worker     // Kernel FCM version R: may use 4.19-stable and android12-5.4
2139*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.19.0", "R_4_19"), Level::R, Level::R, true);
2140*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("4.19.0", "S_4_19"), Level::R, Level::R, true);
2141*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.4.0", "R_5_4"), Level::R, Level::R, true);
2142*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.4.0", "S_5_4"), Level::R, Level::R, true);
2143*70a7ec85SAndroid Build Coastguard Worker 
2144*70a7ec85SAndroid Build Coastguard Worker     // Kernel FCM version S: may not use android13-5.10.
2145*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.4.0", "S_5_4"), Level::S, Level::S, true);
2146*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.10.0", "S_5_10"), Level::S, Level::S, true);
2147*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.10.0", "T_5_10"), Level::S, Level::S, false);
2148*70a7ec85SAndroid Build Coastguard Worker 
2149*70a7ec85SAndroid Build Coastguard Worker     // Kernel FCM version T: may not use android14-5.15.
2150*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.10.0", "T_5_10"), Level::T, Level::T, true);
2151*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.15.0", "T_5_15"), Level::T, Level::T, true);
2152*70a7ec85SAndroid Build Coastguard Worker     ret.emplace_back(matrices, MakeKernelInfo("5.15.0", "U_5_15"), Level::T, Level::T, false);
2153*70a7ec85SAndroid Build Coastguard Worker 
2154*70a7ec85SAndroid Build Coastguard Worker     return ret;
2155*70a7ec85SAndroid Build Coastguard Worker }
2156*70a7ec85SAndroid Build Coastguard Worker 
GkiPrintKernelTestParam(const TestParamInfo<KernelTestP::ParamType> & info)2157*70a7ec85SAndroid Build Coastguard Worker std::string GkiPrintKernelTestParam(const TestParamInfo<KernelTestP::ParamType>& info) {
2158*70a7ec85SAndroid Build Coastguard Worker     const auto& [matrices, kernelInfo, targetFcm, kernelFcm, pass] = info.param;
2159*70a7ec85SAndroid Build Coastguard Worker     std::string ret = kernelInfo.configs().begin()->first;
2160*70a7ec85SAndroid Build Coastguard Worker     ret += "_TargetFcm" + (targetFcm == Level::UNSPECIFIED ? "Unspecified" : to_string(targetFcm));
2161*70a7ec85SAndroid Build Coastguard Worker     ret += "_KernelFcm" + (kernelFcm == Level::UNSPECIFIED ? "Unspecified" : to_string(kernelFcm));
2162*70a7ec85SAndroid Build Coastguard Worker     ret += "_Should"s + (pass ? "Pass" : "Fail");
2163*70a7ec85SAndroid Build Coastguard Worker     return ret;
2164*70a7ec85SAndroid Build Coastguard Worker }
2165*70a7ec85SAndroid Build Coastguard Worker 
2166*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(GkiNoCheckFutureKmi, KernelTestP, ValuesIn(GkiKernelTestParamValues()),
2167*70a7ec85SAndroid Build Coastguard Worker                          &GkiPrintKernelTestParam);
2168*70a7ec85SAndroid Build Coastguard Worker 
2169*70a7ec85SAndroid Build Coastguard Worker // clang-format off
2170*70a7ec85SAndroid Build Coastguard Worker 
2171*70a7ec85SAndroid Build Coastguard Worker class VintfObjectPartialUpdateTest : public MultiMatrixTest {
2172*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()2173*70a7ec85SAndroid Build Coastguard Worker     void SetUp() override {
2174*70a7ec85SAndroid Build Coastguard Worker         MultiMatrixTest::SetUp();
2175*70a7ec85SAndroid Build Coastguard Worker     }
2176*70a7ec85SAndroid Build Coastguard Worker };
2177*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectPartialUpdateTest,DeviceCompatibility)2178*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectPartialUpdateTest, DeviceCompatibility) {
2179*70a7ec85SAndroid Build Coastguard Worker     setupMockFetcher(vendorManifestRequire1, "", systemManifestXml1, vendorMatrixXml1);
2180*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices(systemMatrixRequire);
2181*70a7ec85SAndroid Build Coastguard Worker 
2182*70a7ec85SAndroid Build Coastguard Worker     expectSystemManifest();
2183*70a7ec85SAndroid Build Coastguard Worker     expectVendorMatrix();
2184*70a7ec85SAndroid Build Coastguard Worker     expectVendorManifest();
2185*70a7ec85SAndroid Build Coastguard Worker 
2186*70a7ec85SAndroid Build Coastguard Worker     std::string error;
2187*70a7ec85SAndroid Build Coastguard Worker     EXPECT_TRUE(vintfObject->checkCompatibility(&error)) << error;
2188*70a7ec85SAndroid Build Coastguard Worker }
2189*70a7ec85SAndroid Build Coastguard Worker 
CreateFrameworkManifestFrag(const std::string & interface)2190*70a7ec85SAndroid Build Coastguard Worker std::string CreateFrameworkManifestFrag(const std::string& interface) {
2191*70a7ec85SAndroid Build Coastguard Worker     return "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
2192*70a7ec85SAndroid Build Coastguard Worker            "    <hal format=\"hidl\">\n"
2193*70a7ec85SAndroid Build Coastguard Worker            "        <name>android.hardware.foo</name>\n"
2194*70a7ec85SAndroid Build Coastguard Worker            "        <transport>hwbinder</transport>\n"
2195*70a7ec85SAndroid Build Coastguard Worker            "        <fqname>@1.0::" + interface + "/default</fqname>\n"
2196*70a7ec85SAndroid Build Coastguard Worker            "    </hal>\n"
2197*70a7ec85SAndroid Build Coastguard Worker            "</manifest>\n";
2198*70a7ec85SAndroid Build Coastguard Worker }
2199*70a7ec85SAndroid Build Coastguard Worker 
2200*70a7ec85SAndroid Build Coastguard Worker using FrameworkManifestTestParam =
2201*70a7ec85SAndroid Build Coastguard Worker     std::tuple<bool /* Existence of /system/etc/vintf/manifest.xml */,
2202*70a7ec85SAndroid Build Coastguard Worker                bool /* Existence of /system/etc/vintf/manifest/fragment.xml */,
2203*70a7ec85SAndroid Build Coastguard Worker                bool /* Existence of /product/etc/vintf/manifest.xml */,
2204*70a7ec85SAndroid Build Coastguard Worker                bool /* Existence of /product/etc/vintf/manifest/fragment.xml */,
2205*70a7ec85SAndroid Build Coastguard Worker                bool /* Existence of /system_ext/etc/vintf/manifest.xml */,
2206*70a7ec85SAndroid Build Coastguard Worker                bool /* Existence of /system_ext/etc/vintf/manifest/fragment.xml */,
2207*70a7ec85SAndroid Build Coastguard Worker                bool /* Existence of /apex/com.system/etc/vintf/manifest.xml */>;
2208*70a7ec85SAndroid Build Coastguard Worker class FrameworkManifestTest : public VintfObjectTestBase,
2209*70a7ec85SAndroid Build Coastguard Worker                               public ::testing::WithParamInterface<FrameworkManifestTestParam> {
2210*70a7ec85SAndroid Build Coastguard Worker    protected:
2211*70a7ec85SAndroid Build Coastguard Worker     // Set the existence of |path|.
expectManifest(const std::string & path,const std::string & interface,bool exists)2212*70a7ec85SAndroid Build Coastguard Worker     void expectManifest(const std::string& path, const std::string& interface, bool exists) {
2213*70a7ec85SAndroid Build Coastguard Worker         if (exists) {
2214*70a7ec85SAndroid Build Coastguard Worker             expectFetchRepeatedly(path, CreateFrameworkManifestFrag(interface));
2215*70a7ec85SAndroid Build Coastguard Worker         } else {
2216*70a7ec85SAndroid Build Coastguard Worker             expectFileNotExist(StrEq(path));
2217*70a7ec85SAndroid Build Coastguard Worker         }
2218*70a7ec85SAndroid Build Coastguard Worker     }
2219*70a7ec85SAndroid Build Coastguard Worker 
2220*70a7ec85SAndroid Build Coastguard Worker     // Set the existence of |path| as a fragment dir
expectFragment(const std::string & path,const std::string & interface,bool exists)2221*70a7ec85SAndroid Build Coastguard Worker     void expectFragment(const std::string& path, const std::string& interface, bool exists) {
2222*70a7ec85SAndroid Build Coastguard Worker         if (exists) {
2223*70a7ec85SAndroid Build Coastguard Worker             EXPECT_CALL(fetcher(), listFiles(StrEq(path), _, _))
2224*70a7ec85SAndroid Build Coastguard Worker                 .Times(AnyNumber())
2225*70a7ec85SAndroid Build Coastguard Worker                 .WillRepeatedly(Invoke([](const auto&, auto* out, auto*) {
2226*70a7ec85SAndroid Build Coastguard Worker                     *out = {"fragment.xml"};
2227*70a7ec85SAndroid Build Coastguard Worker                     return ::android::OK;
2228*70a7ec85SAndroid Build Coastguard Worker                 }));
2229*70a7ec85SAndroid Build Coastguard Worker             expectFetchRepeatedly(path + "fragment.xml",
2230*70a7ec85SAndroid Build Coastguard Worker                                   CreateFrameworkManifestFrag(interface));
2231*70a7ec85SAndroid Build Coastguard Worker         } else {
2232*70a7ec85SAndroid Build Coastguard Worker             EXPECT_CALL(fetcher(), listFiles(StrEq(path), _, _))
2233*70a7ec85SAndroid Build Coastguard Worker                 .Times(AnyNumber())
2234*70a7ec85SAndroid Build Coastguard Worker                 .WillRepeatedly(Return(::android::OK));
2235*70a7ec85SAndroid Build Coastguard Worker             expectFileNotExist(path + "fragment.xml");
2236*70a7ec85SAndroid Build Coastguard Worker         }
2237*70a7ec85SAndroid Build Coastguard Worker     }
2238*70a7ec85SAndroid Build Coastguard Worker 
expectContainsInterface(const std::string & interface,bool contains=true)2239*70a7ec85SAndroid Build Coastguard Worker     void expectContainsInterface(const std::string& interface, bool contains = true) {
2240*70a7ec85SAndroid Build Coastguard Worker         auto manifest = vintfObject->getFrameworkHalManifest();
2241*70a7ec85SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, manifest);
2242*70a7ec85SAndroid Build Coastguard Worker         EXPECT_NE(manifest->getHidlInstances("android.hardware.foo", {1, 0}, interface).empty(),
2243*70a7ec85SAndroid Build Coastguard Worker                   contains)
2244*70a7ec85SAndroid Build Coastguard Worker             << interface << " should " << (contains ? "" : "not ") << "exist.";
2245*70a7ec85SAndroid Build Coastguard Worker     }
2246*70a7ec85SAndroid Build Coastguard Worker 
expectApex()2247*70a7ec85SAndroid Build Coastguard Worker     void expectApex() {
2248*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kApexInfoFile, R"(
2249*70a7ec85SAndroid Build Coastguard Worker             <apex-info-list>
2250*70a7ec85SAndroid Build Coastguard Worker                 <apex-info
2251*70a7ec85SAndroid Build Coastguard Worker                     moduleName="com.system"
2252*70a7ec85SAndroid Build Coastguard Worker                     partition="SYSTEM"
2253*70a7ec85SAndroid Build Coastguard Worker                     isActive="true"/>
2254*70a7ec85SAndroid Build Coastguard Worker             </apex-info-list>)");
2255*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), modifiedTime(kApexInfoFile, _, _))
2256*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](auto, timespec* out, auto){
2257*70a7ec85SAndroid Build Coastguard Worker                 *out = {};
2258*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
2259*70a7ec85SAndroid Build Coastguard Worker             }))
2260*70a7ec85SAndroid Build Coastguard Worker             ;
2261*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles("/apex/com.system/etc/vintf/", _, _))
2262*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](auto, std::vector<std::string>* out, auto){
2263*70a7ec85SAndroid Build Coastguard Worker                 *out = {"manifest.xml"};
2264*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
2265*70a7ec85SAndroid Build Coastguard Worker             }));
2266*70a7ec85SAndroid Build Coastguard Worker         expectManifest("/apex/com.system/etc/vintf/manifest.xml", "ISystemApex", true);
2267*70a7ec85SAndroid Build Coastguard Worker     }
2268*70a7ec85SAndroid Build Coastguard Worker };
2269*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(FrameworkManifestTest,Existence)2270*70a7ec85SAndroid Build Coastguard Worker TEST_P(FrameworkManifestTest, Existence) {
2271*70a7ec85SAndroid Build Coastguard Worker     useEmptyFileSystem();
2272*70a7ec85SAndroid Build Coastguard Worker 
2273*70a7ec85SAndroid Build Coastguard Worker     expectFileNotExist(StrEq(kSystemLegacyManifest));
2274*70a7ec85SAndroid Build Coastguard Worker 
2275*70a7ec85SAndroid Build Coastguard Worker     expectManifest(kSystemManifest, "ISystemEtc", std::get<0>(GetParam()));
2276*70a7ec85SAndroid Build Coastguard Worker     expectFragment(kSystemManifestFragmentDir, "ISystemEtcFragment", std::get<1>(GetParam()));
2277*70a7ec85SAndroid Build Coastguard Worker     expectManifest(kProductManifest, "IProductEtc", std::get<2>(GetParam()));
2278*70a7ec85SAndroid Build Coastguard Worker     expectFragment(kProductManifestFragmentDir, "IProductEtcFragment", std::get<3>(GetParam()));
2279*70a7ec85SAndroid Build Coastguard Worker     expectManifest(kSystemExtManifest, "ISystemExtEtc", std::get<4>(GetParam()));
2280*70a7ec85SAndroid Build Coastguard Worker     expectFragment(kSystemExtManifestFragmentDir, "ISystemExtEtcFragment", std::get<5>(GetParam()));
2281*70a7ec85SAndroid Build Coastguard Worker     if (std::get<6>(GetParam())) {
2282*70a7ec85SAndroid Build Coastguard Worker         expectApex();
2283*70a7ec85SAndroid Build Coastguard Worker     }
2284*70a7ec85SAndroid Build Coastguard Worker 
2285*70a7ec85SAndroid Build Coastguard Worker     if (!std::get<0>(GetParam())) {
2286*70a7ec85SAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, vintfObject->getFrameworkHalManifest())
2287*70a7ec85SAndroid Build Coastguard Worker             << "getFrameworkHalManifest must return nullptr if " << kSystemManifest
2288*70a7ec85SAndroid Build Coastguard Worker             << " does not exist";
2289*70a7ec85SAndroid Build Coastguard Worker     } else {
2290*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("ISystemEtc", std::get<0>(GetParam()));
2291*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("ISystemEtcFragment", std::get<1>(GetParam()));
2292*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("IProductEtc", std::get<2>(GetParam()));
2293*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("IProductEtcFragment", std::get<3>(GetParam()));
2294*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("ISystemExtEtc", std::get<4>(GetParam()));
2295*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("ISystemExtEtcFragment", std::get<5>(GetParam()));
2296*70a7ec85SAndroid Build Coastguard Worker         expectContainsInterface("ISystemApex", std::get<6>(GetParam()));
2297*70a7ec85SAndroid Build Coastguard Worker     }
2298*70a7ec85SAndroid Build Coastguard Worker }
2299*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Vintf, FrameworkManifestTest,
2300*70a7ec85SAndroid Build Coastguard Worker                          ::testing::Combine(Bool(), Bool(), Bool(), Bool(), Bool(), Bool(), Bool()));
2301*70a7ec85SAndroid Build Coastguard Worker 
2302*70a7ec85SAndroid Build Coastguard Worker // clang-format on
2303*70a7ec85SAndroid Build Coastguard Worker 
2304*70a7ec85SAndroid Build Coastguard Worker class FrameworkManifestLevelTest : public VintfObjectTestBase {
2305*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()2306*70a7ec85SAndroid Build Coastguard Worker     void SetUp() override {
2307*70a7ec85SAndroid Build Coastguard Worker         VintfObjectTestBase::SetUp();
2308*70a7ec85SAndroid Build Coastguard Worker         useEmptyFileSystem();
2309*70a7ec85SAndroid Build Coastguard Worker 
2310*70a7ec85SAndroid Build Coastguard Worker         auto head = "<manifest " + kMetaVersionStr + R"( type="framework">)";
2311*70a7ec85SAndroid Build Coastguard Worker         auto tail = "</manifest>";
2312*70a7ec85SAndroid Build Coastguard Worker 
2313*70a7ec85SAndroid Build Coastguard Worker         auto systemManifest =
2314*70a7ec85SAndroid Build Coastguard Worker             head + getFragment(HalFormat::HIDL, Level::UNSPECIFIED, Level{6}, "@3.0::ISystemEtc") +
2315*70a7ec85SAndroid Build Coastguard Worker             getFragment(HalFormat::AIDL, Level{6}, Level{7}, "ISystemEtc4") + tail;
2316*70a7ec85SAndroid Build Coastguard Worker         expectFetch(kSystemManifest, systemManifest);
2317*70a7ec85SAndroid Build Coastguard Worker 
2318*70a7ec85SAndroid Build Coastguard Worker         auto hidlFragment =
2319*70a7ec85SAndroid Build Coastguard Worker             head +
2320*70a7ec85SAndroid Build Coastguard Worker             getFragment(HalFormat::HIDL, Level::UNSPECIFIED, Level{7}, "@4.0::ISystemEtcFragment") +
2321*70a7ec85SAndroid Build Coastguard Worker             tail;
2322*70a7ec85SAndroid Build Coastguard Worker         expectFetch(kSystemManifestFragmentDir + "hidl.xml"s, hidlFragment);
2323*70a7ec85SAndroid Build Coastguard Worker 
2324*70a7ec85SAndroid Build Coastguard Worker         auto aidlFragment =
2325*70a7ec85SAndroid Build Coastguard Worker             head + getFragment(HalFormat::AIDL, Level{5}, Level{6}, "ISystemEtcFragment3") + tail;
2326*70a7ec85SAndroid Build Coastguard Worker         expectFetch(kSystemManifestFragmentDir + "aidl.xml"s, aidlFragment);
2327*70a7ec85SAndroid Build Coastguard Worker 
2328*70a7ec85SAndroid Build Coastguard Worker         EXPECT_CALL(fetcher(), listFiles(StrEq(kSystemManifestFragmentDir), _, _))
2329*70a7ec85SAndroid Build Coastguard Worker             .Times(AnyNumber())
2330*70a7ec85SAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([](const auto&, auto* out, auto*) {
2331*70a7ec85SAndroid Build Coastguard Worker                 *out = {"hidl.xml", "aidl.xml"};
2332*70a7ec85SAndroid Build Coastguard Worker                 return ::android::OK;
2333*70a7ec85SAndroid Build Coastguard Worker             }));
2334*70a7ec85SAndroid Build Coastguard Worker     }
2335*70a7ec85SAndroid Build Coastguard Worker 
expectTargetFcmVersion(size_t level)2336*70a7ec85SAndroid Build Coastguard Worker     void expectTargetFcmVersion(size_t level) {
2337*70a7ec85SAndroid Build Coastguard Worker         std::string xml = android::base::StringPrintf(
2338*70a7ec85SAndroid Build Coastguard Worker             R"(<manifest %s type="device" target-level="%s"/>)", kMetaVersionStr.c_str(),
2339*70a7ec85SAndroid Build Coastguard Worker             to_string(static_cast<Level>(level)).c_str());
2340*70a7ec85SAndroid Build Coastguard Worker         expectFetch(kVendorManifest, xml);
2341*70a7ec85SAndroid Build Coastguard Worker         (void)vintfObject->getDeviceHalManifest();
2342*70a7ec85SAndroid Build Coastguard Worker     }
2343*70a7ec85SAndroid Build Coastguard Worker 
expectContainsHidl(const Version & version,const std::string & interfaceName,bool exists=true)2344*70a7ec85SAndroid Build Coastguard Worker     void expectContainsHidl(const Version& version, const std::string& interfaceName,
2345*70a7ec85SAndroid Build Coastguard Worker                             bool exists = true) {
2346*70a7ec85SAndroid Build Coastguard Worker         auto manifest = vintfObject->getFrameworkHalManifest();
2347*70a7ec85SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, manifest);
2348*70a7ec85SAndroid Build Coastguard Worker         EXPECT_NE(
2349*70a7ec85SAndroid Build Coastguard Worker             manifest->getHidlInstances("android.frameworks.foo", version, interfaceName).empty(),
2350*70a7ec85SAndroid Build Coastguard Worker             exists)
2351*70a7ec85SAndroid Build Coastguard Worker             << "@" << version << "::" << interfaceName << " should " << (exists ? "" : "not ")
2352*70a7ec85SAndroid Build Coastguard Worker             << "exist.";
2353*70a7ec85SAndroid Build Coastguard Worker     }
2354*70a7ec85SAndroid Build Coastguard Worker 
expectContainsAidl(const std::string & interfaceName,bool exists=true)2355*70a7ec85SAndroid Build Coastguard Worker     void expectContainsAidl(const std::string& interfaceName, bool exists = true) {
2356*70a7ec85SAndroid Build Coastguard Worker         auto manifest = vintfObject->getFrameworkHalManifest();
2357*70a7ec85SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, manifest);
2358*70a7ec85SAndroid Build Coastguard Worker         EXPECT_NE(manifest->getAidlInstances("android.frameworks.foo", interfaceName).empty(),
2359*70a7ec85SAndroid Build Coastguard Worker                   exists)
2360*70a7ec85SAndroid Build Coastguard Worker             << interfaceName << " should " << (exists ? "" : "not ") << "exist.";
2361*70a7ec85SAndroid Build Coastguard Worker     }
2362*70a7ec85SAndroid Build Coastguard Worker 
2363*70a7ec85SAndroid Build Coastguard Worker    private:
getFragment(HalFormat halFormat,Level minLevel,Level maxLevel,const char * versionedInterface)2364*70a7ec85SAndroid Build Coastguard Worker     std::string getFragment(HalFormat halFormat, Level minLevel, Level maxLevel,
2365*70a7ec85SAndroid Build Coastguard Worker                             const char* versionedInterface) {
2366*70a7ec85SAndroid Build Coastguard Worker         auto format = R"(<hal format="%s"%s>
2367*70a7ec85SAndroid Build Coastguard Worker                              <name>android.frameworks.foo</name>
2368*70a7ec85SAndroid Build Coastguard Worker                              %s
2369*70a7ec85SAndroid Build Coastguard Worker                              <fqname>%s/default</fqname>
2370*70a7ec85SAndroid Build Coastguard Worker                          </hal>)";
2371*70a7ec85SAndroid Build Coastguard Worker         std::string halAttrs;
2372*70a7ec85SAndroid Build Coastguard Worker         if (minLevel != Level::UNSPECIFIED) {
2373*70a7ec85SAndroid Build Coastguard Worker             halAttrs +=
2374*70a7ec85SAndroid Build Coastguard Worker                 android::base::StringPrintf(R"( min-level="%s")", to_string(minLevel).c_str());
2375*70a7ec85SAndroid Build Coastguard Worker         }
2376*70a7ec85SAndroid Build Coastguard Worker         if (maxLevel != Level::UNSPECIFIED) {
2377*70a7ec85SAndroid Build Coastguard Worker             halAttrs +=
2378*70a7ec85SAndroid Build Coastguard Worker                 android::base::StringPrintf(R"( max-level="%s")", to_string(maxLevel).c_str());
2379*70a7ec85SAndroid Build Coastguard Worker         }
2380*70a7ec85SAndroid Build Coastguard Worker         const char* transport = "";
2381*70a7ec85SAndroid Build Coastguard Worker         if (halFormat == HalFormat::HIDL) {
2382*70a7ec85SAndroid Build Coastguard Worker             transport = "<transport>hwbinder</transport>";
2383*70a7ec85SAndroid Build Coastguard Worker         }
2384*70a7ec85SAndroid Build Coastguard Worker         return android::base::StringPrintf(format, to_string(halFormat).c_str(), halAttrs.c_str(),
2385*70a7ec85SAndroid Build Coastguard Worker                                            transport, versionedInterface);
2386*70a7ec85SAndroid Build Coastguard Worker     }
2387*70a7ec85SAndroid Build Coastguard Worker };
2388*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(FrameworkManifestLevelTest,NoTargetFcmVersion)2389*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkManifestLevelTest, NoTargetFcmVersion) {
2390*70a7ec85SAndroid Build Coastguard Worker     auto xml =
2391*70a7ec85SAndroid Build Coastguard Worker         android::base::StringPrintf(R"(<manifest %s type="device"/> )", kMetaVersionStr.c_str());
2392*70a7ec85SAndroid Build Coastguard Worker     expectFetch(kVendorManifest, xml);
2393*70a7ec85SAndroid Build Coastguard Worker 
2394*70a7ec85SAndroid Build Coastguard Worker     // If no target FCM version, it is treated as an infinitely old device
2395*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({3, 0}, "ISystemEtc");
2396*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({4, 0}, "ISystemEtcFragment");
2397*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtcFragment3", false);
2398*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtc4", false);
2399*70a7ec85SAndroid Build Coastguard Worker }
2400*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(FrameworkManifestLevelTest,TargetFcmVersion4)2401*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkManifestLevelTest, TargetFcmVersion4) {
2402*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(4);
2403*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({3, 0}, "ISystemEtc");
2404*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({4, 0}, "ISystemEtcFragment");
2405*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtcFragment3", false);
2406*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtc4", false);
2407*70a7ec85SAndroid Build Coastguard Worker }
2408*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(FrameworkManifestLevelTest,TargetFcmVersion5)2409*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkManifestLevelTest, TargetFcmVersion5) {
2410*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(5);
2411*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({3, 0}, "ISystemEtc");
2412*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({4, 0}, "ISystemEtcFragment");
2413*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtcFragment3");
2414*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtc4", false);
2415*70a7ec85SAndroid Build Coastguard Worker }
2416*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(FrameworkManifestLevelTest,TargetFcmVersion6)2417*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkManifestLevelTest, TargetFcmVersion6) {
2418*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(6);
2419*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({3, 0}, "ISystemEtc");
2420*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({4, 0}, "ISystemEtcFragment");
2421*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtcFragment3");
2422*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtc4");
2423*70a7ec85SAndroid Build Coastguard Worker }
2424*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(FrameworkManifestLevelTest,TargetFcmVersion7)2425*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkManifestLevelTest, TargetFcmVersion7) {
2426*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(7);
2427*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({3, 0}, "ISystemEtc", false);
2428*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({4, 0}, "ISystemEtcFragment");
2429*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtcFragment3", false);
2430*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtc4");
2431*70a7ec85SAndroid Build Coastguard Worker }
2432*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(FrameworkManifestLevelTest,TargetFcmVersion8)2433*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkManifestLevelTest, TargetFcmVersion8) {
2434*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(8);
2435*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({3, 0}, "ISystemEtc", false);
2436*70a7ec85SAndroid Build Coastguard Worker     expectContainsHidl({4, 0}, "ISystemEtcFragment", false);
2437*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtcFragment3", false);
2438*70a7ec85SAndroid Build Coastguard Worker     expectContainsAidl("ISystemEtc4", false);
2439*70a7ec85SAndroid Build Coastguard Worker }
2440*70a7ec85SAndroid Build Coastguard Worker 
2441*70a7ec85SAndroid Build Coastguard Worker // clang-format off
2442*70a7ec85SAndroid Build Coastguard Worker 
2443*70a7ec85SAndroid Build Coastguard Worker //
2444*70a7ec85SAndroid Build Coastguard Worker // Set of OEM FCM matrices at different FCM version.
2445*70a7ec85SAndroid Build Coastguard Worker //
2446*70a7ec85SAndroid Build Coastguard Worker 
GetOemFcmMatrixLevels(const std::string & name)2447*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> GetOemFcmMatrixLevels(const std::string& name) {
2448*70a7ec85SAndroid Build Coastguard Worker     return {
2449*70a7ec85SAndroid Build Coastguard Worker         // 1.xml
2450*70a7ec85SAndroid Build Coastguard Worker         "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2451*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"true\">\n"
2452*70a7ec85SAndroid Build Coastguard Worker         "        <name>vendor.foo." + name + "</name>\n"
2453*70a7ec85SAndroid Build Coastguard Worker         "        <version>1.0</version>\n"
2454*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
2455*70a7ec85SAndroid Build Coastguard Worker         "            <name>IExtra</name>\n"
2456*70a7ec85SAndroid Build Coastguard Worker         "            <instance>default</instance>\n"
2457*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
2458*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n"
2459*70a7ec85SAndroid Build Coastguard Worker         "</compatibility-matrix>\n",
2460*70a7ec85SAndroid Build Coastguard Worker         // 2.xml
2461*70a7ec85SAndroid Build Coastguard Worker         "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2462*70a7ec85SAndroid Build Coastguard Worker         "    <hal format=\"hidl\" optional=\"true\">\n"
2463*70a7ec85SAndroid Build Coastguard Worker         "        <name>vendor.foo." + name + "</name>\n"
2464*70a7ec85SAndroid Build Coastguard Worker         "        <version>2.0</version>\n"
2465*70a7ec85SAndroid Build Coastguard Worker         "        <interface>\n"
2466*70a7ec85SAndroid Build Coastguard Worker         "            <name>IExtra</name>\n"
2467*70a7ec85SAndroid Build Coastguard Worker         "            <instance>default</instance>\n"
2468*70a7ec85SAndroid Build Coastguard Worker         "        </interface>\n"
2469*70a7ec85SAndroid Build Coastguard Worker         "    </hal>\n"
2470*70a7ec85SAndroid Build Coastguard Worker         "</compatibility-matrix>\n",
2471*70a7ec85SAndroid Build Coastguard Worker     };
2472*70a7ec85SAndroid Build Coastguard Worker }
2473*70a7ec85SAndroid Build Coastguard Worker 
2474*70a7ec85SAndroid Build Coastguard Worker class OemFcmLevelTest : public MultiMatrixTest,
2475*70a7ec85SAndroid Build Coastguard Worker                         public WithParamInterface<std::tuple<size_t, bool, bool>> {
2476*70a7ec85SAndroid Build Coastguard Worker    protected:
SetUp()2477*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() override {
2478*70a7ec85SAndroid Build Coastguard Worker         MultiMatrixTest::SetUp();
2479*70a7ec85SAndroid Build Coastguard Worker         SetUpMockSystemMatrices({systemMatrixLevel1, systemMatrixLevel2});
2480*70a7ec85SAndroid Build Coastguard Worker     }
2481*70a7ec85SAndroid Build Coastguard Worker     using Instances = std::set<std::string>;
GetInstances(const CompatibilityMatrix * fcm)2482*70a7ec85SAndroid Build Coastguard Worker     Instances GetInstances(const CompatibilityMatrix* fcm) {
2483*70a7ec85SAndroid Build Coastguard Worker         Instances instances;
2484*70a7ec85SAndroid Build Coastguard Worker         fcm->forEachHidlInstance([&instances](const auto& matrixInstance) {
2485*70a7ec85SAndroid Build Coastguard Worker             instances.insert(matrixInstance.description(matrixInstance.versionRange().minVer()));
2486*70a7ec85SAndroid Build Coastguard Worker             return true; // continue
2487*70a7ec85SAndroid Build Coastguard Worker         });
2488*70a7ec85SAndroid Build Coastguard Worker         return instances;
2489*70a7ec85SAndroid Build Coastguard Worker     }
2490*70a7ec85SAndroid Build Coastguard Worker };
2491*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(OemFcmLevelTest,Test)2492*70a7ec85SAndroid Build Coastguard Worker TEST_P(OemFcmLevelTest, Test) {
2493*70a7ec85SAndroid Build Coastguard Worker     auto&& [level, hasProduct, hasSystemExt] = GetParam();
2494*70a7ec85SAndroid Build Coastguard Worker 
2495*70a7ec85SAndroid Build Coastguard Worker     expectTargetFcmVersion(level);
2496*70a7ec85SAndroid Build Coastguard Worker     if (hasProduct) {
2497*70a7ec85SAndroid Build Coastguard Worker         SetUpMockMatrices(kProductVintfDir, GetOemFcmMatrixLevels("product"));
2498*70a7ec85SAndroid Build Coastguard Worker     }
2499*70a7ec85SAndroid Build Coastguard Worker     if (hasSystemExt) {
2500*70a7ec85SAndroid Build Coastguard Worker         SetUpMockMatrices(kSystemExtVintfDir, GetOemFcmMatrixLevels("systemext"));
2501*70a7ec85SAndroid Build Coastguard Worker     }
2502*70a7ec85SAndroid Build Coastguard Worker 
2503*70a7ec85SAndroid Build Coastguard Worker     auto fcm = vintfObject->getFrameworkCompatibilityMatrix();
2504*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, fcm);
2505*70a7ec85SAndroid Build Coastguard Worker     auto instances = GetInstances(fcm.get());
2506*70a7ec85SAndroid Build Coastguard Worker 
2507*70a7ec85SAndroid Build Coastguard Worker     auto containsOrNot = [](bool contains, const std::string& e) {
2508*70a7ec85SAndroid Build Coastguard Worker         return contains ? SafeMatcherCast<Instances>(Contains(e))
2509*70a7ec85SAndroid Build Coastguard Worker                         : SafeMatcherCast<Instances>(Not(Contains(e)));
2510*70a7ec85SAndroid Build Coastguard Worker     };
2511*70a7ec85SAndroid Build Coastguard Worker 
2512*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(instances, containsOrNot(level == 1,
2513*70a7ec85SAndroid Build Coastguard Worker                                          "[email protected]::IMajor/default"));
2514*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(instances, containsOrNot(level == 1 && hasProduct,
2515*70a7ec85SAndroid Build Coastguard Worker                                          "[email protected]::IExtra/default"));
2516*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(instances, containsOrNot(level == 1 && hasSystemExt,
2517*70a7ec85SAndroid Build Coastguard Worker                                          "[email protected]::IExtra/default"));
2518*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(instances, Contains("[email protected]::IMajor/default"));
2519*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(instances, containsOrNot(hasProduct,
2520*70a7ec85SAndroid Build Coastguard Worker                                          "[email protected]::IExtra/default"));
2521*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(instances, containsOrNot(hasSystemExt,
2522*70a7ec85SAndroid Build Coastguard Worker                                          "[email protected]::IExtra/default"));
2523*70a7ec85SAndroid Build Coastguard Worker }
2524*70a7ec85SAndroid Build Coastguard Worker 
OemFcmLevelTestParamToString(const TestParamInfo<OemFcmLevelTest::ParamType> & info)2525*70a7ec85SAndroid Build Coastguard Worker static std::string OemFcmLevelTestParamToString(
2526*70a7ec85SAndroid Build Coastguard Worker         const TestParamInfo<OemFcmLevelTest::ParamType>& info) {
2527*70a7ec85SAndroid Build Coastguard Worker     auto&& [level, hasProduct, hasSystemExt] = info.param;
2528*70a7ec85SAndroid Build Coastguard Worker     auto name = "Level" + std::to_string(level);
2529*70a7ec85SAndroid Build Coastguard Worker     name += "With"s + (hasProduct ? "" : "out") + "Product";
2530*70a7ec85SAndroid Build Coastguard Worker     name += "With"s + (hasSystemExt ? "" : "out") + "SystemExt";
2531*70a7ec85SAndroid Build Coastguard Worker     return name;
2532*70a7ec85SAndroid Build Coastguard Worker }
2533*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(OemFcmLevel, OemFcmLevelTest, Combine(Values(1, 2), Bool(), Bool()),
2534*70a7ec85SAndroid Build Coastguard Worker     OemFcmLevelTestParamToString);
2535*70a7ec85SAndroid Build Coastguard Worker // clang-format on
2536*70a7ec85SAndroid Build Coastguard Worker 
2537*70a7ec85SAndroid Build Coastguard Worker // Common test set up for checking matrices against lib*idlmetadata.
2538*70a7ec85SAndroid Build Coastguard Worker class CheckMatricesWithHalDefTestBase : public MultiMatrixTest {
SetUp()2539*70a7ec85SAndroid Build Coastguard Worker     void SetUp() override {
2540*70a7ec85SAndroid Build Coastguard Worker         MultiMatrixTest::SetUp();
2541*70a7ec85SAndroid Build Coastguard Worker 
2542*70a7ec85SAndroid Build Coastguard Worker         // clang-format off
2543*70a7ec85SAndroid Build Coastguard Worker         std::vector<std::string> matrices{
2544*70a7ec85SAndroid Build Coastguard Worker             "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2545*70a7ec85SAndroid Build Coastguard Worker             "    <hal format=\"hidl\" optional=\"false\">\n"
2546*70a7ec85SAndroid Build Coastguard Worker             "        <name>android.hardware.hidl</name>\n"
2547*70a7ec85SAndroid Build Coastguard Worker             "        <version>1.0</version>\n"
2548*70a7ec85SAndroid Build Coastguard Worker             "        <interface>\n"
2549*70a7ec85SAndroid Build Coastguard Worker             "            <name>IHidl</name>\n"
2550*70a7ec85SAndroid Build Coastguard Worker             "            <instance>default</instance>\n"
2551*70a7ec85SAndroid Build Coastguard Worker             "        </interface>\n"
2552*70a7ec85SAndroid Build Coastguard Worker             "    </hal>\n"
2553*70a7ec85SAndroid Build Coastguard Worker             "    <hal format=\"aidl\" optional=\"false\">\n"
2554*70a7ec85SAndroid Build Coastguard Worker             "        <name>android.hardware.aidl</name>\n"
2555*70a7ec85SAndroid Build Coastguard Worker             "        <interface>\n"
2556*70a7ec85SAndroid Build Coastguard Worker             "            <name>IAidl</name>\n"
2557*70a7ec85SAndroid Build Coastguard Worker             "            <instance>default</instance>\n"
2558*70a7ec85SAndroid Build Coastguard Worker             "        </interface>\n"
2559*70a7ec85SAndroid Build Coastguard Worker             "    </hal>\n"
2560*70a7ec85SAndroid Build Coastguard Worker             "</compatibility-matrix>\n",
2561*70a7ec85SAndroid Build Coastguard Worker         };
2562*70a7ec85SAndroid Build Coastguard Worker         // clang-format on
2563*70a7ec85SAndroid Build Coastguard Worker 
2564*70a7ec85SAndroid Build Coastguard Worker         SetUpMockSystemMatrices(matrices);
2565*70a7ec85SAndroid Build Coastguard Worker     }
2566*70a7ec85SAndroid Build Coastguard Worker };
2567*70a7ec85SAndroid Build Coastguard Worker 
2568*70a7ec85SAndroid Build Coastguard Worker // A set of tests on VintfObject::checkMissingHalsInMatrices
2569*70a7ec85SAndroid Build Coastguard Worker class CheckMissingHalsTest : public CheckMatricesWithHalDefTestBase {
2570*70a7ec85SAndroid Build Coastguard Worker    public:
defaultPred(const std::string &)2571*70a7ec85SAndroid Build Coastguard Worker     static bool defaultPred(const std::string&) { return true; }
2572*70a7ec85SAndroid Build Coastguard Worker };
2573*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,Empty)2574*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, Empty) {
2575*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices({}, {}, defaultPred, defaultPred), Ok());
2576*70a7ec85SAndroid Build Coastguard Worker }
2577*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,Pass)2578*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, Pass) {
2579*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]::IHidl"}};
2580*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2581*70a7ec85SAndroid Build Coastguard Worker         {.types = {"android.hardware.aidl.IAidl"}, .stability = "vintf", .versions = {1}}};
2582*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices(hidl, {}, defaultPred, defaultPred), Ok());
2583*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred), Ok());
2584*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices(hidl, aidl, defaultPred, defaultPred),
2585*70a7ec85SAndroid Build Coastguard Worker                 Ok());
2586*70a7ec85SAndroid Build Coastguard Worker }
2587*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,FailVendor)2588*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, FailVendor) {
2589*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]"}};
2590*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2591*70a7ec85SAndroid Build Coastguard Worker         {.types = {"vendor.foo.aidl.IAidl"}, .stability = "vintf", .versions = {1}}};
2592*70a7ec85SAndroid Build Coastguard Worker 
2593*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMissingHalsInMatrices(hidl, {}, defaultPred, defaultPred);
2594*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2595*70a7ec85SAndroid Build Coastguard Worker 
2596*70a7ec85SAndroid Build Coastguard Worker     setCheckAidlFCM(true);
2597*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred);
2598*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("vendor.foo.aidl"))));
2599*70a7ec85SAndroid Build Coastguard Worker 
2600*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices(hidl, aidl, defaultPred, defaultPred);
2601*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2602*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("vendor.foo.aidl"))));
2603*70a7ec85SAndroid Build Coastguard Worker 
2604*70a7ec85SAndroid Build Coastguard Worker     auto predicate = [](const auto& interfaceName) {
2605*70a7ec85SAndroid Build Coastguard Worker         return android::base::StartsWith(interfaceName, "android.hardware");
2606*70a7ec85SAndroid Build Coastguard Worker     };
2607*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices(hidl, {}, predicate, predicate), Ok());
2608*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices({}, aidl, predicate, predicate), Ok());
2609*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMissingHalsInMatrices(hidl, aidl, predicate, predicate), Ok());
2610*70a7ec85SAndroid Build Coastguard Worker }
2611*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,FailMajorVersion)2612*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, FailMajorVersion) {
2613*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]"}};
2614*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2615*70a7ec85SAndroid Build Coastguard Worker         {.types = {"android.hardware.aidl2.IAidl"}, .stability = "vintf", .versions = {1}}};
2616*70a7ec85SAndroid Build Coastguard Worker 
2617*70a7ec85SAndroid Build Coastguard Worker     setCheckAidlFCM(true);
2618*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMissingHalsInMatrices(hidl, {}, defaultPred, defaultPred);
2619*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2620*70a7ec85SAndroid Build Coastguard Worker 
2621*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred);
2622*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl2"))));
2623*70a7ec85SAndroid Build Coastguard Worker 
2624*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices(hidl, aidl, defaultPred, defaultPred);
2625*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2626*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl2"))));
2627*70a7ec85SAndroid Build Coastguard Worker 
2628*70a7ec85SAndroid Build Coastguard Worker     auto predicate = [](const auto& interfaceName) {
2629*70a7ec85SAndroid Build Coastguard Worker         return android::base::StartsWith(interfaceName, "android.hardware");
2630*70a7ec85SAndroid Build Coastguard Worker     };
2631*70a7ec85SAndroid Build Coastguard Worker 
2632*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices(hidl, {}, predicate, predicate);
2633*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2634*70a7ec85SAndroid Build Coastguard Worker 
2635*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices({}, aidl, predicate, predicate);
2636*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl2"))));
2637*70a7ec85SAndroid Build Coastguard Worker 
2638*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices(hidl, aidl, predicate, predicate);
2639*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2640*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl2"))));
2641*70a7ec85SAndroid Build Coastguard Worker }
2642*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,FailMinorVersion)2643*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, FailMinorVersion) {
2644*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]"}};
2645*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2646*70a7ec85SAndroid Build Coastguard Worker         {.types = {"android.hardware.aidl.IAidl"}, .stability = "vintf", .versions = {1, 2}}};
2647*70a7ec85SAndroid Build Coastguard Worker 
2648*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMissingHalsInMatrices(hidl, {}, defaultPred, defaultPred);
2649*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2650*70a7ec85SAndroid Build Coastguard Worker 
2651*70a7ec85SAndroid Build Coastguard Worker     setCheckAidlFCM(true);
2652*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred);
2653*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl@2"))));
2654*70a7ec85SAndroid Build Coastguard Worker 
2655*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices(hidl, aidl, defaultPred, defaultPred);
2656*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2657*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl@2"))));
2658*70a7ec85SAndroid Build Coastguard Worker }
2659*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,SkipFcmCheckForAidl)2660*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, SkipFcmCheckForAidl) {
2661*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]"}};
2662*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2663*70a7ec85SAndroid Build Coastguard Worker         {.types = {"android.hardware.aidl.IAidl"}, .stability = "vintf", .versions = {1, 2}}};
2664*70a7ec85SAndroid Build Coastguard Worker 
2665*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMissingHalsInMatrices(hidl, {}, defaultPred, defaultPred);
2666*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2667*70a7ec85SAndroid Build Coastguard Worker 
2668*70a7ec85SAndroid Build Coastguard Worker     setCheckAidlFCM(false);
2669*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred);
2670*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, Ok());
2671*70a7ec85SAndroid Build Coastguard Worker 
2672*70a7ec85SAndroid Build Coastguard Worker     setCheckAidlFCM(true);
2673*70a7ec85SAndroid Build Coastguard Worker     res = vintfObject->checkMissingHalsInMatrices(hidl, aidl, defaultPred, defaultPred);
2674*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]"))));
2675*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl@2"))));
2676*70a7ec85SAndroid Build Coastguard Worker }
2677*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,PassAidlInDevelopment)2678*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, PassAidlInDevelopment) {
2679*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{{.types = {"android.hardware.aidl.IAidl"},
2680*70a7ec85SAndroid Build Coastguard Worker                                              .stability = "vintf",
2681*70a7ec85SAndroid Build Coastguard Worker                                              .versions = {},
2682*70a7ec85SAndroid Build Coastguard Worker                                              .has_development = true}};
2683*70a7ec85SAndroid Build Coastguard Worker 
2684*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred);
2685*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, Ok());
2686*70a7ec85SAndroid Build Coastguard Worker }
2687*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMissingHalsTest,FailAidlInDevelopment)2688*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMissingHalsTest, FailAidlInDevelopment) {
2689*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{{.types = {"android.hardware.aidl.IAidl"},
2690*70a7ec85SAndroid Build Coastguard Worker                                              .stability = "vintf",
2691*70a7ec85SAndroid Build Coastguard Worker                                              .versions = {1},
2692*70a7ec85SAndroid Build Coastguard Worker                                              .has_development = true}};
2693*70a7ec85SAndroid Build Coastguard Worker 
2694*70a7ec85SAndroid Build Coastguard Worker     setCheckAidlFCM(true);
2695*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMissingHalsInMatrices({}, aidl, defaultPred, defaultPred);
2696*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl@2"))));
2697*70a7ec85SAndroid Build Coastguard Worker }
2698*70a7ec85SAndroid Build Coastguard Worker 
2699*70a7ec85SAndroid Build Coastguard Worker // A set of tests on VintfObject::checkMatrixHalsHasDefinition
2700*70a7ec85SAndroid Build Coastguard Worker class CheckMatrixHalsHasDefinitionTest : public CheckMatricesWithHalDefTestBase {};
2701*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMatrixHalsHasDefinitionTest,Pass)2702*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMatrixHalsHasDefinitionTest, Pass) {
2703*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]::IHidl"}};
2704*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2705*70a7ec85SAndroid Build Coastguard Worker         {.types = {"android.hardware.aidl.IAidl"}, .stability = "vintf"}};
2706*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->checkMatrixHalsHasDefinition(hidl, aidl), Ok());
2707*70a7ec85SAndroid Build Coastguard Worker }
2708*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMatrixHalsHasDefinitionTest,FailMissingHidl)2709*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMatrixHalsHasDefinitionTest, FailMissingHidl) {
2710*70a7ec85SAndroid Build Coastguard Worker     std::vector<AidlInterfaceMetadata> aidl{
2711*70a7ec85SAndroid Build Coastguard Worker         {.types = {"android.hardware.aidl.IAidl"}, .stability = "vintf"}};
2712*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMatrixHalsHasDefinition({}, aidl);
2713*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]::IHidl"))));
2714*70a7ec85SAndroid Build Coastguard Worker }
2715*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMatrixHalsHasDefinitionTest,FailMissingAidl)2716*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMatrixHalsHasDefinitionTest, FailMissingAidl) {
2717*70a7ec85SAndroid Build Coastguard Worker     std::vector<HidlInterfaceMetadata> hidl{{.name = "[email protected]::IHidl"}};
2718*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMatrixHalsHasDefinition(hidl, {});
2719*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl.IAidl"))));
2720*70a7ec85SAndroid Build Coastguard Worker }
2721*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(CheckMatrixHalsHasDefinitionTest,FailMissingBoth)2722*70a7ec85SAndroid Build Coastguard Worker TEST_F(CheckMatrixHalsHasDefinitionTest, FailMissingBoth) {
2723*70a7ec85SAndroid Build Coastguard Worker     auto res = vintfObject->checkMatrixHalsHasDefinition({}, {});
2724*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("[email protected]::IHidl"))));
2725*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(res, HasError(WithMessage(HasSubstr("android.hardware.aidl.IAidl"))));
2726*70a7ec85SAndroid Build Coastguard Worker }
2727*70a7ec85SAndroid Build Coastguard Worker 
2728*70a7ec85SAndroid Build Coastguard Worker constexpr const char* systemMatrixHealthFormat = R"(
2729*70a7ec85SAndroid Build Coastguard Worker <compatibility-matrix %s type="framework" level="%s">
2730*70a7ec85SAndroid Build Coastguard Worker     <hal format="%s" optional="%s">
2731*70a7ec85SAndroid Build Coastguard Worker         <name>android.hardware.health</name>
2732*70a7ec85SAndroid Build Coastguard Worker         <version>%s</version>
2733*70a7ec85SAndroid Build Coastguard Worker         <interface>
2734*70a7ec85SAndroid Build Coastguard Worker             <name>IHealth</name>
2735*70a7ec85SAndroid Build Coastguard Worker             <instance>default</instance>
2736*70a7ec85SAndroid Build Coastguard Worker         </interface>
2737*70a7ec85SAndroid Build Coastguard Worker     </hal>
2738*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
2739*70a7ec85SAndroid Build Coastguard Worker )";
2740*70a7ec85SAndroid Build Coastguard Worker 
2741*70a7ec85SAndroid Build Coastguard Worker constexpr const char* vendorManifestHealthHidlFormat = R"(
2742*70a7ec85SAndroid Build Coastguard Worker <manifest %s type="device" target-level="%s">
2743*70a7ec85SAndroid Build Coastguard Worker     <hal format="hidl">
2744*70a7ec85SAndroid Build Coastguard Worker         <name>android.hardware.health</name>
2745*70a7ec85SAndroid Build Coastguard Worker         <transport>hwbinder</transport>
2746*70a7ec85SAndroid Build Coastguard Worker         <fqname>@%s::IHealth/default</fqname>
2747*70a7ec85SAndroid Build Coastguard Worker     </hal>
2748*70a7ec85SAndroid Build Coastguard Worker </manifest>
2749*70a7ec85SAndroid Build Coastguard Worker )";
2750*70a7ec85SAndroid Build Coastguard Worker 
2751*70a7ec85SAndroid Build Coastguard Worker constexpr const char* vendorManifestHealthAidlFormat = R"(
2752*70a7ec85SAndroid Build Coastguard Worker <manifest %s type="device" target-level="%s">
2753*70a7ec85SAndroid Build Coastguard Worker     <hal format="aidl">
2754*70a7ec85SAndroid Build Coastguard Worker         <name>android.hardware.health</name>
2755*70a7ec85SAndroid Build Coastguard Worker         <version>%s</version>
2756*70a7ec85SAndroid Build Coastguard Worker         <fqname>IHealth/default</fqname>
2757*70a7ec85SAndroid Build Coastguard Worker     </hal>
2758*70a7ec85SAndroid Build Coastguard Worker </manifest>
2759*70a7ec85SAndroid Build Coastguard Worker )";
2760*70a7ec85SAndroid Build Coastguard Worker 
2761*70a7ec85SAndroid Build Coastguard Worker using HealthHalVersion = std::variant<Version /* HIDL */, size_t /* AIDL */>;
2762*70a7ec85SAndroid Build Coastguard Worker struct VintfObjectHealthHalTestParam {
2763*70a7ec85SAndroid Build Coastguard Worker     Level targetLevel;
2764*70a7ec85SAndroid Build Coastguard Worker     HealthHalVersion halVersion;
2765*70a7ec85SAndroid Build Coastguard Worker     bool expected;
2766*70a7ec85SAndroid Build Coastguard Worker 
getHalFormatandroid::vintf::testing::VintfObjectHealthHalTestParam2767*70a7ec85SAndroid Build Coastguard Worker     HalFormat getHalFormat() const {
2768*70a7ec85SAndroid Build Coastguard Worker         if (std::holds_alternative<Version>(halVersion)) return HalFormat::HIDL;
2769*70a7ec85SAndroid Build Coastguard Worker         if (std::holds_alternative<size_t>(halVersion)) return HalFormat::AIDL;
2770*70a7ec85SAndroid Build Coastguard Worker         __builtin_unreachable();
2771*70a7ec85SAndroid Build Coastguard Worker     }
2772*70a7ec85SAndroid Build Coastguard Worker };
operator <<(std::ostream & os,const VintfObjectHealthHalTestParam & param)2773*70a7ec85SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const VintfObjectHealthHalTestParam& param) {
2774*70a7ec85SAndroid Build Coastguard Worker     os << param.targetLevel << "_" << param.getHalFormat() << "_";
2775*70a7ec85SAndroid Build Coastguard Worker     switch (param.getHalFormat()) {
2776*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::HIDL: {
2777*70a7ec85SAndroid Build Coastguard Worker             const auto& v = std::get<Version>(param.halVersion);
2778*70a7ec85SAndroid Build Coastguard Worker             os << "v" << v.majorVer << "_" << v.minorVer;
2779*70a7ec85SAndroid Build Coastguard Worker         } break;
2780*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::AIDL: {
2781*70a7ec85SAndroid Build Coastguard Worker             os << "v" << std::get<size_t>(param.halVersion);
2782*70a7ec85SAndroid Build Coastguard Worker         } break;
2783*70a7ec85SAndroid Build Coastguard Worker         default:
2784*70a7ec85SAndroid Build Coastguard Worker             __builtin_unreachable();
2785*70a7ec85SAndroid Build Coastguard Worker     }
2786*70a7ec85SAndroid Build Coastguard Worker     return os << "_" << (param.expected ? "ok" : "not_ok");
2787*70a7ec85SAndroid Build Coastguard Worker }
2788*70a7ec85SAndroid Build Coastguard Worker 
2789*70a7ec85SAndroid Build Coastguard Worker // Test fixture that provides compatible metadata from the mock device.
2790*70a7ec85SAndroid Build Coastguard Worker class VintfObjectHealthHalTest : public MultiMatrixTest,
2791*70a7ec85SAndroid Build Coastguard Worker                                  public WithParamInterface<VintfObjectHealthHalTestParam> {
2792*70a7ec85SAndroid Build Coastguard Worker    public:
SetUp()2793*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
2794*70a7ec85SAndroid Build Coastguard Worker         MultiMatrixTest::SetUp();
2795*70a7ec85SAndroid Build Coastguard Worker         SetUpMockSystemMatrices({
2796*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(
2797*70a7ec85SAndroid Build Coastguard Worker                 systemMatrixHealthFormat, kMetaVersionStr.c_str(), to_string(Level::P).c_str(),
2798*70a7ec85SAndroid Build Coastguard Worker                 to_string(HalFormat::HIDL).c_str(), "true", to_string(Version{2, 0}).c_str()),
2799*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(
2800*70a7ec85SAndroid Build Coastguard Worker                 systemMatrixHealthFormat, kMetaVersionStr.c_str(), to_string(Level::Q).c_str(),
2801*70a7ec85SAndroid Build Coastguard Worker                 to_string(HalFormat::HIDL).c_str(), "true", to_string(Version{2, 0}).c_str()),
2802*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(
2803*70a7ec85SAndroid Build Coastguard Worker                 systemMatrixHealthFormat, kMetaVersionStr.c_str(), to_string(Level::R).c_str(),
2804*70a7ec85SAndroid Build Coastguard Worker                 to_string(HalFormat::HIDL).c_str(), "true", to_string(Version{2, 1}).c_str()),
2805*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(
2806*70a7ec85SAndroid Build Coastguard Worker                 systemMatrixHealthFormat, kMetaVersionStr.c_str(), to_string(Level::S).c_str(),
2807*70a7ec85SAndroid Build Coastguard Worker                 to_string(HalFormat::HIDL).c_str(), "true", to_string(Version{2, 1}).c_str()),
2808*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(
2809*70a7ec85SAndroid Build Coastguard Worker                 systemMatrixHealthFormat, kMetaVersionStr.c_str(), to_string(Level::T).c_str(),
2810*70a7ec85SAndroid Build Coastguard Worker                 to_string(HalFormat::AIDL).c_str(), "false", to_string(1).c_str()),
2811*70a7ec85SAndroid Build Coastguard Worker         });
2812*70a7ec85SAndroid Build Coastguard Worker         switch (GetParam().getHalFormat()) {
2813*70a7ec85SAndroid Build Coastguard Worker             case HalFormat::HIDL:
2814*70a7ec85SAndroid Build Coastguard Worker                 expectFetchRepeatedly(
2815*70a7ec85SAndroid Build Coastguard Worker                     kVendorManifest,
2816*70a7ec85SAndroid Build Coastguard Worker                     android::base::StringPrintf(
2817*70a7ec85SAndroid Build Coastguard Worker                         vendorManifestHealthHidlFormat, kMetaVersionStr.c_str(),
2818*70a7ec85SAndroid Build Coastguard Worker                         to_string(GetParam().targetLevel).c_str(),
2819*70a7ec85SAndroid Build Coastguard Worker                         to_string(std::get<Version>(GetParam().halVersion)).c_str()));
2820*70a7ec85SAndroid Build Coastguard Worker                 break;
2821*70a7ec85SAndroid Build Coastguard Worker             case HalFormat::AIDL:
2822*70a7ec85SAndroid Build Coastguard Worker                 expectFetchRepeatedly(
2823*70a7ec85SAndroid Build Coastguard Worker                     kVendorManifest,
2824*70a7ec85SAndroid Build Coastguard Worker                     android::base::StringPrintf(
2825*70a7ec85SAndroid Build Coastguard Worker                         vendorManifestHealthAidlFormat, kMetaVersionStr.c_str(),
2826*70a7ec85SAndroid Build Coastguard Worker                         to_string(GetParam().targetLevel).c_str(),
2827*70a7ec85SAndroid Build Coastguard Worker                         to_string(std::get<size_t>(GetParam().halVersion)).c_str()));
2828*70a7ec85SAndroid Build Coastguard Worker                 break;
2829*70a7ec85SAndroid Build Coastguard Worker             default:
2830*70a7ec85SAndroid Build Coastguard Worker                 __builtin_unreachable();
2831*70a7ec85SAndroid Build Coastguard Worker         }
2832*70a7ec85SAndroid Build Coastguard Worker     }
GetParams()2833*70a7ec85SAndroid Build Coastguard Worker     static std::vector<VintfObjectHealthHalTestParam> GetParams() {
2834*70a7ec85SAndroid Build Coastguard Worker         std::vector<VintfObjectHealthHalTestParam> ret;
2835*70a7ec85SAndroid Build Coastguard Worker         for (auto level : {Level::P, Level::Q, Level::R, Level::S, Level::T}) {
2836*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, Version{2, 0}, level < Level::R});
2837*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, Version{2, 1}, level < Level::T});
2838*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, 1u, true});
2839*70a7ec85SAndroid Build Coastguard Worker         }
2840*70a7ec85SAndroid Build Coastguard Worker         return ret;
2841*70a7ec85SAndroid Build Coastguard Worker     }
2842*70a7ec85SAndroid Build Coastguard Worker };
2843*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(VintfObjectHealthHalTest,Test)2844*70a7ec85SAndroid Build Coastguard Worker TEST_P(VintfObjectHealthHalTest, Test) {
2845*70a7ec85SAndroid Build Coastguard Worker     auto manifest = vintfObject->getDeviceHalManifest();
2846*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, manifest);
2847*70a7ec85SAndroid Build Coastguard Worker     std::string deprecatedError;
2848*70a7ec85SAndroid Build Coastguard Worker     auto deprecation = vintfObject->checkDeprecation({}, &deprecatedError);
2849*70a7ec85SAndroid Build Coastguard Worker     bool hasHidl =
2850*70a7ec85SAndroid Build Coastguard Worker         manifest->hasHidlInstance("android.hardware.health", {2, 0}, "IHealth", "default");
2851*70a7ec85SAndroid Build Coastguard Worker     bool hasAidl = manifest->hasAidlInstance("android.hardware.health", 1, "IHealth", "default");
2852*70a7ec85SAndroid Build Coastguard Worker     bool hasHal = hasHidl || hasAidl;
2853*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(GetParam().expected, deprecation == NO_DEPRECATED_HALS && hasHal)
2854*70a7ec85SAndroid Build Coastguard Worker         << "checkDeprecation() returns " << deprecation << "; hasHidl = " << hasHidl
2855*70a7ec85SAndroid Build Coastguard Worker         << ", hasAidl = " << hasAidl;
2856*70a7ec85SAndroid Build Coastguard Worker }
2857*70a7ec85SAndroid Build Coastguard Worker 
2858*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VintfObjectHealthHalTest, VintfObjectHealthHalTest,
2859*70a7ec85SAndroid Build Coastguard Worker                          ::testing::ValuesIn(VintfObjectHealthHalTest::GetParams()),
__anon539f1f852202(const auto& info) 2860*70a7ec85SAndroid Build Coastguard Worker                          [](const auto& info) { return to_string(info.param); });
2861*70a7ec85SAndroid Build Coastguard Worker 
2862*70a7ec85SAndroid Build Coastguard Worker constexpr const char* systemMatrixComposerFormat = R"(
2863*70a7ec85SAndroid Build Coastguard Worker <compatibility-matrix %s type="framework" level="%s">
2864*70a7ec85SAndroid Build Coastguard Worker     %s
2865*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
2866*70a7ec85SAndroid Build Coastguard Worker )";
2867*70a7ec85SAndroid Build Coastguard Worker 
2868*70a7ec85SAndroid Build Coastguard Worker constexpr const char* systemMatrixComposerHalFragmentFormat = R"(
2869*70a7ec85SAndroid Build Coastguard Worker     <hal format="%s" optional="%s">
2870*70a7ec85SAndroid Build Coastguard Worker         <name>%s</name>
2871*70a7ec85SAndroid Build Coastguard Worker         <version>%s</version>
2872*70a7ec85SAndroid Build Coastguard Worker         <interface>
2873*70a7ec85SAndroid Build Coastguard Worker             <name>IComposer</name>
2874*70a7ec85SAndroid Build Coastguard Worker             <instance>default</instance>
2875*70a7ec85SAndroid Build Coastguard Worker         </interface>
2876*70a7ec85SAndroid Build Coastguard Worker     </hal>
2877*70a7ec85SAndroid Build Coastguard Worker )";
2878*70a7ec85SAndroid Build Coastguard Worker 
2879*70a7ec85SAndroid Build Coastguard Worker constexpr const char* vendorManifestComposerHidlFormat = R"(
2880*70a7ec85SAndroid Build Coastguard Worker <manifest %s type="device" target-level="%s">
2881*70a7ec85SAndroid Build Coastguard Worker     %s
2882*70a7ec85SAndroid Build Coastguard Worker </manifest>
2883*70a7ec85SAndroid Build Coastguard Worker )";
2884*70a7ec85SAndroid Build Coastguard Worker 
2885*70a7ec85SAndroid Build Coastguard Worker constexpr const char* vendorManifestComposerHidlFragmentFormat = R"(
2886*70a7ec85SAndroid Build Coastguard Worker     <hal format="hidl">
2887*70a7ec85SAndroid Build Coastguard Worker         <name>android.hardware.graphics.composer</name>
2888*70a7ec85SAndroid Build Coastguard Worker         <version>%s</version>
2889*70a7ec85SAndroid Build Coastguard Worker         <transport>hwbinder</transport>
2890*70a7ec85SAndroid Build Coastguard Worker         <interface>
2891*70a7ec85SAndroid Build Coastguard Worker             <name>IComposer</name>
2892*70a7ec85SAndroid Build Coastguard Worker             <instance>default</instance>
2893*70a7ec85SAndroid Build Coastguard Worker         </interface>
2894*70a7ec85SAndroid Build Coastguard Worker     </hal>
2895*70a7ec85SAndroid Build Coastguard Worker )";
2896*70a7ec85SAndroid Build Coastguard Worker 
2897*70a7ec85SAndroid Build Coastguard Worker constexpr const char* vendorManifestComposerAidlFragmentFormat = R"(
2898*70a7ec85SAndroid Build Coastguard Worker     <hal format="aidl">
2899*70a7ec85SAndroid Build Coastguard Worker         <name>android.hardware.graphics.composer3</name>
2900*70a7ec85SAndroid Build Coastguard Worker         <version>%s</version>
2901*70a7ec85SAndroid Build Coastguard Worker         <interface>
2902*70a7ec85SAndroid Build Coastguard Worker             <name>IComposer</name>
2903*70a7ec85SAndroid Build Coastguard Worker             <instance>default</instance>
2904*70a7ec85SAndroid Build Coastguard Worker         </interface>
2905*70a7ec85SAndroid Build Coastguard Worker     </hal>
2906*70a7ec85SAndroid Build Coastguard Worker )";
2907*70a7ec85SAndroid Build Coastguard Worker 
2908*70a7ec85SAndroid Build Coastguard Worker constexpr const char* composerHidlHalName = "android.hardware.graphics.composer";
2909*70a7ec85SAndroid Build Coastguard Worker constexpr const char* composerAidlHalName = "android.hardware.graphics.composer3";
2910*70a7ec85SAndroid Build Coastguard Worker 
2911*70a7ec85SAndroid Build Coastguard Worker using ComposerHalVersion = std::variant<Version /* HIDL */, size_t /* AIDL */>;
2912*70a7ec85SAndroid Build Coastguard Worker struct VintfObjectComposerHalTestParam {
2913*70a7ec85SAndroid Build Coastguard Worker     Level targetLevel;
2914*70a7ec85SAndroid Build Coastguard Worker     std::optional<ComposerHalVersion> halVersion;
2915*70a7ec85SAndroid Build Coastguard Worker     bool expected;
2916*70a7ec85SAndroid Build Coastguard Worker 
hasHalandroid::vintf::testing::VintfObjectComposerHalTestParam2917*70a7ec85SAndroid Build Coastguard Worker     bool hasHal() const { return halVersion.has_value(); }
2918*70a7ec85SAndroid Build Coastguard Worker 
getHalFormatandroid::vintf::testing::VintfObjectComposerHalTestParam2919*70a7ec85SAndroid Build Coastguard Worker     HalFormat getHalFormat() const {
2920*70a7ec85SAndroid Build Coastguard Worker         if (std::holds_alternative<Version>(*halVersion)) return HalFormat::HIDL;
2921*70a7ec85SAndroid Build Coastguard Worker         if (std::holds_alternative<size_t>(*halVersion)) return HalFormat::AIDL;
2922*70a7ec85SAndroid Build Coastguard Worker         __builtin_unreachable();
2923*70a7ec85SAndroid Build Coastguard Worker     }
2924*70a7ec85SAndroid Build Coastguard Worker };
operator <<(std::ostream & os,const VintfObjectComposerHalTestParam & param)2925*70a7ec85SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const VintfObjectComposerHalTestParam& param) {
2926*70a7ec85SAndroid Build Coastguard Worker     os << param.targetLevel << "_";
2927*70a7ec85SAndroid Build Coastguard Worker     if (param.hasHal()) {
2928*70a7ec85SAndroid Build Coastguard Worker         os << param.getHalFormat() << "_";
2929*70a7ec85SAndroid Build Coastguard Worker         switch (param.getHalFormat()) {
2930*70a7ec85SAndroid Build Coastguard Worker             case HalFormat::HIDL: {
2931*70a7ec85SAndroid Build Coastguard Worker                 const auto& v = std::get<Version>(*param.halVersion);
2932*70a7ec85SAndroid Build Coastguard Worker                 os << "v" << v.majorVer << "_" << v.minorVer;
2933*70a7ec85SAndroid Build Coastguard Worker             } break;
2934*70a7ec85SAndroid Build Coastguard Worker             case HalFormat::AIDL: {
2935*70a7ec85SAndroid Build Coastguard Worker                 os << "v" << std::get<size_t>(*param.halVersion);
2936*70a7ec85SAndroid Build Coastguard Worker             } break;
2937*70a7ec85SAndroid Build Coastguard Worker             default:
2938*70a7ec85SAndroid Build Coastguard Worker                 __builtin_unreachable();
2939*70a7ec85SAndroid Build Coastguard Worker         }
2940*70a7ec85SAndroid Build Coastguard Worker     } else {
2941*70a7ec85SAndroid Build Coastguard Worker         os << "no_hal";
2942*70a7ec85SAndroid Build Coastguard Worker     }
2943*70a7ec85SAndroid Build Coastguard Worker     return os << "_" << (param.expected ? "ok" : "not_ok");
2944*70a7ec85SAndroid Build Coastguard Worker }
2945*70a7ec85SAndroid Build Coastguard Worker 
2946*70a7ec85SAndroid Build Coastguard Worker // Test fixture that provides compatible metadata from the mock device.
2947*70a7ec85SAndroid Build Coastguard Worker class VintfObjectComposerHalTest : public MultiMatrixTest,
2948*70a7ec85SAndroid Build Coastguard Worker                                    public WithParamInterface<VintfObjectComposerHalTestParam> {
2949*70a7ec85SAndroid Build Coastguard Worker    public:
SetUp()2950*70a7ec85SAndroid Build Coastguard Worker     virtual void SetUp() {
2951*70a7ec85SAndroid Build Coastguard Worker         MultiMatrixTest::SetUp();
2952*70a7ec85SAndroid Build Coastguard Worker 
2953*70a7ec85SAndroid Build Coastguard Worker         const std::string requiresHidl2_1To2_2 = android::base::StringPrintf(
2954*70a7ec85SAndroid Build Coastguard Worker             systemMatrixComposerHalFragmentFormat, to_string(HalFormat::HIDL).c_str(), "false",
2955*70a7ec85SAndroid Build Coastguard Worker             composerHidlHalName, to_string(VersionRange{2, 1, 2}).c_str());
2956*70a7ec85SAndroid Build Coastguard Worker         const std::string requiresHidl2_1To2_3 = android::base::StringPrintf(
2957*70a7ec85SAndroid Build Coastguard Worker             systemMatrixComposerHalFragmentFormat, to_string(HalFormat::HIDL).c_str(), "false",
2958*70a7ec85SAndroid Build Coastguard Worker             composerHidlHalName, to_string(VersionRange{2, 1, 3}).c_str());
2959*70a7ec85SAndroid Build Coastguard Worker         const std::string requiresHidl2_1To2_4 = android::base::StringPrintf(
2960*70a7ec85SAndroid Build Coastguard Worker             systemMatrixComposerHalFragmentFormat, to_string(HalFormat::HIDL).c_str(), "false",
2961*70a7ec85SAndroid Build Coastguard Worker             composerHidlHalName, to_string(VersionRange{2, 1, 4}).c_str());
2962*70a7ec85SAndroid Build Coastguard Worker         const std::string optionalHidl2_1To2_4 = android::base::StringPrintf(
2963*70a7ec85SAndroid Build Coastguard Worker             systemMatrixComposerHalFragmentFormat, to_string(HalFormat::HIDL).c_str(), "true",
2964*70a7ec85SAndroid Build Coastguard Worker             composerHidlHalName, to_string(VersionRange{2, 1, 4}).c_str());
2965*70a7ec85SAndroid Build Coastguard Worker         const std::string optionalAidl1 = android::base::StringPrintf(
2966*70a7ec85SAndroid Build Coastguard Worker             systemMatrixComposerHalFragmentFormat, to_string(HalFormat::AIDL).c_str(), "true",
2967*70a7ec85SAndroid Build Coastguard Worker             composerAidlHalName, "1");
2968*70a7ec85SAndroid Build Coastguard Worker         const std::string optionalHidl2_1To2_4OrAidl1 = optionalHidl2_1To2_4 + optionalAidl1;
2969*70a7ec85SAndroid Build Coastguard Worker 
2970*70a7ec85SAndroid Build Coastguard Worker         SetUpMockSystemMatrices({
2971*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(systemMatrixComposerFormat, kMetaVersionStr.c_str(),
2972*70a7ec85SAndroid Build Coastguard Worker                                         to_string(Level::P).c_str(), requiresHidl2_1To2_2.c_str()),
2973*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(systemMatrixComposerFormat, kMetaVersionStr.c_str(),
2974*70a7ec85SAndroid Build Coastguard Worker                                         to_string(Level::Q).c_str(), requiresHidl2_1To2_3.c_str()),
2975*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(systemMatrixComposerFormat, kMetaVersionStr.c_str(),
2976*70a7ec85SAndroid Build Coastguard Worker                                         to_string(Level::R).c_str(), requiresHidl2_1To2_4.c_str()),
2977*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(systemMatrixComposerFormat, kMetaVersionStr.c_str(),
2978*70a7ec85SAndroid Build Coastguard Worker                                         to_string(Level::S).c_str(), requiresHidl2_1To2_4.c_str()),
2979*70a7ec85SAndroid Build Coastguard Worker             android::base::StringPrintf(systemMatrixComposerFormat, kMetaVersionStr.c_str(),
2980*70a7ec85SAndroid Build Coastguard Worker                                         to_string(Level::T).c_str(),
2981*70a7ec85SAndroid Build Coastguard Worker                                         optionalHidl2_1To2_4OrAidl1.c_str()),
2982*70a7ec85SAndroid Build Coastguard Worker         });
2983*70a7ec85SAndroid Build Coastguard Worker 
2984*70a7ec85SAndroid Build Coastguard Worker         const auto param = GetParam();
2985*70a7ec85SAndroid Build Coastguard Worker 
2986*70a7ec85SAndroid Build Coastguard Worker         std::string vendorHalFragment;
2987*70a7ec85SAndroid Build Coastguard Worker         if (param.hasHal()) {
2988*70a7ec85SAndroid Build Coastguard Worker             switch (param.getHalFormat()) {
2989*70a7ec85SAndroid Build Coastguard Worker                 case HalFormat::HIDL:
2990*70a7ec85SAndroid Build Coastguard Worker                     vendorHalFragment = android::base::StringPrintf(
2991*70a7ec85SAndroid Build Coastguard Worker                         vendorManifestComposerHidlFragmentFormat,
2992*70a7ec85SAndroid Build Coastguard Worker                         to_string(std::get<Version>(*param.halVersion)).c_str());
2993*70a7ec85SAndroid Build Coastguard Worker                     break;
2994*70a7ec85SAndroid Build Coastguard Worker                 case HalFormat::AIDL:
2995*70a7ec85SAndroid Build Coastguard Worker                     vendorHalFragment = android::base::StringPrintf(
2996*70a7ec85SAndroid Build Coastguard Worker                         vendorManifestComposerAidlFragmentFormat,
2997*70a7ec85SAndroid Build Coastguard Worker                         to_string(std::get<size_t>(*param.halVersion)).c_str());
2998*70a7ec85SAndroid Build Coastguard Worker                     break;
2999*70a7ec85SAndroid Build Coastguard Worker                 default:
3000*70a7ec85SAndroid Build Coastguard Worker                     __builtin_unreachable();
3001*70a7ec85SAndroid Build Coastguard Worker             }
3002*70a7ec85SAndroid Build Coastguard Worker         } else {
3003*70a7ec85SAndroid Build Coastguard Worker             vendorHalFragment = "";
3004*70a7ec85SAndroid Build Coastguard Worker         }
3005*70a7ec85SAndroid Build Coastguard Worker         expectFetchRepeatedly(kVendorManifest,
3006*70a7ec85SAndroid Build Coastguard Worker                               android::base::StringPrintf(
3007*70a7ec85SAndroid Build Coastguard Worker                                   vendorManifestComposerHidlFormat, kMetaVersionStr.c_str(),
3008*70a7ec85SAndroid Build Coastguard Worker                                   to_string(param.targetLevel).c_str(), vendorHalFragment.c_str()));
3009*70a7ec85SAndroid Build Coastguard Worker     }
GetParams()3010*70a7ec85SAndroid Build Coastguard Worker     static std::vector<VintfObjectComposerHalTestParam> GetParams() {
3011*70a7ec85SAndroid Build Coastguard Worker         std::vector<VintfObjectComposerHalTestParam> ret;
3012*70a7ec85SAndroid Build Coastguard Worker         for (auto level : {Level::P, Level::Q, Level::R, Level::S, Level::T}) {
3013*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, std::nullopt, false});
3014*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, ComposerHalVersion{Version{2, 1}}, true});
3015*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, ComposerHalVersion{Version{2, 2}}, true});
3016*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, ComposerHalVersion{Version{2, 3}}, true});
3017*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, ComposerHalVersion{Version{2, 4}}, true});
3018*70a7ec85SAndroid Build Coastguard Worker             ret.push_back({level, ComposerHalVersion{1u}, true});
3019*70a7ec85SAndroid Build Coastguard Worker         }
3020*70a7ec85SAndroid Build Coastguard Worker         return ret;
3021*70a7ec85SAndroid Build Coastguard Worker     }
3022*70a7ec85SAndroid Build Coastguard Worker };
3023*70a7ec85SAndroid Build Coastguard Worker 
TEST_P(VintfObjectComposerHalTest,Test)3024*70a7ec85SAndroid Build Coastguard Worker TEST_P(VintfObjectComposerHalTest, Test) {
3025*70a7ec85SAndroid Build Coastguard Worker     auto manifest = vintfObject->getDeviceHalManifest();
3026*70a7ec85SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, manifest);
3027*70a7ec85SAndroid Build Coastguard Worker     std::string deprecatedError;
3028*70a7ec85SAndroid Build Coastguard Worker     auto deprecation = vintfObject->checkDeprecation({}, &deprecatedError);
3029*70a7ec85SAndroid Build Coastguard Worker     bool hasHidl = manifest->hasHidlInstance(composerHidlHalName, {2, 1}, "IComposer", "default");
3030*70a7ec85SAndroid Build Coastguard Worker     bool hasAidl = manifest->hasAidlInstance(composerAidlHalName, 1, "IComposer", "default");
3031*70a7ec85SAndroid Build Coastguard Worker     bool hasHal = hasHidl || hasAidl;
3032*70a7ec85SAndroid Build Coastguard Worker     EXPECT_EQ(GetParam().expected, deprecation == NO_DEPRECATED_HALS && hasHal)
3033*70a7ec85SAndroid Build Coastguard Worker         << "checkDeprecation() returns " << deprecation << "; hasHidl = " << hasHidl
3034*70a7ec85SAndroid Build Coastguard Worker         << ", hasAidl = " << hasAidl;
3035*70a7ec85SAndroid Build Coastguard Worker }
3036*70a7ec85SAndroid Build Coastguard Worker 
3037*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VintfObjectComposerHalTest, VintfObjectComposerHalTest,
3038*70a7ec85SAndroid Build Coastguard Worker                          ::testing::ValuesIn(VintfObjectComposerHalTest::GetParams()),
__anon539f1f852302(const auto& info) 3039*70a7ec85SAndroid Build Coastguard Worker                          [](const auto& info) { return to_string(info.param); });
3040*70a7ec85SAndroid Build Coastguard Worker 
3041*70a7ec85SAndroid Build Coastguard Worker constexpr const char* systemMatrixLatestMinLtsFormat = R"(
3042*70a7ec85SAndroid Build Coastguard Worker <compatibility-matrix %s type="framework" level="%s">
3043*70a7ec85SAndroid Build Coastguard Worker     <kernel version="%s" />
3044*70a7ec85SAndroid Build Coastguard Worker     <kernel version="%s" />
3045*70a7ec85SAndroid Build Coastguard Worker     <kernel version="%s" />
3046*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
3047*70a7ec85SAndroid Build Coastguard Worker )";
3048*70a7ec85SAndroid Build Coastguard Worker 
3049*70a7ec85SAndroid Build Coastguard Worker class VintfObjectLatestMinLtsTest : public MultiMatrixTest {};
3050*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectLatestMinLtsTest,TestEmpty)3051*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectLatestMinLtsTest, TestEmpty) {
3052*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({});
3053*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->getLatestMinLtsAtFcmVersion(Level::S),
3054*70a7ec85SAndroid Build Coastguard Worker                 HasError(WithCode(-NAME_NOT_FOUND)));
3055*70a7ec85SAndroid Build Coastguard Worker }
3056*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectLatestMinLtsTest,TestMissing)3057*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectLatestMinLtsTest, TestMissing) {
3058*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({
3059*70a7ec85SAndroid Build Coastguard Worker         android::base::StringPrintf(systemMatrixLatestMinLtsFormat, kMetaVersionStr.c_str(),
3060*70a7ec85SAndroid Build Coastguard Worker                                     to_string(Level::S).c_str(), "4.19.191", "5.4.86", "5.10.43"),
3061*70a7ec85SAndroid Build Coastguard Worker     });
3062*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(
3063*70a7ec85SAndroid Build Coastguard Worker         vintfObject->getLatestMinLtsAtFcmVersion(Level::T),
3064*70a7ec85SAndroid Build Coastguard Worker         HasError(WithMessage(HasSubstr("Can't find compatibility matrix fragment for level 7"))));
3065*70a7ec85SAndroid Build Coastguard Worker }
3066*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectLatestMinLtsTest,TestSimple)3067*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectLatestMinLtsTest, TestSimple) {
3068*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({
3069*70a7ec85SAndroid Build Coastguard Worker         android::base::StringPrintf(systemMatrixLatestMinLtsFormat, kMetaVersionStr.c_str(),
3070*70a7ec85SAndroid Build Coastguard Worker                                     to_string(Level::S).c_str(), "4.19.191", "5.4.86", "5.10.43"),
3071*70a7ec85SAndroid Build Coastguard Worker         android::base::StringPrintf(systemMatrixLatestMinLtsFormat, kMetaVersionStr.c_str(),
3072*70a7ec85SAndroid Build Coastguard Worker                                     to_string(Level::T).c_str(), "5.4.86", "5.10.107", "5.15.41"),
3073*70a7ec85SAndroid Build Coastguard Worker     });
3074*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->getLatestMinLtsAtFcmVersion(Level::S),
3075*70a7ec85SAndroid Build Coastguard Worker                 HasValue(KernelVersion{5, 10, 43}));
3076*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->getLatestMinLtsAtFcmVersion(Level::T),
3077*70a7ec85SAndroid Build Coastguard Worker                 HasValue(KernelVersion{5, 15, 41}));
3078*70a7ec85SAndroid Build Coastguard Worker }
3079*70a7ec85SAndroid Build Coastguard Worker 
TEST_F(VintfObjectLatestMinLtsTest,TestMultipleFragment)3080*70a7ec85SAndroid Build Coastguard Worker TEST_F(VintfObjectLatestMinLtsTest, TestMultipleFragment) {
3081*70a7ec85SAndroid Build Coastguard Worker     SetUpMockSystemMatrices({
3082*70a7ec85SAndroid Build Coastguard Worker         android::base::StringPrintf(systemMatrixLatestMinLtsFormat, kMetaVersionStr.c_str(),
3083*70a7ec85SAndroid Build Coastguard Worker                                     to_string(Level::S).c_str(), "4.19.191", "5.4.86", "5.10.43"),
3084*70a7ec85SAndroid Build Coastguard Worker         android::base::StringPrintf(systemMatrixLatestMinLtsFormat, kMetaVersionStr.c_str(),
3085*70a7ec85SAndroid Build Coastguard Worker                                     to_string(Level::S).c_str(), "5.4.86", "5.10.107", "5.15.41"),
3086*70a7ec85SAndroid Build Coastguard Worker     });
3087*70a7ec85SAndroid Build Coastguard Worker     EXPECT_THAT(vintfObject->getLatestMinLtsAtFcmVersion(Level::S),
3088*70a7ec85SAndroid Build Coastguard Worker                 HasValue(KernelVersion{5, 15, 41}));
3089*70a7ec85SAndroid Build Coastguard Worker }
3090*70a7ec85SAndroid Build Coastguard Worker 
3091*70a7ec85SAndroid Build Coastguard Worker }  // namespace testing
3092*70a7ec85SAndroid Build Coastguard Worker }  // namespace vintf
3093*70a7ec85SAndroid Build Coastguard Worker }  // namespace android
3094*70a7ec85SAndroid Build Coastguard Worker 
main(int argc,char ** argv)3095*70a7ec85SAndroid Build Coastguard Worker int main(int argc, char** argv) {
3096*70a7ec85SAndroid Build Coastguard Worker #ifndef LIBVINTF_TARGET
3097*70a7ec85SAndroid Build Coastguard Worker     // Silence logs on host because they pollute the gtest output. Negative tests writes a lot
3098*70a7ec85SAndroid Build Coastguard Worker     // of warning and error logs.
3099*70a7ec85SAndroid Build Coastguard Worker     android::base::SetMinimumLogSeverity(android::base::LogSeverity::FATAL);
3100*70a7ec85SAndroid Build Coastguard Worker #endif
3101*70a7ec85SAndroid Build Coastguard Worker 
3102*70a7ec85SAndroid Build Coastguard Worker     ::testing::InitGoogleMock(&argc, argv);
3103*70a7ec85SAndroid Build Coastguard Worker     return RUN_ALL_TESTS();
3104*70a7ec85SAndroid Build Coastguard Worker }
3105