• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include "VtsTestabilityChecker.h"
17 
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
20 
21 #include <vintf/CompatibilityMatrix.h>
22 #include <vintf/HalManifest.h>
23 #include <vintf/parse_xml.h>
24 
25 using namespace testing;
26 
27 using android::hidl::base::V1_0::IBase;
28 using android::hidl::manager::V1_0::IServiceManager;
29 using android::hidl::manager::V1_0::IServiceNotification;
30 using android::hardware::hidl_array;
31 using android::hardware::hidl_death_recipient;
32 using android::hardware::hidl_handle;
33 using android::hardware::hidl_string;
34 using android::hardware::hidl_vec;
35 using android::vintf::Arch;
36 using android::vintf::CompatibilityMatrix;
37 using android::vintf::HalManifest;
38 using android::vintf::ManifestHal;
39 using android::vintf::MatrixHal;
40 using android::vintf::Version;
41 using android::vintf::XmlConverter;
42 using android::vintf::gCompatibilityMatrixConverter;
43 using android::vintf::gHalManifestConverter;
44 using std::set;
45 using std::string;
46 
47 namespace android {
48 namespace vts {
49 
50 class MockServiceManager : public IServiceManager {
51  public:
52   template <typename T>
53   using R = ::android::hardware::Return<T>;
54   using String = const hidl_string &;
55   ~MockServiceManager() = default;
56 
57 #define MOCK_METHOD_CB(name) \
58   MOCK_METHOD1(name, R<void>(IServiceManager::name##_cb))
59 
60   MOCK_METHOD2(get, R<sp<IBase>>(String, String));
61   MOCK_METHOD2(add, R<bool>(String, const sp<IBase> &));
62   MOCK_METHOD2(getTransport, R<IServiceManager::Transport>(String, String));
63   MOCK_METHOD_CB(list);
64   MOCK_METHOD2(listByInterface, R<void>(String, listByInterface_cb));
65   MOCK_METHOD3(registerForNotifications,
66                R<bool>(String, String, const sp<IServiceNotification> &));
67   MOCK_METHOD_CB(debugDump);
68   MOCK_METHOD2(registerPassthroughClient, R<void>(String, String));
69   MOCK_METHOD_CB(interfaceChain);
70   MOCK_METHOD2(debug,
71                R<void>(const hidl_handle &, const hidl_vec<hidl_string> &));
72   MOCK_METHOD_CB(interfaceDescriptor);
73   MOCK_METHOD_CB(getHashChain);
74   MOCK_METHOD0(setHalInstrumentation, R<void>());
75   MOCK_METHOD2(linkToDeath,
76                R<bool>(const sp<hidl_death_recipient> &, uint64_t));
77   MOCK_METHOD0(ping, R<void>());
78   MOCK_METHOD_CB(getDebugInfo);
79   MOCK_METHOD0(notifySyspropsChanged, R<void>());
80   MOCK_METHOD1(unlinkToDeath, R<bool>(const sp<hidl_death_recipient> &));
81 };
82 
83 class VtsTestabilityCheckerTest : public ::testing::Test {
84  public:
SetUp()85   virtual void SetUp() override {
86     test_cm_ = testFrameworkCompMatrix();
87     test_fm_ = testFrameworkManfiest();
88     test_vm_ = testDeviceManifest();
89     sm_ = new NiceMock<MockServiceManager>();
90     checker_.reset(
91         new VtsTestabilityChecker(&test_cm_, &test_fm_, &test_vm_, sm_));
92   }
TearDown()93   virtual void TearDown() override {}
94 
testDeviceManifest()95   HalManifest testDeviceManifest() {
96     HalManifest vm;
97     string xml =
98         "<manifest version=\"1.0\" type=\"framework\">\n"
99         "    <hal format=\"hidl\">\n"
100         "        <name>android.hardware.audio</name>\n"
101         "        <transport arch=\"32\">passthrough</transport>\n"
102         "        <version>2.0</version>\n"
103         "        <interface>\n"
104         "            <name>IAudio</name>\n"
105         "            <instance>default</instance>\n"
106         "        </interface>\n"
107         "    </hal>\n"
108         "    <hal format=\"hidl\">\n"
109         "        <name>android.hardware.camera</name>\n"
110         "        <transport>hwbinder</transport>\n"
111         "        <version>1.2</version>\n"
112         "        <version>2.5</version>\n"
113         "        <interface>\n"
114         "            <name>ICamera</name>\n"
115         "            <instance>legacy/0</instance>\n"
116         "        </interface>\n"
117         "        <interface>\n"
118         "            <name>IBetterCamera</name>\n"
119         "            <instance>camera</instance>\n"
120         "            <instance>default</instance>\n"
121         "        </interface>\n"
122         "    </hal>\n"
123         "    <hal format=\"hidl\">\n"
124         "        <name>android.hardware.drm</name>\n"
125         "        <transport>hwbinder</transport>\n"
126         "        <version>2.0</version>\n"
127         "        <interface>\n"
128         "            <name>IDrm</name>\n"
129         "            <instance>default</instance>\n"
130         "        </interface>\n"
131         "    </hal>\n"
132         "    <hal format=\"hidl\">\n"
133         "        <name>android.hardware.nfc</name>\n"
134         "        <transport>hwbinder</transport>\n"
135         "        <version>1.0</version>\n"
136         "        <interface>\n"
137         "            <name>INfc</name>\n"
138         "            <instance>default</instance>\n"
139         "        </interface>\n"
140         "    </hal>\n"
141         "    <hal format=\"hidl\">\n"
142         "        <name>android.hardware.renderscript</name>\n"
143         "        <transport arch=\"32+64\">passthrough</transport>\n"
144         "        <version>1.0</version>\n"
145         "        <interface>\n"
146         "            <name>IRenderscript</name>\n"
147         "            <instance>default</instance>\n"
148         "        </interface>\n"
149         "    </hal>\n"
150         "    <hal format=\"hidl\">\n"
151         "        <name>android.hardware.vibrator</name>\n"
152         "        <transport>hwbinder</transport>\n"
153         "        <version>1.0</version>\n"
154         "        <interface>\n"
155         "            <name>IVibrator</name>\n"
156         "            <instance>default</instance>\n"
157         "        </interface>\n"
158         "    </hal>\n"
159         "</manifest>\n";
160     gHalManifestConverter(&vm, xml);
161     return vm;
162   }
163 
testFrameworkManfiest()164   HalManifest testFrameworkManfiest() {
165     HalManifest fm;
166     string xml =
167         "<manifest version=\"1.0\" type=\"framework\">\n"
168         "    <hal format=\"hidl\">\n"
169         "        <name>android.hardware.nfc</name>\n"
170         "        <transport>hwbinder</transport>\n"
171         "        <version>1.0</version>\n"
172         "        <interface>\n"
173         "            <name>INfc</name>\n"
174         "            <instance>default</instance>\n"
175         "            <instance>fnfc</instance>\n"
176         "        </interface>\n"
177         "    </hal>\n"
178         "</manifest>\n";
179     gHalManifestConverter(&fm, xml);
180     return fm;
181   }
182 
testFrameworkCompMatrix()183   CompatibilityMatrix testFrameworkCompMatrix() {
184     CompatibilityMatrix cm;
185     string xml =
186         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
187         "    <hal format=\"native\" optional=\"true\">\n"
188         "        <name>android.hardware.audio</name>\n"
189         "        <version>2.0-1</version>\n"
190         "        <interface>\n"
191         "            <name>IAudio</name>\n"
192         "            <instance>default</instance>\n"
193         "        </interface>\n"
194         "    </hal>\n"
195         "    <hal format=\"native\" optional=\"true\">\n"
196         "        <name>android.hardware.camera</name>\n"
197         "        <version>2.2-3</version>\n"
198         "        <version>4.5-6</version>\n"
199         "        <interface>\n"
200         "            <name>ICamera</name>\n"
201         "            <instance>default</instance>\n"
202         "        </interface>\n"
203         "        <interface>\n"
204         "            <name>IBetterCamera</name>\n"
205         "            <instance>camera</instance>\n"
206         "        </interface>\n"
207         "    </hal>\n"
208         "    <hal format=\"native\" optional=\"false\">\n"
209         "        <name>android.hardware.drm</name>\n"
210         "        <version>1.0-1</version>\n"
211         "        <interface>\n"
212         "            <name>IDrm</name>\n"
213         "            <instance>default</instance>\n"
214         "            <instance>drm</instance>\n"
215         "        </interface>\n"
216         "        <interface>\n"
217         "            <name>IDrmTest</name>\n"
218         "            <instance>default</instance>\n"
219         "        </interface>\n"
220         "    </hal>\n"
221         "    <hal format=\"native\" optional=\"false\">\n"
222         "        <name>android.hardware.light</name>\n"
223         "        <version>2.0-1</version>\n"
224         "        <interface>\n"
225         "            <name>ILight</name>\n"
226         "            <instance>default</instance>\n"
227         "        </interface>\n"
228         "    </hal>\n"
229         "    <hal format=\"native\" optional=\"true\">\n"
230         "        <name>android.hardware.nfc</name>\n"
231         "        <version>1.0-2</version>\n"
232         "        <interface>\n"
233         "            <name>INfc</name>\n"
234         "            <instance>default</instance>\n"
235         "            <instance>nfc</instance>\n"
236         "        </interface>\n"
237         "        <interface>\n"
238         "            <name>INfcTest</name>\n"
239         "            <instance>default</instance>\n"
240         "        </interface>\n"
241         "    </hal>\n"
242         "    <hal format=\"native\" optional=\"true\">\n"
243         "        <name>android.hardware.radio</name>\n"
244         "        <version>1.0-1</version>\n"
245         "        <interface>\n"
246         "            <name>IRadio</name>\n"
247         "            <instance>default</instance>\n"
248         "        </interface>\n"
249         "    </hal>\n"
250         "    <hal format=\"native\" optional=\"false\">\n"
251         "        <name>android.hardware.vibrator</name>\n"
252         "        <version>2.0</version>\n"
253         "        <interface>\n"
254         "            <name>IVibrator</name>\n"
255         "            <instance>default</instance>\n"
256         "        </interface>\n"
257         "    </hal>\n"
258         "</compatibility-matrix>\n";
259     gCompatibilityMatrixConverter(&cm, xml);
260     return cm;
261   }
262 
263  protected:
264   CompatibilityMatrix test_cm_;
265   HalManifest test_fm_;
266   HalManifest test_vm_;
267   sp<MockServiceManager> sm_;
268   std::unique_ptr<VtsTestabilityChecker> checker_;
269 };
270 
TEST_F(VtsTestabilityCheckerTest,CheckComplianceTest)271 TEST_F(VtsTestabilityCheckerTest, CheckComplianceTest) {
272   set<string> instances;
273   // Check non-existent hal.
274   EXPECT_FALSE(checker_->CheckHalForComplianceTest(
275       "nonexistent", {1, 0}, "None", Arch::ARCH_32, &instances));
276   EXPECT_TRUE(instances.empty());
277   // Check hal with unsupported version by vendor.
278   EXPECT_FALSE(checker_->CheckHalForComplianceTest(
279       "android.hardware.nfc", {2, 0}, "INfc", Arch::ARCH_32, &instances));
280   EXPECT_TRUE(instances.empty());
281   // Check hal with unsupported interface by vendor.
282   EXPECT_FALSE(checker_->CheckHalForComplianceTest(
283       "android.hardware.nfc", {1, 0}, "INfcTest", Arch::ARCH_32, &instances));
284   EXPECT_TRUE(instances.empty());
285   // Check hal with unsupported arch by vendor.
286   EXPECT_FALSE(checker_->CheckHalForComplianceTest(
287       "android.hardware.audio", {1, 0}, "IAudio", Arch::ARCH_64, &instances));
288   EXPECT_TRUE(instances.empty());
289   // Check hal claimed by framework but not supported by vendor (error case).
290   EXPECT_FALSE(checker_->CheckHalForComplianceTest(
291       "android.hardware.light", {2, 0}, "ILight", Arch::ARCH_32, &instances));
292   EXPECT_TRUE(instances.empty());
293   // Check hal interface claimed by framework but not supported by vendor (error
294   // case).
295   EXPECT_FALSE(checker_->CheckHalForComplianceTest(
296       "android.hardware.drm", {1, 0}, "IDrmTest", Arch::ARCH_32, &instances));
297   EXPECT_TRUE(instances.empty());
298 
299   // Check hal claimed by framework and supported by vendor.
300   instances.clear();
301   EXPECT_TRUE(checker_->CheckHalForComplianceTest("android.hardware.vibrator",
302                                                   {1, 0}, "IVibrator",
303                                                   Arch::ARCH_32, &instances));
304   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
305 
306   // Check hal not claimed by framework but supported by vendor.
307   instances.clear();
308   EXPECT_TRUE(checker_->CheckHalForComplianceTest(
309       "android.hardware.renderscript", {1, 0}, "IRenderscript", Arch::ARCH_32,
310       &instances));
311   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
312 
313   // Check hal with version not claimed by framework by supported by vendor.
314   instances.clear();
315   EXPECT_TRUE(checker_->CheckHalForComplianceTest("android.hardware.vibrator",
316                                                   {1, 0}, "IVibrator",
317                                                   Arch::ARCH_32, &instances));
318   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
319 
320   // Check hal with instance not claimed by framework but supported by vendor.
321   instances.clear();
322   EXPECT_TRUE(checker_->CheckHalForComplianceTest(
323       "android.hardware.camera", {2, 2}, "ICamera", Arch::ARCH_32, &instances));
324   EXPECT_THAT(instances, ContainerEq(set<string>({"legacy/0"})));
325 
326   // Check hal with additional vendor instance not claimed by framework.
327   instances.clear();
328   EXPECT_TRUE(checker_->CheckHalForComplianceTest("android.hardware.camera",
329                                                   {1, 2}, "IBetterCamera",
330                                                   Arch::ARCH_32, &instances));
331   EXPECT_THAT(instances, ContainerEq(set<string>({"default", "camera"})));
332 
333   // Check hal supported by both framework and vendor.
334   instances.clear();
335   EXPECT_TRUE(checker_->CheckHalForComplianceTest(
336       "android.hardware.nfc", {1, 0}, "INfc", Arch::ARCH_32, &instances));
337   EXPECT_THAT(instances, ContainerEq(set<string>({"default", "fnfc"})));
338 
339   // Check hal instance claimed by framework but not supported by vendor.
340   instances.clear();
341   EXPECT_TRUE(checker_->CheckHalForComplianceTest(
342       "android.hardware.drm", {2, 0}, "IDrm", Arch::ARCH_32, &instances));
343   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
344 
345   // Check an optional hal with empty interface (legacy input).
346   instances.clear();
347   EXPECT_TRUE(checker_->CheckHalForComplianceTest(
348       "android.hardware.vibrator", {1, 0}, "" /*interface*/, Arch::ARCH_EMPTY,
349       &instances));
350   EXPECT_TRUE(instances.empty());
351 }
352 
TEST_F(VtsTestabilityCheckerTest,CheckNonComplianceTest)353 TEST_F(VtsTestabilityCheckerTest, CheckNonComplianceTest) {
354   set<string> instances;
355   ON_CALL(*sm_, listByInterface(_, _))
356       .WillByDefault(
357           Invoke([](hidl_string str, IServiceManager::listByInterface_cb cb) {
358             if (str == "android.hardware.foo@1.0::IFoo") {
359               cb({"default", "footest"});
360             } else if (str == "android.hardware.nfc@3.0::INfc") {
361               cb({"default"});
362             } else if (str == "android.hardware.drm@2.0::IDrm") {
363               cb({"drmtest"});
364             }
365             return hardware::Void();
366           }));
367 
368   ON_CALL(*sm_, list(_)).WillByDefault(Invoke([](IServiceManager::list_cb cb) {
369     cb({"android.hardware.foo@1.0::IFoo/default",
370         "android.hardware.foo@1.0::IFoo/footest",
371         "android.hardware.nfc@3.0::INfc/default",
372         "android.hardware.drm@2.0::IDrm/drmtest"});
373     return hardware::Void();
374   }));
375 
376   // Check non-existent hal.
377   EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
378       "non-existent", {1, 0}, "None", Arch::ARCH_32, &instances));
379   EXPECT_TRUE(instances.empty());
380   // Check hal with unsupported version by vendor.
381   EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
382       "android.hardware.nfc", {2, 0}, "INfc", Arch::ARCH_32, &instances));
383   EXPECT_TRUE(instances.empty());
384   // Check hal with unsupported interface by vendor.
385   EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
386       "android.hardware.nfc", {1, 0}, "INfcTest", Arch::ARCH_32, &instances));
387   EXPECT_TRUE(instances.empty());
388   // Check hal with unsupported arch by vendor.
389   EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
390       "android.hardware.audio", {1, 0}, "IAudio", Arch::ARCH_64, &instances));
391   EXPECT_TRUE(instances.empty());
392   // Check hal claimed by framework but not supported by vendor (error case).
393   EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
394       "android.hardware.light", {2, 0}, "ILight", Arch::ARCH_32, &instances));
395   EXPECT_TRUE(instances.empty());
396   // Check hal interface claimed by framework but not supported by vendor (error
397   // case).
398   EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
399       "android.hardware.drm", {1, 0}, "IDrmTest", Arch::ARCH_32, &instances));
400   EXPECT_TRUE(instances.empty());
401 
402   // Check hal claimed by framework and supported by vendor.
403   instances.clear();
404   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
405       "android.hardware.vibrator", {1, 0}, "IVibrator", Arch::ARCH_32,
406       &instances));
407   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
408 
409   // Check hal not claimed by framework but supported by vendor.
410   instances.clear();
411   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
412       "android.hardware.renderscript", {1, 0}, "IRenderscript", Arch::ARCH_32,
413       &instances));
414   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
415 
416   // Check hal with version not claimed by framework by supported by vendor.
417   instances.clear();
418   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
419       "android.hardware.vibrator", {1, 0}, "IVibrator", Arch::ARCH_32,
420       &instances));
421   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
422 
423   // Check hal with instance not claimed by framework but supported by vendor.
424   instances.clear();
425   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
426       "android.hardware.camera", {2, 2}, "ICamera", Arch::ARCH_32, &instances));
427   EXPECT_THAT(instances, ContainerEq(set<string>({"legacy/0"})));
428 
429   // Check hal with additional vendor instance not claimed by framework.
430   instances.clear();
431   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
432       "android.hardware.camera", {1, 2}, "IBetterCamera", Arch::ARCH_32,
433       &instances));
434   EXPECT_THAT(instances, ContainerEq(set<string>({"default", "camera"})));
435 
436   // Check hal supported by both framework and vendor.
437   instances.clear();
438   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
439       "android.hardware.nfc", {1, 0}, "INfc", Arch::ARCH_32, &instances));
440   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
441 
442   // Check an optional hal with empty interface (legacy input).
443   instances.clear();
444   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
445       "android.hardware.vibrator", {1, 0}, "" /*interface*/, Arch::ARCH_EMPTY,
446       &instances));
447   EXPECT_TRUE(instances.empty());
448 
449   // Check hal only registered with hwmanger.
450   instances.clear();
451   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
452       "android.hardware.foo", {1, 0}, "IFoo", Arch::ARCH_EMPTY, &instances));
453   EXPECT_THAT(instances, ContainerEq(set<string>({"default", "footest"})));
454 
455   // Check hal with version only registered with hwmanger.
456   instances.clear();
457   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
458       "android.hardware.nfc", {3, 0}, "INfc", Arch::ARCH_EMPTY, &instances));
459   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
460 
461   // Check hal with additional instance registered with hwmanger.
462   instances.clear();
463   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
464       "android.hardware.drm", {2, 0}, "IDrm", Arch::ARCH_EMPTY, &instances));
465   EXPECT_THAT(instances, ContainerEq(set<string>({"default", "drmtest"})));
466 
467   instances.clear();
468   EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
469       "android.hardware.foo", {1, 0}, "", Arch::ARCH_EMPTY, &instances));
470   EXPECT_TRUE(instances.empty());
471 }
472 
TEST_F(VtsTestabilityCheckerTest,CheckFrameworkCompatibleHalOptional)473 TEST_F(VtsTestabilityCheckerTest, CheckFrameworkCompatibleHalOptional) {
474   set<string> instances;
475   // Check non-existent hal.
476   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
477       "nonexistent", {1, 0}, "None", Arch::ARCH_EMPTY, &instances));
478   EXPECT_TRUE(instances.empty());
479 
480   // Check hal not required by framework
481   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
482       "android.hardware.renderscript", {1, 0}, "IRenderscript",
483       Arch::ARCH_EMPTY, &instances));
484   EXPECT_TRUE(instances.empty());
485 
486   // Check hal with unsupported version.
487   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
488       "android.hardware.camera", {1, 0}, "ICamera", Arch::ARCH_EMPTY,
489       &instances));
490   EXPECT_TRUE(instances.empty());
491 
492   // Check hal with non-existent interface.
493   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
494       "android.hardware.camera", {1, 2}, "None", Arch::ARCH_EMPTY, &instances));
495   EXPECT_TRUE(instances.empty());
496 
497   // Check an optional hal not supported by vendor.
498   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
499       "android.hardware.radio", {1, 0}, "IRadio", Arch::ARCH_EMPTY,
500       &instances));
501   EXPECT_TRUE(instances.empty());
502 
503   // Check an optional hal with version not supported by vendor.
504   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
505       "android.hardware.camera", {4, 5}, "ICamera", Arch::ARCH_EMPTY,
506       &instances));
507   EXPECT_TRUE(instances.empty());
508 
509   // Check an optional hal with interface not supported by vendor.
510   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
511       "android.hardware.nfc", {4, 5}, "INfcTest", Arch::ARCH_EMPTY,
512       &instances));
513   EXPECT_TRUE(instances.empty());
514 
515   // Check an option passthrough hal with unsupported arch.
516   EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
517       "android.hardware.audio", {2, 0}, "IAudio", Arch::ARCH_64, &instances));
518   EXPECT_TRUE(instances.empty());
519 
520   // Check an optional hal supported by vendor but with no compatible
521   // instance.
522   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
523       "android.hardware.camera", {2, 2}, "ICamera", Arch::ARCH_EMPTY,
524       &instances));
525   EXPECT_TRUE(instances.empty());
526 
527   // Check an optional hal supported by vendor.
528   instances.clear();
529   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
530       "android.hardware.camera", {2, 2}, "IBetterCamera", Arch::ARCH_EMPTY,
531       &instances));
532   EXPECT_THAT(instances, ContainerEq(set<string>({"camera"})));
533 
534   // Check an optional passthrough hal supported by vendor.
535   instances.clear();
536   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
537       "android.hardware.audio", {2, 0}, "IAudio", Arch::ARCH_32, &instances));
538   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
539 
540   // Check an optional hal with empty interface (legacy input).
541   instances.clear();
542   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
543       "android.hardware.camera", {2, 2}, "" /*interface*/, Arch::ARCH_EMPTY,
544       &instances));
545   EXPECT_TRUE(instances.empty());
546 }
547 
TEST_F(VtsTestabilityCheckerTest,CheckFrameworkCompatibleHalRequired)548 TEST_F(VtsTestabilityCheckerTest, CheckFrameworkCompatibleHalRequired) {
549   set<string> instances;
550   // Check a required hal not supported by vendor.
551   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
552       "android.hardware.light", {2, 0}, "ILight", Arch::ARCH_32, &instances));
553   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
554 
555   // Check a required hal with version not supported by vendor.
556   instances.clear();
557   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal("android.hardware.vibrator",
558                                                     {2, 0}, "IVibrator",
559                                                     Arch::ARCH_32, &instances));
560   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
561 
562   // Check a required hal with interface not supported by vendor.
563   instances.clear();
564   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
565       "android.hardware.drm", {1, 0}, "IDrmTest", Arch::ARCH_32, &instances));
566   EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));
567 
568   // Check a required hal supported by vendor.
569   instances.clear();
570   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
571       "android.hardware.drm", {1, 0}, "IDrm", Arch::ARCH_32, &instances));
572   EXPECT_THAT(instances, ContainerEq(set<string>({"default", "drm"})));
573 
574   // Check an optional hal with empty interface (legacy input).
575   instances.clear();
576   EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
577       "android.hardware.vibrator", {2, 0}, "" /*interface*/, Arch::ARCH_EMPTY,
578       &instances));
579   EXPECT_TRUE(instances.empty());
580 }
581 
582 }  // namespace vts
583 }  // namespace android
584 
main(int argc,char ** argv)585 int main(int argc, char **argv) {
586   ::testing::InitGoogleTest(&argc, argv);
587   return RUN_ALL_TESTS();
588 }
589