Home | History | Annotate | Download | only in test
      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 
     17 #define LOG_TAG "LibVintfTest"
     18 
     19 #include <algorithm>
     20 #include <functional>
     21 
     22 #include <vintf/CompatibilityMatrix.h>
     23 #include <vintf/KernelConfigParser.h>
     24 #include <vintf/VintfObject.h>
     25 #include <vintf/parse_string.h>
     26 #include <vintf/parse_xml.h>
     27 
     28 #include <android-base/logging.h>
     29 #include <android-base/parseint.h>
     30 #include <android-base/strings.h>
     31 #include <gtest/gtest.h>
     32 
     33 namespace android {
     34 namespace vintf {
     35 
     36 extern XmlConverter<Version>& gVersionConverter;
     37 extern XmlConverter<ManifestHal>& gManifestHalConverter;
     38 extern XmlConverter<MatrixHal>& gMatrixHalConverter;
     39 extern XmlConverter<KernelConfigTypedValue>& gKernelConfigTypedValueConverter;
     40 extern XmlConverter<HalManifest>& gHalManifestConverter;
     41 extern XmlConverter<CompatibilityMatrix>& gCompatibilityMatrixConverter;
     42 
     43 static bool In(const std::string& sub, const std::string& str) {
     44     return str.find(sub) != std::string::npos;
     45 }
     46 #define EXPECT_IN(sub, str) EXPECT_TRUE(In((sub), (str))) << (str);
     47 
     48 #ifndef LIBVINTF_TARGET
     49 #define EXPECT_CONTAINS(str, sub) EXPECT_IN(sub, str);
     50 #endif
     51 
     52 struct LibVintfTest : public ::testing::Test {
     53 public:
     54     virtual void SetUp() override {
     55     }
     56     virtual void TearDown() override {
     57     }
     58     bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
     59         return cm.add(std::move(hal));
     60     }
     61     bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
     62         return cm.add(std::move(kernel));
     63     }
     64     bool add(HalManifest &vm, ManifestHal &&hal) {
     65         return vm.add(std::move(hal));
     66     }
     67     void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
     68         MatrixXmlFile f;
     69         f.mName = name;
     70         f.mVersionRange = range;
     71         f.mFormat = XmlSchemaFormat::DTD;
     72         f.mOptional = true;
     73         cm.addXmlFile(std::move(f));
     74     }
     75     void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
     76         cm.framework.mSepolicy = sepolicy;
     77     }
     78     void set(CompatibilityMatrix &cm, SchemaType type) {
     79         cm.mType = type;
     80     }
     81     void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
     82         cm.device.mVndk.mVersionRange = range;
     83         cm.device.mVndk.mLibraries = libs;
     84     }
     85     void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
     86         ki.mBootVbmetaAvbVersion = vbmeta;
     87         ki.mBootAvbVersion = boot;
     88     }
     89     void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
     90         cm.framework.mAvbMetaVersion = avbVersion;
     91     }
     92     Version getAvb(CompatibilityMatrix &cm) {
     93         return cm.framework.mAvbMetaVersion;
     94     }
     95     const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
     96         return vm.getAnyHal(name);
     97     }
     98     MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
     99         return cm.getAnyHal(name);
    100     }
    101     ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
    102         return vm.getHals();
    103     }
    104     bool isValid(const ManifestHal &mh) {
    105         return mh.isValid();
    106     }
    107     std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
    108     bool addAllHalsAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2, std::string* e) {
    109         return cm1->addAllHalsAsOptional(cm2, e);
    110     }
    111     bool addAllXmlFilesAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2,
    112                                   std::string* e) {
    113         return cm1->addAllXmlFilesAsOptional(cm2, e);
    114     }
    115     std::set<std::string> checkUnusedHals(const HalManifest& m, const CompatibilityMatrix& cm) {
    116         return m.checkUnusedHals(cm);
    117     }
    118 
    119     std::map<std::string, HalInterface> testHalInterfaces() {
    120         HalInterface intf("IFoo", {"default"});
    121         std::map<std::string, HalInterface> map;
    122         map[intf.name()] = intf;
    123         return map;
    124     }
    125 
    126     HalManifest testDeviceManifest() {
    127         HalManifest vm;
    128         vm.mType = SchemaType::DEVICE;
    129         vm.device.mSepolicyVersion = {25, 0};
    130         vm.add(ManifestHal{HalFormat::HIDL,
    131                            "android.hardware.camera",
    132                            {Version(2, 0)},
    133                            {Transport::HWBINDER, Arch::ARCH_EMPTY},
    134                            {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
    135                             {"IBetterCamera", {"IBetterCamera", {"camera"}}}}});
    136         vm.add(ManifestHal{HalFormat::HIDL,
    137                            "android.hardware.nfc",
    138                            {Version(1, 0)},
    139                            {Transport::PASSTHROUGH, Arch::ARCH_32_64},
    140                            {{"INfc", {"INfc", {"default"}}}}});
    141 
    142         return vm;
    143     }
    144     HalManifest testDeviceManifestWithXmlFile() {
    145         HalManifest vm = testDeviceManifest();
    146         ManifestXmlFile xmlFile;
    147         xmlFile.mName = "media_profile";
    148         xmlFile.mVersion = {1, 0};
    149         vm.addXmlFile(std::move(xmlFile));
    150         return vm;
    151     }
    152     HalManifest testFrameworkManfiest() {
    153         HalManifest vm;
    154         vm.mType = SchemaType::FRAMEWORK;
    155         vm.add(ManifestHal{HalFormat::HIDL,
    156                            "android.hidl.manager",
    157                            {Version(1, 0)},
    158                            {Transport::HWBINDER, Arch::ARCH_EMPTY},
    159                            {
    160                                {"IServiceManager", {"IServiceManager", {"default"}}},
    161                            }});
    162         Vndk vndk2505;
    163         vndk2505.mVersionRange = {25, 0, 5};
    164         vndk2505.mLibraries = { "libjpeg.so", "libbase.so" };
    165         Vndk vndk2513;
    166         vndk2513.mVersionRange = {25, 1, 3};
    167         vndk2513.mLibraries = { "libjpeg.so", "libbase.so", "libtinyxml2.so" };
    168         vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
    169 
    170         return vm;
    171     }
    172     RuntimeInfo testRuntimeInfo() {
    173         RuntimeInfo info;
    174         info.mOsName = "Linux";
    175         info.mNodeName = "localhost";
    176         info.mOsRelease = "3.18.31-g936f9a479d0f";
    177         info.mKernelVersion = {3, 18, 31};
    178         info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
    179         info.mHardwareId = "aarch64";
    180         info.mKernelSepolicyVersion = 30;
    181         info.mKernelConfigs = {
    182             {"CONFIG_64BIT", "y"},
    183             {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
    184             {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
    185             {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
    186             {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}
    187         };
    188         setAvb(info, {2, 1}, {2, 1});
    189         return info;
    190     }
    191 };
    192 
    193 TEST_F(LibVintfTest, ArchOperatorOr) {
    194     Arch a = Arch::ARCH_EMPTY;
    195     a |= Arch::ARCH_32;
    196     EXPECT_EQ(Arch::ARCH_32, a);
    197 
    198     a |= Arch::ARCH_64;
    199     EXPECT_EQ(Arch::ARCH_32_64, a);
    200 
    201     a = Arch::ARCH_EMPTY;
    202     a |= Arch::ARCH_64;
    203     EXPECT_EQ(Arch::ARCH_64, a);
    204 }
    205 
    206 TEST_F(LibVintfTest, Stringify) {
    207     HalManifest vm = testDeviceManifest();
    208     EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/2.0:"
    209                         "hidl/android.hardware.nfc/passthrough32+64/1.0");
    210 
    211     EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
    212     EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
    213 
    214     VersionRange v(1, 2, 3);
    215     EXPECT_EQ(to_string(v), "1.2-3");
    216     VersionRange v2;
    217     EXPECT_TRUE(parse("1.2-3", &v2));
    218     EXPECT_EQ(v, v2);
    219 }
    220 
    221 TEST_F(LibVintfTest, GetTransport) {
    222     HalManifest vm = testDeviceManifest();
    223     EXPECT_EQ(Transport::HWBINDER, vm.getTransport("android.hardware.camera",
    224             {2, 0}, "ICamera", "default"));
    225 }
    226 
    227 TEST_F(LibVintfTest, FutureManifestCompatible) {
    228     HalManifest expectedManifest;
    229     expectedManifest.add(ManifestHal{HalFormat::HIDL,
    230                                      "android.hardware.foo",
    231                                      {Version(1, 0)},
    232                                      {Transport::HWBINDER, Arch::ARCH_EMPTY},
    233                                      {
    234                                          {"IFoo", {"IFoo", {"default"}}},
    235                                      }});
    236     std::string manifestXml =
    237         "<manifest version=\"1.0\" type=\"device\" might_add=\"true\">\n"
    238         "    <hal format=\"hidl\" attribuet_might_be_added=\"value\">\n"
    239         "        <name>android.hardware.foo</name>\n"
    240         "        <transport>hwbinder</transport>\n"
    241         "        <version>1.0</version>\n"
    242         "        <interface>\n"
    243         "            <name>IFoo</name>\n"
    244         "            <instance>default</instance>\n"
    245         "        </interface>\n"
    246         "    </hal>\n"
    247         "    <tag_might_be_added/>\n"
    248         "</manifest>\n";
    249     HalManifest manifest;
    250     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
    251     EXPECT_EQ(expectedManifest, manifest);
    252 }
    253 
    254 TEST_F(LibVintfTest, HalManifestConverter) {
    255     HalManifest vm = testDeviceManifest();
    256     std::string xml =
    257         gHalManifestConverter(vm, SerializeFlag::HALS_NO_FQNAME & SerializeFlag::SEPOLICY_ONLY);
    258     EXPECT_EQ(xml,
    259         "<manifest version=\"1.0\" type=\"device\">\n"
    260         "    <hal format=\"hidl\">\n"
    261         "        <name>android.hardware.camera</name>\n"
    262         "        <transport>hwbinder</transport>\n"
    263         "        <version>2.0</version>\n"
    264         "        <interface>\n"
    265         "            <name>IBetterCamera</name>\n"
    266         "            <instance>camera</instance>\n"
    267         "        </interface>\n"
    268         "        <interface>\n"
    269         "            <name>ICamera</name>\n"
    270         "            <instance>default</instance>\n"
    271         "            <instance>legacy/0</instance>\n"
    272         "        </interface>\n"
    273         "    </hal>\n"
    274         "    <hal format=\"hidl\">\n"
    275         "        <name>android.hardware.nfc</name>\n"
    276         "        <transport arch=\"32+64\">passthrough</transport>\n"
    277         "        <version>1.0</version>\n"
    278         "        <interface>\n"
    279         "            <name>INfc</name>\n"
    280         "            <instance>default</instance>\n"
    281         "        </interface>\n"
    282         "    </hal>\n"
    283         "    <sepolicy>\n"
    284         "        <version>25.0</version>\n"
    285         "    </sepolicy>\n"
    286         "</manifest>\n");
    287     HalManifest vm2;
    288     EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
    289     EXPECT_EQ(vm, vm2);
    290 }
    291 
    292 TEST_F(LibVintfTest, HalManifestConverterFramework) {
    293     HalManifest vm = testFrameworkManfiest();
    294     std::string xml =
    295         gHalManifestConverter(vm, SerializeFlag::HALS_NO_FQNAME & SerializeFlag::VNDK_ONLY);
    296     EXPECT_EQ(xml,
    297         "<manifest version=\"1.0\" type=\"framework\">\n"
    298         "    <hal format=\"hidl\">\n"
    299         "        <name>android.hidl.manager</name>\n"
    300         "        <transport>hwbinder</transport>\n"
    301         "        <version>1.0</version>\n"
    302         "        <interface>\n"
    303         "            <name>IServiceManager</name>\n"
    304         "            <instance>default</instance>\n"
    305         "        </interface>\n"
    306         "    </hal>\n"
    307         "    <vndk>\n"
    308         "        <version>25.0.5</version>\n"
    309         "        <library>libbase.so</library>\n"
    310         "        <library>libjpeg.so</library>\n"
    311         "    </vndk>\n"
    312         "    <vndk>\n"
    313         "        <version>25.1.3</version>\n"
    314         "        <library>libbase.so</library>\n"
    315         "        <library>libjpeg.so</library>\n"
    316         "        <library>libtinyxml2.so</library>\n"
    317         "    </vndk>\n"
    318         "</manifest>\n");
    319     HalManifest vm2;
    320     EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
    321     EXPECT_EQ(vm, vm2);
    322 }
    323 
    324 TEST_F(LibVintfTest, HalManifestOptional) {
    325     HalManifest vm;
    326     EXPECT_TRUE(gHalManifestConverter(&vm,
    327             "<manifest version=\"1.0\" type=\"device\"></manifest>"));
    328     EXPECT_TRUE(gHalManifestConverter(&vm,
    329             "<manifest version=\"1.0\" type=\"device\">"
    330             "    <hal>"
    331             "        <name>android.hidl.manager</name>"
    332             "        <transport>hwbinder</transport>"
    333             "        <version>1.0</version>"
    334             "    </hal>"
    335             "</manifest>"));
    336     EXPECT_FALSE(gHalManifestConverter(&vm,
    337             "<manifest version=\"1.0\" type=\"device\">"
    338             "    <hal>"
    339             "        <name>android.hidl.manager</name>"
    340             "        <version>1.0</version>"
    341             "    </hal>"
    342             "</manifest>"));
    343 }
    344 
    345 TEST_F(LibVintfTest, HalManifestNative) {
    346     HalManifest vm;
    347     EXPECT_TRUE(gHalManifestConverter(&vm,
    348                                       "<manifest version=\"1.0\" type=\"device\">"
    349                                       "    <hal format=\"native\">"
    350                                       "        <name>foo</name>"
    351                                       "        <version>1.0</version>"
    352                                       "    </hal>"
    353                                       "</manifest>"))
    354         << gHalManifestConverter.lastError();
    355     EXPECT_FALSE(gHalManifestConverter(&vm,
    356                                        "<manifest version=\"1.0\" type=\"device\">"
    357                                        "    <hal format=\"native\">"
    358                                        "        <name>foo</name>"
    359                                        "        <version>1.0</version>"
    360                                        "        <transport>hwbinder</transport>"
    361                                        "    </hal>"
    362                                        "</manifest>"));
    363     EXPECT_TRUE(gHalManifestConverter.lastError().find(
    364                     "Native HAL 'foo' should not have <transport> defined") != std::string::npos);
    365 }
    366 
    367 TEST_F(LibVintfTest, HalManifestDuplicate) {
    368     HalManifest vm;
    369     EXPECT_FALSE(gHalManifestConverter(&vm,
    370                                        "<manifest version=\"1.0\" type=\"device\">"
    371                                        "    <hal>"
    372                                        "        <name>android.hidl.manager</name>"
    373                                        "        <transport>hwbinder</transport>"
    374                                        "        <version>1.0</version>"
    375                                        "        <version>1.1</version>"
    376                                        "    </hal>"
    377                                        "</manifest>"))
    378         << "Should not allow duplicated major version in <hal>";
    379     EXPECT_FALSE(gHalManifestConverter(&vm,
    380                                        "<manifest version=\"1.0\" type=\"device\">"
    381                                        "    <hal>"
    382                                        "        <name>android.hidl.manager</name>"
    383                                        "        <transport>hwbinder</transport>"
    384                                        "        <version>1.0</version>"
    385                                        "    </hal>"
    386                                        "    <hal>"
    387                                        "        <name>android.hidl.manager</name>"
    388                                        "        <transport arch=\"32+64\">passthrough</transport>"
    389                                        "        <version>1.1</version>"
    390                                        "    </hal>"
    391                                        "</manifest>"))
    392         << "Should not allow duplicated major version across <hal>";
    393 }
    394 
    395 TEST_F(LibVintfTest, HalManifestGetTransport) {
    396     HalManifest vm;
    397     EXPECT_TRUE(gHalManifestConverter(&vm,
    398                                       "<manifest version=\"1.0\" type=\"device\">"
    399                                       "    <hal>"
    400                                       "        <name>android.hidl.manager</name>"
    401                                       "        <transport>hwbinder</transport>"
    402                                       "        <version>1.0</version>"
    403                                       "        <interface>"
    404                                       "            <name>IServiceManager</name>"
    405                                       "            <instance>default</instance>"
    406                                       "        </interface>"
    407                                       "    </hal>"
    408                                       "    <hal>"
    409                                       "        <name>android.hidl.manager</name>"
    410                                       "        <transport arch=\"32+64\">passthrough</transport>"
    411                                       "        <version>2.1</version>"
    412                                       "        <interface>"
    413                                       "            <name>IServiceManager</name>"
    414                                       "            <instance>default</instance>"
    415                                       "        </interface>"
    416                                       "    </hal>"
    417                                       "</manifest>"));
    418     EXPECT_EQ(Transport::PASSTHROUGH,
    419               vm.getTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
    420     EXPECT_EQ(Transport::PASSTHROUGH,
    421               vm.getTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
    422     EXPECT_EQ(Transport::EMPTY,
    423               vm.getTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
    424     EXPECT_EQ(Transport::HWBINDER,
    425               vm.getTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
    426 }
    427 
    428 TEST_F(LibVintfTest, HalManifestInstances) {
    429     HalManifest vm = testDeviceManifest();
    430     EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "ICamera"),
    431               std::set<std::string>({"default", "legacy/0"}));
    432     EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
    433               std::set<std::string>({"camera"}));
    434     EXPECT_EQ(vm.getInstances("android.hardware.camera", {2, 0}, "INotExist"),
    435               std::set<std::string>({}));
    436     EXPECT_EQ(vm.getInstances("android.hardware.nfc", {1, 0}, "INfc"),
    437               std::set<std::string>({"default"}));
    438 
    439     EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
    440     EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
    441     EXPECT_TRUE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
    442     EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
    443 
    444     EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
    445     EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
    446     EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
    447     EXPECT_FALSE(vm.hasInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
    448     EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
    449 }
    450 
    451 TEST_F(LibVintfTest, VersionConverter) {
    452     Version v(3, 6);
    453     std::string xml = gVersionConverter(v);
    454     EXPECT_EQ(xml, "<version>3.6</version>\n");
    455     Version v2;
    456     EXPECT_TRUE(gVersionConverter(&v2, xml));
    457     EXPECT_EQ(v, v2);
    458 }
    459 
    460 static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
    461     std::string name{intf.name()};
    462     return map->emplace(std::move(name), std::move(intf)).second;
    463 }
    464 
    465 TEST_F(LibVintfTest, MatrixHalConverter) {
    466     MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
    467             {{VersionRange(1,2,3), VersionRange(4,5,6)}},
    468             false /* optional */, {}};
    469     EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
    470     EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
    471     std::string xml = gMatrixHalConverter(mh);
    472     EXPECT_EQ(xml,
    473         "<hal format=\"native\" optional=\"false\">\n"
    474         "    <name>android.hardware.camera</name>\n"
    475         "    <version>1.2-3</version>\n"
    476         "    <version>4.5-6</version>\n"
    477         "    <interface>\n"
    478         "        <name>IBetterCamera</name>\n"
    479         "        <instance>default</instance>\n"
    480         "        <instance>great</instance>\n"
    481         "    </interface>\n"
    482         "    <interface>\n"
    483         "        <name>ICamera</name>\n"
    484         "        <instance>default</instance>\n"
    485         "    </interface>\n"
    486         "</hal>\n");
    487     MatrixHal mh2;
    488     EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
    489     EXPECT_EQ(mh, mh2);
    490 }
    491 
    492 TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
    493 
    494     KernelConfigTypedValue converted;
    495 
    496     auto testOne = [] (const KernelConfigTypedValue &original,
    497                     const std::string &expectXml) {
    498         std::string xml;
    499         KernelConfigTypedValue converted;
    500         xml = gKernelConfigTypedValueConverter(original);
    501         EXPECT_EQ(xml, expectXml);
    502         EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
    503         EXPECT_EQ(original, converted);
    504     };
    505 
    506     auto testParse = [] (const KernelConfigTypedValue &original,
    507                     const std::string &xml) {
    508         KernelConfigTypedValue converted;
    509         EXPECT_TRUE(gKernelConfigTypedValueConverter(&converted, xml));
    510         EXPECT_EQ(original, converted);
    511     };
    512 
    513     testOne(KernelConfigTypedValue("stringvalue"),
    514         "<value type=\"string\">stringvalue</value>\n");
    515     testOne(KernelConfigTypedValue(""),
    516         "<value type=\"string\"></value>\n");
    517 
    518     testOne(KernelConfigTypedValue(Tristate::YES),
    519         "<value type=\"tristate\">y</value>\n");
    520     testOne(KernelConfigTypedValue(Tristate::NO),
    521         "<value type=\"tristate\">n</value>\n");
    522     testOne(KernelConfigTypedValue(Tristate::MODULE),
    523         "<value type=\"tristate\">m</value>\n");
    524     EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
    525         "<value type=\"tristate\">q</value>\n"));
    526 
    527     testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
    528         "<value type=\"range\">4-20</value>\n");
    529     testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
    530         "<value type=\"range\">0-18446744073709551615</value>\n");
    531     testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
    532             "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
    533 
    534     EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
    535             "<value type=\"int\">-18446744073709551616</value>\n"));
    536 
    537     testOne(KernelConfigTypedValue(INT64_MIN),
    538          "<value type=\"int\">-9223372036854775808</value>\n");
    539     testParse(KernelConfigTypedValue(INT64_MIN),
    540             "<value type=\"int\">0x8000000000000000</value>\n");
    541     testParse(KernelConfigTypedValue(INT64_MIN),
    542             "<value type=\"int\">-0X8000000000000000</value>\n");
    543 
    544     testParse(KernelConfigTypedValue(INT64_MIN + 1),
    545             "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
    546 
    547     testParse(KernelConfigTypedValue(-0x50),
    548             "<value type=\"int\">-0x50</value>\n");
    549 
    550     testOne(KernelConfigTypedValue(0),
    551          "<value type=\"int\">0</value>\n");
    552 
    553     // Truncation for underflow.
    554     testParse(KernelConfigTypedValue(1),
    555             "<value type=\"int\">-0xffffffffffffffff</value>\n");
    556     testParse(KernelConfigTypedValue(1),
    557             "<value type=\"int\">-18446744073709551615</value>\n");
    558 
    559     testOne(KernelConfigTypedValue(INT64_MAX),
    560          "<value type=\"int\">9223372036854775807</value>\n");
    561     testParse(KernelConfigTypedValue(INT64_MAX),
    562             "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
    563     // Truncation for underflow.
    564     testParse(KernelConfigTypedValue(INT64_MAX),
    565             "<value type=\"int\">-9223372036854775809</value>\n");
    566 
    567     testParse(KernelConfigTypedValue(-1),
    568             "<value type=\"int\">18446744073709551615</value>\n");
    569     testParse(KernelConfigTypedValue(-1),
    570             "<value type=\"int\">0xffffffffffffffff</value>\n");
    571 
    572     EXPECT_FALSE(gKernelConfigTypedValueConverter(&converted,
    573             "<value type=\"int\">18446744073709551616</value>\n"));
    574 }
    575 
    576 TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
    577     CompatibilityMatrix cm;
    578     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
    579             {{VersionRange(1,2,3), VersionRange(4,5,6)}},
    580             false /* optional */, testHalInterfaces()}));
    581     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
    582             {{VersionRange(4,5,6), VersionRange(10,11,12)}},
    583             true /* optional */, testHalInterfaces()}));
    584     EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
    585             {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
    586     EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
    587             {KernelConfig{"CONFIG_BAZ", 20}, KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
    588     set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}}));
    589     setAvb(cm, Version{2, 1});
    590     std::string xml = gCompatibilityMatrixConverter(cm);
    591     EXPECT_EQ(xml,
    592             "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
    593             "    <hal format=\"native\" optional=\"false\">\n"
    594             "        <name>android.hardware.camera</name>\n"
    595             "        <version>1.2-3</version>\n"
    596             "        <version>4.5-6</version>\n"
    597             "        <interface>\n"
    598             "            <name>IFoo</name>\n"
    599             "            <instance>default</instance>\n"
    600             "        </interface>\n"
    601             "    </hal>\n"
    602             "    <hal format=\"native\" optional=\"true\">\n"
    603             "        <name>android.hardware.nfc</name>\n"
    604             "        <version>4.5-6</version>\n"
    605             "        <version>10.11-12</version>\n"
    606             "        <interface>\n"
    607             "            <name>IFoo</name>\n"
    608             "            <instance>default</instance>\n"
    609             "        </interface>\n"
    610             "    </hal>\n"
    611             "    <kernel version=\"3.18.22\">\n"
    612             "        <config>\n"
    613             "            <key>CONFIG_FOO</key>\n"
    614             "            <value type=\"tristate\">y</value>\n"
    615             "        </config>\n"
    616             "        <config>\n"
    617             "            <key>CONFIG_BAR</key>\n"
    618             "            <value type=\"string\">stringvalue</value>\n"
    619             "        </config>\n"
    620             "    </kernel>\n"
    621             "    <kernel version=\"4.4.1\">\n"
    622             "        <config>\n"
    623             "            <key>CONFIG_BAZ</key>\n"
    624             "            <value type=\"int\">20</value>\n"
    625             "        </config>\n"
    626             "        <config>\n"
    627             "            <key>CONFIG_BAR</key>\n"
    628             "            <value type=\"range\">3-5</value>\n"
    629             "        </config>\n"
    630             "    </kernel>\n"
    631             "    <sepolicy>\n"
    632             "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
    633             "        <sepolicy-version>25.0</sepolicy-version>\n"
    634             "        <sepolicy-version>26.0-3</sepolicy-version>\n"
    635             "    </sepolicy>\n"
    636             "    <avb>\n"
    637             "        <vbmeta-version>2.1</vbmeta-version>\n"
    638             "    </avb>\n"
    639             "</compatibility-matrix>\n");
    640     CompatibilityMatrix cm2;
    641     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
    642     EXPECT_EQ(cm, cm2);
    643 }
    644 
    645 TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
    646     CompatibilityMatrix cm;
    647     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
    648             {{VersionRange(1,0)}},
    649             false /* optional */, testHalInterfaces()}));
    650     set(cm, SchemaType::DEVICE);
    651     set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
    652     std::string xml = gCompatibilityMatrixConverter(cm);
    653     EXPECT_EQ(xml,
    654         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
    655         "    <hal format=\"native\" optional=\"false\">\n"
    656         "        <name>android.hidl.manager</name>\n"
    657         "        <version>1.0</version>\n"
    658         "        <interface>\n"
    659         "            <name>IFoo</name>\n"
    660         "            <instance>default</instance>\n"
    661         "        </interface>\n"
    662         "    </hal>\n"
    663         "    <vndk>\n"
    664         "        <version>25.0.1-5</version>\n"
    665         "        <library>libbase.so</library>\n"
    666         "        <library>libjpeg.so</library>\n"
    667         "    </vndk>\n"
    668         "</compatibility-matrix>\n");
    669     CompatibilityMatrix cm2;
    670     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
    671     EXPECT_EQ(cm, cm2);
    672 }
    673 
    674 TEST_F(LibVintfTest, IsValid) {
    675     EXPECT_TRUE(isValid(ManifestHal()));
    676 
    677     ManifestHal invalidHal{HalFormat::HIDL,
    678                            "android.hardware.camera",
    679                            {{Version(2, 0), Version(2, 1)}},
    680                            {Transport::PASSTHROUGH, Arch::ARCH_32_64},
    681                            {}};
    682 
    683     EXPECT_FALSE(isValid(invalidHal));
    684     HalManifest vm2;
    685     EXPECT_FALSE(add(vm2, std::move(invalidHal)));
    686 }
    687 
    688 TEST_F(LibVintfTest, HalManifestGetHalNames) {
    689     HalManifest vm = testDeviceManifest();
    690     EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
    691                   {"android.hardware.camera", "android.hardware.nfc"}));
    692 }
    693 
    694 TEST_F(LibVintfTest, HalManifestGetAllHals) {
    695     HalManifest vm = testDeviceManifest();
    696     EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
    697     EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
    698 
    699     std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
    700     size_t i = 0;
    701     for (const auto &hal : getHals(vm)) {
    702         EXPECT_EQ(hal.name, arr[i++]);
    703     }
    704 }
    705 
    706 TEST_F(LibVintfTest, HalManifestGetHals) {
    707     HalManifest vm;
    708     EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
    709                                     "android.hardware.camera",
    710                                     {Version(1, 2)},
    711                                     {Transport::HWBINDER, Arch::ARCH_EMPTY},
    712                                     {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
    713                                      {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
    714     EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
    715                                     "android.hardware.camera",
    716                                     {Version(2, 0)},
    717                                     {Transport::HWBINDER, Arch::ARCH_EMPTY},
    718                                     {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
    719                                      {"IBetterCamera", {"IBetterCamera", {"camera"}}}}}));
    720     EXPECT_TRUE(add(vm, ManifestHal{HalFormat::HIDL,
    721                                     "android.hardware.nfc",
    722                                     {Version(1, 0), Version(2, 1)},
    723                                     {Transport::PASSTHROUGH, Arch::ARCH_32_64},
    724                                     {{"INfc", {"INfc", {"default"}}}}}));
    725     ManifestHal expectedCameraHalV1_2 =
    726         ManifestHal{HalFormat::HIDL,
    727                     "android.hardware.camera",
    728                     {Version(1, 2)},
    729                     {Transport::HWBINDER, Arch::ARCH_EMPTY},
    730                     {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
    731                      {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
    732     ManifestHal expectedCameraHalV2_0 =
    733         ManifestHal{HalFormat::HIDL,
    734                     "android.hardware.camera",
    735                     {Version(2, 0)},
    736                     {Transport::HWBINDER, Arch::ARCH_EMPTY},
    737                     {{"ICamera", {"ICamera", {"legacy/0", "default"}}},
    738                      {"IBetterCamera", {"IBetterCamera", {"camera"}}}}};
    739     ManifestHal expectedNfcHal = ManifestHal{HalFormat::HIDL,
    740                                              "android.hardware.nfc",
    741                                              {Version(1, 0), Version(2, 1)},
    742                                              {Transport::PASSTHROUGH, Arch::ARCH_32_64},
    743                                              {{"INfc", {"INfc", {"default"}}}}};
    744     auto cameraHals = vm.getHals("android.hardware.camera");
    745     EXPECT_EQ((int)cameraHals.size(), 2);
    746     EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
    747     EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
    748     auto nfcHals = vm.getHals("android.hardware.nfc");
    749     EXPECT_EQ((int)nfcHals.size(), 1);
    750     EXPECT_EQ(*nfcHals[0], expectedNfcHal);
    751 }
    752 
    753 TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
    754     CompatibilityMatrix cm;
    755     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
    756                                   "android.hardware.camera",
    757                                   {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
    758                                   false /* optional */,
    759                                   testHalInterfaces()}));
    760     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
    761                                   "android.hardware.nfc",
    762                                   {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
    763                                   true /* optional */,
    764                                   testHalInterfaces()}));
    765 
    766     MatrixHal expectedCameraHal = MatrixHal{
    767         HalFormat::NATIVE,
    768         "android.hardware.camera",
    769         {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
    770         false /* optional */,
    771         testHalInterfaces(),
    772     };
    773     MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
    774                                          "android.hardware.nfc",
    775                                          {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
    776                                          true /* optional */,
    777                                          testHalInterfaces()};
    778     auto cameraHals = cm.getHals("android.hardware.camera");
    779     EXPECT_EQ((int)cameraHals.size(), 1);
    780     EXPECT_EQ(*cameraHals[0], expectedCameraHal);
    781     auto nfcHals = cm.getHals("android.hardware.nfc");
    782     EXPECT_EQ((int)nfcHals.size(), 1);
    783     EXPECT_EQ(*nfcHals[0], expectedNfcHal);
    784 }
    785 
    786 TEST_F(LibVintfTest, RuntimeInfo) {
    787     RuntimeInfo ki = testRuntimeInfo();
    788     using KernelConfigs = std::vector<KernelConfig>;
    789     const KernelConfigs configs {
    790             KernelConfig{"CONFIG_64BIT", Tristate::YES},
    791             KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
    792             KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
    793             KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
    794             KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
    795             KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
    796     };
    797 
    798     auto testMatrix = [&] (MatrixKernel &&kernel) {
    799         CompatibilityMatrix cm;
    800         add(cm, std::move(kernel));
    801         set(cm, {30, {{25, 0}}});
    802         setAvb(cm, {2, 1});
    803         return cm;
    804     };
    805 
    806     std::string error;
    807 
    808     {
    809         MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
    810         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    811         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
    812     }
    813 
    814     {
    815         MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
    816         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    817         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
    818     }
    819 
    820     {
    821         MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
    822         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    823         EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
    824     }
    825 
    826     {
    827         MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
    828         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    829         set(cm, Sepolicy{22, {{25, 0}}});
    830         EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
    831         set(cm, Sepolicy{40, {{25, 0}}});
    832         EXPECT_FALSE(ki.checkCompatibility(cm, &error))
    833             << "kernel-sepolicy-version shouldn't match";
    834         EXPECT_IN("kernelSepolicyVersion = 30 but required >= 40", error);
    835     }
    836 
    837     {
    838         KernelConfigs newConfigs(configs);
    839         newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
    840         MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
    841         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    842         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
    843     }
    844 
    845     {
    846         KernelConfigs newConfigs(configs);
    847         newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
    848         MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
    849         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    850         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
    851     }
    852 
    853     {
    854         KernelConfigs newConfigs(configs);
    855         newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
    856         MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
    857         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    858         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
    859     }
    860 
    861     {
    862         KernelConfigs newConfigs(configs);
    863         newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
    864         MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
    865         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    866         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
    867     }
    868 
    869     {
    870         KernelConfigs newConfigs(configs);
    871         newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
    872         MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
    873         CompatibilityMatrix cm = testMatrix(std::move(kernel));
    874         EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
    875     }
    876 
    877     RuntimeInfo badAvb = testRuntimeInfo();
    878     CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
    879     {
    880         setAvb(badAvb, {1, 0}, {2, 1});
    881         EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
    882         EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
    883     }
    884     {
    885         setAvb(badAvb, {2, 1}, {3, 0});
    886         EXPECT_FALSE(badAvb.checkCompatibility(cm, &error));
    887     }
    888     {
    889         setAvb(badAvb, {2, 1}, {2, 3});
    890         EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
    891     }
    892     {
    893         setAvb(badAvb, {2, 3}, {2, 1});
    894         EXPECT_TRUE(badAvb.checkCompatibility(cm, &error));
    895     }
    896 }
    897 
    898 TEST_F(LibVintfTest, MissingAvb) {
    899     std::string xml =
    900         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
    901         "    <kernel version=\"3.18.31\"></kernel>"
    902         "    <sepolicy>\n"
    903         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
    904         "        <sepolicy-version>25.5</sepolicy-version>\n"
    905         "    </sepolicy>\n"
    906         "</compatibility-matrix>\n";
    907     CompatibilityMatrix cm;
    908     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
    909     EXPECT_EQ(getAvb(cm), Version(0, 0));
    910 }
    911 
    912 TEST_F(LibVintfTest, DisableAvb) {
    913     std::string xml =
    914         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
    915         "    <kernel version=\"3.18.31\"></kernel>"
    916         "    <sepolicy>\n"
    917         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
    918         "        <sepolicy-version>25.5</sepolicy-version>\n"
    919         "    </sepolicy>\n"
    920         "    <avb>\n"
    921         "        <vbmeta-version>1.0</vbmeta-version>\n"
    922         "    </avb>\n"
    923         "</compatibility-matrix>\n";
    924     CompatibilityMatrix cm;
    925     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml));
    926     RuntimeInfo ki = testRuntimeInfo();
    927     std::string error;
    928     EXPECT_FALSE(ki.checkCompatibility(cm, &error));
    929     EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
    930     EXPECT_TRUE(ki.checkCompatibility(cm, &error, DISABLE_AVB_CHECK)) << error;
    931 }
    932 
    933 // This is the test extracted from VINTF Object doc
    934 TEST_F(LibVintfTest, HalCompat) {
    935     CompatibilityMatrix matrix;
    936     std::string error;
    937 
    938     std::string matrixXml =
    939             "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
    940             "    <hal format=\"hidl\" optional=\"false\">\n"
    941             "        <name>android.hardware.foo</name>\n"
    942             "        <version>1.0</version>\n"
    943             "        <version>3.1-2</version>\n"
    944             "        <interface>\n"
    945             "            <name>IFoo</name>\n"
    946             "            <instance>default</instance>\n"
    947             "            <instance>specific</instance>\n"
    948             "        </interface>\n"
    949             "    </hal>\n"
    950             "    <hal format=\"hidl\" optional=\"false\">\n"
    951             "        <name>android.hardware.foo</name>\n"
    952             "        <version>2.0</version>\n"
    953             "        <interface>\n"
    954             "            <name>IBar</name>\n"
    955             "            <instance>default</instance>\n"
    956             "        </interface>\n"
    957             "    </hal>\n"
    958             "    <sepolicy>\n"
    959             "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
    960             "        <sepolicy-version>25.5</sepolicy-version>\n"
    961             "    </sepolicy>\n"
    962             "</compatibility-matrix>\n";
    963     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
    964             << gCompatibilityMatrixConverter.lastError();
    965 
    966     {
    967         std::string manifestXml =
    968                 "<manifest version=\"1.0\" type=\"device\">\n"
    969                 "    <hal format=\"hidl\">\n"
    970                 "        <name>android.hardware.foo</name>\n"
    971                 "        <transport>hwbinder</transport>\n"
    972                 "        <version>1.0</version>\n"
    973                 "        <interface>\n"
    974                 "            <name>IFoo</name>\n"
    975                 "            <instance>default</instance>\n"
    976                 "            <instance>specific</instance>\n"
    977                 "        </interface>\n"
    978                 "    </hal>\n"
    979                 "    <hal format=\"hidl\">\n"
    980                 "        <name>android.hardware.foo</name>\n"
    981                 "        <transport>hwbinder</transport>\n"
    982                 "        <version>2.0</version>\n"
    983                 "        <interface>\n"
    984                 "            <name>IBar</name>\n"
    985                 "            <instance>default</instance>\n"
    986                 "        </interface>\n"
    987                 "    </hal>\n"
    988                 "    <sepolicy>\n"
    989                 "        <version>25.5</version>\n"
    990                 "    </sepolicy>\n"
    991                 "</manifest>\n";
    992 
    993         HalManifest manifest;
    994         EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
    995         EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
    996     }
    997 
    998     {
    999         std::string manifestXml =
   1000                 "<manifest version=\"1.0\" type=\"device\">\n"
   1001                 "    <hal format=\"hidl\">\n"
   1002                 "        <name>android.hardware.foo</name>\n"
   1003                 "        <transport>hwbinder</transport>\n"
   1004                 "        <version>1.0</version>\n"
   1005                 "        <interface>\n"
   1006                 "            <name>IFoo</name>\n"
   1007                 "            <instance>default</instance>\n"
   1008                 "            <instance>specific</instance>\n"
   1009                 "        </interface>\n"
   1010                 "    </hal>\n"
   1011                 "    <sepolicy>\n"
   1012                 "        <version>25.5</version>\n"
   1013                 "    </sepolicy>\n"
   1014                 "</manifest>\n";
   1015         HalManifest manifest;
   1016         EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1017         EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
   1018                 << "should not be compatible because IBar is missing";
   1019     }
   1020 
   1021     {
   1022         std::string manifestXml =
   1023                 "<manifest version=\"1.0\" type=\"device\">\n"
   1024                 "    <hal format=\"hidl\">\n"
   1025                 "        <name>android.hardware.foo</name>\n"
   1026                 "        <transport>hwbinder</transport>\n"
   1027                 "        <version>1.0</version>\n"
   1028                 "        <interface>\n"
   1029                 "            <name>IFoo</name>\n"
   1030                 "            <instance>default</instance>\n"
   1031                 "        </interface>\n"
   1032                 "    </hal>\n"
   1033                 "    <hal format=\"hidl\">\n"
   1034                 "        <name>android.hardware.foo</name>\n"
   1035                 "        <transport>hwbinder</transport>\n"
   1036                 "        <version>2.0</version>\n"
   1037                 "        <interface>\n"
   1038                 "            <name>IBar</name>\n"
   1039                 "            <instance>default</instance>\n"
   1040                 "        </interface>\n"
   1041                 "    </hal>\n"
   1042                 "    <sepolicy>\n"
   1043                 "        <version>25.5</version>\n"
   1044                 "    </sepolicy>\n"
   1045                 "</manifest>\n";
   1046         HalManifest manifest;
   1047         EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1048         EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
   1049             << "should not be compatible because IFoo/specific is missing";
   1050     }
   1051 
   1052     {
   1053         std::string manifestXml =
   1054                 "<manifest version=\"1.0\" type=\"device\">\n"
   1055                 "    <hal format=\"hidl\">\n"
   1056                 "        <name>android.hardware.foo</name>\n"
   1057                 "        <transport>hwbinder</transport>\n"
   1058                 "        <version>3.3</version>\n"
   1059                 "        <interface>\n"
   1060                 "            <name>IFoo</name>\n"
   1061                 "            <instance>default</instance>\n"
   1062                 "            <instance>specific</instance>\n"
   1063                 "        </interface>\n"
   1064                 "    </hal>\n"
   1065                 "    <hal format=\"hidl\">\n"
   1066                 "        <name>android.hardware.foo</name>\n"
   1067                 "        <transport>hwbinder</transport>\n"
   1068                 "        <version>2.0</version>\n"
   1069                 "        <interface>\n"
   1070                 "            <name>IBar</name>\n"
   1071                 "            <instance>default</instance>\n"
   1072                 "        </interface>\n"
   1073                 "    </hal>\n"
   1074                 "    <sepolicy>\n"
   1075                 "        <version>25.5</version>\n"
   1076                 "    </sepolicy>\n"
   1077                 "</manifest>\n";
   1078         HalManifest manifest;
   1079         EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1080         EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   1081     }
   1082 
   1083     {
   1084         std::string manifestXml =
   1085                 "<manifest version=\"1.0\" type=\"device\">\n"
   1086                 "    <hal format=\"hidl\">\n"
   1087                 "        <name>android.hardware.foo</name>\n"
   1088                 "        <transport>hwbinder</transport>\n"
   1089                 "        <version>1.0</version>\n"
   1090                 "        <interface>\n"
   1091                 "            <name>IFoo</name>\n"
   1092                 "            <instance>default</instance>\n"
   1093                 "        </interface>\n"
   1094                 "    </hal>\n"
   1095                 "    <hal format=\"hidl\">\n"
   1096                 "        <name>android.hardware.foo</name>\n"
   1097                 "        <transport>hwbinder</transport>\n"
   1098                 "        <version>3.2</version>\n"
   1099                 "        <interface>\n"
   1100                 "            <name>IFoo</name>\n"
   1101                 "            <instance>specific</instance>\n"
   1102                 "        </interface>\n"
   1103                 "    </hal>\n"
   1104                 "    <hal format=\"hidl\">\n"
   1105                 "        <name>android.hardware.foo</name>\n"
   1106                 "        <transport>hwbinder</transport>\n"
   1107                 "        <version>2.0</version>\n"
   1108                 "        <interface>\n"
   1109                 "            <name>IBar</name>\n"
   1110                 "            <instance>default</instance>\n"
   1111                 "        </interface>\n"
   1112                 "    </hal>\n"
   1113                 "    <sepolicy>\n"
   1114                 "        <version>25.5</version>\n"
   1115                 "    </sepolicy>\n"
   1116                 "</manifest>\n";
   1117         HalManifest manifest;
   1118         EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1119         EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
   1120                 << "should not be compatible even though @1.0::IFoo/default "
   1121                 << "and @3.2::IFoo/specific present";
   1122     }
   1123 
   1124     {
   1125         std::string manifestXml =
   1126                 "<manifest version=\"1.0\" type=\"device\">\n"
   1127                 "    <hal format=\"hidl\">\n"
   1128                 "        <name>android.hardware.foo</name>\n"
   1129                 "        <transport>hwbinder</transport>\n"
   1130                 "        <version>1.0</version>\n"
   1131                 "        <interface>\n"
   1132                 "            <name>IFoo</name>\n"
   1133                 "            <instance>default</instance>\n"
   1134                 "            <instance>specific</instance>\n"
   1135                 "        </interface>\n"
   1136                 "    </hal>\n"
   1137                 "    <hal format=\"hidl\">\n"
   1138                 "        <name>android.hardware.foo</name>\n"
   1139                 "        <transport>hwbinder</transport>\n"
   1140                 "        <version>2.0</version>\n"
   1141                 "        <interface>\n"
   1142                 "            <name>IBar</name>\n"
   1143                 "            <instance>default</instance>\n"
   1144                 "        </interface>\n"
   1145                 "    </hal>\n"
   1146                 "    <sepolicy>\n"
   1147                 "        <version>25.5</version>\n"
   1148                 "    </sepolicy>\n"
   1149                 "</manifest>\n";
   1150         HalManifest manifest;
   1151         EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml))
   1152             << gHalManifestConverter.lastError();
   1153         EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   1154     }
   1155 }
   1156 
   1157 TEST_F(LibVintfTest, Compat) {
   1158     std::string manifestXml =
   1159         "<manifest version=\"1.0\" type=\"device\">\n"
   1160         "    <hal format=\"hidl\">\n"
   1161         "        <name>android.hardware.camera</name>\n"
   1162         "        <transport>hwbinder</transport>\n"
   1163         "        <version>3.5</version>\n"
   1164         "        <interface>\n"
   1165         "            <name>IBetterCamera</name>\n"
   1166         "            <instance>camera</instance>\n"
   1167         "        </interface>\n"
   1168         "        <interface>\n"
   1169         "            <name>ICamera</name>\n"
   1170         "            <instance>default</instance>\n"
   1171         "            <instance>legacy/0</instance>\n"
   1172         "        </interface>\n"
   1173         "    </hal>\n"
   1174         "    <hal format=\"hidl\">\n"
   1175         "        <name>android.hardware.nfc</name>\n"
   1176         "        <transport>hwbinder</transport>\n"
   1177         "        <version>1.0</version>\n"
   1178         "        <interface>\n"
   1179         "            <name>INfc</name>\n"
   1180         "            <instance>nfc_nci</instance>\n"
   1181         "        </interface>\n"
   1182         "    </hal>\n"
   1183         "    <hal format=\"hidl\">\n"
   1184         "        <name>android.hardware.nfc</name>\n"
   1185         "        <transport>hwbinder</transport>\n"
   1186         "        <version>2.0</version>\n"
   1187         "        <interface>\n"
   1188         "            <name>INfc</name>\n"
   1189         "            <instance>default</instance>\n"
   1190         "            <instance>nfc_nci</instance>\n"
   1191         "        </interface>\n"
   1192         "    </hal>\n"
   1193         "    <sepolicy>\n"
   1194         "        <version>25.5</version>\n"
   1195         "    </sepolicy>\n"
   1196         "</manifest>\n";
   1197 
   1198     std::string matrixXml =
   1199         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1200         "    <hal format=\"hidl\" optional=\"false\">\n"
   1201         "        <name>android.hardware.camera</name>\n"
   1202         "        <version>2.0-5</version>\n"
   1203         "        <version>3.4-16</version>\n"
   1204         "        <interface>\n"
   1205         "            <name>IBetterCamera</name>\n"
   1206         "            <instance>camera</instance>\n"
   1207         "        </interface>\n"
   1208         "        <interface>\n"
   1209         "            <name>ICamera</name>\n"
   1210         "            <instance>default</instance>\n"
   1211         "            <instance>legacy/0</instance>\n"
   1212         "        </interface>\n"
   1213         "    </hal>\n"
   1214         "    <hal format=\"hidl\" optional=\"false\">\n"
   1215         "        <name>android.hardware.nfc</name>\n"
   1216         "        <version>1.0</version>\n"
   1217         "        <version>2.0</version>\n"
   1218         "        <interface>\n"
   1219         "            <name>INfc</name>\n"
   1220         "            <instance>nfc_nci</instance>\n"
   1221         "        </interface>\n"
   1222         "    </hal>\n"
   1223         "    <hal format=\"hidl\" optional=\"true\">\n"
   1224         "        <name>android.hardware.foo</name>\n"
   1225         "        <version>1.0</version>\n"
   1226         "    </hal>\n"
   1227         "    <sepolicy>\n"
   1228         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1229         "        <sepolicy-version>25.5</sepolicy-version>\n"
   1230         "        <sepolicy-version>26.0-3</sepolicy-version>\n"
   1231         "    </sepolicy>\n"
   1232         "    <avb>\n"
   1233         "        <vbmeta-version>2.1</vbmeta-version>\n"
   1234         "    </avb>\n"
   1235         "</compatibility-matrix>\n";
   1236 
   1237     HalManifest manifest;
   1238     CompatibilityMatrix matrix;
   1239     std::string error;
   1240     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1241     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1242     EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   1243 
   1244     // some smaller test cases
   1245     matrixXml =
   1246         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1247         "    <hal format=\"hidl\" optional=\"false\">\n"
   1248         "        <name>android.hardware.camera</name>\n"
   1249         "        <version>3.4</version>\n"
   1250         "    </hal>\n"
   1251         "    <sepolicy>\n"
   1252         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1253         "        <sepolicy-version>25.5</sepolicy-version>\n"
   1254         "    </sepolicy>\n"
   1255         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1256         "</compatibility-matrix>\n";
   1257     matrix = {};
   1258     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1259     EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   1260     MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
   1261     EXPECT_NE(camera, nullptr);
   1262     camera->versionRanges[0] = {3, 5};
   1263     EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   1264     camera->versionRanges[0] = {3, 6};
   1265     EXPECT_FALSE(manifest.checkCompatibility(matrix));
   1266 
   1267     // reset it
   1268     matrix = {};
   1269     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1270     set(matrix, Sepolicy{30, {{26, 0}}});
   1271     EXPECT_FALSE(manifest.checkCompatibility(matrix));
   1272     set(matrix, Sepolicy{30, {{25, 6}}});
   1273     EXPECT_FALSE(manifest.checkCompatibility(matrix));
   1274     set(matrix, Sepolicy{30, {{25, 4}}});
   1275     EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   1276 }
   1277 
   1278 /////////////////// xmlfile tests
   1279 
   1280 TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
   1281     HalManifest vm = testDeviceManifestWithXmlFile();
   1282     std::string xml =
   1283         gHalManifestConverter(vm, SerializeFlag::HALS_NO_FQNAME & SerializeFlag::SEPOLICY_ONLY &
   1284                                       SerializeFlag::XMLFILES_ONLY);
   1285     EXPECT_EQ(xml,
   1286               "<manifest version=\"1.0\" type=\"device\">\n"
   1287               "    <hal format=\"hidl\">\n"
   1288               "        <name>android.hardware.camera</name>\n"
   1289               "        <transport>hwbinder</transport>\n"
   1290               "        <version>2.0</version>\n"
   1291               "        <interface>\n"
   1292               "            <name>IBetterCamera</name>\n"
   1293               "            <instance>camera</instance>\n"
   1294               "        </interface>\n"
   1295               "        <interface>\n"
   1296               "            <name>ICamera</name>\n"
   1297               "            <instance>default</instance>\n"
   1298               "            <instance>legacy/0</instance>\n"
   1299               "        </interface>\n"
   1300               "    </hal>\n"
   1301               "    <hal format=\"hidl\">\n"
   1302               "        <name>android.hardware.nfc</name>\n"
   1303               "        <transport arch=\"32+64\">passthrough</transport>\n"
   1304               "        <version>1.0</version>\n"
   1305               "        <interface>\n"
   1306               "            <name>INfc</name>\n"
   1307               "            <instance>default</instance>\n"
   1308               "        </interface>\n"
   1309               "    </hal>\n"
   1310               "    <sepolicy>\n"
   1311               "        <version>25.0</version>\n"
   1312               "    </sepolicy>\n"
   1313               "    <xmlfile>\n"
   1314               "        <name>media_profile</name>\n"
   1315               "        <version>1.0</version>\n"
   1316               "    </xmlfile>\n"
   1317               "</manifest>\n");
   1318     HalManifest vm2;
   1319     EXPECT_TRUE(gHalManifestConverter(&vm2, xml));
   1320     EXPECT_EQ(vm, vm2);
   1321 }
   1322 
   1323 TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
   1324     CompatibilityMatrix cm;
   1325     addXmlFile(cm, "media_profile", {1, 0});
   1326     std::string xml = gCompatibilityMatrixConverter(cm, SerializeFlag::XMLFILES_ONLY);
   1327     EXPECT_EQ(xml,
   1328               "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1329               "    <xmlfile format=\"dtd\" optional=\"true\">\n"
   1330               "        <name>media_profile</name>\n"
   1331               "        <version>1.0</version>\n"
   1332               "    </xmlfile>\n"
   1333               "</compatibility-matrix>\n");
   1334     CompatibilityMatrix cm2;
   1335     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml));
   1336     EXPECT_EQ(cm, cm2);
   1337 }
   1338 
   1339 TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
   1340     std::string xml =
   1341         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1342         "    <xmlfile format=\"dtd\" optional=\"false\">\n"
   1343         "        <name>media_profile</name>\n"
   1344         "        <version>1.0</version>\n"
   1345         "    </xmlfile>\n"
   1346         "</compatibility-matrix>\n";
   1347     CompatibilityMatrix cm;
   1348     EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml));
   1349     EXPECT_EQ(
   1350         "compatibility-matrix.xmlfile entry media_profile has to be optional for "
   1351         "compatibility matrix version 1.0",
   1352         gCompatibilityMatrixConverter.lastError());
   1353 }
   1354 
   1355 TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
   1356     std::string manifestXml =
   1357         "<manifest version=\"1.0\" type=\"device\">"
   1358         "    <xmlfile>"
   1359         "        <name>media_profile</name>"
   1360         "        <version>1.0</version>"
   1361         "    </xmlfile>"
   1362         "</manifest>";
   1363     HalManifest manifest;
   1364     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1365     EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
   1366               "/vendor/etc/media_profile_V1_0.xml");
   1367 }
   1368 
   1369 TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
   1370     std::string manifestXml =
   1371         "<manifest version=\"1.0\" type=\"framework\">"
   1372         "    <xmlfile>"
   1373         "        <name>media_profile</name>"
   1374         "        <version>1.0</version>"
   1375         "    </xmlfile>"
   1376         "</manifest>";
   1377     HalManifest manifest;
   1378     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1379     EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
   1380               "/system/etc/media_profile_V1_0.xml");
   1381 }
   1382 
   1383 TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
   1384     std::string manifestXml =
   1385         "<manifest version=\"1.0\" type=\"device\">"
   1386         "    <xmlfile>"
   1387         "        <name>media_profile</name>"
   1388         "        <version>1.0</version>"
   1389         "        <path>/vendor/etc/foo.xml</path>"
   1390         "    </xmlfile>"
   1391         "</manifest>";
   1392     HalManifest manifest;
   1393     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1394     EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
   1395 }
   1396 
   1397 TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
   1398     std::string manifestXml =
   1399         "<manifest version=\"1.0\" type=\"device\">"
   1400         "    <xmlfile>"
   1401         "        <name>media_profile</name>"
   1402         "        <version>1.1</version>"
   1403         "    </xmlfile>"
   1404         "</manifest>";
   1405     HalManifest manifest;
   1406     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
   1407     EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
   1408 }
   1409 
   1410 TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
   1411     std::string matrixXml =
   1412         "<compatibility-matrix version=\"1.0\" type=\"framework\">"
   1413         "    <xmlfile format=\"dtd\" optional=\"true\">"
   1414         "        <name>media_profile</name>"
   1415         "        <version>2.0-1</version>"
   1416         "    </xmlfile>"
   1417         "</compatibility-matrix>";
   1418     CompatibilityMatrix matrix;
   1419     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1420     EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
   1421               "/system/etc/media_profile_V2_1.dtd");
   1422 }
   1423 
   1424 TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
   1425     std::string matrixXml =
   1426         "<compatibility-matrix version=\"1.0\" type=\"device\">"
   1427         "    <xmlfile format=\"xsd\" optional=\"true\">"
   1428         "        <name>media_profile</name>"
   1429         "        <version>2.0-1</version>"
   1430         "    </xmlfile>"
   1431         "</compatibility-matrix>";
   1432     CompatibilityMatrix matrix;
   1433     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1434     EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
   1435               "/vendor/etc/media_profile_V2_1.xsd");
   1436 }
   1437 
   1438 TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
   1439     std::string matrixXml =
   1440         "<compatibility-matrix version=\"1.0\" type=\"framework\">"
   1441         "    <xmlfile format=\"xsd\" optional=\"true\">"
   1442         "        <name>media_profile</name>"
   1443         "        <version>2.0-1</version>"
   1444         "        <path>/system/etc/foo.xsd</path>"
   1445         "    </xmlfile>"
   1446         "</compatibility-matrix>";
   1447     CompatibilityMatrix matrix;
   1448     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1449     EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
   1450 }
   1451 
   1452 TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
   1453     std::string matrixXml =
   1454         "<compatibility-matrix version=\"1.0\" type=\"framework\">"
   1455         "    <xmlfile format=\"dtd\" optional=\"true\">"
   1456         "        <name>media_profile</name>"
   1457         "        <version>2.1</version>"
   1458         "    </xmlfile>"
   1459         "</compatibility-matrix>";
   1460     CompatibilityMatrix matrix;
   1461     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1462     EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
   1463 }
   1464 
   1465 std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
   1466                                                     bool relaxedFormat = false) {
   1467     KernelConfigParser parser(processComments, relaxedFormat);
   1468     const char* p = data.c_str();
   1469     size_t n = 0;
   1470     size_t chunkSize;
   1471     status_t status = OK;
   1472     for (; n < data.size(); p += chunkSize, n += chunkSize) {
   1473         chunkSize = std::min<size_t>(5, data.size() - n);
   1474         if ((status = parser.process(p, chunkSize)) != OK) {
   1475             break;
   1476         }
   1477     }
   1478     return {std::move(parser), status};
   1479 }
   1480 
   1481 TEST_F(LibVintfTest, KernelConfigParser) {
   1482     // usage in /proc/config.gz
   1483     const std::string data =
   1484         "# CONFIG_NOT_SET is not set\n"
   1485         "CONFIG_ONE=1\n"
   1486         "CONFIG_Y=y\n"
   1487         "CONFIG_STR=\"string\"\n";
   1488     auto pair = processData(data, false /* processComments */);
   1489     ASSERT_EQ(OK, pair.second) << pair.first.error();
   1490     const auto& configs = pair.first.configs();
   1491 
   1492     EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
   1493     EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
   1494     EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
   1495     EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
   1496 }
   1497 
   1498 TEST_F(LibVintfTest, KernelConfigParser2) {
   1499     // usage in android-base.cfg
   1500     const std::string data =
   1501         "# CONFIG_NOT_SET is not set\n"
   1502         "CONFIG_ONE=1\n"
   1503         "CONFIG_Y=y\n"
   1504         "CONFIG_STR=string\n"
   1505         "# ignore_thiscomment\n"
   1506         "# CONFIG_NOT_SET2 is not set\n";
   1507     auto pair = processData(data, true /* processComments */);
   1508     ASSERT_EQ(OK, pair.second) << pair.first.error();
   1509     const auto& configs = pair.first.configs();
   1510 
   1511     EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
   1512     EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
   1513     EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
   1514     EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
   1515     EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
   1516 }
   1517 
   1518 TEST_F(LibVintfTest, KernelConfigParserSpace) {
   1519     // usage in android-base.cfg
   1520     const std::string data =
   1521         "   #   CONFIG_NOT_SET is not set   \n"
   1522         "  CONFIG_ONE=1   # 'tis a one!\n"
   1523         " CONFIG_TWO=2 #'tis a two!   \n"
   1524         " CONFIG_THREE=3#'tis a three!   \n"
   1525         " CONFIG_233=233#'tis a three!   \n"
   1526         "#yey! random comments\n"
   1527         "CONFIG_Y=y   \n"
   1528         " CONFIG_YES=y#YES!   \n"
   1529         "CONFIG_STR=string\n"
   1530         "CONFIG_HELLO=hello world!  #still works\n"
   1531         "CONFIG_WORLD=hello world!       \n"
   1532         "CONFIG_GOOD   =   good morning!  #comments here\n"
   1533         "    CONFIG_MORNING   =   good morning!  \n";
   1534     auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
   1535     ASSERT_EQ(OK, pair.second) << pair.first.error();
   1536     const auto& configs = pair.first.configs();
   1537 
   1538     EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
   1539     EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
   1540     EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
   1541     EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
   1542     EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
   1543     EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
   1544         << "Value should be \"hello world!\" without trailing spaces";
   1545     EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
   1546         << "Value should be \"hello world!\" without trailing spaces";
   1547     EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
   1548         << "Value should be \"good morning!\" without leading or trailing spaces";
   1549     EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
   1550         << "Value should be \"good morning!\" without leading or trailing spaces";
   1551     EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
   1552 }
   1553 
   1554 TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
   1555     std::string matrixXml;
   1556     CompatibilityMatrix matrix;
   1557 
   1558     matrixXml =
   1559         "<compatibility-matrix version=\"1.0\" type=\"device\">"
   1560         "    <hal format=\"native\" optional=\"false\">"
   1561         "        <name>netutils-wrapper</name>"
   1562         "        <version>1.0</version>"
   1563         "    </hal>"
   1564         "</compatibility-matrix>";
   1565     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml))
   1566         << gCompatibilityMatrixConverter.lastError();
   1567 
   1568 // only host libvintf hardcodes netutils-wrapper version requirements
   1569 #ifndef LIBVINTF_TARGET
   1570 
   1571     matrixXml =
   1572         "<compatibility-matrix version=\"1.0\" type=\"device\">"
   1573         "    <hal format=\"native\" optional=\"false\">"
   1574         "        <name>netutils-wrapper</name>"
   1575         "        <version>1.0-1</version>"
   1576         "    </hal>"
   1577         "</compatibility-matrix>";
   1578     EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1579     EXPECT_CONTAINS(
   1580         gCompatibilityMatrixConverter.lastError(),
   1581         "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
   1582         "Perhaps you mean '1.0'?");
   1583 
   1584     matrixXml =
   1585         "<compatibility-matrix version=\"1.0\" type=\"device\">"
   1586         "    <hal format=\"native\" optional=\"false\">"
   1587         "        <name>netutils-wrapper</name>"
   1588         "        <version>1.1</version>"
   1589         "    </hal>"
   1590         "</compatibility-matrix>";
   1591     EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1592     EXPECT_CONTAINS(
   1593         gCompatibilityMatrixConverter.lastError(),
   1594         "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
   1595         "Perhaps you mean '1.0'?");
   1596 
   1597     matrixXml =
   1598         "<compatibility-matrix version=\"1.0\" type=\"device\">"
   1599         "    <hal format=\"native\" optional=\"false\">"
   1600         "        <name>netutils-wrapper</name>"
   1601         "        <version>1.0</version>"
   1602         "        <version>2.0</version>"
   1603         "    </hal>"
   1604         "</compatibility-matrix>";
   1605     EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, matrixXml));
   1606     EXPECT_CONTAINS(
   1607         gCompatibilityMatrixConverter.lastError(),
   1608         "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
   1609         "is specified.");
   1610 
   1611 #endif  // LIBVINTF_TARGET
   1612 }
   1613 
   1614 TEST_F(LibVintfTest, NetutilsWrapperManifest) {
   1615     std::string manifestXml;
   1616     HalManifest manifest;
   1617 
   1618     manifestXml =
   1619         "<manifest version=\"1.0\" type=\"framework\">"
   1620         "    <hal format=\"native\">"
   1621         "        <name>netutils-wrapper</name>"
   1622         "        <version>1.0</version>"
   1623         "        <version>2.0</version>"
   1624         "    </hal>"
   1625         "</manifest>";
   1626     EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml)) << gHalManifestConverter.lastError();
   1627 
   1628 // only host libvintf hardcodes netutils-wrapper version requirements
   1629 #ifndef LIBVINTF_TARGET
   1630 
   1631     manifestXml =
   1632         "<manifest version=\"1.0\" type=\"framework\">"
   1633         "    <hal format=\"native\">"
   1634         "        <name>netutils-wrapper</name>"
   1635         "        <version>1.1</version>"
   1636         "    </hal>"
   1637         "</manifest>";
   1638     EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
   1639     EXPECT_CONTAINS(
   1640         gCompatibilityMatrixConverter.lastError(),
   1641         "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
   1642         "is specified.");
   1643 
   1644     manifestXml =
   1645         "<manifest version=\"1.0\" type=\"framework\">"
   1646         "    <hal format=\"native\">"
   1647         "        <name>netutils-wrapper</name>"
   1648         "        <version>1.0</version>"
   1649         "        <version>2.1</version>"
   1650         "    </hal>"
   1651         "</manifest>";
   1652     EXPECT_FALSE(gHalManifestConverter(&manifest, manifestXml));
   1653     EXPECT_CONTAINS(
   1654         gCompatibilityMatrixConverter.lastError(),
   1655         "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
   1656         "is specified.");
   1657 
   1658 #endif  // LIBVINTF_TARGET
   1659 }
   1660 
   1661 TEST_F(LibVintfTest, KernelConfigConditionTest) {
   1662     std::string xml =
   1663         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1664         "    <kernel version=\"3.18.22\"/>\n"
   1665         "    <kernel version=\"3.18.22\">\n"
   1666         "        <conditions>\n"
   1667         "            <config>\n"
   1668         "                <key>CONFIG_ARM</key>\n"
   1669         "                <value type=\"tristate\">y</value>\n"
   1670         "            </config>\n"
   1671         "        </conditions>\n"
   1672         "        <config>\n"
   1673         "            <key>CONFIG_FOO</key>\n"
   1674         "            <value type=\"tristate\">y</value>\n"
   1675         "        </config>\n"
   1676         "    </kernel>\n"
   1677         "    <sepolicy>\n"
   1678         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1679         "        <sepolicy-version>25.0</sepolicy-version>\n"
   1680         "    </sepolicy>\n"
   1681         "    <avb>\n"
   1682         "        <vbmeta-version>2.1</vbmeta-version>\n"
   1683         "    </avb>\n"
   1684         "</compatibility-matrix>\n";
   1685 
   1686     CompatibilityMatrix cm;
   1687     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1688         << gCompatibilityMatrixConverter.lastError();
   1689     const auto& kernels = getKernels(cm);
   1690     ASSERT_GE(kernels.size(), 2u);
   1691     ASSERT_TRUE(kernels[0].conditions().empty());
   1692     const auto& kernel = kernels[1];
   1693     const auto& cond = kernel.conditions();
   1694     ASSERT_FALSE(cond.empty());
   1695     EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
   1696     EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
   1697     EXPECT_FALSE(kernel.configs().empty());
   1698 
   1699     EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
   1700 }
   1701 
   1702 TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
   1703     std::string xml =
   1704         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1705         "    <kernel version=\"4.4.0\"/>\n"
   1706         "    <kernel version=\"3.18.22\">\n"
   1707         "        <conditions>\n"
   1708         "            <config>\n"
   1709         "                <key>CONFIG_ARM</key>\n"
   1710         "                <value type=\"tristate\">y</value>\n"
   1711         "            </config>\n"
   1712         "        </conditions>\n"
   1713         "    </kernel>\n"
   1714         "</compatibility-matrix>\n";
   1715 
   1716     CompatibilityMatrix cm;
   1717     EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
   1718         << "Should not accept first kernel version with non-empty conditions";
   1719     EXPECT_EQ(
   1720         "First <kernel> for version 3.18 must have empty <conditions> "
   1721         "for backwards compatibility.",
   1722         gCompatibilityMatrixConverter.lastError());
   1723 }
   1724 
   1725 TEST_F(LibVintfTest, KernelConfigConditionMatch) {
   1726     RuntimeInfo runtime = testRuntimeInfo();
   1727     std::string error;
   1728     std::string xml;
   1729     CompatibilityMatrix cm;
   1730 
   1731     xml =
   1732         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1733         "    <kernel version=\"3.18.22\"/>\n"
   1734         "    <kernel version=\"3.18.22\">\n"
   1735         "        <conditions>\n"
   1736         "            <config>\n"
   1737         "                <key>CONFIG_64BIT</key>\n"
   1738         "                <value type=\"tristate\">y</value>\n"
   1739         "            </config>\n"
   1740         "        </conditions>\n"
   1741         "        <config>\n"
   1742         "            <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1743         "            <value type=\"int\">24</value>\n"
   1744         "        </config>\n"
   1745         "    </kernel>\n"
   1746         "    <sepolicy>\n"
   1747         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1748         "    </sepolicy>\n"
   1749         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1750         "</compatibility-matrix>\n";
   1751 
   1752     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1753         << gCompatibilityMatrixConverter.lastError();
   1754     EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
   1755 
   1756     xml =
   1757         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1758         "    <kernel version=\"3.18.22\"/>\n"
   1759         "    <kernel version=\"3.18.22\">\n"
   1760         "        <conditions>\n"
   1761         "            <config>\n"
   1762         "                <key>CONFIG_64BIT</key>\n"
   1763         "                <value type=\"tristate\">y</value>\n"
   1764         "            </config>\n"
   1765         "        </conditions>\n"
   1766         "        <config>\n"
   1767         "            <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1768         "            <value type=\"int\">26</value>\n"
   1769         "        </config>\n"
   1770         "    </kernel>\n"
   1771         "    <sepolicy>\n"
   1772         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1773         "    </sepolicy>\n"
   1774         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1775         "</compatibility-matrix>\n";
   1776 
   1777     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1778         << gCompatibilityMatrixConverter.lastError();
   1779     EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
   1780         << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
   1781 
   1782     xml =
   1783         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1784         "    <kernel version=\"3.18.22\"/>\n"
   1785         "    <kernel version=\"3.18.22\">\n"
   1786         "        <conditions>\n"
   1787         "            <config>\n"
   1788         "                <key>CONFIG_64BIT</key>\n"
   1789         "                <value type=\"tristate\">n</value>\n"
   1790         "            </config>\n"
   1791         "        </conditions>\n"
   1792         "        <config>\n"
   1793         "            <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1794         "            <value type=\"int\">26</value>\n"
   1795         "        </config>\n"
   1796         "    </kernel>\n"
   1797         "    <sepolicy>\n"
   1798         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1799         "    </sepolicy>\n"
   1800         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1801         "</compatibility-matrix>\n";
   1802 
   1803     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1804         << gCompatibilityMatrixConverter.lastError();
   1805     EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
   1806     xml =
   1807         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1808         "    <kernel version=\"3.18.22\"/>\n"
   1809         "    <kernel version=\"3.18.22\">\n"
   1810         "        <conditions>\n"
   1811         "            <config>\n"
   1812         "                <key>CONFIG_64BIT</key>\n"
   1813         "                <value type=\"tristate\">y</value>\n"
   1814         "            </config>\n"
   1815         "            <config>\n"
   1816         "                <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1817         "                <value type=\"int\">24</value>\n"
   1818         "            </config>\n"
   1819         "        </conditions>\n"
   1820         "        <config>\n"
   1821         "            <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
   1822         "            <value type=\"int\">0xdead000000000000</value>\n"
   1823         "        </config>\n"
   1824         "    </kernel>\n"
   1825         "    <sepolicy>\n"
   1826         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1827         "    </sepolicy>\n"
   1828         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1829         "</compatibility-matrix>\n";
   1830 
   1831     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1832         << gCompatibilityMatrixConverter.lastError();
   1833     EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
   1834 
   1835     xml =
   1836         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1837         "    <kernel version=\"3.18.22\"/>\n"
   1838         "    <kernel version=\"3.18.22\">\n"
   1839         "        <conditions>\n"
   1840         "            <config>\n"
   1841         "                <key>CONFIG_64BIT</key>\n"
   1842         "                <value type=\"tristate\">y</value>\n"
   1843         "            </config>\n"
   1844         "            <config>\n"
   1845         "                <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1846         "                <value type=\"int\">24</value>\n"
   1847         "            </config>\n"
   1848         "        </conditions>\n"
   1849         "        <config>\n"
   1850         "            <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
   1851         "            <value type=\"int\">0xbeaf000000000000</value>\n"
   1852         "        </config>\n"
   1853         "    </kernel>\n"
   1854         "    <sepolicy>\n"
   1855         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1856         "    </sepolicy>\n"
   1857         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1858         "</compatibility-matrix>\n";
   1859 
   1860     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1861         << gCompatibilityMatrixConverter.lastError();
   1862     EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
   1863         << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
   1864 
   1865     xml =
   1866         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1867         "    <kernel version=\"3.18.22\"/>\n"
   1868         "    <kernel version=\"3.18.22\">\n"
   1869         "        <conditions>\n"
   1870         "            <config>\n"
   1871         "                <key>CONFIG_64BIT</key>\n"
   1872         "                <value type=\"tristate\">y</value>\n"
   1873         "            </config>\n"
   1874         "            <config>\n"
   1875         "                <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1876         "                <value type=\"int\">26</value>\n"
   1877         "            </config>\n"
   1878         "        </conditions>\n"
   1879         "        <config>\n"
   1880         "            <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
   1881         "            <value type=\"int\">0xbeaf000000000000</value>\n"
   1882         "        </config>\n"
   1883         "    </kernel>\n"
   1884         "    <sepolicy>\n"
   1885         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1886         "    </sepolicy>\n"
   1887         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1888         "</compatibility-matrix>\n";
   1889 
   1890     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1891         << gCompatibilityMatrixConverter.lastError();
   1892     EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
   1893 
   1894     xml =
   1895         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1896         "    <kernel version=\"3.18.22\">\n"
   1897         "        <config>\n"
   1898         "            <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
   1899         "            <value type=\"string\"/>\n"
   1900         "        </config>\n"
   1901         "    </kernel>\n"
   1902         "    <kernel version=\"3.18.22\">\n"
   1903         "        <conditions>\n"
   1904         "            <config>\n"
   1905         "                <key>CONFIG_64BIT</key>\n"
   1906         "                <value type=\"tristate\">y</value>\n"
   1907         "            </config>\n"
   1908         "        </conditions>\n"
   1909         "        <config>\n"
   1910         "            <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
   1911         "            <value type=\"int\">0xdead000000000000</value>\n"
   1912         "        </config>\n"
   1913         "    </kernel>\n"
   1914         "    <kernel version=\"3.18.22\">\n"
   1915         "        <conditions>\n"
   1916         "            <config>\n"
   1917         "                <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1918         "                <value type=\"int\">24</value>\n"
   1919         "            </config>\n"
   1920         "        </conditions>\n"
   1921         "        <config>\n"
   1922         "            <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
   1923         "            <value type=\"string\">binder,hwbinder</value>\n"
   1924         "        </config>\n"
   1925         "    </kernel>\n"
   1926         "    <sepolicy>\n"
   1927         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1928         "    </sepolicy>\n"
   1929         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1930         "</compatibility-matrix>\n";
   1931 
   1932     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1933         << gCompatibilityMatrixConverter.lastError();
   1934     EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
   1935 
   1936     xml =
   1937         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1938         "    <kernel version=\"3.18.22\">\n"
   1939         "        <config>\n"
   1940         "            <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
   1941         "            <value type=\"string\"/>\n"
   1942         "        </config>\n"
   1943         "    </kernel>\n"
   1944         "    <kernel version=\"3.18.22\">\n"
   1945         "        <conditions>\n"
   1946         "            <config>\n"
   1947         "                <key>CONFIG_64BIT</key>\n"
   1948         "                <value type=\"tristate\">y</value>\n"
   1949         "            </config>\n"
   1950         "        </conditions>\n"
   1951         "        <config>\n"
   1952         "            <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
   1953         "            <value type=\"int\">0xbeaf000000000000</value>\n"
   1954         "        </config>\n"
   1955         "    </kernel>\n"
   1956         "    <kernel version=\"3.18.22\">\n"
   1957         "        <conditions>\n"
   1958         "            <config>\n"
   1959         "                <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   1960         "                <value type=\"int\">24</value>\n"
   1961         "            </config>\n"
   1962         "        </conditions>\n"
   1963         "        <config>\n"
   1964         "            <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
   1965         "            <value type=\"string\">binder,hwbinder</value>\n"
   1966         "        </config>\n"
   1967         "    </kernel>\n"
   1968         "    <sepolicy>\n"
   1969         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   1970         "    </sepolicy>\n"
   1971         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   1972         "</compatibility-matrix>\n";
   1973 
   1974     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   1975         << gCompatibilityMatrixConverter.lastError();
   1976     EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
   1977 
   1978     xml =
   1979         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   1980         "    <kernel version=\"3.18.22\">\n"
   1981         "        <config>\n"
   1982         "            <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
   1983         "            <value type=\"string\"/>\n"
   1984         "        </config>\n"
   1985         "    </kernel>\n"
   1986         "    <kernel version=\"3.18.22\">\n"
   1987         "        <conditions>\n"
   1988         "            <config>\n"
   1989         "                <key>CONFIG_64BIT</key>\n"
   1990         "                <value type=\"tristate\">y</value>\n"
   1991         "            </config>\n"
   1992         "        </conditions>\n"
   1993         "        <config>\n"
   1994         "            <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
   1995         "            <value type=\"int\">0xdead000000000000</value>\n"
   1996         "        </config>\n"
   1997         "    </kernel>\n"
   1998         "    <kernel version=\"3.18.22\">\n"
   1999         "        <conditions>\n"
   2000         "            <config>\n"
   2001         "                <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
   2002         "                <value type=\"int\">24</value>\n"
   2003         "            </config>\n"
   2004         "        </conditions>\n"
   2005         "        <config>\n"
   2006         "            <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
   2007         "            <value type=\"string\">binder</value>\n"
   2008         "        </config>\n"
   2009         "    </kernel>\n"
   2010         "    <sepolicy>\n"
   2011         "        <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
   2012         "    </sepolicy>\n"
   2013         "    <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
   2014         "</compatibility-matrix>\n";
   2015 
   2016     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2017         << gCompatibilityMatrixConverter.lastError();
   2018     EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
   2019 }
   2020 
   2021 // Run KernelConfigParserInvalidTest on processComments = {true, false}
   2022 class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
   2023 
   2024 TEST_P(KernelConfigParserInvalidTest, NonSet1) {
   2025     const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
   2026     auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
   2027     ASSERT_EQ(OK, pair.second) << pair.first.error();
   2028     const auto& configs = pair.first.configs();
   2029     EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
   2030         << "CONFIG_NOT_EXIST should not exist because of typo";
   2031 }
   2032 
   2033 TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
   2034     const std::string data = "FOO_CONFIG=foo\n";
   2035     ASSERT_NE(OK,
   2036               processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
   2037 }
   2038 
   2039 TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
   2040     const std::string data = "CONFIG_BAR-BAZ=foo\n";
   2041     ASSERT_NE(OK,
   2042               processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
   2043 }
   2044 
   2045 INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
   2046 
   2047 TEST_F(LibVintfTest, MatrixLevel) {
   2048     CompatibilityMatrix cm;
   2049     std::string xml;
   2050 
   2051     xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
   2052     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2053         << gCompatibilityMatrixConverter.lastError();
   2054     EXPECT_EQ(Level::UNSPECIFIED, cm.level());
   2055 
   2056     xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
   2057     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2058         << gCompatibilityMatrixConverter.lastError();
   2059     EXPECT_EQ(Level::LEGACY, cm.level());
   2060 
   2061     xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
   2062     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2063         << gCompatibilityMatrixConverter.lastError();
   2064     EXPECT_EQ(1u, cm.level());
   2065 }
   2066 
   2067 TEST_F(LibVintfTest, ManifestLevel) {
   2068     HalManifest manifest;
   2069     std::string xml;
   2070 
   2071     xml = "<manifest version=\"1.0\" type=\"device\"/>";
   2072     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2073     EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
   2074 
   2075     xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
   2076     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2077     EXPECT_EQ(Level::LEGACY, manifest.level());
   2078 
   2079     xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
   2080     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2081     EXPECT_EQ(1u, manifest.level());
   2082 }
   2083 
   2084 TEST_F(LibVintfTest, AddOptionalHal) {
   2085     CompatibilityMatrix cm1;
   2086     CompatibilityMatrix cm2;
   2087     std::string error;
   2088     std::string xml;
   2089 
   2090     xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
   2091     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2092         << gCompatibilityMatrixConverter.lastError();
   2093 
   2094     xml =
   2095         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2096         "    <hal format=\"hidl\" optional=\"false\">\n"
   2097         "        <name>android.hardware.foo</name>\n"
   2098         "        <version>1.0-1</version>\n"
   2099         "        <interface>\n"
   2100         "            <name>IFoo</name>\n"
   2101         "            <instance>default</instance>\n"
   2102         "        </interface>\n"
   2103         "    </hal>\n"
   2104         "</compatibility-matrix>\n";
   2105     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2106         << gCompatibilityMatrixConverter.lastError();
   2107 
   2108     EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2109     xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2110     EXPECT_EQ(xml,
   2111               "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2112               "    <hal format=\"hidl\" optional=\"true\">\n"
   2113               "        <name>android.hardware.foo</name>\n"
   2114               "        <version>1.0-1</version>\n"
   2115               "        <interface>\n"
   2116               "            <name>IFoo</name>\n"
   2117               "            <instance>default</instance>\n"
   2118               "        </interface>\n"
   2119               "    </hal>\n"
   2120               "</compatibility-matrix>\n");
   2121 }
   2122 
   2123 TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
   2124     CompatibilityMatrix cm1;
   2125     CompatibilityMatrix cm2;
   2126     std::string error;
   2127     std::string xml;
   2128 
   2129     xml =
   2130         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2131         "    <hal format=\"hidl\" optional=\"false\">\n"
   2132         "        <name>android.hardware.foo</name>\n"
   2133         "        <version>1.2-3</version>\n"
   2134         "        <interface>\n"
   2135         "            <name>IFoo</name>\n"
   2136         "            <instance>default</instance>\n"
   2137         "        </interface>\n"
   2138         "    </hal>\n"
   2139         "</compatibility-matrix>\n";
   2140     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2141         << gCompatibilityMatrixConverter.lastError();
   2142 
   2143     xml =
   2144         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2145         "    <hal format=\"hidl\" optional=\"false\">\n"
   2146         "        <name>android.hardware.foo</name>\n"
   2147         "        <version>1.0-4</version>\n"
   2148         "        <interface>\n"
   2149         "            <name>IFoo</name>\n"
   2150         "            <instance>default</instance>\n"
   2151         "        </interface>\n"
   2152         "    </hal>\n"
   2153         "</compatibility-matrix>\n";
   2154     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2155         << gCompatibilityMatrixConverter.lastError();
   2156 
   2157     EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2158     xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2159     EXPECT_EQ(xml,
   2160               "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2161               "    <hal format=\"hidl\" optional=\"false\">\n"
   2162               "        <name>android.hardware.foo</name>\n"
   2163               "        <version>1.0-4</version>\n"
   2164               "        <interface>\n"
   2165               "            <name>IFoo</name>\n"
   2166               "            <instance>default</instance>\n"
   2167               "        </interface>\n"
   2168               "    </hal>\n"
   2169               "</compatibility-matrix>\n");
   2170 }
   2171 
   2172 TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
   2173     CompatibilityMatrix cm1;
   2174     CompatibilityMatrix cm2;
   2175     std::string error;
   2176     std::string xml;
   2177 
   2178     xml =
   2179         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2180         "    <hal format=\"hidl\" optional=\"false\">\n"
   2181         "        <name>android.hardware.foo</name>\n"
   2182         "        <version>1.2-3</version>\n"
   2183         "        <interface>\n"
   2184         "            <name>IFoo</name>\n"
   2185         "            <instance>default</instance>\n"
   2186         "        </interface>\n"
   2187         "    </hal>\n"
   2188         "</compatibility-matrix>\n";
   2189     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2190         << gCompatibilityMatrixConverter.lastError();
   2191 
   2192     xml =
   2193         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2194         "    <hal format=\"hidl\" optional=\"false\">\n"
   2195         "        <name>android.hardware.foo</name>\n"
   2196         "        <version>1.2-3</version>\n"
   2197         "        <version>2.0-4</version>\n"
   2198         "        <interface>\n"
   2199         "            <name>IFoo</name>\n"
   2200         "            <instance>default</instance>\n"
   2201         "        </interface>\n"
   2202         "    </hal>\n"
   2203         "</compatibility-matrix>\n";
   2204     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2205         << gCompatibilityMatrixConverter.lastError();
   2206 
   2207     EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2208     xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2209     EXPECT_EQ(xml,
   2210               "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2211               "    <hal format=\"hidl\" optional=\"false\">\n"
   2212               "        <name>android.hardware.foo</name>\n"
   2213               "        <version>1.2-3</version>\n"
   2214               "        <version>2.0-4</version>\n"
   2215               "        <interface>\n"
   2216               "            <name>IFoo</name>\n"
   2217               "            <instance>default</instance>\n"
   2218               "        </interface>\n"
   2219               "    </hal>\n"
   2220               "</compatibility-matrix>\n");
   2221 }
   2222 
   2223 TEST_F(LibVintfTest, AddOptionalHalMinorVersionDiffInstance) {
   2224     CompatibilityMatrix cm1;
   2225     CompatibilityMatrix cm2;
   2226     std::string error;
   2227     std::string xml;
   2228 
   2229     xml =
   2230         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2231         "    <hal format=\"hidl\" optional=\"false\">\n"
   2232         "        <name>android.hardware.foo</name>\n"
   2233         "        <version>1.0-1</version>\n"
   2234         "        <interface>\n"
   2235         "            <name>IFoo</name>\n"
   2236         "            <instance>default</instance>\n"
   2237         "        </interface>\n"
   2238         "    </hal>\n"
   2239         "</compatibility-matrix>\n";
   2240     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2241         << gCompatibilityMatrixConverter.lastError();
   2242 
   2243     xml =
   2244         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2245         "    <hal format=\"hidl\" optional=\"false\">\n"
   2246         "        <name>android.hardware.foo</name>\n"
   2247         "        <version>1.1-2</version>\n"
   2248         "        <interface>\n"
   2249         "            <name>IFoo</name>\n"
   2250         "            <instance>custom</instance>\n"
   2251         "        </interface>\n"
   2252         "    </hal>\n"
   2253         "</compatibility-matrix>\n";
   2254     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2255         << gCompatibilityMatrixConverter.lastError();
   2256 
   2257     EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2258     xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2259     EXPECT_EQ(xml,
   2260               "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2261               "    <hal format=\"hidl\" optional=\"false\">\n"
   2262               "        <name>android.hardware.foo</name>\n"
   2263               "        <version>1.0-1</version>\n"
   2264               "        <interface>\n"
   2265               "            <name>IFoo</name>\n"
   2266               "            <instance>default</instance>\n"
   2267               "        </interface>\n"
   2268               "    </hal>\n"
   2269               "    <hal format=\"hidl\" optional=\"true\">\n"
   2270               "        <name>android.hardware.foo</name>\n"
   2271               "        <version>1.1-2</version>\n"
   2272               "        <interface>\n"
   2273               "            <name>IFoo</name>\n"
   2274               "            <instance>custom</instance>\n"
   2275               "        </interface>\n"
   2276               "    </hal>\n"
   2277               "</compatibility-matrix>\n");
   2278 }
   2279 
   2280 TEST_F(LibVintfTest, AddRequiredHalOverlapInstance) {
   2281     CompatibilityMatrix cm1;
   2282     std::string error;
   2283     std::string xml;
   2284 
   2285     xml =
   2286         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2287         "    <hal format=\"hidl\" optional=\"false\">\n"
   2288         "        <name>android.hardware.foo</name>\n"
   2289         "        <version>1.0</version>\n"
   2290         "        <interface>\n"
   2291         "            <name>IFoo</name>\n"
   2292         "            <instance>default</instance>\n"
   2293         "            <instance>custom</instance>\n"
   2294         "        </interface>\n"
   2295         "    </hal>\n"
   2296         "</compatibility-matrix>\n";
   2297     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2298         << gCompatibilityMatrixConverter.lastError();
   2299 
   2300     {
   2301         // Test that 2.0 should be added to IFoo/default, so 1.0::IFoo/custom
   2302         // should be in a new <hal> tag
   2303         CompatibilityMatrix cm2;
   2304         xml =
   2305             "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2306             "    <hal format=\"hidl\" optional=\"false\">\n"
   2307             "        <name>android.hardware.foo</name>\n"
   2308             "        <version>2.0</version>\n"
   2309             "        <interface>\n"
   2310             "            <name>IFoo</name>\n"
   2311             "            <instance>default</instance>\n"
   2312             "        </interface>\n"
   2313             "    </hal>\n"
   2314             "</compatibility-matrix>\n";
   2315         EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2316             << gCompatibilityMatrixConverter.lastError();
   2317 
   2318         EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2319 
   2320         xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2321         EXPECT_EQ(xml,
   2322                   "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2323                   "    <hal format=\"hidl\" optional=\"false\">\n"
   2324                   "        <name>android.hardware.foo</name>\n"
   2325                   "        <version>1.0</version>\n"
   2326                   "        <interface>\n"
   2327                   "            <name>IFoo</name>\n"
   2328                   "            <instance>custom</instance>\n"
   2329                   "        </interface>\n"
   2330                   "    </hal>\n"
   2331                   "    <hal format=\"hidl\" optional=\"false\">\n"
   2332                   "        <name>android.hardware.foo</name>\n"
   2333                   "        <version>1.0</version>\n"
   2334                   "        <version>2.0</version>\n"
   2335                   "        <interface>\n"
   2336                   "            <name>IFoo</name>\n"
   2337                   "            <instance>default</instance>\n"
   2338                   "        </interface>\n"
   2339                   "    </hal>\n"
   2340                   "</compatibility-matrix>\n");
   2341     }
   2342 
   2343     {
   2344         // Test that 2.0::IFoo/strong should be added as an optional <hal> tag.
   2345         CompatibilityMatrix cm2;
   2346         xml =
   2347             "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2348             "    <hal format=\"hidl\" optional=\"false\">\n"
   2349             "        <name>android.hardware.foo</name>\n"
   2350             "        <version>2.0</version>\n"
   2351             "        <interface>\n"
   2352             "            <name>IFoo</name>\n"
   2353             "            <instance>default</instance>\n"
   2354             "            <instance>strong</instance>\n"
   2355             "        </interface>\n"
   2356             "    </hal>\n"
   2357             "</compatibility-matrix>\n";
   2358         EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2359             << gCompatibilityMatrixConverter.lastError();
   2360 
   2361         EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2362 
   2363         xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2364         EXPECT_EQ(xml,
   2365                   "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2366                   "    <hal format=\"hidl\" optional=\"false\">\n"
   2367                   "        <name>android.hardware.foo</name>\n"
   2368                   "        <version>1.0</version>\n"
   2369                   "        <interface>\n"
   2370                   "            <name>IFoo</name>\n"
   2371                   "            <instance>custom</instance>\n"
   2372                   "        </interface>\n"
   2373                   "    </hal>\n"
   2374                   "    <hal format=\"hidl\" optional=\"false\">\n"
   2375                   "        <name>android.hardware.foo</name>\n"
   2376                   "        <version>1.0</version>\n"
   2377                   "        <version>2.0</version>\n"
   2378                   "        <interface>\n"
   2379                   "            <name>IFoo</name>\n"
   2380                   "            <instance>default</instance>\n"
   2381                   "        </interface>\n"
   2382                   "    </hal>\n"
   2383                   "    <hal format=\"hidl\" optional=\"true\">\n"
   2384                   "        <name>android.hardware.foo</name>\n"
   2385                   "        <version>2.0</version>\n"
   2386                   "        <interface>\n"
   2387                   "            <name>IFoo</name>\n"
   2388                   "            <instance>strong</instance>\n"
   2389                   "        </interface>\n"
   2390                   "    </hal>\n"
   2391                   "</compatibility-matrix>\n");
   2392     }
   2393 }
   2394 
   2395 TEST_F(LibVintfTest, AddRequiredHalOverlapInstanceSplit) {
   2396     CompatibilityMatrix cm1;
   2397     CompatibilityMatrix cm2;
   2398     std::string error;
   2399     std::string xml;
   2400 
   2401     xml =
   2402         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2403         "    <hal format=\"hidl\" optional=\"false\">\n"
   2404         "        <name>android.hardware.foo</name>\n"
   2405         "        <version>1.0</version>\n"
   2406         "        <interface>\n"
   2407         "            <name>IFoo</name>\n"
   2408         "            <instance>default</instance>\n"
   2409         "        </interface>\n"
   2410         "    </hal>\n"
   2411         "    <hal format=\"hidl\" optional=\"false\">\n"
   2412         "        <name>android.hardware.foo</name>\n"
   2413         "        <version>1.0</version>\n"
   2414         "        <interface>\n"
   2415         "            <name>IFoo</name>\n"
   2416         "            <instance>custom</instance>\n"
   2417         "        </interface>\n"
   2418         "    </hal>\n"
   2419         "</compatibility-matrix>\n";
   2420     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2421         << gCompatibilityMatrixConverter.lastError();
   2422 
   2423     xml =
   2424         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2425         "    <hal format=\"hidl\" optional=\"false\">\n"
   2426         "        <name>android.hardware.foo</name>\n"
   2427         "        <version>2.0</version>\n"
   2428         "        <interface>\n"
   2429         "            <name>IFoo</name>\n"
   2430         "            <instance>default</instance>\n"
   2431         "        </interface>\n"
   2432         "    </hal>\n"
   2433         "    <hal format=\"hidl\" optional=\"false\">\n"
   2434         "        <name>android.hardware.foo</name>\n"
   2435         "        <version>2.0</version>\n"
   2436         "        <interface>\n"
   2437         "            <name>IFoo</name>\n"
   2438         "            <instance>strong</instance>\n"
   2439         "        </interface>\n"
   2440         "    </hal>\n"
   2441         "</compatibility-matrix>\n";
   2442     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2443         << gCompatibilityMatrixConverter.lastError();
   2444 
   2445     EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
   2446     xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::HALS_ONLY);
   2447     EXPECT_EQ(
   2448         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2449         "    <hal format=\"hidl\" optional=\"false\">\n"
   2450         "        <name>android.hardware.foo</name>\n"
   2451         "        <version>1.0</version>\n"
   2452         "        <version>2.0</version>\n"
   2453         "        <interface>\n"
   2454         "            <name>IFoo</name>\n"
   2455         "            <instance>default</instance>\n"
   2456         "        </interface>\n"
   2457         "    </hal>\n"
   2458         "    <hal format=\"hidl\" optional=\"false\">\n"
   2459         "        <name>android.hardware.foo</name>\n"
   2460         "        <version>1.0</version>\n"
   2461         "        <interface>\n"
   2462         "            <name>IFoo</name>\n"
   2463         "            <instance>custom</instance>\n"
   2464         "        </interface>\n"
   2465         "    </hal>\n"
   2466         "    <hal format=\"hidl\" optional=\"true\">\n"
   2467         "        <name>android.hardware.foo</name>\n"
   2468         "        <version>2.0</version>\n"
   2469         "        <interface>\n"
   2470         "            <name>IFoo</name>\n"
   2471         "            <instance>strong</instance>\n"
   2472         "        </interface>\n"
   2473         "    </hal>\n"
   2474         "</compatibility-matrix>\n",
   2475         xml);
   2476 }
   2477 TEST_F(LibVintfTest, AddOptionalXmlFile) {
   2478     CompatibilityMatrix cm1;
   2479     CompatibilityMatrix cm2;
   2480     std::string error;
   2481     std::string xml;
   2482 
   2483     xml =
   2484         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2485         "    <xmlfile format=\"xsd\" optional=\"true\">\n"
   2486         "        <name>foo</name>\n"
   2487         "        <version>1.0-2</version>\n"
   2488         "        <path>/foo/bar/baz.xsd</path>\n"
   2489         "    </xmlfile>\n"
   2490         "</compatibility-matrix>\n";
   2491     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm1, xml))
   2492         << gCompatibilityMatrixConverter.lastError();
   2493 
   2494     xml =
   2495         "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"
   2496         "    <xmlfile format=\"xsd\" optional=\"true\">\n"
   2497         "        <name>foo</name>\n"
   2498         "        <version>1.1-3</version>\n"
   2499         "        <path>/foo/bar/quux.xsd</path>\n"
   2500         "    </xmlfile>\n"
   2501         "</compatibility-matrix>\n";
   2502     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm2, xml))
   2503         << gCompatibilityMatrixConverter.lastError();
   2504 
   2505     EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
   2506     xml = gCompatibilityMatrixConverter(cm1, SerializeFlag::XMLFILES_ONLY);
   2507     EXPECT_EQ(xml,
   2508               "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"
   2509               "    <xmlfile format=\"xsd\" optional=\"true\">\n"
   2510               "        <name>foo</name>\n"
   2511               "        <version>1.0-2</version>\n"
   2512               "        <path>/foo/bar/baz.xsd</path>\n"
   2513               "    </xmlfile>\n"
   2514               "    <xmlfile format=\"xsd\" optional=\"true\">\n"
   2515               "        <name>foo</name>\n"
   2516               "        <version>1.1-3</version>\n"
   2517               "        <path>/foo/bar/quux.xsd</path>\n"
   2518               "    </xmlfile>\n"
   2519               "</compatibility-matrix>\n");
   2520 }
   2521 
   2522 TEST_F(LibVintfTest, VendorNdk) {
   2523     CompatibilityMatrix cm;
   2524     std::string error;
   2525     std::string xml;
   2526 
   2527     xml =
   2528         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
   2529         "    <vendor-ndk>\n"
   2530         "        <version>P</version>\n"
   2531         "        <library>libbase.so</library>\n"
   2532         "        <library>libjpeg.so</library>\n"
   2533         "    </vendor-ndk>\n"
   2534         "</compatibility-matrix>\n";
   2535     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2536         << gCompatibilityMatrixConverter.lastError();
   2537     EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
   2538 
   2539     {
   2540         HalManifest manifest;
   2541         xml =
   2542             "<manifest version=\"1.0\" type=\"framework\">\n"
   2543             "    <vendor-ndk>\n"
   2544             "        <version>27</version>\n"
   2545             "        <library>libbase.so</library>\n"
   2546             "        <library>libjpeg.so</library>\n"
   2547             "    </vendor-ndk>\n"
   2548             "    <vendor-ndk>\n"
   2549             "        <version>P</version>\n"
   2550             "        <library>libbase.so</library>\n"
   2551             "        <library>libjpeg.so</library>\n"
   2552             "        <library>libtinyxml2.so</library>\n"
   2553             "    </vendor-ndk>\n"
   2554             "</manifest>\n";
   2555 
   2556         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2557         EXPECT_EQ(xml, gHalManifestConverter(manifest));
   2558         EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   2559     }
   2560 
   2561     {
   2562         HalManifest manifest;
   2563         xml =
   2564             "<manifest version=\"1.0\" type=\"framework\">\n"
   2565             "    <vendor-ndk>\n"
   2566             "        <version>27</version>\n"
   2567             "        <library>libbase.so</library>\n"
   2568             "        <library>libjpeg.so</library>\n"
   2569             "    </vendor-ndk>\n"
   2570             "</manifest>\n";
   2571 
   2572         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2573         EXPECT_EQ(xml, gHalManifestConverter(manifest));
   2574         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   2575         EXPECT_IN("Vndk version P is not supported.", error);
   2576     }
   2577 
   2578     {
   2579         HalManifest manifest;
   2580         xml =
   2581             "<manifest version=\"1.0\" type=\"framework\">\n"
   2582             "    <vendor-ndk>\n"
   2583             "        <version>P</version>\n"
   2584             "        <library>libbase.so</library>\n"
   2585             "    </vendor-ndk>\n"
   2586             "</manifest>\n";
   2587 
   2588         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2589         EXPECT_EQ(xml, gHalManifestConverter(manifest));
   2590         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   2591         EXPECT_IN("Vndk libs incompatible for version P.", error);
   2592         EXPECT_IN("libjpeg.so", error);
   2593     }
   2594 }
   2595 
   2596 TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
   2597     CompatibilityMatrix cm;
   2598     std::string xml;
   2599     std::string error;
   2600 
   2601     xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
   2602     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2603         << gCompatibilityMatrixConverter.lastError();
   2604 
   2605     {
   2606         HalManifest manifest;
   2607         xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
   2608         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2609 
   2610         EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   2611     }
   2612 
   2613     {
   2614         HalManifest manifest;
   2615         xml =
   2616             "<manifest version=\"1.0\" type=\"framework\">\n"
   2617             "    <vendor-ndk>\n"
   2618             "        <version>P</version>\n"
   2619             "        <library>libbase.so</library>\n"
   2620             "    </vendor-ndk>\n"
   2621             "</manifest>\n";
   2622         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2623 
   2624         EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   2625     }
   2626 }
   2627 
   2628 TEST_F(LibVintfTest, DuplicatedVendorNdkVersion) {
   2629     std::string error;
   2630     HalManifest manifest;
   2631     std::string xml =
   2632         "<manifest version=\"1.0\" type=\"framework\">\n"
   2633         "    <vendor-ndk>\n"
   2634         "        <version>27</version>\n"
   2635         "    </vendor-ndk>\n"
   2636         "    <vendor-ndk>\n"
   2637         "        <version>27</version>\n"
   2638         "    </vendor-ndk>\n"
   2639         "</manifest>\n";
   2640 
   2641     EXPECT_FALSE(gHalManifestConverter(&manifest, xml));
   2642     EXPECT_EQ("Duplicated manifest.vendor-ndk.version 27", gHalManifestConverter.lastError());
   2643 }
   2644 
   2645 TEST_F(LibVintfTest, ManifestHalOverride) {
   2646     HalManifest manifest;
   2647     std::string xml =
   2648         "<manifest version=\"1.0\" type=\"device\">\n"
   2649         "    <hal format=\"hidl\" override=\"true\">\n"
   2650         "        <name>android.hardware.foo</name>\n"
   2651         "        <transport>hwbinder</transport>\n"
   2652         "        <version>1.0</version>\n"
   2653         "    </hal>\n"
   2654         "    <hal format=\"hidl\">\n"
   2655         "        <name>android.hardware.bar</name>\n"
   2656         "        <transport>hwbinder</transport>\n"
   2657         "        <version>1.0</version>\n"
   2658         "    </hal>\n"
   2659         "</manifest>\n";
   2660     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2661     const auto& foo = manifest.getHals("android.hardware.foo");
   2662     ASSERT_FALSE(foo.empty());
   2663     EXPECT_TRUE(foo.front()->isOverride());
   2664     const auto& bar = manifest.getHals("android.hardware.bar");
   2665     ASSERT_FALSE(bar.empty());
   2666     EXPECT_FALSE(bar.front()->isOverride());
   2667 }
   2668 
   2669 // Test functionality of override="true" tag
   2670 TEST_F(LibVintfTest, ManifestAddOverrideHalSimple) {
   2671     HalManifest manifest;
   2672     std::string xml = "<manifest version=\"1.0\" type=\"device\"/>\n";
   2673     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2674 
   2675     HalManifest newManifest;
   2676     xml =
   2677         "<manifest version=\"1.0\" type=\"device\">\n"
   2678         "    <hal format=\"hidl\" override=\"true\">\n"
   2679         "        <name>android.hardware.foo</name>\n"
   2680         "        <transport>hwbinder</transport>\n"
   2681         "        <version>1.1</version>\n"
   2682         "        <interface>\n"
   2683         "            <name>IFoo</name>\n"
   2684         "            <instance>default</instance>\n"
   2685         "        </interface>\n"
   2686         "    </hal>\n"
   2687         "</manifest>\n";
   2688     EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
   2689 
   2690     manifest.addAllHals(&newManifest);
   2691     EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
   2692 }
   2693 
   2694 TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverride) {
   2695     HalManifest manifest;
   2696     std::string xml =
   2697         "<manifest version=\"1.0\" type=\"device\">\n"
   2698         "    <hal format=\"hidl\">\n"
   2699         "        <name>android.hardware.foo</name>\n"
   2700         "        <transport>hwbinder</transport>\n"
   2701         "        <version>1.0</version>\n"
   2702         "    </hal>\n"
   2703         "</manifest>\n";
   2704     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2705 
   2706     HalManifest newManifest;
   2707     xml =
   2708         "<manifest version=\"1.0\" type=\"device\">\n"
   2709         "    <hal format=\"hidl\" override=\"true\">\n"
   2710         "        <name>android.hardware.foo</name>\n"
   2711         "        <transport>hwbinder</transport>\n"
   2712         "        <version>1.1</version>\n"
   2713         "        <interface>\n"
   2714         "            <name>IFoo</name>\n"
   2715         "            <instance>default</instance>\n"
   2716         "        </interface>\n"
   2717         "    </hal>\n"
   2718         "</manifest>\n";
   2719     EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
   2720 
   2721     manifest.addAllHals(&newManifest);
   2722     EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
   2723 }
   2724 
   2725 // Existing major versions should be removed.
   2726 TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion) {
   2727     HalManifest manifest;
   2728     std::string xml =
   2729         "<manifest version=\"1.0\" type=\"device\">\n"
   2730         "    <hal format=\"hidl\">\n"
   2731         "        <name>android.hardware.foo</name>\n"
   2732         "        <transport>hwbinder</transport>\n"
   2733         "        <version>1.3</version>\n"
   2734         "        <version>2.4</version>\n"
   2735         "        <interface>\n"
   2736         "            <name>IFoo</name>\n"
   2737         "            <instance>slot1</instance>\n"
   2738         "        </interface>\n"
   2739         "    </hal>\n"
   2740         "    <hal format=\"hidl\">\n"
   2741         "        <name>android.hardware.bar</name>\n"
   2742         "        <transport>hwbinder</transport>\n"
   2743         "        <version>1.3</version>\n"
   2744         "    </hal>\n"
   2745         "</manifest>\n";
   2746     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2747 
   2748     HalManifest newManifest;
   2749     xml =
   2750         "<manifest version=\"1.0\" type=\"device\">\n"
   2751         "    <hal format=\"hidl\" override=\"true\">\n"
   2752         "        <name>android.hardware.foo</name>\n"
   2753         "        <transport>hwbinder</transport>\n"
   2754         "        <version>1.1</version>\n"
   2755         "        <version>3.1</version>\n"
   2756         "        <interface>\n"
   2757         "            <name>IFoo</name>\n"
   2758         "            <instance>slot2</instance>\n"
   2759         "        </interface>\n"
   2760         "    </hal>\n"
   2761         "</manifest>\n";
   2762     EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
   2763 
   2764     manifest.addAllHals(&newManifest);
   2765     EXPECT_EQ(
   2766         "<manifest version=\"1.0\" type=\"device\">\n"
   2767         "    <hal format=\"hidl\">\n"
   2768         "        <name>android.hardware.bar</name>\n"
   2769         "        <transport>hwbinder</transport>\n"
   2770         "        <version>1.3</version>\n"
   2771         "    </hal>\n"
   2772         "    <hal format=\"hidl\">\n"
   2773         "        <name>android.hardware.foo</name>\n"
   2774         "        <transport>hwbinder</transport>\n"
   2775         "        <version>2.4</version>\n"
   2776         "        <interface>\n"
   2777         "            <name>IFoo</name>\n"
   2778         "            <instance>slot1</instance>\n"
   2779         "        </interface>\n"
   2780         "    </hal>\n"
   2781         "    <hal format=\"hidl\" override=\"true\">\n"
   2782         "        <name>android.hardware.foo</name>\n"
   2783         "        <transport>hwbinder</transport>\n"
   2784         "        <version>1.1</version>\n"
   2785         "        <version>3.1</version>\n"
   2786         "        <interface>\n"
   2787         "            <name>IFoo</name>\n"
   2788         "            <instance>slot2</instance>\n"
   2789         "        </interface>\n"
   2790         "    </hal>\n"
   2791         "</manifest>\n",
   2792         gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
   2793 }
   2794 
   2795 TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2) {
   2796     HalManifest manifest;
   2797     std::string xml =
   2798         "<manifest version=\"1.0\" type=\"device\">\n"
   2799         "    <hal format=\"hidl\">\n"
   2800         "        <name>android.hardware.foo</name>\n"
   2801         "        <transport>hwbinder</transport>\n"
   2802         "        <version>1.3</version>\n"
   2803         "        <version>2.4</version>\n"
   2804         "        <interface>\n"
   2805         "            <name>IFoo</name>\n"
   2806         "            <instance>slot1</instance>\n"
   2807         "        </interface>\n"
   2808         "    </hal>\n"
   2809         "</manifest>\n";
   2810     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2811 
   2812     HalManifest newManifest;
   2813     xml =
   2814         "<manifest version=\"1.0\" type=\"device\">\n"
   2815         "    <hal format=\"hidl\" override=\"true\">\n"
   2816         "        <name>android.hardware.foo</name>\n"
   2817         "        <transport>hwbinder</transport>\n"
   2818         "        <version>1.1</version>\n"
   2819         "        <version>2.1</version>\n"
   2820         "        <interface>\n"
   2821         "            <name>IFoo</name>\n"
   2822         "            <instance>slot2</instance>\n"
   2823         "        </interface>\n"
   2824         "    </hal>\n"
   2825         "</manifest>\n";
   2826     EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
   2827 
   2828     manifest.addAllHals(&newManifest);
   2829     EXPECT_EQ(xml, gHalManifestConverter(manifest, SerializeFlag::HALS_NO_FQNAME));
   2830 }
   2831 
   2832 // if no <versions>, remove all existing <hal> with given <name>.
   2833 TEST_F(LibVintfTest, ManifestAddOverrideHalRemoveAll) {
   2834     HalManifest manifest;
   2835     std::string xml =
   2836         "<manifest version=\"1.0\" type=\"device\">\n"
   2837         "    <hal format=\"hidl\">\n"
   2838         "        <name>android.hardware.foo</name>\n"
   2839         "        <transport>hwbinder</transport>\n"
   2840         "        <version>1.3</version>\n"
   2841         "        <version>2.4</version>\n"
   2842         "        <interface>\n"
   2843         "            <name>IFoo</name>\n"
   2844         "            <instance>slot1</instance>\n"
   2845         "        </interface>\n"
   2846         "    </hal>\n"
   2847         "    <hal format=\"hidl\">\n"
   2848         "        <name>android.hardware.foo</name>\n"
   2849         "        <transport>hwbinder</transport>\n"
   2850         "        <version>3.1</version>\n"
   2851         "        <version>4.3</version>\n"
   2852         "        <interface>\n"
   2853         "            <name>IBar</name>\n"
   2854         "            <instance>slot2</instance>\n"
   2855         "        </interface>\n"
   2856         "    </hal>\n"
   2857         "    <hal format=\"hidl\">\n"
   2858         "        <name>android.hardware.bar</name>\n"
   2859         "        <transport>hwbinder</transport>\n"
   2860         "        <version>1.3</version>\n"
   2861         "    </hal>\n"
   2862         "</manifest>\n";
   2863     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2864 
   2865     HalManifest newManifest;
   2866     xml =
   2867         "<manifest version=\"1.0\" type=\"device\">\n"
   2868         "    <hal format=\"hidl\" override=\"true\">\n"
   2869         "        <name>android.hardware.foo</name>\n"
   2870         "        <transport>hwbinder</transport>\n"
   2871         "    </hal>\n"
   2872         "</manifest>\n";
   2873     EXPECT_TRUE(gHalManifestConverter(&newManifest, xml)) << gHalManifestConverter.lastError();
   2874 
   2875     manifest.addAllHals(&newManifest);
   2876     EXPECT_EQ(
   2877         "<manifest version=\"1.0\" type=\"device\">\n"
   2878         "    <hal format=\"hidl\">\n"
   2879         "        <name>android.hardware.bar</name>\n"
   2880         "        <transport>hwbinder</transport>\n"
   2881         "        <version>1.3</version>\n"
   2882         "    </hal>\n"
   2883         "    <hal format=\"hidl\" override=\"true\">\n"
   2884         "        <name>android.hardware.foo</name>\n"
   2885         "        <transport>hwbinder</transport>\n"
   2886         "    </hal>\n"
   2887         "</manifest>\n",
   2888         gHalManifestConverter(manifest, SerializeFlag::HALS_ONLY));
   2889 }
   2890 
   2891 // Make sure missing tags in old VINTF files does not cause incompatibilities.
   2892 TEST_F(LibVintfTest, Empty) {
   2893     CompatibilityMatrix cm;
   2894     HalManifest manifest;
   2895     std::string xml;
   2896     std::string error;
   2897 
   2898     xml = "<compatibility-matrix version=\"1.0\" type=\"device\"/>\n";
   2899     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2900         << gCompatibilityMatrixConverter.lastError();
   2901 
   2902     xml = "<manifest version=\"1.0\" type=\"framework\"/>\n";
   2903     EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2904 
   2905     EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   2906 }
   2907 
   2908 TEST_F(LibVintfTest, SystemSdk) {
   2909     CompatibilityMatrix cm;
   2910     std::string xml;
   2911     std::string error;
   2912 
   2913     xml =
   2914         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
   2915         "    <system-sdk>\n"
   2916         "        <version>1</version>\n"
   2917         "        <version>P</version>\n"
   2918         "    </system-sdk>\n"
   2919         "</compatibility-matrix>\n";
   2920     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
   2921         << gCompatibilityMatrixConverter.lastError();
   2922     EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm, ~SerializeFlag::NO_SSDK));
   2923 
   2924     {
   2925         HalManifest manifest;
   2926         xml =
   2927             "<manifest version=\"1.0\" type=\"framework\">\n"
   2928             "    <system-sdk>\n"
   2929             "        <version>1</version>\n"
   2930             "        <version>P</version>\n"
   2931             "    </system-sdk>\n"
   2932             "</manifest>\n";
   2933         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2934         EXPECT_EQ(xml, gHalManifestConverter(manifest, ~SerializeFlag::NO_SSDK));
   2935 
   2936         EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   2937     }
   2938 
   2939     {
   2940         HalManifest manifest;
   2941         xml =
   2942             "<manifest version=\"1.0\" type=\"framework\">\n"
   2943             "    <system-sdk>\n"
   2944             "        <version>1</version>\n"
   2945             "        <version>3</version>\n"
   2946             "        <version>P</version>\n"
   2947             "    </system-sdk>\n"
   2948             "</manifest>\n";
   2949         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2950         EXPECT_TRUE(manifest.checkCompatibility(cm, &error));
   2951     }
   2952 
   2953     {
   2954         HalManifest manifest;
   2955         xml =
   2956             "<manifest version=\"1.0\" type=\"framework\">\n"
   2957             "    <system-sdk>\n"
   2958             "        <version>1</version>\n"
   2959             "    </system-sdk>\n"
   2960             "</manifest>\n";
   2961         EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
   2962         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   2963         EXPECT_TRUE(error.find("System SDK") != std::string::npos) << error;
   2964     }
   2965 }
   2966 
   2967 TEST_F(LibVintfTest, ManifestLastError) {
   2968     HalManifest e;
   2969     // Set mLastError to something else before testing.
   2970     EXPECT_FALSE(gHalManifestConverter(&e, "<manifest/>"));
   2971     EXPECT_NE("Not a valid XML", gHalManifestConverter.lastError());
   2972 
   2973     std::string error;
   2974     std::string prevError = gHalManifestConverter.lastError();
   2975     EXPECT_FALSE(gHalManifestConverter(&e, "", &error));
   2976     EXPECT_EQ("Not a valid XML", error);
   2977     EXPECT_EQ(prevError, gHalManifestConverter.lastError()) << "lastError() should not be modified";
   2978 }
   2979 
   2980 TEST_F(LibVintfTest, MatrixLastError) {
   2981     CompatibilityMatrix e;
   2982     // Set mLastError to something else before testing.
   2983     EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "<compatibility-matrix/>"));
   2984     EXPECT_NE("Not a valid XML", gCompatibilityMatrixConverter.lastError());
   2985 
   2986     std::string error;
   2987     std::string prevError = gCompatibilityMatrixConverter.lastError();
   2988     EXPECT_FALSE(gCompatibilityMatrixConverter(&e, "", &error));
   2989     EXPECT_EQ("Not a valid XML", error);
   2990     EXPECT_EQ(prevError, gCompatibilityMatrixConverter.lastError())
   2991         << "lastError() should not be modified";
   2992 }
   2993 
   2994 TEST_F(LibVintfTest, MatrixDetailErrorMsg) {
   2995     std::string error;
   2996     std::string xml;
   2997 
   2998     HalManifest manifest;
   2999     xml =
   3000         "<manifest version=\"1.0\" type=\"device\" target-level=\"103\">\n"
   3001         "    <hal format=\"hidl\">\n"
   3002         "        <name>android.hardware.foo</name>\n"
   3003         "        <transport>hwbinder</transport>\n"
   3004         "        <version>1.0</version>\n"
   3005         "        <interface>\n"
   3006         "            <name>IFoo</name>\n"
   3007         "            <instance>default</instance>\n"
   3008         "        </interface>\n"
   3009         "    </hal>\n"
   3010         "</manifest>\n";
   3011     ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
   3012 
   3013     {
   3014         CompatibilityMatrix cm;
   3015         xml =
   3016             "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"100\">\n"
   3017             "    <hal format=\"hidl\" optional=\"false\">\n"
   3018             "        <name>android.hardware.foo</name>\n"
   3019             "        <version>1.2-3</version>\n"
   3020             "        <version>4.5</version>\n"
   3021             "        <interface>\n"
   3022             "            <name>IFoo</name>\n"
   3023             "            <instance>default</instance>\n"
   3024             "            <instance>slot1</instance>\n"
   3025             "        </interface>\n"
   3026             "        <interface>\n"
   3027             "            <name>IBar</name>\n"
   3028             "            <instance>default</instance>\n"
   3029             "        </interface>\n"
   3030             "    </hal>\n"
   3031             "</compatibility-matrix>\n";
   3032         EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
   3033         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   3034         EXPECT_IN("Manifest level = 103", error)
   3035         EXPECT_IN("Matrix level = 100", error)
   3036         EXPECT_IN(
   3037             "android.hardware.foo:\n"
   3038             "    required: \n"
   3039             "        (@1.2-3::IBar/default AND @1.2-3::IFoo/default AND @1.2-3::IFoo/slot1) OR\n"
   3040             "        (@4.5::IBar/default AND @4.5::IFoo/default AND @4.5::IFoo/slot1)\n"
   3041             "    provided: @1.0::IFoo/default",
   3042             error);
   3043     }
   3044 
   3045     {
   3046         CompatibilityMatrix cm;
   3047         xml =
   3048             "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   3049             "    <hal format=\"hidl\" optional=\"false\">\n"
   3050             "        <name>android.hardware.foo</name>\n"
   3051             "        <version>1.2-3</version>\n"
   3052             "        <interface>\n"
   3053             "            <name>IFoo</name>\n"
   3054             "            <instance>default</instance>\n"
   3055             "            <instance>slot1</instance>\n"
   3056             "        </interface>\n"
   3057             "    </hal>\n"
   3058             "</compatibility-matrix>\n";
   3059         EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
   3060         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   3061         EXPECT_IN(
   3062             "android.hardware.foo:\n"
   3063             "    required: (@1.2-3::IFoo/default AND @1.2-3::IFoo/slot1)\n"
   3064             "    provided: @1.0::IFoo/default",
   3065             error);
   3066     }
   3067 
   3068     // the most frequent use case.
   3069     {
   3070         CompatibilityMatrix cm;
   3071         xml =
   3072             "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   3073             "    <hal format=\"hidl\" optional=\"false\">\n"
   3074             "        <name>android.hardware.foo</name>\n"
   3075             "        <version>1.2-3</version>\n"
   3076             "        <interface>\n"
   3077             "            <name>IFoo</name>\n"
   3078             "            <instance>default</instance>\n"
   3079             "        </interface>\n"
   3080             "    </hal>\n"
   3081             "</compatibility-matrix>\n";
   3082         EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
   3083         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   3084         EXPECT_IN(
   3085             "android.hardware.foo:\n"
   3086             "    required: @1.2-3::IFoo/default\n"
   3087             "    provided: @1.0::IFoo/default",
   3088             error);
   3089     }
   3090 }
   3091 
   3092 TEST_F(LibVintfTest, DisabledHal) {
   3093     std::string error;
   3094     std::string xml;
   3095     HalManifest manifest;
   3096     xml =
   3097         "<manifest version=\"1.0\" type=\"framework\">\n"
   3098         "    <hal format=\"hidl\" override=\"true\">\n"
   3099         "        <transport>hwbinder</transport>\n"
   3100         "        <name>android.hardware.foo</name>\n"
   3101         "        <transport>hwbinder</transport>\n"
   3102         "    </hal>\n"
   3103         "    <hal format=\"hidl\" override=\"true\">\n"
   3104         "        <name>android.hardware.bar</name>\n"
   3105         "        <transport>hwbinder</transport>\n"
   3106         "        <fqname>@1.1::IFoo/custom</fqname>\n"
   3107         "    </hal>\n"
   3108         "    <hal format=\"hidl\">\n"
   3109         "        <name>android.hardware.baz</name>\n"
   3110         "        <transport>hwbinder</transport>\n"
   3111         "    </hal>\n"
   3112         "</manifest>\n";
   3113     ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
   3114 
   3115     auto foo = manifest.getHals("android.hardware.foo");
   3116     ASSERT_EQ(1u, foo.size());
   3117     EXPECT_TRUE(foo.front()->isDisabledHal());
   3118     auto bar = manifest.getHals("android.hardware.bar");
   3119     ASSERT_EQ(1u, bar.size());
   3120     EXPECT_FALSE(bar.front()->isDisabledHal());
   3121     auto baz = manifest.getHals("android.hardware.baz");
   3122     ASSERT_EQ(1u, baz.size());
   3123     EXPECT_FALSE(baz.front()->isDisabledHal());
   3124 }
   3125 
   3126 TEST_F(LibVintfTest, FqNameValid) {
   3127     std::string error;
   3128     std::string xml;
   3129 
   3130     CompatibilityMatrix cm;
   3131     xml =
   3132         "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
   3133         "    <hal format=\"hidl\" optional=\"false\">\n"
   3134         "        <name>android.hardware.foo</name>\n"
   3135         "        <version>1.0</version>\n"
   3136         "        <interface>\n"
   3137         "            <name>IFoo</name>\n"
   3138         "            <instance>default</instance>\n"
   3139         "        </interface>\n"
   3140         "    </hal>\n"
   3141         "    <hal format=\"hidl\" optional=\"false\">\n"
   3142         "        <name>android.hardware.foo</name>\n"
   3143         "        <version>1.1</version>\n"
   3144         "        <interface>\n"
   3145         "            <name>IFoo</name>\n"
   3146         "            <instance>custom</instance>\n"
   3147         "        </interface>\n"
   3148         "    </hal>\n"
   3149         "</compatibility-matrix>\n";
   3150     EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml, &error)) << error;
   3151 
   3152     {
   3153         HalManifest manifest;
   3154         xml =
   3155             "<manifest version=\"1.0\" type=\"framework\">\n"
   3156             "    <hal format=\"hidl\">\n"
   3157             "        <name>android.hardware.foo</name>\n"
   3158             "        <transport>hwbinder</transport>\n"
   3159             "        <version>1.0</version>\n"
   3160             "        <interface>\n"
   3161             "            <name>IFoo</name>\n"
   3162             "            <instance>default</instance>\n"
   3163             "            <instance>custom</instance>\n"
   3164             "        </interface>\n"
   3165             "        <fqname>@1.1::IFoo/custom</fqname>\n"
   3166             "    </hal>\n"
   3167             "</manifest>\n";
   3168         ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
   3169         EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   3170 
   3171         EXPECT_EQ(Transport::HWBINDER,
   3172                   manifest.getTransport("android.hardware.foo", {1, 1}, "IFoo", "custom"));
   3173     }
   3174 
   3175     {
   3176         HalManifest manifest;
   3177         xml =
   3178             "<manifest version=\"1.0\" type=\"framework\">\n"
   3179             "    <hal format=\"hidl\">\n"
   3180             "        <name>android.hardware.foo</name>\n"
   3181             "        <transport>hwbinder</transport>\n"
   3182             "        <fqname>@1.0::IFoo/default</fqname>\n"
   3183             "        <fqname>@1.1::IFoo/custom</fqname>\n"
   3184             "    </hal>\n"
   3185             "</manifest>\n";
   3186         ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
   3187         EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
   3188     }
   3189 
   3190     {
   3191         HalManifest manifest;
   3192         xml =
   3193             "<manifest version=\"1.0\" type=\"framework\">\n"
   3194             "    <hal format=\"hidl\">\n"
   3195             "        <name>android.hardware.foo</name>\n"
   3196             "        <transport>hwbinder</transport>\n"
   3197             "        <version>1.0</version>\n"
   3198             "        <interface>\n"
   3199             "            <name>IFoo</name>\n"
   3200             "            <instance>default</instance>\n"
   3201             "            <instance>custom</instance>\n"
   3202             "        </interface>\n"
   3203             "    </hal>\n"
   3204             "</manifest>\n";
   3205         ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
   3206         EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
   3207         EXPECT_IN(
   3208             "android.hardware.foo:\n"
   3209             "    required: @1.1::IFoo/custom\n"
   3210             "    provided: \n"
   3211             "        @1.0::IFoo/custom\n"
   3212             "        @1.0::IFoo/default",
   3213             error);
   3214     }
   3215 
   3216     {
   3217         HalManifest manifest;
   3218         xml =
   3219             "<manifest version=\"1.0\" type=\"framework\">\n"
   3220             "    <hal format=\"hidl\">\n"
   3221             "        <name>android.hardware.foo</name>\n"
   3222             "        <transport>hwbinder</transport>\n"
   3223             "        <fqname>@1.0::IFoo/default</fqname>\n"
   3224             "        <fqname>@1.0::IFoo/custom</fqname>\n"
   3225             "    </hal>\n"
   3226             "</manifest>\n";
   3227         ASSERT_TRUE(gHalManifestConverter(&manifest, xml, &error)) << error;
   3228         EXPECT_IN(
   3229             "android.hardware.foo:\n"
   3230             "    required: @1.1::IFoo/custom\n"
   3231             "    provided: \n"
   3232             "        @1.0::IFoo/custom\n"
   3233             "        @1.0::IFoo/default",
   3234             error);
   3235     }
   3236 }
   3237 
   3238 TEST_F(LibVintfTest, FqNameInvalid) {
   3239     std::string error;
   3240     std::string xml;
   3241     ManifestHal hal;
   3242     xml =
   3243         "<hal format=\"hidl\">\n"
   3244         "    <name>android.hardware.foo</name>\n"
   3245         "    <transport>hwbinder</transport>\n"
   3246         "    <fqname>@1.1::IFoo/custom</fqname>\n"
   3247         "</hal>\n";
   3248     EXPECT_TRUE(gManifestHalConverter(&hal, xml, &error)) << error;
   3249     xml =
   3250         "<hal format=\"hidl\">\n"
   3251         "    <name>android.hardware.foo</name>\n"
   3252         "    <transport>hwbinder</transport>\n"
   3253         "    <fqname>1.1::IFoo/custom</fqname>\n"
   3254         "</hal>\n";
   3255     ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
   3256     EXPECT_IN("Could not parse text \"1.1::IFoo/custom\" in element <fqname>", error);
   3257     xml =
   3258         "<hal format=\"hidl\">\n"
   3259         "    <name>android.hardware.foo</name>\n"
   3260         "    <transport>hwbinder</transport>\n"
   3261         "    <fqname>android.hardware.foo (at) 1.1::IFoo/custom</fqname>\n"
   3262         "</hal>\n";
   3263     ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
   3264     EXPECT_IN("Should not specify package", error);
   3265     xml =
   3266         "<hal format=\"hidl\">\n"
   3267         "    <name>android.hardware.foo</name>\n"
   3268         "    <transport>hwbinder</transport>\n"
   3269         "    <fqname>IFoo/custom</fqname>\n"
   3270         "</hal>\n";
   3271     ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
   3272     EXPECT_IN("Should specify version", error);
   3273     xml =
   3274         "<hal format=\"hidl\">\n"
   3275         "    <name>android.hardware.foo</name>\n"
   3276         "    <transport>hwbinder</transport>\n"
   3277         "    <fqname>@1.0::IFoo</fqname>\n"
   3278         "</hal>\n";
   3279     ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
   3280     EXPECT_IN("Should specify instance", error);
   3281     xml =
   3282         "<hal format=\"hidl\">\n"
   3283         "    <name>n07 4 v4l1d 1n73rf4c3</name>\n"
   3284         "    <transport>hwbinder</transport>\n"
   3285         "    <fqname>@1.0::IFoo/custom</fqname>\n"
   3286         "</hal>\n";
   3287     ASSERT_FALSE(gManifestHalConverter(&hal, xml, &error));
   3288     EXPECT_IN("Cannot create FqInstance", error);
   3289     EXPECT_IN("n07 4 v4l1d 1n73rf4c3", error);
   3290 }
   3291 
   3292 TEST_F(LibVintfTest, RegexInstanceValid) {
   3293     CompatibilityMatrix matrix;
   3294     std::string error;
   3295 
   3296     std::string xml =
   3297         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   3298         "    <hal format=\"hidl\" optional=\"false\">\n"
   3299         "        <name>android.hardware.foo</name>\n"
   3300         "        <version>1.0</version>\n"
   3301         "        <interface>\n"
   3302         "            <name>IFoo</name>\n"
   3303         "            <regex-instance>legacy/[0-9]+</regex-instance>\n"
   3304         "            <regex-instance>slot[0-9]+</regex-instance>\n"
   3305         "            <regex-instance>.*</regex-instance>\n"
   3306         "        </interface>\n"
   3307         "    </hal>\n"
   3308         "</compatibility-matrix>\n";
   3309     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, xml, &error)) << error;
   3310 }
   3311 
   3312 TEST_F(LibVintfTest, RegexInstanceInvalid) {
   3313     CompatibilityMatrix matrix;
   3314     std::string error;
   3315     std::string xml =
   3316         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   3317         "    <hal format=\"hidl\" optional=\"false\">\n"
   3318         "        <name>android.hardware.foo</name>\n"
   3319         "        <version>1.0</version>\n"
   3320         "        <interface>\n"
   3321         "            <name>IFoo</name>\n"
   3322         "            <regex-instance>e{1,2,3}</regex-instance>\n"
   3323         "            <regex-instance>*</regex-instance>\n"
   3324         "            <regex-instance>+</regex-instance>\n"
   3325         "            <regex-instance>[0-9]+</regex-instance>\n"
   3326         "            <regex-instance>[0-9]+</regex-instance>\n"
   3327         "        </interface>\n"
   3328         "    </hal>\n"
   3329         "</compatibility-matrix>\n";
   3330     EXPECT_FALSE(gCompatibilityMatrixConverter(&matrix, xml, &error));
   3331     EXPECT_IN("Invalid regular expression 'e{1,2,3}'", error);
   3332     EXPECT_IN("Invalid regular expression '*'", error);
   3333     EXPECT_IN("Invalid regular expression '+'", error);
   3334     EXPECT_IN("Duplicated regex-instance '[0-9]+'", error);
   3335 }
   3336 
   3337 TEST_F(LibVintfTest, RegexInstanceCompat) {
   3338     CompatibilityMatrix matrix;
   3339     std::string error;
   3340 
   3341     std::string xml =
   3342         "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
   3343         "    <hal format=\"hidl\" optional=\"false\">\n"
   3344         "        <name>android.hardware.foo</name>\n"
   3345         "        <version>1.0</version>\n"
   3346         "        <version>3.1-2</version>\n"
   3347         "        <interface>\n"
   3348         "            <name>IFoo</name>\n"
   3349         "            <instance>default</instance>\n"
   3350         "            <regex-instance>legacy/[0-9]+</regex-instance>\n"
   3351         "        </interface>\n"
   3352         "    </hal>\n"
   3353         "    <sepolicy>\n"
   3354         "        <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
   3355         "        <sepolicy-version>0.0</sepolicy-version>\n"
   3356         "    </sepolicy>\n"
   3357         "</compatibility-matrix>\n";
   3358     EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, xml))
   3359         << gCompatibilityMatrixConverter.lastError();
   3360 
   3361     {
   3362         std::string xml =
   3363             "<manifest version=\"1.0\" type=\"device\">\n"
   3364             "    <hal format=\"hidl\">\n"
   3365             "        <name>android.hardware.foo</name>\n"
   3366             "        <transport>hwbinder</transport>\n"
   3367             "        <version>1.0</version>\n"
   3368             "        <interface>\n"
   3369             "            <name>IFoo</name>\n"
   3370             "            <instance>default</instance>\n"
   3371             "            <instance>legacy/0</instance>\n"
   3372             "            <instance>legacy/1</instance>\n"
   3373             "        </interface>\n"
   3374             "    </hal>\n"
   3375             "</manifest>\n";
   3376 
   3377         HalManifest manifest;
   3378         EXPECT_TRUE(gHalManifestConverter(&manifest, xml));
   3379         EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
   3380 
   3381         auto unused = checkUnusedHals(manifest, matrix);
   3382         EXPECT_TRUE(unused.empty())
   3383             << "Contains unused HALs: " << android::base::Join(unused, "\n");
   3384     }
   3385 
   3386     {
   3387         std::string xml =
   3388             "<manifest version=\"1.0\" type=\"device\">\n"
   3389             "    <hal format=\"hidl\">\n"
   3390             "        <name>android.hardware.foo</name>\n"
   3391             "        <transport>hwbinder</transport>\n"
   3392             "        <version>1.0</version>\n"
   3393             "        <interface>\n"
   3394             "            <name>IFoo</name>\n"
   3395             "            <instance>default</instance>\n"
   3396             "            <instance>legacy0</instance>\n"
   3397             "            <instance>nonmatch/legacy/0</instance>\n"
   3398             "            <instance>legacy/0/nonmatch</instance>\n"
   3399             "        </interface>\n"
   3400             "    </hal>\n"
   3401             "</manifest>\n";
   3402 
   3403         HalManifest manifest;
   3404         EXPECT_TRUE(gHalManifestConverter(&manifest, xml));
   3405         EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
   3406             << "Should not be compatible because no legacy/[0-9]+ is provided.";
   3407 
   3408         auto unused = checkUnusedHals(manifest, matrix);
   3409         EXPECT_EQ((std::set<std::string>{"android.hardware.foo (at) 1.0::IFoo/nonmatch/legacy/0",
   3410                                          "android.hardware.foo (at) 1.0::IFoo/legacy/0/nonmatch",
   3411                                          "android.hardware.foo (at) 1.0::IFoo/legacy0"}),
   3412                   unused);
   3413     }
   3414 }
   3415 
   3416 TEST_F(LibVintfTest, Regex) {
   3417     details::Regex regex;
   3418 
   3419     EXPECT_FALSE(regex.compile("+"));
   3420     EXPECT_FALSE(regex.compile("*"));
   3421 
   3422     ASSERT_TRUE(regex.compile("legacy/[0-9]+"));
   3423     EXPECT_TRUE(regex.matches("legacy/0"));
   3424     EXPECT_TRUE(regex.matches("legacy/000"));
   3425     EXPECT_FALSE(regex.matches("legacy/"));
   3426     EXPECT_FALSE(regex.matches("ssslegacy/0"));
   3427     EXPECT_FALSE(regex.matches("legacy/0sss"));
   3428 }
   3429 
   3430 } // namespace vintf
   3431 } // namespace android
   3432 
   3433 int main(int argc, char **argv) {
   3434     ::testing::InitGoogleTest(&argc, argv);
   3435     return RUN_ALL_TESTS();
   3436 }
   3437