1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*70a7ec85SAndroid Build Coastguard Worker *
4*70a7ec85SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*70a7ec85SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*70a7ec85SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*70a7ec85SAndroid Build Coastguard Worker *
8*70a7ec85SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*70a7ec85SAndroid Build Coastguard Worker *
10*70a7ec85SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*70a7ec85SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*70a7ec85SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*70a7ec85SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*70a7ec85SAndroid Build Coastguard Worker * limitations under the License.
15*70a7ec85SAndroid Build Coastguard Worker */
16*70a7ec85SAndroid Build Coastguard Worker
17*70a7ec85SAndroid Build Coastguard Worker #define LOG_TAG "LibVintfTest"
18*70a7ec85SAndroid Build Coastguard Worker
19*70a7ec85SAndroid Build Coastguard Worker #include <algorithm>
20*70a7ec85SAndroid Build Coastguard Worker #include <functional>
21*70a7ec85SAndroid Build Coastguard Worker #include <vector>
22*70a7ec85SAndroid Build Coastguard Worker
23*70a7ec85SAndroid Build Coastguard Worker #include <android-base/logging.h>
24*70a7ec85SAndroid Build Coastguard Worker #include <android-base/parseint.h>
25*70a7ec85SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
26*70a7ec85SAndroid Build Coastguard Worker #include <android-base/strings.h>
27*70a7ec85SAndroid Build Coastguard Worker #include <gmock/gmock.h>
28*70a7ec85SAndroid Build Coastguard Worker #include <gtest/gtest.h>
29*70a7ec85SAndroid Build Coastguard Worker
30*70a7ec85SAndroid Build Coastguard Worker #include <vintf/CompatibilityMatrix.h>
31*70a7ec85SAndroid Build Coastguard Worker #include <vintf/KernelConfigParser.h>
32*70a7ec85SAndroid Build Coastguard Worker #include <vintf/VintfObject.h>
33*70a7ec85SAndroid Build Coastguard Worker #include <vintf/parse_string.h>
34*70a7ec85SAndroid Build Coastguard Worker #include <vintf/parse_xml.h>
35*70a7ec85SAndroid Build Coastguard Worker #include "constants-private.h"
36*70a7ec85SAndroid Build Coastguard Worker #include "parse_xml_for_test.h"
37*70a7ec85SAndroid Build Coastguard Worker #include "parse_xml_internal.h"
38*70a7ec85SAndroid Build Coastguard Worker #include "test_constants.h"
39*70a7ec85SAndroid Build Coastguard Worker #include "utils.h"
40*70a7ec85SAndroid Build Coastguard Worker
41*70a7ec85SAndroid Build Coastguard Worker using android::base::StringPrintf;
42*70a7ec85SAndroid Build Coastguard Worker using ::testing::Combine;
43*70a7ec85SAndroid Build Coastguard Worker using ::testing::ElementsAre;
44*70a7ec85SAndroid Build Coastguard Worker using ::testing::Eq;
45*70a7ec85SAndroid Build Coastguard Worker using ::testing::HasSubstr;
46*70a7ec85SAndroid Build Coastguard Worker using ::testing::IsEmpty;
47*70a7ec85SAndroid Build Coastguard Worker using ::testing::Optional;
48*70a7ec85SAndroid Build Coastguard Worker using ::testing::Property;
49*70a7ec85SAndroid Build Coastguard Worker using ::testing::Range;
50*70a7ec85SAndroid Build Coastguard Worker using ::testing::SizeIs;
51*70a7ec85SAndroid Build Coastguard Worker using ::testing::TestParamInfo;
52*70a7ec85SAndroid Build Coastguard Worker
53*70a7ec85SAndroid Build Coastguard Worker using std::string_literals::operator""s;
54*70a7ec85SAndroid Build Coastguard Worker
55*70a7ec85SAndroid Build Coastguard Worker namespace android {
56*70a7ec85SAndroid Build Coastguard Worker namespace vintf {
57*70a7ec85SAndroid Build Coastguard Worker
58*70a7ec85SAndroid Build Coastguard Worker #define EXPECT_IN(sub, str) EXPECT_THAT(str, HasSubstr(sub))
59*70a7ec85SAndroid Build Coastguard Worker
60*70a7ec85SAndroid Build Coastguard Worker struct LibVintfTest : public ::testing::Test {
61*70a7ec85SAndroid Build Coastguard Worker public:
SetUpandroid::vintf::LibVintfTest62*70a7ec85SAndroid Build Coastguard Worker virtual void SetUp() override {
63*70a7ec85SAndroid Build Coastguard Worker }
TearDownandroid::vintf::LibVintfTest64*70a7ec85SAndroid Build Coastguard Worker virtual void TearDown() override {
65*70a7ec85SAndroid Build Coastguard Worker }
addandroid::vintf::LibVintfTest66*70a7ec85SAndroid Build Coastguard Worker bool add(CompatibilityMatrix &cm, MatrixHal &&hal) {
67*70a7ec85SAndroid Build Coastguard Worker return cm.add(std::move(hal));
68*70a7ec85SAndroid Build Coastguard Worker }
addandroid::vintf::LibVintfTest69*70a7ec85SAndroid Build Coastguard Worker bool add(CompatibilityMatrix &cm, MatrixKernel &&kernel) {
70*70a7ec85SAndroid Build Coastguard Worker std::string error;
71*70a7ec85SAndroid Build Coastguard Worker bool success = cm.addKernel(std::move(kernel), &error);
72*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(success, error == "") << "success: " << success << ", error: " << error;
73*70a7ec85SAndroid Build Coastguard Worker return success;
74*70a7ec85SAndroid Build Coastguard Worker }
addandroid::vintf::LibVintfTest75*70a7ec85SAndroid Build Coastguard Worker bool add(HalManifest& vm, ManifestHal&& hal) { return vm.add(std::move(hal), nullptr); }
addXmlFileandroid::vintf::LibVintfTest76*70a7ec85SAndroid Build Coastguard Worker void addXmlFile(CompatibilityMatrix& cm, std::string name, VersionRange range) {
77*70a7ec85SAndroid Build Coastguard Worker MatrixXmlFile f;
78*70a7ec85SAndroid Build Coastguard Worker f.mName = name;
79*70a7ec85SAndroid Build Coastguard Worker f.mVersionRange = range;
80*70a7ec85SAndroid Build Coastguard Worker f.mFormat = XmlSchemaFormat::DTD;
81*70a7ec85SAndroid Build Coastguard Worker f.mOptional = true;
82*70a7ec85SAndroid Build Coastguard Worker cm.addXmlFile(std::move(f));
83*70a7ec85SAndroid Build Coastguard Worker }
setandroid::vintf::LibVintfTest84*70a7ec85SAndroid Build Coastguard Worker void set(CompatibilityMatrix &cm, Sepolicy &&sepolicy) {
85*70a7ec85SAndroid Build Coastguard Worker cm.framework.mSepolicy = sepolicy;
86*70a7ec85SAndroid Build Coastguard Worker }
setandroid::vintf::LibVintfTest87*70a7ec85SAndroid Build Coastguard Worker void set(CompatibilityMatrix &cm, SchemaType type) {
88*70a7ec85SAndroid Build Coastguard Worker cm.mType = type;
89*70a7ec85SAndroid Build Coastguard Worker }
setandroid::vintf::LibVintfTest90*70a7ec85SAndroid Build Coastguard Worker void set(CompatibilityMatrix &cm, VndkVersionRange &&range, std::set<std::string> &&libs) {
91*70a7ec85SAndroid Build Coastguard Worker cm.device.mVndk.mVersionRange = range;
92*70a7ec85SAndroid Build Coastguard Worker cm.device.mVndk.mLibraries = libs;
93*70a7ec85SAndroid Build Coastguard Worker }
setAvbandroid::vintf::LibVintfTest94*70a7ec85SAndroid Build Coastguard Worker void setAvb(RuntimeInfo &ki, Version vbmeta, Version boot) {
95*70a7ec85SAndroid Build Coastguard Worker ki.mBootVbmetaAvbVersion = vbmeta;
96*70a7ec85SAndroid Build Coastguard Worker ki.mBootAvbVersion = boot;
97*70a7ec85SAndroid Build Coastguard Worker }
setAvbandroid::vintf::LibVintfTest98*70a7ec85SAndroid Build Coastguard Worker void setAvb(CompatibilityMatrix &cm, Version &&avbVersion) {
99*70a7ec85SAndroid Build Coastguard Worker cm.framework.mAvbMetaVersion = avbVersion;
100*70a7ec85SAndroid Build Coastguard Worker }
getAvbandroid::vintf::LibVintfTest101*70a7ec85SAndroid Build Coastguard Worker Version getAvb(CompatibilityMatrix &cm) {
102*70a7ec85SAndroid Build Coastguard Worker return cm.framework.mAvbMetaVersion;
103*70a7ec85SAndroid Build Coastguard Worker }
getAnyHalandroid::vintf::LibVintfTest104*70a7ec85SAndroid Build Coastguard Worker const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
105*70a7ec85SAndroid Build Coastguard Worker return vm.getAnyHal(name);
106*70a7ec85SAndroid Build Coastguard Worker }
getAnyHalandroid::vintf::LibVintfTest107*70a7ec85SAndroid Build Coastguard Worker MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
108*70a7ec85SAndroid Build Coastguard Worker return cm.getAnyHal(name);
109*70a7ec85SAndroid Build Coastguard Worker }
getHalsandroid::vintf::LibVintfTest110*70a7ec85SAndroid Build Coastguard Worker ConstMultiMapValueIterable<std::string, ManifestHal> getHals(const HalManifest& vm) {
111*70a7ec85SAndroid Build Coastguard Worker return vm.getHals();
112*70a7ec85SAndroid Build Coastguard Worker }
getHalsandroid::vintf::LibVintfTest113*70a7ec85SAndroid Build Coastguard Worker std::vector<const ManifestHal*> getHals(const HalManifest& vm, const std::string& name) {
114*70a7ec85SAndroid Build Coastguard Worker return vm.getHals(name);
115*70a7ec85SAndroid Build Coastguard Worker }
getHalsandroid::vintf::LibVintfTest116*70a7ec85SAndroid Build Coastguard Worker std::vector<const MatrixHal*> getHals(const CompatibilityMatrix& cm, const std::string& name) {
117*70a7ec85SAndroid Build Coastguard Worker return cm.getHals(name);
118*70a7ec85SAndroid Build Coastguard Worker }
isValidandroid::vintf::LibVintfTest119*70a7ec85SAndroid Build Coastguard Worker bool isValid(const ManifestHal &mh) {
120*70a7ec85SAndroid Build Coastguard Worker return mh.isValid();
121*70a7ec85SAndroid Build Coastguard Worker }
getKernelsandroid::vintf::LibVintfTest122*70a7ec85SAndroid Build Coastguard Worker std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
addAllHalsAsOptionalandroid::vintf::LibVintfTest123*70a7ec85SAndroid Build Coastguard Worker bool addAllHalsAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2, std::string* e) {
124*70a7ec85SAndroid Build Coastguard Worker return cm1->addAllHalsAsOptional(cm2, e);
125*70a7ec85SAndroid Build Coastguard Worker }
addAllXmlFilesAsOptionalandroid::vintf::LibVintfTest126*70a7ec85SAndroid Build Coastguard Worker bool addAllXmlFilesAsOptional(CompatibilityMatrix* cm1, CompatibilityMatrix* cm2,
127*70a7ec85SAndroid Build Coastguard Worker std::string* e) {
128*70a7ec85SAndroid Build Coastguard Worker return cm1->addAllXmlFilesAsOptional(cm2, e);
129*70a7ec85SAndroid Build Coastguard Worker }
checkUnusedHalsandroid::vintf::LibVintfTest130*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> checkUnusedHals(const HalManifest& m, const CompatibilityMatrix& cm) {
131*70a7ec85SAndroid Build Coastguard Worker return m.checkUnusedHals(cm, {});
132*70a7ec85SAndroid Build Coastguard Worker }
getLevelandroid::vintf::LibVintfTest133*70a7ec85SAndroid Build Coastguard Worker Level getLevel(const KernelInfo& ki) { return ki.level(); }
parseGkiKernelReleaseandroid::vintf::LibVintfTest134*70a7ec85SAndroid Build Coastguard Worker static status_t parseGkiKernelRelease(RuntimeInfo::FetchFlags flags,
135*70a7ec85SAndroid Build Coastguard Worker const std::string& kernelRelease, KernelVersion* version,
136*70a7ec85SAndroid Build Coastguard Worker Level* kernelLevel) {
137*70a7ec85SAndroid Build Coastguard Worker return RuntimeInfo::parseGkiKernelRelease(flags, kernelRelease, version, kernelLevel);
138*70a7ec85SAndroid Build Coastguard Worker }
139*70a7ec85SAndroid Build Coastguard Worker
testHalInterfacesandroid::vintf::LibVintfTest140*70a7ec85SAndroid Build Coastguard Worker std::map<std::string, HalInterface> testHalInterfaces() {
141*70a7ec85SAndroid Build Coastguard Worker HalInterface intf("IFoo", {"default"});
142*70a7ec85SAndroid Build Coastguard Worker std::map<std::string, HalInterface> map;
143*70a7ec85SAndroid Build Coastguard Worker map[intf.name()] = intf;
144*70a7ec85SAndroid Build Coastguard Worker return map;
145*70a7ec85SAndroid Build Coastguard Worker }
146*70a7ec85SAndroid Build Coastguard Worker
createManifestHalandroid::vintf::LibVintfTest147*70a7ec85SAndroid Build Coastguard Worker ManifestHal createManifestHal(HalFormat format, std::string name, TransportArch ta,
148*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo exclusiveTo,
149*70a7ec85SAndroid Build Coastguard Worker const std::set<FqInstance>& fqInstances) {
150*70a7ec85SAndroid Build Coastguard Worker ManifestHal ret;
151*70a7ec85SAndroid Build Coastguard Worker ret.format = format;
152*70a7ec85SAndroid Build Coastguard Worker ret.name = std::move(name);
153*70a7ec85SAndroid Build Coastguard Worker // AIDL versions are stored in the versions field instead of only in the
154*70a7ec85SAndroid Build Coastguard Worker // FqInstance
155*70a7ec85SAndroid Build Coastguard Worker if (format == HalFormat::AIDL) {
156*70a7ec85SAndroid Build Coastguard Worker for (const auto& fq : fqInstances) {
157*70a7ec85SAndroid Build Coastguard Worker auto [major, minor] = fq.getVersion();
158*70a7ec85SAndroid Build Coastguard Worker ret.versions.push_back({major, minor});
159*70a7ec85SAndroid Build Coastguard Worker }
160*70a7ec85SAndroid Build Coastguard Worker }
161*70a7ec85SAndroid Build Coastguard Worker ret.transportArch = ta;
162*70a7ec85SAndroid Build Coastguard Worker ret.exclusiveTo = exclusiveTo;
163*70a7ec85SAndroid Build Coastguard Worker std::string error;
164*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(ret.insertInstances(fqInstances, false, &error)) << error;
165*70a7ec85SAndroid Build Coastguard Worker return ret;
166*70a7ec85SAndroid Build Coastguard Worker }
167*70a7ec85SAndroid Build Coastguard Worker
testDeviceManifestWithSepolicyandroid::vintf::LibVintfTest168*70a7ec85SAndroid Build Coastguard Worker HalManifest testDeviceManifestWithSepolicy(SepolicyVersion sepolicyVersion) {
169*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
170*70a7ec85SAndroid Build Coastguard Worker vm.mType = SchemaType::DEVICE;
171*70a7ec85SAndroid Build Coastguard Worker vm.device.mSepolicyVersion = sepolicyVersion;
172*70a7ec85SAndroid Build Coastguard Worker vm.add(createManifestHal(HalFormat::HIDL, "android.hardware.camera",
173*70a7ec85SAndroid Build Coastguard Worker {Transport::HWBINDER, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
174*70a7ec85SAndroid Build Coastguard Worker {
175*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "ICamera", "legacy/0"),
176*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "ICamera", "default"),
177*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "IBetterCamera", "camera"),
178*70a7ec85SAndroid Build Coastguard Worker }));
179*70a7ec85SAndroid Build Coastguard Worker vm.add(createManifestHal(HalFormat::HIDL, "android.hardware.nfc",
180*70a7ec85SAndroid Build Coastguard Worker {Transport::PASSTHROUGH, Arch::ARCH_32_64}, ExclusiveTo::EMPTY,
181*70a7ec85SAndroid Build Coastguard Worker std::set({*FqInstance::from(1, 0, "INfc", "default")})));
182*70a7ec85SAndroid Build Coastguard Worker
183*70a7ec85SAndroid Build Coastguard Worker return vm;
184*70a7ec85SAndroid Build Coastguard Worker }
testDeviceManifestandroid::vintf::LibVintfTest185*70a7ec85SAndroid Build Coastguard Worker HalManifest testDeviceManifest() { return testDeviceManifestWithSepolicy({25, 0}); }
testDeviceManifestWithXmlFileandroid::vintf::LibVintfTest186*70a7ec85SAndroid Build Coastguard Worker HalManifest testDeviceManifestWithXmlFile() {
187*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
188*70a7ec85SAndroid Build Coastguard Worker ManifestXmlFile xmlFile;
189*70a7ec85SAndroid Build Coastguard Worker xmlFile.mName = "media_profile";
190*70a7ec85SAndroid Build Coastguard Worker xmlFile.mVersion = {1, 0};
191*70a7ec85SAndroid Build Coastguard Worker vm.addXmlFile(std::move(xmlFile));
192*70a7ec85SAndroid Build Coastguard Worker return vm;
193*70a7ec85SAndroid Build Coastguard Worker }
testFrameworkManfiestandroid::vintf::LibVintfTest194*70a7ec85SAndroid Build Coastguard Worker HalManifest testFrameworkManfiest() {
195*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
196*70a7ec85SAndroid Build Coastguard Worker vm.mType = SchemaType::FRAMEWORK;
197*70a7ec85SAndroid Build Coastguard Worker vm.add(createManifestHal(
198*70a7ec85SAndroid Build Coastguard Worker HalFormat::HIDL, "android.hidl.manager", {Transport::HWBINDER, Arch::ARCH_EMPTY},
199*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY, std::set({*FqInstance::from(1, 0, "IServiceManager", "default")})));
200*70a7ec85SAndroid Build Coastguard Worker Vndk vndk2505;
201*70a7ec85SAndroid Build Coastguard Worker vndk2505.mVersionRange = {25, 0, 5};
202*70a7ec85SAndroid Build Coastguard Worker vndk2505.mLibraries = {"libjpeg.so", "libbase.so"};
203*70a7ec85SAndroid Build Coastguard Worker Vndk vndk2513;
204*70a7ec85SAndroid Build Coastguard Worker vndk2513.mVersionRange = {25, 1, 3};
205*70a7ec85SAndroid Build Coastguard Worker vndk2513.mLibraries = {"libjpeg.so", "libbase.so", "libtinyxml2.so"};
206*70a7ec85SAndroid Build Coastguard Worker vm.framework.mVndks = { std::move(vndk2505), std::move(vndk2513) };
207*70a7ec85SAndroid Build Coastguard Worker
208*70a7ec85SAndroid Build Coastguard Worker return vm;
209*70a7ec85SAndroid Build Coastguard Worker }
testRuntimeInfoandroid::vintf::LibVintfTest210*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo testRuntimeInfo() {
211*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo info;
212*70a7ec85SAndroid Build Coastguard Worker info.mOsName = "Linux";
213*70a7ec85SAndroid Build Coastguard Worker info.mNodeName = "localhost";
214*70a7ec85SAndroid Build Coastguard Worker info.mOsRelease = "3.18.31-g936f9a479d0f";
215*70a7ec85SAndroid Build Coastguard Worker info.mOsVersion = "#4 SMP PREEMPT Wed Feb 1 18:10:52 PST 2017";
216*70a7ec85SAndroid Build Coastguard Worker info.mHardwareId = "aarch64";
217*70a7ec85SAndroid Build Coastguard Worker info.mKernelSepolicyVersion = 30;
218*70a7ec85SAndroid Build Coastguard Worker info.mKernel = testKernelInfo();
219*70a7ec85SAndroid Build Coastguard Worker setAvb(info, {2, 1}, {2, 1});
220*70a7ec85SAndroid Build Coastguard Worker return info;
221*70a7ec85SAndroid Build Coastguard Worker }
testKernelInfoandroid::vintf::LibVintfTest222*70a7ec85SAndroid Build Coastguard Worker KernelInfo testKernelInfo() {
223*70a7ec85SAndroid Build Coastguard Worker KernelInfo info;
224*70a7ec85SAndroid Build Coastguard Worker info.mVersion = {3, 18, 31};
225*70a7ec85SAndroid Build Coastguard Worker info.mConfigs = {{"CONFIG_64BIT", "y"},
226*70a7ec85SAndroid Build Coastguard Worker {"CONFIG_ANDROID_BINDER_DEVICES", "\"binder,hwbinder\""},
227*70a7ec85SAndroid Build Coastguard Worker {"CONFIG_ARCH_MMAP_RND_BITS", "24"},
228*70a7ec85SAndroid Build Coastguard Worker {"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", "\"\""},
229*70a7ec85SAndroid Build Coastguard Worker {"CONFIG_ILLEGAL_POINTER_VALUE", "0xdead000000000000"}};
230*70a7ec85SAndroid Build Coastguard Worker return info;
231*70a7ec85SAndroid Build Coastguard Worker }
fetchManifestandroid::vintf::LibVintfTest232*70a7ec85SAndroid Build Coastguard Worker status_t fetchManifest(HalManifest& manifest, FileSystem* files, const std::string& path,
233*70a7ec85SAndroid Build Coastguard Worker std::string* error) {
234*70a7ec85SAndroid Build Coastguard Worker return manifest.fetchAllInformation(files, path, error);
235*70a7ec85SAndroid Build Coastguard Worker }
236*70a7ec85SAndroid Build Coastguard Worker };
237*70a7ec85SAndroid Build Coastguard Worker
238*70a7ec85SAndroid Build Coastguard Worker // clang-format off
239*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ArchOperatorOr)240*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ArchOperatorOr) {
241*70a7ec85SAndroid Build Coastguard Worker Arch a = Arch::ARCH_EMPTY;
242*70a7ec85SAndroid Build Coastguard Worker a |= Arch::ARCH_32;
243*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Arch::ARCH_32, a);
244*70a7ec85SAndroid Build Coastguard Worker
245*70a7ec85SAndroid Build Coastguard Worker a |= Arch::ARCH_64;
246*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Arch::ARCH_32_64, a);
247*70a7ec85SAndroid Build Coastguard Worker
248*70a7ec85SAndroid Build Coastguard Worker a = Arch::ARCH_EMPTY;
249*70a7ec85SAndroid Build Coastguard Worker a |= Arch::ARCH_64;
250*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Arch::ARCH_64, a);
251*70a7ec85SAndroid Build Coastguard Worker }
252*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,Stringify)253*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, Stringify) {
254*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
255*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(dump(vm), "hidl/android.hardware.camera/hwbinder/:"
256*70a7ec85SAndroid Build Coastguard Worker "hidl/android.hardware.nfc/passthrough32+64/");
257*70a7ec85SAndroid Build Coastguard Worker
258*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(to_string(HalFormat::HIDL), "hidl");
259*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(to_string(HalFormat::NATIVE), "native");
260*70a7ec85SAndroid Build Coastguard Worker
261*70a7ec85SAndroid Build Coastguard Worker VersionRange v(1, 2, 3);
262*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(to_string(v), "1.2-3");
263*70a7ec85SAndroid Build Coastguard Worker VersionRange v2;
264*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(parse("1.2-3", &v2));
265*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(v, v2);
266*70a7ec85SAndroid Build Coastguard Worker SepolicyVersionRange v3(4, std::nullopt);
267*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(to_string(v3), "4");
268*70a7ec85SAndroid Build Coastguard Worker SepolicyVersionRange v4;
269*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(parse("4", &v4));
270*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(v3, v4);
271*70a7ec85SAndroid Build Coastguard Worker SepolicyVersion v5(5, std::nullopt);
272*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(to_string(v5), "5");
273*70a7ec85SAndroid Build Coastguard Worker SepolicyVersion v6;
274*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(parse("5", &v6));
275*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(v5, v6);
276*70a7ec85SAndroid Build Coastguard Worker }
277*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,GetTransport)278*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, GetTransport) {
279*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
280*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::HWBINDER, vm.getHidlTransport("android.hardware.camera",
281*70a7ec85SAndroid Build Coastguard Worker {2, 0}, "ICamera", "default"));
282*70a7ec85SAndroid Build Coastguard Worker }
283*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FutureManifestCompatible)284*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FutureManifestCompatible) {
285*70a7ec85SAndroid Build Coastguard Worker HalManifest expectedManifest;
286*70a7ec85SAndroid Build Coastguard Worker expectedManifest.add(createManifestHal(HalFormat::HIDL,
287*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo",
288*70a7ec85SAndroid Build Coastguard Worker {Transport::HWBINDER, Arch::ARCH_EMPTY},
289*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
290*70a7ec85SAndroid Build Coastguard Worker {*FqInstance::from(1, 0, "IFoo", "default")}));
291*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
292*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\" might_add=\"true\">\n"
293*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" attribuet_might_be_added=\"value\">\n"
294*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
295*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
296*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
297*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
298*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
299*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
300*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
301*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
302*70a7ec85SAndroid Build Coastguard Worker " <tag_might_be_added/>\n"
303*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
304*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
305*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
306*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(expectedManifest, manifest) << dump(expectedManifest)
307*70a7ec85SAndroid Build Coastguard Worker << " is expected but got " << dump(manifest);
308*70a7ec85SAndroid Build Coastguard Worker }
309*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverter)310*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverter) {
311*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
312*70a7ec85SAndroid Build Coastguard Worker std::string xml =
313*70a7ec85SAndroid Build Coastguard Worker toXml(vm, SerializeFlags::HALS_ONLY.enableSepolicy());
314*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
315*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
316*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
317*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
318*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
319*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::IBetterCamera/camera</fqname>\n"
320*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::ICamera/default</fqname>\n"
321*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::ICamera/legacy/0</fqname>\n"
322*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
323*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
324*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
325*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>\n"
326*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::INfc/default</fqname>\n"
327*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
328*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
329*70a7ec85SAndroid Build Coastguard Worker " <version>25.0</version>\n"
330*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
331*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n");
332*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
333*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
334*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
335*70a7ec85SAndroid Build Coastguard Worker }
336*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverterWithVfrcSepolicy)337*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverterWithVfrcSepolicy) {
338*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifestWithSepolicy({202404, std::nullopt});
339*70a7ec85SAndroid Build Coastguard Worker std::string xml =
340*70a7ec85SAndroid Build Coastguard Worker toXml(vm, SerializeFlags::HALS_ONLY.enableSepolicy());
341*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
342*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
343*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
344*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
345*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
346*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::IBetterCamera/camera</fqname>\n"
347*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::ICamera/default</fqname>\n"
348*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::ICamera/legacy/0</fqname>\n"
349*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
350*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
351*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
352*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>\n"
353*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::INfc/default</fqname>\n"
354*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
355*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
356*70a7ec85SAndroid Build Coastguard Worker " <version>202404</version>\n"
357*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
358*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n");
359*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
360*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
361*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
362*70a7ec85SAndroid Build Coastguard Worker }
363*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverterWithInterface)364*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverterWithInterface) {
365*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
366*70a7ec85SAndroid Build Coastguard Worker std::string xml =
367*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
368*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
369*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
370*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
371*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
372*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
373*70a7ec85SAndroid Build Coastguard Worker " <name>IBetterCamera</name>\n"
374*70a7ec85SAndroid Build Coastguard Worker " <instance>camera</instance>\n"
375*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
376*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
377*70a7ec85SAndroid Build Coastguard Worker " <name>ICamera</name>\n"
378*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
379*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/0</instance>\n"
380*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
381*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
382*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
383*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
384*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>\n"
385*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
386*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
387*70a7ec85SAndroid Build Coastguard Worker " <name>INfc</name>\n"
388*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
389*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
390*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
391*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
392*70a7ec85SAndroid Build Coastguard Worker " <version>25.0</version>\n"
393*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
394*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
395*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
396*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
397*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
398*70a7ec85SAndroid Build Coastguard Worker }
399*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverterFramework)400*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverterFramework) {
401*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testFrameworkManfiest();
402*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(vm, SerializeFlags::HALS_ONLY.enableVndk());
403*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
404*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
405*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
406*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>\n"
407*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
408*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IServiceManager/default</fqname>\n"
409*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
410*70a7ec85SAndroid Build Coastguard Worker " <vndk>\n"
411*70a7ec85SAndroid Build Coastguard Worker " <version>25.0.5</version>\n"
412*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
413*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
414*70a7ec85SAndroid Build Coastguard Worker " </vndk>\n"
415*70a7ec85SAndroid Build Coastguard Worker " <vndk>\n"
416*70a7ec85SAndroid Build Coastguard Worker " <version>25.1.3</version>\n"
417*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
418*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
419*70a7ec85SAndroid Build Coastguard Worker " <library>libtinyxml2.so</library>\n"
420*70a7ec85SAndroid Build Coastguard Worker " </vndk>\n"
421*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n");
422*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
423*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
424*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
425*70a7ec85SAndroid Build Coastguard Worker }
426*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverterFrameworkWithInterface)427*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverterFrameworkWithInterface) {
428*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testFrameworkManfiest();
429*70a7ec85SAndroid Build Coastguard Worker std::string xml =
430*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
431*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
432*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>\n"
433*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
434*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
435*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
436*70a7ec85SAndroid Build Coastguard Worker " <name>IServiceManager</name>\n"
437*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
438*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
439*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
440*70a7ec85SAndroid Build Coastguard Worker " <vndk>\n"
441*70a7ec85SAndroid Build Coastguard Worker " <version>25.0.5</version>\n"
442*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
443*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
444*70a7ec85SAndroid Build Coastguard Worker " </vndk>\n"
445*70a7ec85SAndroid Build Coastguard Worker " <vndk>\n"
446*70a7ec85SAndroid Build Coastguard Worker " <version>25.1.3</version>\n"
447*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
448*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
449*70a7ec85SAndroid Build Coastguard Worker " <library>libtinyxml2.so</library>\n"
450*70a7ec85SAndroid Build Coastguard Worker " </vndk>\n"
451*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
452*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
453*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
454*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
455*70a7ec85SAndroid Build Coastguard Worker }
456*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestOptional)457*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestOptional) {
458*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
459*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm,
460*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\"></manifest>"));
461*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm,
462*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">"
463*70a7ec85SAndroid Build Coastguard Worker " <hal>"
464*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
465*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>"
466*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
467*70a7ec85SAndroid Build Coastguard Worker " </hal>"
468*70a7ec85SAndroid Build Coastguard Worker "</manifest>"));
469*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm,
470*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">"
471*70a7ec85SAndroid Build Coastguard Worker " <hal>"
472*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
473*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
474*70a7ec85SAndroid Build Coastguard Worker " </hal>"
475*70a7ec85SAndroid Build Coastguard Worker "</manifest>"));
476*70a7ec85SAndroid Build Coastguard Worker }
477*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestNativeNoInstance)478*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestNativeNoInstance) {
479*70a7ec85SAndroid Build Coastguard Worker std::string error;
480*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
481*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm,
482*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
483*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\">"
484*70a7ec85SAndroid Build Coastguard Worker " <name>foo</name>"
485*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
486*70a7ec85SAndroid Build Coastguard Worker " </hal>"
487*70a7ec85SAndroid Build Coastguard Worker "</manifest>", &error)) << error;
488*70a7ec85SAndroid Build Coastguard Worker }
489*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestNativeWithTransport)490*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestNativeWithTransport) {
491*70a7ec85SAndroid Build Coastguard Worker std::string error;
492*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
493*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm,
494*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
495*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\">"
496*70a7ec85SAndroid Build Coastguard Worker " <name>foo</name>"
497*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
498*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>"
499*70a7ec85SAndroid Build Coastguard Worker " </hal>"
500*70a7ec85SAndroid Build Coastguard Worker "</manifest>", &error));
501*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr("Native HAL 'foo' should not have <transport> defined"));
502*70a7ec85SAndroid Build Coastguard Worker }
503*70a7ec85SAndroid Build Coastguard Worker
504*70a7ec85SAndroid Build Coastguard Worker // clang-format on
505*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestNativeInstancesWithInterface)506*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestNativeInstancesWithInterface) {
507*70a7ec85SAndroid Build Coastguard Worker std::string error;
508*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
509*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
510*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
511*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
512*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
513*70a7ec85SAndroid Build Coastguard Worker <interface>
514*70a7ec85SAndroid Build Coastguard Worker <name>IFoo</name>
515*70a7ec85SAndroid Build Coastguard Worker <instance>inst</instance>
516*70a7ec85SAndroid Build Coastguard Worker </interface>
517*70a7ec85SAndroid Build Coastguard Worker </hal>
518*70a7ec85SAndroid Build Coastguard Worker </manifest>
519*70a7ec85SAndroid Build Coastguard Worker )";
520*70a7ec85SAndroid Build Coastguard Worker
521*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
522*70a7ec85SAndroid Build Coastguard Worker
523*70a7ec85SAndroid Build Coastguard Worker manifest.forEachInstance([](const auto& manifestInstance) {
524*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.package(), "foo");
525*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.version(), Version(1, 0));
526*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.interface(), "IFoo");
527*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.instance(), "inst");
528*70a7ec85SAndroid Build Coastguard Worker return true; // continue
529*70a7ec85SAndroid Build Coastguard Worker });
530*70a7ec85SAndroid Build Coastguard Worker }
531*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestNativeFqInstancesWithInterface)532*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestNativeFqInstancesWithInterface) {
533*70a7ec85SAndroid Build Coastguard Worker std::string error;
534*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
535*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
536*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
537*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
538*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::IFoo/inst</fqname>
539*70a7ec85SAndroid Build Coastguard Worker </hal>
540*70a7ec85SAndroid Build Coastguard Worker </manifest>
541*70a7ec85SAndroid Build Coastguard Worker )";
542*70a7ec85SAndroid Build Coastguard Worker
543*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
544*70a7ec85SAndroid Build Coastguard Worker
545*70a7ec85SAndroid Build Coastguard Worker manifest.forEachInstance([](const auto& manifestInstance) {
546*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.package(), "foo");
547*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.version(), Version(1, 0));
548*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.interface(), "IFoo");
549*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.instance(), "inst");
550*70a7ec85SAndroid Build Coastguard Worker return true; // continue
551*70a7ec85SAndroid Build Coastguard Worker });
552*70a7ec85SAndroid Build Coastguard Worker }
553*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestNativeInstancesNoInterface)554*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestNativeInstancesNoInterface) {
555*70a7ec85SAndroid Build Coastguard Worker std::string error;
556*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
557*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
558*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
559*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
560*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
561*70a7ec85SAndroid Build Coastguard Worker <interface>
562*70a7ec85SAndroid Build Coastguard Worker <instance>inst</instance>
563*70a7ec85SAndroid Build Coastguard Worker </interface>
564*70a7ec85SAndroid Build Coastguard Worker </hal>
565*70a7ec85SAndroid Build Coastguard Worker </manifest>
566*70a7ec85SAndroid Build Coastguard Worker )";
567*70a7ec85SAndroid Build Coastguard Worker
568*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
569*70a7ec85SAndroid Build Coastguard Worker
570*70a7ec85SAndroid Build Coastguard Worker manifest.forEachInstance([](const auto& manifestInstance) {
571*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.package(), "foo");
572*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.version(), Version(1, 0));
573*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.interface(), "");
574*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.instance(), "inst");
575*70a7ec85SAndroid Build Coastguard Worker return true; // continue
576*70a7ec85SAndroid Build Coastguard Worker });
577*70a7ec85SAndroid Build Coastguard Worker }
578*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestNativeFqInstancesNoInterface)579*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestNativeFqInstancesNoInterface) {
580*70a7ec85SAndroid Build Coastguard Worker std::string error;
581*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
582*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
583*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
584*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
585*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0/inst</fqname>
586*70a7ec85SAndroid Build Coastguard Worker </hal>
587*70a7ec85SAndroid Build Coastguard Worker </manifest>
588*70a7ec85SAndroid Build Coastguard Worker )";
589*70a7ec85SAndroid Build Coastguard Worker
590*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
591*70a7ec85SAndroid Build Coastguard Worker
592*70a7ec85SAndroid Build Coastguard Worker manifest.forEachInstance([](const auto& manifestInstance) {
593*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.package(), "foo");
594*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.version(), Version(1, 0));
595*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.interface(), "");
596*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestInstance.instance(), "inst");
597*70a7ec85SAndroid Build Coastguard Worker return true; // continue
598*70a7ec85SAndroid Build Coastguard Worker });
599*70a7ec85SAndroid Build Coastguard Worker }
600*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,QueryNativeInstances)601*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, QueryNativeInstances) {
602*70a7ec85SAndroid Build Coastguard Worker std::string error;
603*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
604*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
605*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
606*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
607*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
608*70a7ec85SAndroid Build Coastguard Worker <interface>
609*70a7ec85SAndroid Build Coastguard Worker <instance>fooinst</instance>
610*70a7ec85SAndroid Build Coastguard Worker </interface>
611*70a7ec85SAndroid Build Coastguard Worker </hal>
612*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
613*70a7ec85SAndroid Build Coastguard Worker <name>bar</name>
614*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::I/barinst</fqname>
615*70a7ec85SAndroid Build Coastguard Worker </hal>
616*70a7ec85SAndroid Build Coastguard Worker </manifest>
617*70a7ec85SAndroid Build Coastguard Worker )";
618*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
619*70a7ec85SAndroid Build Coastguard Worker
620*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getNativeInstances("foo"), std::set<std::string>{"fooinst"});
621*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasNativeInstance("foo", "fooinst"));
622*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getNativeInstances("bar"), std::set<std::string>{"barinst"});
623*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasNativeInstance("bar", "barinst"));
624*70a7ec85SAndroid Build Coastguard Worker
625*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getNativeInstances("baz"), std::set<std::string>{});
626*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasNativeInstance("baz", "bazinst"));
627*70a7ec85SAndroid Build Coastguard Worker }
628*70a7ec85SAndroid Build Coastguard Worker
629*70a7ec85SAndroid Build Coastguard Worker // clang-format off
630*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestDuplicate)631*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestDuplicate) {
632*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
633*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm,
634*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
635*70a7ec85SAndroid Build Coastguard Worker " <hal>"
636*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
637*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>"
638*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
639*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>"
640*70a7ec85SAndroid Build Coastguard Worker " </hal>"
641*70a7ec85SAndroid Build Coastguard Worker "</manifest>"))
642*70a7ec85SAndroid Build Coastguard Worker << "Should not allow duplicated major version in <hal>";
643*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm,
644*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
645*70a7ec85SAndroid Build Coastguard Worker " <hal>"
646*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
647*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>"
648*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
649*70a7ec85SAndroid Build Coastguard Worker " </hal>"
650*70a7ec85SAndroid Build Coastguard Worker " <hal>"
651*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
652*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>"
653*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>"
654*70a7ec85SAndroid Build Coastguard Worker " </hal>"
655*70a7ec85SAndroid Build Coastguard Worker "</manifest>"))
656*70a7ec85SAndroid Build Coastguard Worker << "Should not allow duplicated major version across <hal>";
657*70a7ec85SAndroid Build Coastguard Worker }
658*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestGetTransport)659*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestGetTransport) {
660*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
661*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm,
662*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
663*70a7ec85SAndroid Build Coastguard Worker " <hal>"
664*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
665*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>"
666*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
667*70a7ec85SAndroid Build Coastguard Worker " <interface>"
668*70a7ec85SAndroid Build Coastguard Worker " <name>IServiceManager</name>"
669*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>"
670*70a7ec85SAndroid Build Coastguard Worker " </interface>"
671*70a7ec85SAndroid Build Coastguard Worker " </hal>"
672*70a7ec85SAndroid Build Coastguard Worker " <hal>"
673*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>"
674*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>"
675*70a7ec85SAndroid Build Coastguard Worker " <version>2.1</version>"
676*70a7ec85SAndroid Build Coastguard Worker " <interface>"
677*70a7ec85SAndroid Build Coastguard Worker " <name>IServiceManager</name>"
678*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>"
679*70a7ec85SAndroid Build Coastguard Worker " </interface>"
680*70a7ec85SAndroid Build Coastguard Worker " </hal>"
681*70a7ec85SAndroid Build Coastguard Worker "</manifest>"));
682*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::PASSTHROUGH,
683*70a7ec85SAndroid Build Coastguard Worker vm.getHidlTransport("android.hidl.manager", {2, 1}, "IServiceManager", "default"));
684*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::PASSTHROUGH,
685*70a7ec85SAndroid Build Coastguard Worker vm.getHidlTransport("android.hidl.manager", {2, 0}, "IServiceManager", "default"));
686*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::EMPTY,
687*70a7ec85SAndroid Build Coastguard Worker vm.getHidlTransport("android.hidl.manager", {2, 2}, "IServiceManager", "default"));
688*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::HWBINDER,
689*70a7ec85SAndroid Build Coastguard Worker vm.getHidlTransport("android.hidl.manager", {1, 0}, "IServiceManager", "default"));
690*70a7ec85SAndroid Build Coastguard Worker }
691*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestInstances)692*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestInstances) {
693*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
694*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm.getHidlInstances("android.hardware.camera", {2, 0}, "ICamera"),
695*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "legacy/0"}));
696*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm.getHidlInstances("android.hardware.camera", {2, 0}, "IBetterCamera"),
697*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"camera"}));
698*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm.getHidlInstances("android.hardware.camera", {2, 0}, "INotExist"),
699*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({}));
700*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm.getHidlInstances("android.hardware.nfc", {1, 0}, "INfc"),
701*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default"}));
702*70a7ec85SAndroid Build Coastguard Worker
703*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "ICamera", "default"));
704*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "ICamera", "legacy/0"));
705*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "camera"));
706*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(vm.hasHidlInstance("android.hardware.nfc", {1, 0}, "INfc", "default"));
707*70a7ec85SAndroid Build Coastguard Worker
708*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "INotExist", "default"));
709*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "ICamera", "notexist"));
710*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "IBetterCamera", "default"));
711*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(vm.hasHidlInstance("android.hardware.camera", {2, 0}, "INotExist", "notexist"));
712*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(vm.hasHidlInstance("android.hardware.nfc", {1, 0}, "INfc", "notexist"));
713*70a7ec85SAndroid Build Coastguard Worker }
714*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,VersionConverter)715*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, VersionConverter) {
716*70a7ec85SAndroid Build Coastguard Worker Version v(3, 6);
717*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(v);
718*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, "<version>3.6</version>\n");
719*70a7ec85SAndroid Build Coastguard Worker Version v2;
720*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&v2, xml));
721*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(v, v2);
722*70a7ec85SAndroid Build Coastguard Worker
723*70a7ec85SAndroid Build Coastguard Worker SepolicyVersion v3(202404, std::nullopt);
724*70a7ec85SAndroid Build Coastguard Worker std::string xml2 = toXml(v3);
725*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml2, "<version>202404</version>\n");
726*70a7ec85SAndroid Build Coastguard Worker SepolicyVersion v4;
727*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&v4, xml2));
728*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(v3, v4);
729*70a7ec85SAndroid Build Coastguard Worker }
730*70a7ec85SAndroid Build Coastguard Worker
insert(std::map<std::string,HalInterface> * map,HalInterface && intf)731*70a7ec85SAndroid Build Coastguard Worker static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
732*70a7ec85SAndroid Build Coastguard Worker std::string name{intf.name()};
733*70a7ec85SAndroid Build Coastguard Worker return map->emplace(std::move(name), std::move(intf)).second;
734*70a7ec85SAndroid Build Coastguard Worker }
735*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixHalConverter)736*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixHalConverter) {
737*70a7ec85SAndroid Build Coastguard Worker MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
738*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(1,2,3), VersionRange(4,5,6)}},
739*70a7ec85SAndroid Build Coastguard Worker false /* optional */, ExclusiveTo::EMPTY, false /* updatableViaApex */, {}};
740*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
741*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
742*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(mh);
743*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
744*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"native\" optional=\"false\">\n"
745*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
746*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
747*70a7ec85SAndroid Build Coastguard Worker " <version>4.5-6</version>\n"
748*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
749*70a7ec85SAndroid Build Coastguard Worker " <name>IBetterCamera</name>\n"
750*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
751*70a7ec85SAndroid Build Coastguard Worker " <instance>great</instance>\n"
752*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
753*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
754*70a7ec85SAndroid Build Coastguard Worker " <name>ICamera</name>\n"
755*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
756*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
757*70a7ec85SAndroid Build Coastguard Worker "</hal>\n");
758*70a7ec85SAndroid Build Coastguard Worker MatrixHal mh2;
759*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&mh2, xml));
760*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(mh, mh2);
761*70a7ec85SAndroid Build Coastguard Worker }
762*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigTypedValueConverter)763*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigTypedValueConverter) {
764*70a7ec85SAndroid Build Coastguard Worker
765*70a7ec85SAndroid Build Coastguard Worker KernelConfigTypedValue converted;
766*70a7ec85SAndroid Build Coastguard Worker
767*70a7ec85SAndroid Build Coastguard Worker auto testOne = [] (const KernelConfigTypedValue &original,
768*70a7ec85SAndroid Build Coastguard Worker const std::string &expectXml) {
769*70a7ec85SAndroid Build Coastguard Worker std::string xml;
770*70a7ec85SAndroid Build Coastguard Worker KernelConfigTypedValue converted;
771*70a7ec85SAndroid Build Coastguard Worker xml = toXml(original);
772*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, expectXml);
773*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&converted, xml));
774*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(original, converted);
775*70a7ec85SAndroid Build Coastguard Worker };
776*70a7ec85SAndroid Build Coastguard Worker
777*70a7ec85SAndroid Build Coastguard Worker auto testParse = [] (const KernelConfigTypedValue &original,
778*70a7ec85SAndroid Build Coastguard Worker const std::string &xml) {
779*70a7ec85SAndroid Build Coastguard Worker KernelConfigTypedValue converted;
780*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&converted, xml));
781*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(original, converted);
782*70a7ec85SAndroid Build Coastguard Worker };
783*70a7ec85SAndroid Build Coastguard Worker
784*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue("stringvalue"),
785*70a7ec85SAndroid Build Coastguard Worker "<value type=\"string\">stringvalue</value>\n");
786*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(""),
787*70a7ec85SAndroid Build Coastguard Worker "<value type=\"string\"></value>\n");
788*70a7ec85SAndroid Build Coastguard Worker
789*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(Tristate::YES),
790*70a7ec85SAndroid Build Coastguard Worker "<value type=\"tristate\">y</value>\n");
791*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(Tristate::NO),
792*70a7ec85SAndroid Build Coastguard Worker "<value type=\"tristate\">n</value>\n");
793*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(Tristate::MODULE),
794*70a7ec85SAndroid Build Coastguard Worker "<value type=\"tristate\">m</value>\n");
795*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&converted,
796*70a7ec85SAndroid Build Coastguard Worker "<value type=\"tristate\">q</value>\n"));
797*70a7ec85SAndroid Build Coastguard Worker
798*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(KernelConfigRangeValue{4, 20}),
799*70a7ec85SAndroid Build Coastguard Worker "<value type=\"range\">4-20</value>\n");
800*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
801*70a7ec85SAndroid Build Coastguard Worker "<value type=\"range\">0-18446744073709551615</value>\n");
802*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(KernelConfigRangeValue{0, UINT64_MAX}),
803*70a7ec85SAndroid Build Coastguard Worker "<value type=\"range\">0x0-0xffffffffffffffff</value>\n");
804*70a7ec85SAndroid Build Coastguard Worker
805*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&converted,
806*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-18446744073709551616</value>\n"));
807*70a7ec85SAndroid Build Coastguard Worker
808*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(INT64_MIN),
809*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-9223372036854775808</value>\n");
810*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(INT64_MIN),
811*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">0x8000000000000000</value>\n");
812*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(INT64_MIN),
813*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-0X8000000000000000</value>\n");
814*70a7ec85SAndroid Build Coastguard Worker
815*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(INT64_MIN + 1),
816*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-0X7FFFFFFFFFFFFFFF</value>\n");
817*70a7ec85SAndroid Build Coastguard Worker
818*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(-0x50),
819*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-0x50</value>\n");
820*70a7ec85SAndroid Build Coastguard Worker
821*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(0),
822*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">0</value>\n");
823*70a7ec85SAndroid Build Coastguard Worker
824*70a7ec85SAndroid Build Coastguard Worker // Truncation for underflow.
825*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(1),
826*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-0xffffffffffffffff</value>\n");
827*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(1),
828*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-18446744073709551615</value>\n");
829*70a7ec85SAndroid Build Coastguard Worker
830*70a7ec85SAndroid Build Coastguard Worker testOne(KernelConfigTypedValue(INT64_MAX),
831*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">9223372036854775807</value>\n");
832*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(INT64_MAX),
833*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">0x7FFFFFFFFFFFFFFF</value>\n");
834*70a7ec85SAndroid Build Coastguard Worker // Truncation for underflow.
835*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(INT64_MAX),
836*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">-9223372036854775809</value>\n");
837*70a7ec85SAndroid Build Coastguard Worker
838*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(-1),
839*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">18446744073709551615</value>\n");
840*70a7ec85SAndroid Build Coastguard Worker testParse(KernelConfigTypedValue(-1),
841*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">0xffffffffffffffff</value>\n");
842*70a7ec85SAndroid Build Coastguard Worker
843*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&converted,
844*70a7ec85SAndroid Build Coastguard Worker "<value type=\"int\">18446744073709551616</value>\n"));
845*70a7ec85SAndroid Build Coastguard Worker }
846*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,CompatibilityMatrixConverter)847*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
848*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
849*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
850*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(1,2,3), VersionRange(4,5,6)}},
851*70a7ec85SAndroid Build Coastguard Worker false /* optional */, ExclusiveTo::EMPTY, false /* updatableViaApex */,
852*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces()}));
853*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
854*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(4,5,6), VersionRange(10,11,12)}},
855*70a7ec85SAndroid Build Coastguard Worker true /* optional */, ExclusiveTo::EMPTY, false /* updatableViaApex */,
856*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces()}));
857*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
858*70a7ec85SAndroid Build Coastguard Worker {KernelConfig{"CONFIG_FOO", Tristate::YES},
859*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
860*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
861*70a7ec85SAndroid Build Coastguard Worker {KernelConfig{"CONFIG_BAZ", 20},
862*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_BAR", KernelConfigRangeValue{3, 5} }}}));
863*70a7ec85SAndroid Build Coastguard Worker set(cm, Sepolicy(30, {{25, 0}, {26, 0, 3}, {202404, std::nullopt}}));
864*70a7ec85SAndroid Build Coastguard Worker setAvb(cm, Version{2, 1});
865*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(cm);
866*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
867*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
868*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"false\">\n"
869*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
870*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
871*70a7ec85SAndroid Build Coastguard Worker " <version>4.5-6</version>\n"
872*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
873*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
874*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
875*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
876*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
877*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"true\">\n"
878*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
879*70a7ec85SAndroid Build Coastguard Worker " <version>4.5-6</version>\n"
880*70a7ec85SAndroid Build Coastguard Worker " <version>10.11-12</version>\n"
881*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
882*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
883*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
884*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
885*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
886*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
887*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
888*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_FOO</key>\n"
889*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
890*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
891*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
892*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BAR</key>\n"
893*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\">stringvalue</value>\n"
894*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
895*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
896*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"4.4.1\">\n"
897*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
898*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BAZ</key>\n"
899*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">20</value>\n"
900*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
901*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
902*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BAR</key>\n"
903*70a7ec85SAndroid Build Coastguard Worker " <value type=\"range\">3-5</value>\n"
904*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
905*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
906*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
907*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
908*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.0</sepolicy-version>\n"
909*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>26.0-3</sepolicy-version>\n"
910*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>202404</sepolicy-version>\n"
911*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
912*70a7ec85SAndroid Build Coastguard Worker " <avb>\n"
913*70a7ec85SAndroid Build Coastguard Worker " <vbmeta-version>2.1</vbmeta-version>\n"
914*70a7ec85SAndroid Build Coastguard Worker " </avb>\n"
915*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
916*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
917*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml));
918*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(cm, cm2);
919*70a7ec85SAndroid Build Coastguard Worker }
920*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,DeviceCompatibilityMatrixCoverter)921*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, DeviceCompatibilityMatrixCoverter) {
922*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
923*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
924*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(1,0)}},
925*70a7ec85SAndroid Build Coastguard Worker false /* optional */, ExclusiveTo::EMPTY, false /* updatableViaApex */,
926*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces()}));
927*70a7ec85SAndroid Build Coastguard Worker set(cm, SchemaType::DEVICE);
928*70a7ec85SAndroid Build Coastguard Worker set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
929*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(cm);
930*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
931*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
932*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"false\">\n"
933*70a7ec85SAndroid Build Coastguard Worker " <name>android.hidl.manager</name>\n"
934*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
935*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
936*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
937*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
938*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
939*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
940*70a7ec85SAndroid Build Coastguard Worker " <vndk>\n"
941*70a7ec85SAndroid Build Coastguard Worker " <version>25.0.1-5</version>\n"
942*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
943*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
944*70a7ec85SAndroid Build Coastguard Worker " </vndk>\n"
945*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
946*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
947*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml));
948*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(cm, cm2);
949*70a7ec85SAndroid Build Coastguard Worker }
950*70a7ec85SAndroid Build Coastguard Worker
951*70a7ec85SAndroid Build Coastguard Worker // clang-format on
952*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,CompatibilityMatrixDefaultOptionalTrue)953*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, CompatibilityMatrixDefaultOptionalTrue) {
954*70a7ec85SAndroid Build Coastguard Worker auto xml = "<compatibility-matrix " + kMetaVersionStr + R"( type="device">
955*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
956*70a7ec85SAndroid Build Coastguard Worker <name>android.foo.bar</name>
957*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
958*70a7ec85SAndroid Build Coastguard Worker <interface>
959*70a7ec85SAndroid Build Coastguard Worker <name>IFoo</name>
960*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
961*70a7ec85SAndroid Build Coastguard Worker </interface>
962*70a7ec85SAndroid Build Coastguard Worker </hal>
963*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)";
964*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
965*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml));
966*70a7ec85SAndroid Build Coastguard Worker auto hal = getAnyHal(cm, "android.foo.bar");
967*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, hal);
968*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(hal->optional) << "If optional is not specified, it should be true by default";
969*70a7ec85SAndroid Build Coastguard Worker }
970*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,IsValid)971*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, IsValid) {
972*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(isValid(ManifestHal()));
973*70a7ec85SAndroid Build Coastguard Worker
974*70a7ec85SAndroid Build Coastguard Worker auto invalidHal =
975*70a7ec85SAndroid Build Coastguard Worker createManifestHal(HalFormat::HIDL, "android.hardware.camera",
976*70a7ec85SAndroid Build Coastguard Worker {Transport::PASSTHROUGH, Arch::ARCH_32_64}, ExclusiveTo::EMPTY, {});
977*70a7ec85SAndroid Build Coastguard Worker invalidHal.versions = {{Version(2, 0), Version(2, 1)}};
978*70a7ec85SAndroid Build Coastguard Worker
979*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(isValid(invalidHal));
980*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
981*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(add(vm2, std::move(invalidHal)));
982*70a7ec85SAndroid Build Coastguard Worker }
983*70a7ec85SAndroid Build Coastguard Worker // clang-format off
984*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestGetHalNames)985*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestGetHalNames) {
986*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
987*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm.getHalNames(), std::set<std::string>(
988*70a7ec85SAndroid Build Coastguard Worker {"android.hardware.camera", "android.hardware.nfc"}));
989*70a7ec85SAndroid Build Coastguard Worker }
990*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestGetAllHals)991*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestGetAllHals) {
992*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
993*70a7ec85SAndroid Build Coastguard Worker EXPECT_NE(getAnyHal(vm, "android.hardware.camera"), nullptr);
994*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(getAnyHal(vm, "non-existent"), nullptr);
995*70a7ec85SAndroid Build Coastguard Worker
996*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> arr{"android.hardware.camera", "android.hardware.nfc"};
997*70a7ec85SAndroid Build Coastguard Worker size_t i = 0;
998*70a7ec85SAndroid Build Coastguard Worker for (const auto &hal : getHals(vm)) {
999*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(hal.name, arr[i++]);
1000*70a7ec85SAndroid Build Coastguard Worker }
1001*70a7ec85SAndroid Build Coastguard Worker }
1002*70a7ec85SAndroid Build Coastguard Worker
1003*70a7ec85SAndroid Build Coastguard Worker // clang-format on
TEST_F(LibVintfTest,HalManifestGetHals)1004*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestGetHals) {
1005*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
1006*70a7ec85SAndroid Build Coastguard Worker
1007*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(
1008*70a7ec85SAndroid Build Coastguard Worker add(vm, createManifestHal(HalFormat::HIDL, "android.hardware.camera",
1009*70a7ec85SAndroid Build Coastguard Worker {Transport::HWBINDER, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
1010*70a7ec85SAndroid Build Coastguard Worker {
1011*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(1, 2, "ICamera", "legacy/0"),
1012*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(1, 2, "ICamera", "default"),
1013*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(1, 2, "IBetterCamera", "camera"),
1014*70a7ec85SAndroid Build Coastguard Worker })));
1015*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(
1016*70a7ec85SAndroid Build Coastguard Worker add(vm, createManifestHal(HalFormat::HIDL, "android.hardware.camera",
1017*70a7ec85SAndroid Build Coastguard Worker {Transport::HWBINDER, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
1018*70a7ec85SAndroid Build Coastguard Worker {
1019*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "ICamera", "legacy/0"),
1020*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "ICamera", "default"),
1021*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "IBetterCamera", "camera"),
1022*70a7ec85SAndroid Build Coastguard Worker })));
1023*70a7ec85SAndroid Build Coastguard Worker
1024*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(
1025*70a7ec85SAndroid Build Coastguard Worker add(vm, createManifestHal(HalFormat::HIDL, "android.hardware.nfc",
1026*70a7ec85SAndroid Build Coastguard Worker {Transport::PASSTHROUGH, Arch::ARCH_32_64}, ExclusiveTo::EMPTY,
1027*70a7ec85SAndroid Build Coastguard Worker {*FqInstance::from(1, 0, "INfc", "default"),
1028*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 1, "INfc", "default")})));
1029*70a7ec85SAndroid Build Coastguard Worker
1030*70a7ec85SAndroid Build Coastguard Worker ManifestHal expectedCameraHalV1_2 =
1031*70a7ec85SAndroid Build Coastguard Worker createManifestHal(HalFormat::HIDL, "android.hardware.camera",
1032*70a7ec85SAndroid Build Coastguard Worker {Transport::HWBINDER, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
1033*70a7ec85SAndroid Build Coastguard Worker {
1034*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(1, 2, "ICamera", "legacy/0"),
1035*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(1, 2, "ICamera", "default"),
1036*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(1, 2, "IBetterCamera", "camera"),
1037*70a7ec85SAndroid Build Coastguard Worker });
1038*70a7ec85SAndroid Build Coastguard Worker ManifestHal expectedCameraHalV2_0 =
1039*70a7ec85SAndroid Build Coastguard Worker createManifestHal(HalFormat::HIDL, "android.hardware.camera",
1040*70a7ec85SAndroid Build Coastguard Worker {Transport::HWBINDER, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
1041*70a7ec85SAndroid Build Coastguard Worker {
1042*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "ICamera", "legacy/0"),
1043*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "ICamera", "default"),
1044*70a7ec85SAndroid Build Coastguard Worker *FqInstance::from(2, 0, "IBetterCamera", "camera"),
1045*70a7ec85SAndroid Build Coastguard Worker });
1046*70a7ec85SAndroid Build Coastguard Worker ManifestHal expectedNfcHal = createManifestHal(
1047*70a7ec85SAndroid Build Coastguard Worker HalFormat::HIDL, "android.hardware.nfc", {Transport::PASSTHROUGH, Arch::ARCH_32_64},
1048*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
1049*70a7ec85SAndroid Build Coastguard Worker {*FqInstance::from(1, 0, "INfc", "default"), *FqInstance::from(2, 1, "INfc", "default")});
1050*70a7ec85SAndroid Build Coastguard Worker
1051*70a7ec85SAndroid Build Coastguard Worker auto cameraHals = getHals(vm, "android.hardware.camera");
1052*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ((int)cameraHals.size(), 2);
1053*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(*cameraHals[0], expectedCameraHalV1_2);
1054*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(*cameraHals[1], expectedCameraHalV2_0);
1055*70a7ec85SAndroid Build Coastguard Worker auto nfcHals = getHals(vm, "android.hardware.nfc");
1056*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ((int)nfcHals.size(), 1);
1057*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(*nfcHals[0], expectedNfcHal);
1058*70a7ec85SAndroid Build Coastguard Worker }
1059*70a7ec85SAndroid Build Coastguard Worker // clang-format off
1060*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,CompatibilityMatrixGetHals)1061*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, CompatibilityMatrixGetHals) {
1062*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
1063*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
1064*70a7ec85SAndroid Build Coastguard Worker "android.hardware.camera",
1065*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
1066*70a7ec85SAndroid Build Coastguard Worker false /* optional */,
1067*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
1068*70a7ec85SAndroid Build Coastguard Worker false /* updatableViaApex */,
1069*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces()}));
1070*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE,
1071*70a7ec85SAndroid Build Coastguard Worker "android.hardware.nfc",
1072*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
1073*70a7ec85SAndroid Build Coastguard Worker true /* optional */,
1074*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
1075*70a7ec85SAndroid Build Coastguard Worker false /* updatableViaApex */,
1076*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces()}));
1077*70a7ec85SAndroid Build Coastguard Worker
1078*70a7ec85SAndroid Build Coastguard Worker MatrixHal expectedCameraHal = MatrixHal{
1079*70a7ec85SAndroid Build Coastguard Worker HalFormat::NATIVE,
1080*70a7ec85SAndroid Build Coastguard Worker "android.hardware.camera",
1081*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(1, 2, 3), VersionRange(4, 5, 6)}},
1082*70a7ec85SAndroid Build Coastguard Worker false /* optional */,
1083*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
1084*70a7ec85SAndroid Build Coastguard Worker false /* updatableViaApex */,
1085*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces(),
1086*70a7ec85SAndroid Build Coastguard Worker };
1087*70a7ec85SAndroid Build Coastguard Worker MatrixHal expectedNfcHal = MatrixHal{HalFormat::NATIVE,
1088*70a7ec85SAndroid Build Coastguard Worker "android.hardware.nfc",
1089*70a7ec85SAndroid Build Coastguard Worker {{VersionRange(4, 5, 6), VersionRange(10, 11, 12)}},
1090*70a7ec85SAndroid Build Coastguard Worker true /* optional */,
1091*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
1092*70a7ec85SAndroid Build Coastguard Worker false /* updatableViaApex */,
1093*70a7ec85SAndroid Build Coastguard Worker testHalInterfaces()};
1094*70a7ec85SAndroid Build Coastguard Worker auto cameraHals = getHals(cm, "android.hardware.camera");
1095*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ((int)cameraHals.size(), 1);
1096*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(*cameraHals[0], expectedCameraHal);
1097*70a7ec85SAndroid Build Coastguard Worker auto nfcHals = getHals(cm, "android.hardware.nfc");
1098*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ((int)nfcHals.size(), 1);
1099*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(*nfcHals[0], expectedNfcHal);
1100*70a7ec85SAndroid Build Coastguard Worker }
1101*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RuntimeInfo)1102*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfo) {
1103*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo ki = testRuntimeInfo();
1104*70a7ec85SAndroid Build Coastguard Worker using KernelConfigs = std::vector<KernelConfig>;
1105*70a7ec85SAndroid Build Coastguard Worker const KernelConfigs configs {
1106*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_64BIT", Tristate::YES},
1107*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder,hwbinder"},
1108*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 24},
1109*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES", ""},
1110*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_ILLEGAL_POINTER_VALUE", 0xdead000000000000},
1111*70a7ec85SAndroid Build Coastguard Worker KernelConfig{"CONFIG_NOTEXIST", Tristate::NO},
1112*70a7ec85SAndroid Build Coastguard Worker };
1113*70a7ec85SAndroid Build Coastguard Worker
1114*70a7ec85SAndroid Build Coastguard Worker auto testMatrix = [&] (MatrixKernel &&kernel) {
1115*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
1116*70a7ec85SAndroid Build Coastguard Worker add(cm, std::move(kernel));
1117*70a7ec85SAndroid Build Coastguard Worker set(cm, {30, {{25, 0}}});
1118*70a7ec85SAndroid Build Coastguard Worker setAvb(cm, {2, 1});
1119*70a7ec85SAndroid Build Coastguard Worker return cm;
1120*70a7ec85SAndroid Build Coastguard Worker };
1121*70a7ec85SAndroid Build Coastguard Worker
1122*70a7ec85SAndroid Build Coastguard Worker std::string error;
1123*70a7ec85SAndroid Build Coastguard Worker
1124*70a7ec85SAndroid Build Coastguard Worker {
1125*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{4, 4, 1}, KernelConfigs(configs));
1126*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1127*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
1128*70a7ec85SAndroid Build Coastguard Worker }
1129*70a7ec85SAndroid Build Coastguard Worker
1130*70a7ec85SAndroid Build Coastguard Worker {
1131*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
1132*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1133*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
1134*70a7ec85SAndroid Build Coastguard Worker }
1135*70a7ec85SAndroid Build Coastguard Worker
1136*70a7ec85SAndroid Build Coastguard Worker {
1137*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
1138*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1139*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
1140*70a7ec85SAndroid Build Coastguard Worker }
1141*70a7ec85SAndroid Build Coastguard Worker
1142*70a7ec85SAndroid Build Coastguard Worker {
1143*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
1144*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1145*70a7ec85SAndroid Build Coastguard Worker set(cm, Sepolicy{22, {{25, 0}}});
1146*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
1147*70a7ec85SAndroid Build Coastguard Worker set(cm, Sepolicy{40, {{25, 0}}});
1148*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm, &error))
1149*70a7ec85SAndroid Build Coastguard Worker << "kernel-sepolicy-version shouldn't match";
1150*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("kernelSepolicyVersion = 30 but required >= 40", error);
1151*70a7ec85SAndroid Build Coastguard Worker }
1152*70a7ec85SAndroid Build Coastguard Worker
1153*70a7ec85SAndroid Build Coastguard Worker {
1154*70a7ec85SAndroid Build Coastguard Worker KernelConfigs newConfigs(configs);
1155*70a7ec85SAndroid Build Coastguard Worker newConfigs[0] = KernelConfig{"CONFIG_64BIT", Tristate::NO};
1156*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
1157*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1158*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for tristate";
1159*70a7ec85SAndroid Build Coastguard Worker }
1160*70a7ec85SAndroid Build Coastguard Worker
1161*70a7ec85SAndroid Build Coastguard Worker {
1162*70a7ec85SAndroid Build Coastguard Worker KernelConfigs newConfigs(configs);
1163*70a7ec85SAndroid Build Coastguard Worker newConfigs[0] = KernelConfig{"CONFIG_64BIT", 20};
1164*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
1165*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1166*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
1167*70a7ec85SAndroid Build Coastguard Worker }
1168*70a7ec85SAndroid Build Coastguard Worker
1169*70a7ec85SAndroid Build Coastguard Worker {
1170*70a7ec85SAndroid Build Coastguard Worker KernelConfigs newConfigs(configs);
1171*70a7ec85SAndroid Build Coastguard Worker newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", "binder"};
1172*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
1173*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1174*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for string";
1175*70a7ec85SAndroid Build Coastguard Worker }
1176*70a7ec85SAndroid Build Coastguard Worker
1177*70a7ec85SAndroid Build Coastguard Worker {
1178*70a7ec85SAndroid Build Coastguard Worker KernelConfigs newConfigs(configs);
1179*70a7ec85SAndroid Build Coastguard Worker newConfigs[1] = KernelConfig{"CONFIG_ANDROID_BINDER_DEVICES", Tristate::YES};
1180*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
1181*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1182*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Type shouldn't match";
1183*70a7ec85SAndroid Build Coastguard Worker }
1184*70a7ec85SAndroid Build Coastguard Worker
1185*70a7ec85SAndroid Build Coastguard Worker {
1186*70a7ec85SAndroid Build Coastguard Worker KernelConfigs newConfigs(configs);
1187*70a7ec85SAndroid Build Coastguard Worker newConfigs[2] = KernelConfig{"CONFIG_ARCH_MMAP_RND_BITS", 30};
1188*70a7ec85SAndroid Build Coastguard Worker MatrixKernel kernel(KernelVersion{3, 18, 22}, std::move(newConfigs));
1189*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(std::move(kernel));
1190*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm)) << "Value shouldn't match for integer";
1191*70a7ec85SAndroid Build Coastguard Worker }
1192*70a7ec85SAndroid Build Coastguard Worker
1193*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo badAvb = testRuntimeInfo();
1194*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm = testMatrix(MatrixKernel(KernelVersion{3, 18, 31}, {}));
1195*70a7ec85SAndroid Build Coastguard Worker {
1196*70a7ec85SAndroid Build Coastguard Worker setAvb(badAvb, {1, 0}, {2, 1});
1197*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(badAvb.checkCompatibility(cm, &error, CheckFlags::ENABLE_ALL_CHECKS));
1198*70a7ec85SAndroid Build Coastguard Worker EXPECT_STREQ(error.c_str(), "Vbmeta version 1.0 does not match framework matrix 2.1");
1199*70a7ec85SAndroid Build Coastguard Worker }
1200*70a7ec85SAndroid Build Coastguard Worker {
1201*70a7ec85SAndroid Build Coastguard Worker setAvb(badAvb, {2, 1}, {3, 0});
1202*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(badAvb.checkCompatibility(cm, &error, CheckFlags::ENABLE_ALL_CHECKS));
1203*70a7ec85SAndroid Build Coastguard Worker }
1204*70a7ec85SAndroid Build Coastguard Worker {
1205*70a7ec85SAndroid Build Coastguard Worker setAvb(badAvb, {2, 1}, {2, 3});
1206*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(badAvb.checkCompatibility(cm, &error, CheckFlags::ENABLE_ALL_CHECKS));
1207*70a7ec85SAndroid Build Coastguard Worker }
1208*70a7ec85SAndroid Build Coastguard Worker {
1209*70a7ec85SAndroid Build Coastguard Worker setAvb(badAvb, {2, 3}, {2, 1});
1210*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(badAvb.checkCompatibility(cm, &error, CheckFlags::ENABLE_ALL_CHECKS));
1211*70a7ec85SAndroid Build Coastguard Worker }
1212*70a7ec85SAndroid Build Coastguard Worker }
1213*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MissingAvb)1214*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MissingAvb) {
1215*70a7ec85SAndroid Build Coastguard Worker std::string xml =
1216*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1217*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.31\"></kernel>"
1218*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1219*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1220*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
1221*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1222*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
1223*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
1224*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml));
1225*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(getAvb(cm), Version(0, 0));
1226*70a7ec85SAndroid Build Coastguard Worker }
1227*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,DisableAvb)1228*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, DisableAvb) {
1229*70a7ec85SAndroid Build Coastguard Worker std::string xml =
1230*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1231*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.31\"></kernel>"
1232*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1233*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1234*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
1235*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1236*70a7ec85SAndroid Build Coastguard Worker " <avb>\n"
1237*70a7ec85SAndroid Build Coastguard Worker " <vbmeta-version>1.0</vbmeta-version>\n"
1238*70a7ec85SAndroid Build Coastguard Worker " </avb>\n"
1239*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
1240*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
1241*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml));
1242*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo ki = testRuntimeInfo();
1243*70a7ec85SAndroid Build Coastguard Worker std::string error;
1244*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(ki.checkCompatibility(cm, &error, CheckFlags::ENABLE_ALL_CHECKS));
1245*70a7ec85SAndroid Build Coastguard Worker EXPECT_STREQ(error.c_str(), "AVB version 2.1 does not match framework matrix 1.0");
1246*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(ki.checkCompatibility(cm, &error, CheckFlags::DISABLE_AVB_CHECK)) << error;
1247*70a7ec85SAndroid Build Coastguard Worker }
1248*70a7ec85SAndroid Build Coastguard Worker
1249*70a7ec85SAndroid Build Coastguard Worker // This is the test extracted from VINTF Object doc
TEST_F(LibVintfTest,HalCompat)1250*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalCompat) {
1251*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1252*70a7ec85SAndroid Build Coastguard Worker std::string error;
1253*70a7ec85SAndroid Build Coastguard Worker
1254*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
1255*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1256*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
1257*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1258*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1259*70a7ec85SAndroid Build Coastguard Worker " <version>3.1-2</version>\n"
1260*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1261*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1262*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1263*70a7ec85SAndroid Build Coastguard Worker " <instance>specific</instance>\n"
1264*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1265*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1266*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
1267*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1268*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1269*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1270*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
1271*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1272*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1273*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1274*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1275*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1276*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
1277*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1278*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
1279*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml, &error)) << error;
1280*70a7ec85SAndroid Build Coastguard Worker
1281*70a7ec85SAndroid Build Coastguard Worker {
1282*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1283*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1284*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1285*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1286*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1287*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1288*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1289*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1290*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1291*70a7ec85SAndroid Build Coastguard Worker " <instance>specific</instance>\n"
1292*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1293*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1294*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1295*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1296*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1297*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1298*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1299*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
1300*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1301*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1302*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1303*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1304*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1305*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1306*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1307*70a7ec85SAndroid Build Coastguard Worker
1308*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1309*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
1310*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1311*70a7ec85SAndroid Build Coastguard Worker }
1312*70a7ec85SAndroid Build Coastguard Worker
1313*70a7ec85SAndroid Build Coastguard Worker {
1314*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1315*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1316*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1317*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1318*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1319*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1320*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1321*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1322*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1323*70a7ec85SAndroid Build Coastguard Worker " <instance>specific</instance>\n"
1324*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1325*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1326*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1327*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1328*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1329*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1330*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1331*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
1332*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1333*70a7ec85SAndroid Build Coastguard Worker << "should not be compatible because IBar is missing";
1334*70a7ec85SAndroid Build Coastguard Worker }
1335*70a7ec85SAndroid Build Coastguard Worker
1336*70a7ec85SAndroid Build Coastguard Worker {
1337*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1338*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1339*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1340*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1341*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1342*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1343*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1344*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1345*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1346*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1347*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1348*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1349*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1350*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1351*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1352*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1353*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
1354*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1355*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1356*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1357*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1358*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1359*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1360*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1361*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1362*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
1363*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1364*70a7ec85SAndroid Build Coastguard Worker << "should not be compatible because IFoo/specific is missing";
1365*70a7ec85SAndroid Build Coastguard Worker }
1366*70a7ec85SAndroid Build Coastguard Worker
1367*70a7ec85SAndroid Build Coastguard Worker {
1368*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1369*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1370*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1371*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1372*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1373*70a7ec85SAndroid Build Coastguard Worker " <version>3.3</version>\n"
1374*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1375*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1376*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1377*70a7ec85SAndroid Build Coastguard Worker " <instance>specific</instance>\n"
1378*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1379*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1380*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1381*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1382*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1383*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1384*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1385*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
1386*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1387*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1388*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1389*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1390*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1391*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1392*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1393*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1394*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
1395*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1396*70a7ec85SAndroid Build Coastguard Worker }
1397*70a7ec85SAndroid Build Coastguard Worker
1398*70a7ec85SAndroid Build Coastguard Worker {
1399*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1400*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1401*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1402*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1403*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1404*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1405*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1406*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1407*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1408*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1409*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1410*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1411*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1412*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1413*70a7ec85SAndroid Build Coastguard Worker " <version>3.2</version>\n"
1414*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1415*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1416*70a7ec85SAndroid Build Coastguard Worker " <instance>specific</instance>\n"
1417*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1418*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1419*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1420*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1421*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1422*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1423*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1424*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
1425*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1426*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1427*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1428*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1429*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1430*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1431*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1432*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1433*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
1434*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
1435*70a7ec85SAndroid Build Coastguard Worker << "should not be compatible even though @1.0::IFoo/default "
1436*70a7ec85SAndroid Build Coastguard Worker << "and @3.2::IFoo/specific present";
1437*70a7ec85SAndroid Build Coastguard Worker }
1438*70a7ec85SAndroid Build Coastguard Worker
1439*70a7ec85SAndroid Build Coastguard Worker {
1440*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1441*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1442*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1443*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1444*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1445*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1446*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1447*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
1448*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1449*70a7ec85SAndroid Build Coastguard Worker " <instance>specific</instance>\n"
1450*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1451*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1452*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1453*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1454*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1455*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1456*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1457*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
1458*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1459*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1460*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1461*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1462*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1463*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1464*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1465*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1466*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
1467*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1468*70a7ec85SAndroid Build Coastguard Worker }
1469*70a7ec85SAndroid Build Coastguard Worker }
1470*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FullCompat)1471*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FullCompat) {
1472*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1473*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1474*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1475*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
1476*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1477*70a7ec85SAndroid Build Coastguard Worker " <version>3.5</version>\n"
1478*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1479*70a7ec85SAndroid Build Coastguard Worker " <name>IBetterCamera</name>\n"
1480*70a7ec85SAndroid Build Coastguard Worker " <instance>camera</instance>\n"
1481*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1482*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1483*70a7ec85SAndroid Build Coastguard Worker " <name>ICamera</name>\n"
1484*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1485*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/0</instance>\n"
1486*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1487*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1488*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1489*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
1490*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1491*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1492*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1493*70a7ec85SAndroid Build Coastguard Worker " <name>INfc</name>\n"
1494*70a7ec85SAndroid Build Coastguard Worker " <instance>nfc_nci</instance>\n"
1495*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1496*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1497*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1498*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
1499*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1500*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1501*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1502*70a7ec85SAndroid Build Coastguard Worker " <name>INfc</name>\n"
1503*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1504*70a7ec85SAndroid Build Coastguard Worker " <instance>nfc_nci</instance>\n"
1505*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1506*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1507*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1508*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
1509*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1510*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1511*70a7ec85SAndroid Build Coastguard Worker
1512*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
1513*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1514*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
1515*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
1516*70a7ec85SAndroid Build Coastguard Worker " <version>2.0-5</version>\n"
1517*70a7ec85SAndroid Build Coastguard Worker " <version>3.4-16</version>\n"
1518*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1519*70a7ec85SAndroid Build Coastguard Worker " <name>IBetterCamera</name>\n"
1520*70a7ec85SAndroid Build Coastguard Worker " <instance>camera</instance>\n"
1521*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1522*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1523*70a7ec85SAndroid Build Coastguard Worker " <name>ICamera</name>\n"
1524*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1525*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/0</instance>\n"
1526*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1527*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1528*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
1529*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
1530*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1531*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1532*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1533*70a7ec85SAndroid Build Coastguard Worker " <name>INfc</name>\n"
1534*70a7ec85SAndroid Build Coastguard Worker " <instance>nfc_nci</instance>\n"
1535*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1536*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1537*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
1538*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
1539*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1540*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1541*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1542*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1543*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
1544*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>26.0-3</sepolicy-version>\n"
1545*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>202404</sepolicy-version>\n"
1546*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1547*70a7ec85SAndroid Build Coastguard Worker " <avb>\n"
1548*70a7ec85SAndroid Build Coastguard Worker " <vbmeta-version>2.1</vbmeta-version>\n"
1549*70a7ec85SAndroid Build Coastguard Worker " </avb>\n"
1550*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
1551*70a7ec85SAndroid Build Coastguard Worker
1552*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1553*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1554*70a7ec85SAndroid Build Coastguard Worker std::string error;
1555*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
1556*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1557*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1558*70a7ec85SAndroid Build Coastguard Worker
1559*70a7ec85SAndroid Build Coastguard Worker // some smaller test cases
1560*70a7ec85SAndroid Build Coastguard Worker matrixXml =
1561*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1562*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
1563*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
1564*70a7ec85SAndroid Build Coastguard Worker " <version>3.4</version>\n"
1565*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1566*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1567*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
1568*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
1569*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1570*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
1571*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
1572*70a7ec85SAndroid Build Coastguard Worker matrix = {};
1573*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1574*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1575*70a7ec85SAndroid Build Coastguard Worker MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
1576*70a7ec85SAndroid Build Coastguard Worker EXPECT_NE(camera, nullptr);
1577*70a7ec85SAndroid Build Coastguard Worker camera->versionRanges[0] = {3, 5};
1578*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1579*70a7ec85SAndroid Build Coastguard Worker camera->versionRanges[0] = {3, 6};
1580*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix));
1581*70a7ec85SAndroid Build Coastguard Worker
1582*70a7ec85SAndroid Build Coastguard Worker // reset it
1583*70a7ec85SAndroid Build Coastguard Worker matrix = {};
1584*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1585*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{26, 0}}});
1586*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix));
1587*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{25, 6}}});
1588*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix));
1589*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{25, 4}}});
1590*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
1591*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{202404, std::nullopt}}});
1592*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix));
1593*70a7ec85SAndroid Build Coastguard Worker
1594*70a7ec85SAndroid Build Coastguard Worker // vFRC sepolicy test cases
1595*70a7ec85SAndroid Build Coastguard Worker manifestXml =
1596*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1597*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1598*70a7ec85SAndroid Build Coastguard Worker " <version>202404</version>\n"
1599*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1600*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1601*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
1602*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{202404, std::nullopt}}});
1603*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix)) << error;
1604*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{202404, 0}}});
1605*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix)) << error;
1606*70a7ec85SAndroid Build Coastguard Worker set(matrix, Sepolicy{30, {{202504, std::nullopt}}});
1607*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix));
1608*70a7ec85SAndroid Build Coastguard Worker }
1609*70a7ec85SAndroid Build Coastguard Worker
1610*70a7ec85SAndroid Build Coastguard Worker // clang-format on
1611*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ApexInterfaceShouldBeOkayWithoutApexInfoList)1612*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ApexInterfaceShouldBeOkayWithoutApexInfoList) {
1613*70a7ec85SAndroid Build Coastguard Worker details::FileSystemNoOp fs;
1614*70a7ec85SAndroid Build Coastguard Worker details::PropertyFetcherNoOp pf;
1615*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(apex::GetModifiedTime(&fs, &pf), std::nullopt);
1616*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> dirs;
1617*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, apex::GetDeviceVintfDirs(&fs, &pf, &dirs, nullptr));
1618*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(dirs, std::vector<std::string>{});
1619*70a7ec85SAndroid Build Coastguard Worker }
1620*70a7ec85SAndroid Build Coastguard Worker
1621*70a7ec85SAndroid Build Coastguard Worker struct NativeHalCompatTestParam {
1622*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml;
1623*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml;
1624*70a7ec85SAndroid Build Coastguard Worker bool compatible;
1625*70a7ec85SAndroid Build Coastguard Worker std::string expectedError;
1626*70a7ec85SAndroid Build Coastguard Worker };
1627*70a7ec85SAndroid Build Coastguard Worker
1628*70a7ec85SAndroid Build Coastguard Worker class NativeHalCompatTest : public LibVintfTest,
1629*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<NativeHalCompatTestParam> {
1630*70a7ec85SAndroid Build Coastguard Worker public:
createParams()1631*70a7ec85SAndroid Build Coastguard Worker static std::vector<NativeHalCompatTestParam> createParams() {
1632*70a7ec85SAndroid Build Coastguard Worker std::string matrixIntf = "<compatibility-matrix " + kMetaVersionStr + R"( type="device">
1633*70a7ec85SAndroid Build Coastguard Worker <hal format="native" optional="false">
1634*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1635*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
1636*70a7ec85SAndroid Build Coastguard Worker <interface>
1637*70a7ec85SAndroid Build Coastguard Worker <name>IFoo</name>
1638*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
1639*70a7ec85SAndroid Build Coastguard Worker </interface>
1640*70a7ec85SAndroid Build Coastguard Worker </hal>
1641*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
1642*70a7ec85SAndroid Build Coastguard Worker )";
1643*70a7ec85SAndroid Build Coastguard Worker std::string matrixNoIntf = "<compatibility-matrix " + kMetaVersionStr + R"( type="device">
1644*70a7ec85SAndroid Build Coastguard Worker <hal format="native" optional="false">
1645*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1646*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
1647*70a7ec85SAndroid Build Coastguard Worker <interface>
1648*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
1649*70a7ec85SAndroid Build Coastguard Worker </interface>
1650*70a7ec85SAndroid Build Coastguard Worker </hal>
1651*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
1652*70a7ec85SAndroid Build Coastguard Worker )";
1653*70a7ec85SAndroid Build Coastguard Worker std::string matrixNoInst = "<compatibility-matrix " + kMetaVersionStr + R"( type="device">
1654*70a7ec85SAndroid Build Coastguard Worker <hal format="native" optional="false">
1655*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1656*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
1657*70a7ec85SAndroid Build Coastguard Worker </hal>
1658*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
1659*70a7ec85SAndroid Build Coastguard Worker )";
1660*70a7ec85SAndroid Build Coastguard Worker std::string manifestFqnameIntf = "<manifest " + kMetaVersionStr + R"( type="framework">
1661*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
1662*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1663*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::IFoo/default</fqname>
1664*70a7ec85SAndroid Build Coastguard Worker </hal>
1665*70a7ec85SAndroid Build Coastguard Worker </manifest>
1666*70a7ec85SAndroid Build Coastguard Worker )";
1667*70a7ec85SAndroid Build Coastguard Worker std::string manifestLegacyIntf = "<manifest " + kMetaVersionStr + R"( type="framework">
1668*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
1669*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1670*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
1671*70a7ec85SAndroid Build Coastguard Worker <interface>
1672*70a7ec85SAndroid Build Coastguard Worker <name>IFoo</name>
1673*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
1674*70a7ec85SAndroid Build Coastguard Worker </interface>
1675*70a7ec85SAndroid Build Coastguard Worker </hal>
1676*70a7ec85SAndroid Build Coastguard Worker </manifest>
1677*70a7ec85SAndroid Build Coastguard Worker )";
1678*70a7ec85SAndroid Build Coastguard Worker std::string manifestFqnameNoIntf = "<manifest " + kMetaVersionStr + R"( type="framework">
1679*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
1680*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1681*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0/default</fqname>
1682*70a7ec85SAndroid Build Coastguard Worker </hal>
1683*70a7ec85SAndroid Build Coastguard Worker </manifest>
1684*70a7ec85SAndroid Build Coastguard Worker )";
1685*70a7ec85SAndroid Build Coastguard Worker std::string manifestLegacyNoIntf = "<manifest " + kMetaVersionStr + R"( type="framework">
1686*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
1687*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1688*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
1689*70a7ec85SAndroid Build Coastguard Worker <interface>
1690*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
1691*70a7ec85SAndroid Build Coastguard Worker </interface>
1692*70a7ec85SAndroid Build Coastguard Worker </hal>
1693*70a7ec85SAndroid Build Coastguard Worker </manifest>
1694*70a7ec85SAndroid Build Coastguard Worker )";
1695*70a7ec85SAndroid Build Coastguard Worker std::string manifestNoInst = "<manifest " + kMetaVersionStr + R"( type="framework">
1696*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
1697*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
1698*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
1699*70a7ec85SAndroid Build Coastguard Worker </hal>
1700*70a7ec85SAndroid Build Coastguard Worker </manifest>
1701*70a7ec85SAndroid Build Coastguard Worker )";
1702*70a7ec85SAndroid Build Coastguard Worker
1703*70a7ec85SAndroid Build Coastguard Worker std::vector<NativeHalCompatTestParam> ret;
1704*70a7ec85SAndroid Build Coastguard Worker
1705*70a7ec85SAndroid Build Coastguard Worker // If the matrix specifies interface name, the manifest must also do.
1706*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixIntf, manifestFqnameIntf, true, ""});
1707*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixIntf, manifestLegacyIntf, true, ""});
1708*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixIntf, manifestFqnameNoIntf, false,
1709*70a7ec85SAndroid Build Coastguard Worker "required: @1.0::IFoo/default"});
1710*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixIntf, manifestLegacyNoIntf, false,
1711*70a7ec85SAndroid Build Coastguard Worker "required: @1.0::IFoo/default"});
1712*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixIntf, manifestNoInst, false,
1713*70a7ec85SAndroid Build Coastguard Worker "required: @1.0::IFoo/default"});
1714*70a7ec85SAndroid Build Coastguard Worker
1715*70a7ec85SAndroid Build Coastguard Worker // If the matrix does not specify an interface name, the manifest must not do that either.
1716*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoIntf, manifestFqnameIntf, false,
1717*70a7ec85SAndroid Build Coastguard Worker "required: @1.0/default"});
1718*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoIntf, manifestLegacyIntf, false,
1719*70a7ec85SAndroid Build Coastguard Worker "required: @1.0/default"});
1720*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoIntf, manifestFqnameNoIntf, true, ""});
1721*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoIntf, manifestLegacyNoIntf, true, ""});
1722*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoIntf, manifestNoInst, false,
1723*70a7ec85SAndroid Build Coastguard Worker "required: @1.0/default"});
1724*70a7ec85SAndroid Build Coastguard Worker
1725*70a7ec85SAndroid Build Coastguard Worker // If the matrix does not specify interface name nor instances, the manifest may either
1726*70a7ec85SAndroid Build Coastguard Worker // provide instances of that version, or just a version number with no instances.
1727*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoInst, manifestFqnameIntf, true, ""});
1728*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoInst, manifestLegacyIntf, true, ""});
1729*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoInst, manifestFqnameNoIntf, true, ""});
1730*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoInst, manifestLegacyNoIntf, true, ""});
1731*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(NativeHalCompatTestParam{matrixNoInst, manifestNoInst, true, ""});
1732*70a7ec85SAndroid Build Coastguard Worker
1733*70a7ec85SAndroid Build Coastguard Worker return ret;
1734*70a7ec85SAndroid Build Coastguard Worker }
1735*70a7ec85SAndroid Build Coastguard Worker };
1736*70a7ec85SAndroid Build Coastguard Worker
TEST_P(NativeHalCompatTest,Compat)1737*70a7ec85SAndroid Build Coastguard Worker TEST_P(NativeHalCompatTest, Compat) {
1738*70a7ec85SAndroid Build Coastguard Worker auto params = GetParam();
1739*70a7ec85SAndroid Build Coastguard Worker std::string error;
1740*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1741*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, params.manifestXml, &error)) << error;
1742*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1743*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrix, params.matrixXml, &error)) << error;
1744*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(params.compatible, manifest.checkCompatibility(matrix, &error)) << error;
1745*70a7ec85SAndroid Build Coastguard Worker if (!params.expectedError.empty()) {
1746*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(params.expectedError));
1747*70a7ec85SAndroid Build Coastguard Worker } else {
1748*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, IsEmpty());
1749*70a7ec85SAndroid Build Coastguard Worker }
1750*70a7ec85SAndroid Build Coastguard Worker }
1751*70a7ec85SAndroid Build Coastguard Worker
1752*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_CASE_P(LibVintfTest, NativeHalCompatTest,
1753*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(NativeHalCompatTest::createParams()));
1754*70a7ec85SAndroid Build Coastguard Worker
1755*70a7ec85SAndroid Build Coastguard Worker // clang-format off
1756*70a7ec85SAndroid Build Coastguard Worker
1757*70a7ec85SAndroid Build Coastguard Worker /////////////////// xmlfile tests
1758*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverterXmlFile)1759*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverterXmlFile) {
1760*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifestWithXmlFile();
1761*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(
1762*70a7ec85SAndroid Build Coastguard Worker vm, SerializeFlags::HALS_ONLY.enableSepolicy().enableXmlFiles());
1763*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
1764*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1765*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1766*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
1767*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1768*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::IBetterCamera/camera</fqname>\n"
1769*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::ICamera/default</fqname>\n"
1770*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.0::ICamera/legacy/0</fqname>\n"
1771*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1772*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1773*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
1774*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>\n"
1775*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::INfc/default</fqname>\n"
1776*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1777*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1778*70a7ec85SAndroid Build Coastguard Worker " <version>25.0</version>\n"
1779*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1780*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>\n"
1781*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>\n"
1782*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1783*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
1784*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n");
1785*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
1786*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
1787*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
1788*70a7ec85SAndroid Build Coastguard Worker }
1789*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestConverterXmlFileWithInterface)1790*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestConverterXmlFileWithInterface) {
1791*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifestWithXmlFile();
1792*70a7ec85SAndroid Build Coastguard Worker std::string xml =
1793*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
1794*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1795*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.camera</name>\n"
1796*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
1797*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
1798*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1799*70a7ec85SAndroid Build Coastguard Worker " <name>IBetterCamera</name>\n"
1800*70a7ec85SAndroid Build Coastguard Worker " <instance>camera</instance>\n"
1801*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1802*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1803*70a7ec85SAndroid Build Coastguard Worker " <name>ICamera</name>\n"
1804*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1805*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/0</instance>\n"
1806*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1807*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1808*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
1809*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.nfc</name>\n"
1810*70a7ec85SAndroid Build Coastguard Worker " <transport arch=\"32+64\">passthrough</transport>\n"
1811*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1812*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
1813*70a7ec85SAndroid Build Coastguard Worker " <name>INfc</name>\n"
1814*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
1815*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
1816*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
1817*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
1818*70a7ec85SAndroid Build Coastguard Worker " <version>25.0</version>\n"
1819*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
1820*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>\n"
1821*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>\n"
1822*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1823*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
1824*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
1825*70a7ec85SAndroid Build Coastguard Worker HalManifest vm2;
1826*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm2, xml));
1827*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm, vm2);
1828*70a7ec85SAndroid Build Coastguard Worker }
1829*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,CompatibilityMatrixConverterXmlFile)1830*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile) {
1831*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
1832*70a7ec85SAndroid Build Coastguard Worker addXmlFile(cm, "media_profile", {1, 0});
1833*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(cm, SerializeFlags::XMLFILES_ONLY);
1834*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
1835*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1836*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"dtd\" optional=\"true\">\n"
1837*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>\n"
1838*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1839*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
1840*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
1841*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
1842*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml));
1843*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(cm, cm2);
1844*70a7ec85SAndroid Build Coastguard Worker }
1845*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,CompatibilityMatrixConverterXmlFile2)1846*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, CompatibilityMatrixConverterXmlFile2) {
1847*70a7ec85SAndroid Build Coastguard Worker std::string error;
1848*70a7ec85SAndroid Build Coastguard Worker std::string xml =
1849*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
1850*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"dtd\" optional=\"false\">\n"
1851*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>\n"
1852*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
1853*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
1854*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
1855*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
1856*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&cm, xml, &error));
1857*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("compatibility-matrix.xmlfile entry media_profile has to be optional for "
1858*70a7ec85SAndroid Build Coastguard Worker "compatibility matrix version 1.0", error);
1859*70a7ec85SAndroid Build Coastguard Worker }
1860*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestXmlFilePathDevice)1861*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestXmlFilePathDevice) {
1862*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1863*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
1864*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>"
1865*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1866*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
1867*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1868*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
1869*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1870*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
1871*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1872*70a7ec85SAndroid Build Coastguard Worker "/vendor/etc/media_profile_V1_0.xml");
1873*70a7ec85SAndroid Build Coastguard Worker }
1874*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestXmlFilePathFramework)1875*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestXmlFilePathFramework) {
1876*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1877*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">"
1878*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>"
1879*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1880*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
1881*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1882*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
1883*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1884*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
1885*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}),
1886*70a7ec85SAndroid Build Coastguard Worker "/system/etc/media_profile_V1_0.xml");
1887*70a7ec85SAndroid Build Coastguard Worker }
1888*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestXmlFilePathOverride)1889*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestXmlFilePathOverride) {
1890*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1891*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
1892*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>"
1893*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1894*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
1895*70a7ec85SAndroid Build Coastguard Worker " <path>/vendor/etc/foo.xml</path>"
1896*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1897*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
1898*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1899*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
1900*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "/vendor/etc/foo.xml");
1901*70a7ec85SAndroid Build Coastguard Worker }
1902*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestXmlFilePathMissing)1903*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestXmlFilePathMissing) {
1904*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
1905*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">"
1906*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>"
1907*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1908*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>"
1909*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1910*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
1911*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
1912*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
1913*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getXmlFilePath("media_profile", {1, 0}), "");
1914*70a7ec85SAndroid Build Coastguard Worker }
1915*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixXmlFilePathFramework)1916*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixXmlFilePathFramework) {
1917*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
1918*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">"
1919*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"dtd\" optional=\"true\">"
1920*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1921*70a7ec85SAndroid Build Coastguard Worker " <version>2.0-1</version>"
1922*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1923*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
1924*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1925*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1926*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 1}),
1927*70a7ec85SAndroid Build Coastguard Worker "/system/etc/media_profile_V2_1.dtd");
1928*70a7ec85SAndroid Build Coastguard Worker }
1929*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixXmlFilePathDevice)1930*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixXmlFilePathDevice) {
1931*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
1932*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">"
1933*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"xsd\" optional=\"true\">"
1934*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1935*70a7ec85SAndroid Build Coastguard Worker " <version>2.0-1</version>"
1936*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1937*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
1938*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1939*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1940*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}),
1941*70a7ec85SAndroid Build Coastguard Worker "/vendor/etc/media_profile_V2_1.xsd");
1942*70a7ec85SAndroid Build Coastguard Worker }
1943*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixXmlFilePathOverride)1944*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixXmlFilePathOverride) {
1945*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
1946*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">"
1947*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"xsd\" optional=\"true\">"
1948*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1949*70a7ec85SAndroid Build Coastguard Worker " <version>2.0-1</version>"
1950*70a7ec85SAndroid Build Coastguard Worker " <path>/system/etc/foo.xsd</path>"
1951*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1952*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
1953*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1954*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1955*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "/system/etc/foo.xsd");
1956*70a7ec85SAndroid Build Coastguard Worker }
1957*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixXmlFilePathMissing)1958*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixXmlFilePathMissing) {
1959*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
1960*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">"
1961*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"dtd\" optional=\"true\">"
1962*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>"
1963*70a7ec85SAndroid Build Coastguard Worker " <version>2.1</version>"
1964*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>"
1965*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
1966*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
1967*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml));
1968*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(matrix.getXmlSchemaPath("media_profile", {2, 0}), "");
1969*70a7ec85SAndroid Build Coastguard Worker }
1970*70a7ec85SAndroid Build Coastguard Worker
processData(const std::string & data,bool processComments,bool relaxedFormat=false)1971*70a7ec85SAndroid Build Coastguard Worker std::pair<KernelConfigParser, status_t> processData(const std::string& data, bool processComments,
1972*70a7ec85SAndroid Build Coastguard Worker bool relaxedFormat = false) {
1973*70a7ec85SAndroid Build Coastguard Worker KernelConfigParser parser(processComments, relaxedFormat);
1974*70a7ec85SAndroid Build Coastguard Worker const char* p = data.c_str();
1975*70a7ec85SAndroid Build Coastguard Worker size_t n = 0;
1976*70a7ec85SAndroid Build Coastguard Worker size_t chunkSize;
1977*70a7ec85SAndroid Build Coastguard Worker status_t status = OK;
1978*70a7ec85SAndroid Build Coastguard Worker for (; n < data.size(); p += chunkSize, n += chunkSize) {
1979*70a7ec85SAndroid Build Coastguard Worker chunkSize = std::min<size_t>(5, data.size() - n);
1980*70a7ec85SAndroid Build Coastguard Worker if ((status = parser.process(p, chunkSize)) != OK) {
1981*70a7ec85SAndroid Build Coastguard Worker break;
1982*70a7ec85SAndroid Build Coastguard Worker }
1983*70a7ec85SAndroid Build Coastguard Worker }
1984*70a7ec85SAndroid Build Coastguard Worker return {std::move(parser), status};
1985*70a7ec85SAndroid Build Coastguard Worker }
1986*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigParser)1987*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigParser) {
1988*70a7ec85SAndroid Build Coastguard Worker // usage in /proc/config.gz
1989*70a7ec85SAndroid Build Coastguard Worker const std::string data =
1990*70a7ec85SAndroid Build Coastguard Worker "# CONFIG_NOT_SET is not set\n"
1991*70a7ec85SAndroid Build Coastguard Worker "CONFIG_ONE=1\n"
1992*70a7ec85SAndroid Build Coastguard Worker "CONFIG_Y=y\n"
1993*70a7ec85SAndroid Build Coastguard Worker "CONFIG_STR=\"string\"\n";
1994*70a7ec85SAndroid Build Coastguard Worker auto pair = processData(data, false /* processComments */);
1995*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, pair.second) << pair.first.error();
1996*70a7ec85SAndroid Build Coastguard Worker const auto& configs = pair.first.configs();
1997*70a7ec85SAndroid Build Coastguard Worker
1998*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
1999*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
2000*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_STR")->second, "\"string\"");
2001*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_NOT_SET"), configs.end());
2002*70a7ec85SAndroid Build Coastguard Worker }
2003*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigParser2)2004*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigParser2) {
2005*70a7ec85SAndroid Build Coastguard Worker // usage in android-base.config
2006*70a7ec85SAndroid Build Coastguard Worker const std::string data =
2007*70a7ec85SAndroid Build Coastguard Worker "# CONFIG_NOT_SET is not set\n"
2008*70a7ec85SAndroid Build Coastguard Worker "CONFIG_ONE=1\n"
2009*70a7ec85SAndroid Build Coastguard Worker "CONFIG_Y=y\n"
2010*70a7ec85SAndroid Build Coastguard Worker "CONFIG_STR=string\n"
2011*70a7ec85SAndroid Build Coastguard Worker "# ignore_thiscomment\n"
2012*70a7ec85SAndroid Build Coastguard Worker "# CONFIG_NOT_SET2 is not set\n";
2013*70a7ec85SAndroid Build Coastguard Worker auto pair = processData(data, true /* processComments */);
2014*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, pair.second) << pair.first.error();
2015*70a7ec85SAndroid Build Coastguard Worker const auto& configs = pair.first.configs();
2016*70a7ec85SAndroid Build Coastguard Worker
2017*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
2018*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
2019*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
2020*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
2021*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_NOT_SET2")->second, "n");
2022*70a7ec85SAndroid Build Coastguard Worker }
2023*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigParserSpace)2024*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigParserSpace) {
2025*70a7ec85SAndroid Build Coastguard Worker // usage in android-base.config
2026*70a7ec85SAndroid Build Coastguard Worker const std::string data =
2027*70a7ec85SAndroid Build Coastguard Worker " # CONFIG_NOT_SET is not set \n"
2028*70a7ec85SAndroid Build Coastguard Worker " CONFIG_ONE=1 # 'tis a one!\n"
2029*70a7ec85SAndroid Build Coastguard Worker " CONFIG_TWO=2 #'tis a two! \n"
2030*70a7ec85SAndroid Build Coastguard Worker " CONFIG_THREE=3#'tis a three! \n"
2031*70a7ec85SAndroid Build Coastguard Worker " CONFIG_233=233#'tis a three! \n"
2032*70a7ec85SAndroid Build Coastguard Worker "#yey! random comments\n"
2033*70a7ec85SAndroid Build Coastguard Worker "CONFIG_Y=y \n"
2034*70a7ec85SAndroid Build Coastguard Worker " CONFIG_YES=y#YES! \n"
2035*70a7ec85SAndroid Build Coastguard Worker "CONFIG_STR=string\n"
2036*70a7ec85SAndroid Build Coastguard Worker "CONFIG_HELLO=hello world! #still works\n"
2037*70a7ec85SAndroid Build Coastguard Worker "CONFIG_WORLD=hello world! \n"
2038*70a7ec85SAndroid Build Coastguard Worker "CONFIG_GOOD = good morning! #comments here\n"
2039*70a7ec85SAndroid Build Coastguard Worker " CONFIG_MORNING = good morning! \n";
2040*70a7ec85SAndroid Build Coastguard Worker auto pair = processData(data, true /* processComments */, true /* relaxedFormat */);
2041*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, pair.second) << pair.first.error();
2042*70a7ec85SAndroid Build Coastguard Worker const auto& configs = pair.first.configs();
2043*70a7ec85SAndroid Build Coastguard Worker
2044*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_ONE")->second, "1");
2045*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_TWO")->second, "2");
2046*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_THREE")->second, "3");
2047*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_Y")->second, "y");
2048*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_STR")->second, "string");
2049*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_HELLO")->second, "hello world!")
2050*70a7ec85SAndroid Build Coastguard Worker << "Value should be \"hello world!\" without trailing spaces";
2051*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_WORLD")->second, "hello world!")
2052*70a7ec85SAndroid Build Coastguard Worker << "Value should be \"hello world!\" without trailing spaces";
2053*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_GOOD")->second, "good morning!")
2054*70a7ec85SAndroid Build Coastguard Worker << "Value should be \"good morning!\" without leading or trailing spaces";
2055*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_MORNING")->second, "good morning!")
2056*70a7ec85SAndroid Build Coastguard Worker << "Value should be \"good morning!\" without leading or trailing spaces";
2057*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_NOT_SET")->second, "n");
2058*70a7ec85SAndroid Build Coastguard Worker }
2059*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,NetutilsWrapperMatrix)2060*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, NetutilsWrapperMatrix) {
2061*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml;
2062*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
2063*70a7ec85SAndroid Build Coastguard Worker std::string error;
2064*70a7ec85SAndroid Build Coastguard Worker
2065*70a7ec85SAndroid Build Coastguard Worker matrixXml =
2066*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">"
2067*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"false\">"
2068*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2069*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
2070*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2071*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
2072*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml, &error)) << error;
2073*70a7ec85SAndroid Build Coastguard Worker
2074*70a7ec85SAndroid Build Coastguard Worker // only host libvintf hardcodes netutils-wrapper version requirements
2075*70a7ec85SAndroid Build Coastguard Worker #ifndef LIBVINTF_TARGET
2076*70a7ec85SAndroid Build Coastguard Worker
2077*70a7ec85SAndroid Build Coastguard Worker matrixXml =
2078*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">"
2079*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"false\">"
2080*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2081*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-1</version>"
2082*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2083*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
2084*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&matrix, matrixXml, &error));
2085*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(
2086*70a7ec85SAndroid Build Coastguard Worker "netutils-wrapper HAL must specify exactly one version x.0, but a range is provided. "
2087*70a7ec85SAndroid Build Coastguard Worker "Perhaps you mean '1.0'?"));
2088*70a7ec85SAndroid Build Coastguard Worker
2089*70a7ec85SAndroid Build Coastguard Worker matrixXml =
2090*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">"
2091*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"false\">"
2092*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2093*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>"
2094*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2095*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
2096*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&matrix, matrixXml, &error));
2097*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(
2098*70a7ec85SAndroid Build Coastguard Worker "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0. "
2099*70a7ec85SAndroid Build Coastguard Worker "Perhaps you mean '1.0'?"));
2100*70a7ec85SAndroid Build Coastguard Worker
2101*70a7ec85SAndroid Build Coastguard Worker matrixXml =
2102*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">"
2103*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\" optional=\"false\">"
2104*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2105*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
2106*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>"
2107*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2108*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>";
2109*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&matrix, matrixXml, &error));
2110*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(
2111*70a7ec85SAndroid Build Coastguard Worker "netutils-wrapper HAL must specify exactly one version x.0, but multiple <version> element "
2112*70a7ec85SAndroid Build Coastguard Worker "is specified."));
2113*70a7ec85SAndroid Build Coastguard Worker
2114*70a7ec85SAndroid Build Coastguard Worker #endif // LIBVINTF_TARGET
2115*70a7ec85SAndroid Build Coastguard Worker }
2116*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,NetutilsWrapperManifest)2117*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, NetutilsWrapperManifest) {
2118*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml;
2119*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
2120*70a7ec85SAndroid Build Coastguard Worker std::string error;
2121*70a7ec85SAndroid Build Coastguard Worker
2122*70a7ec85SAndroid Build Coastguard Worker manifestXml =
2123*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">"
2124*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\">"
2125*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2126*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
2127*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>"
2128*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2129*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
2130*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
2131*70a7ec85SAndroid Build Coastguard Worker
2132*70a7ec85SAndroid Build Coastguard Worker // only host libvintf hardcodes netutils-wrapper version requirements
2133*70a7ec85SAndroid Build Coastguard Worker #ifndef LIBVINTF_TARGET
2134*70a7ec85SAndroid Build Coastguard Worker
2135*70a7ec85SAndroid Build Coastguard Worker manifestXml =
2136*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">"
2137*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\">"
2138*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2139*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>"
2140*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2141*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
2142*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
2143*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(
2144*70a7ec85SAndroid Build Coastguard Worker "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0."));
2145*70a7ec85SAndroid Build Coastguard Worker
2146*70a7ec85SAndroid Build Coastguard Worker manifestXml =
2147*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">"
2148*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"native\">"
2149*70a7ec85SAndroid Build Coastguard Worker " <name>netutils-wrapper</name>"
2150*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>"
2151*70a7ec85SAndroid Build Coastguard Worker " <version>2.1</version>"
2152*70a7ec85SAndroid Build Coastguard Worker " </hal>"
2153*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
2154*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
2155*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(
2156*70a7ec85SAndroid Build Coastguard Worker "netutils-wrapper HAL must specify exactly one version x.0, but minor version is not 0."));
2157*70a7ec85SAndroid Build Coastguard Worker
2158*70a7ec85SAndroid Build Coastguard Worker #endif // LIBVINTF_TARGET
2159*70a7ec85SAndroid Build Coastguard Worker }
2160*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigConditionTest)2161*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigConditionTest) {
2162*70a7ec85SAndroid Build Coastguard Worker std::string error;
2163*70a7ec85SAndroid Build Coastguard Worker std::string xml =
2164*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2165*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2166*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2167*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2168*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2169*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARM</key>\n"
2170*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2171*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2172*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2173*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2174*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_FOO</key>\n"
2175*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2176*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2177*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2178*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2179*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2180*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.0</sepolicy-version>\n"
2181*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2182*70a7ec85SAndroid Build Coastguard Worker " <avb>\n"
2183*70a7ec85SAndroid Build Coastguard Worker " <vbmeta-version>2.1</vbmeta-version>\n"
2184*70a7ec85SAndroid Build Coastguard Worker " </avb>\n"
2185*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2186*70a7ec85SAndroid Build Coastguard Worker
2187*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
2188*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2189*70a7ec85SAndroid Build Coastguard Worker const auto& kernels = getKernels(cm);
2190*70a7ec85SAndroid Build Coastguard Worker ASSERT_GE(kernels.size(), 2u);
2191*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(kernels[0].conditions().empty());
2192*70a7ec85SAndroid Build Coastguard Worker const auto& kernel = kernels[1];
2193*70a7ec85SAndroid Build Coastguard Worker const auto& cond = kernel.conditions();
2194*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(cond.empty());
2195*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
2196*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
2197*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(kernel.configs().empty());
2198*70a7ec85SAndroid Build Coastguard Worker
2199*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(cm));
2200*70a7ec85SAndroid Build Coastguard Worker }
2201*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigConditionEmptyTest)2202*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
2203*70a7ec85SAndroid Build Coastguard Worker std::string error;
2204*70a7ec85SAndroid Build Coastguard Worker std::string xml =
2205*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2206*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"4.4.0\"/>\n"
2207*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2208*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2209*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2210*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARM</key>\n"
2211*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2212*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2213*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2214*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2215*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2216*70a7ec85SAndroid Build Coastguard Worker
2217*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
2218*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&cm, xml, &error))
2219*70a7ec85SAndroid Build Coastguard Worker << "Should not accept first kernel version with non-empty conditions";
2220*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
2221*70a7ec85SAndroid Build Coastguard Worker "First <kernel> for version 3.18 must have empty <conditions> "
2222*70a7ec85SAndroid Build Coastguard Worker "for backwards compatibility.", error);
2223*70a7ec85SAndroid Build Coastguard Worker }
2224*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelConfigConditionMatch)2225*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelConfigConditionMatch) {
2226*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo runtime = testRuntimeInfo();
2227*70a7ec85SAndroid Build Coastguard Worker std::string error;
2228*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2229*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
2230*70a7ec85SAndroid Build Coastguard Worker
2231*70a7ec85SAndroid Build Coastguard Worker xml =
2232*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2233*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2234*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2235*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2236*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2237*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2238*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2239*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2240*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2241*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2242*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2243*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">24</value>\n"
2244*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2245*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2246*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2247*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2248*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2249*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2250*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2251*70a7ec85SAndroid Build Coastguard Worker
2252*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2253*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
2254*70a7ec85SAndroid Build Coastguard Worker
2255*70a7ec85SAndroid Build Coastguard Worker xml =
2256*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2257*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2258*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2259*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2260*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2261*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2262*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2263*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2264*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2265*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2266*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2267*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">26</value>\n"
2268*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2269*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2270*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2271*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2272*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2273*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2274*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2275*70a7ec85SAndroid Build Coastguard Worker
2276*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2277*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
2278*70a7ec85SAndroid Build Coastguard Worker << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
2279*70a7ec85SAndroid Build Coastguard Worker
2280*70a7ec85SAndroid Build Coastguard Worker xml =
2281*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2282*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2283*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2284*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2285*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2286*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2287*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">n</value>\n"
2288*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2289*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2290*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2291*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2292*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">26</value>\n"
2293*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2294*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2295*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2296*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2297*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2298*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2299*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2300*70a7ec85SAndroid Build Coastguard Worker
2301*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2302*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
2303*70a7ec85SAndroid Build Coastguard Worker xml =
2304*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2305*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2306*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2307*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2308*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2309*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2310*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2311*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2312*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2313*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2314*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">24</value>\n"
2315*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2316*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2317*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2318*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2319*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">0xdead000000000000</value>\n"
2320*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2321*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2322*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2323*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2324*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2325*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2326*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2327*70a7ec85SAndroid Build Coastguard Worker
2328*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2329*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
2330*70a7ec85SAndroid Build Coastguard Worker
2331*70a7ec85SAndroid Build Coastguard Worker xml =
2332*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2333*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2334*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2335*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2336*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2337*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2338*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2339*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2340*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2341*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2342*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">24</value>\n"
2343*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2344*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2345*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2346*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2347*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">0xbeaf000000000000</value>\n"
2348*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2349*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2350*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2351*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2352*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2353*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2354*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2355*70a7ec85SAndroid Build Coastguard Worker
2356*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2357*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
2358*70a7ec85SAndroid Build Coastguard Worker << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
2359*70a7ec85SAndroid Build Coastguard Worker
2360*70a7ec85SAndroid Build Coastguard Worker xml =
2361*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2362*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\"/>\n"
2363*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2364*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2365*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2366*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2367*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2368*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2369*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2370*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2371*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">26</value>\n"
2372*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2373*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2374*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2375*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2376*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">0xbeaf000000000000</value>\n"
2377*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2378*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2379*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2380*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2381*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2382*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2383*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2384*70a7ec85SAndroid Build Coastguard Worker
2385*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2386*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
2387*70a7ec85SAndroid Build Coastguard Worker
2388*70a7ec85SAndroid Build Coastguard Worker xml =
2389*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2390*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2391*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2392*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
2393*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\"/>\n"
2394*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2395*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2396*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2397*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2398*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2399*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2400*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2401*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2402*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2403*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2404*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2405*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">0xdead000000000000</value>\n"
2406*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2407*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2408*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2409*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2410*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2411*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2412*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">24</value>\n"
2413*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2414*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2415*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2416*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2417*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\">binder,hwbinder</value>\n"
2418*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2419*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2420*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2421*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2422*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2423*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2424*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2425*70a7ec85SAndroid Build Coastguard Worker
2426*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2427*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
2428*70a7ec85SAndroid Build Coastguard Worker
2429*70a7ec85SAndroid Build Coastguard Worker xml =
2430*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2431*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2432*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2433*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
2434*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\"/>\n"
2435*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2436*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2437*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2438*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2439*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2440*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2441*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2442*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2443*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2444*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2445*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2446*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">0xbeaf000000000000</value>\n"
2447*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2448*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2449*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2450*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2451*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2452*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2453*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">24</value>\n"
2454*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2455*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2456*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2457*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2458*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\">binder,hwbinder</value>\n"
2459*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2460*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2461*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2462*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2463*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2464*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2465*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2466*70a7ec85SAndroid Build Coastguard Worker
2467*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2468*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
2469*70a7ec85SAndroid Build Coastguard Worker
2470*70a7ec85SAndroid Build Coastguard Worker xml =
2471*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
2472*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2473*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2474*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
2475*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\"/>\n"
2476*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2477*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2478*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2479*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2480*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2481*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
2482*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
2483*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2484*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2485*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2486*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
2487*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">0xdead000000000000</value>\n"
2488*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2489*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2490*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.22\">\n"
2491*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
2492*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2493*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
2494*70a7ec85SAndroid Build Coastguard Worker " <value type=\"int\">24</value>\n"
2495*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2496*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
2497*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
2498*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
2499*70a7ec85SAndroid Build Coastguard Worker " <value type=\"string\">binder</value>\n"
2500*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
2501*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
2502*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
2503*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
2504*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
2505*70a7ec85SAndroid Build Coastguard Worker " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
2506*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2507*70a7ec85SAndroid Build Coastguard Worker
2508*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2509*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
2510*70a7ec85SAndroid Build Coastguard Worker }
2511*70a7ec85SAndroid Build Coastguard Worker
2512*70a7ec85SAndroid Build Coastguard Worker // Run KernelConfigParserInvalidTest on processComments = {true, false}
2513*70a7ec85SAndroid Build Coastguard Worker class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};
2514*70a7ec85SAndroid Build Coastguard Worker
TEST_P(KernelConfigParserInvalidTest,NonSet1)2515*70a7ec85SAndroid Build Coastguard Worker TEST_P(KernelConfigParserInvalidTest, NonSet1) {
2516*70a7ec85SAndroid Build Coastguard Worker const std::string data = "# CONFIG_NOT_EXIST is not sat\n";
2517*70a7ec85SAndroid Build Coastguard Worker auto pair = processData(data, GetParam() /* processComments */, true /* relaxedFormat */);
2518*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, pair.second) << pair.first.error();
2519*70a7ec85SAndroid Build Coastguard Worker const auto& configs = pair.first.configs();
2520*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(configs.find("CONFIG_NOT_EXIST"), configs.end())
2521*70a7ec85SAndroid Build Coastguard Worker << "CONFIG_NOT_EXIST should not exist because of typo";
2522*70a7ec85SAndroid Build Coastguard Worker }
2523*70a7ec85SAndroid Build Coastguard Worker
TEST_P(KernelConfigParserInvalidTest,InvalidLine1)2524*70a7ec85SAndroid Build Coastguard Worker TEST_P(KernelConfigParserInvalidTest, InvalidLine1) {
2525*70a7ec85SAndroid Build Coastguard Worker const std::string data = "FOO_CONFIG=foo\n";
2526*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(OK,
2527*70a7ec85SAndroid Build Coastguard Worker processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
2528*70a7ec85SAndroid Build Coastguard Worker }
2529*70a7ec85SAndroid Build Coastguard Worker
TEST_P(KernelConfigParserInvalidTest,InvalidLine2)2530*70a7ec85SAndroid Build Coastguard Worker TEST_P(KernelConfigParserInvalidTest, InvalidLine2) {
2531*70a7ec85SAndroid Build Coastguard Worker const std::string data = "CONFIG_BAR-BAZ=foo\n";
2532*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(OK,
2533*70a7ec85SAndroid Build Coastguard Worker processData(data, GetParam() /* processComments */, true /* relaxedFormat */).second);
2534*70a7ec85SAndroid Build Coastguard Worker }
2535*70a7ec85SAndroid Build Coastguard Worker
2536*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
2537*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixLevel)2538*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixLevel) {
2539*70a7ec85SAndroid Build Coastguard Worker std::string error;
2540*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
2541*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2542*70a7ec85SAndroid Build Coastguard Worker
2543*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\"/>";
2544*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2545*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::UNSPECIFIED, cm.level());
2546*70a7ec85SAndroid Build Coastguard Worker
2547*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"legacy\"/>";
2548*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2549*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::LEGACY, cm.level());
2550*70a7ec85SAndroid Build Coastguard Worker
2551*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\"/>";
2552*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
2553*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level{1}, cm.level());
2554*70a7ec85SAndroid Build Coastguard Worker }
2555*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestLevel)2556*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestLevel) {
2557*70a7ec85SAndroid Build Coastguard Worker std::string error;
2558*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
2559*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2560*70a7ec85SAndroid Build Coastguard Worker
2561*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr + " type=\"device\"/>";
2562*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
2563*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
2564*70a7ec85SAndroid Build Coastguard Worker
2565*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"legacy\"/>";
2566*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
2567*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::LEGACY, manifest.level());
2568*70a7ec85SAndroid Build Coastguard Worker
2569*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\"/>";
2570*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
2571*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level{1}, manifest.level());
2572*70a7ec85SAndroid Build Coastguard Worker }
2573*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddOptionalHal)2574*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddOptionalHal) {
2575*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2576*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2577*70a7ec85SAndroid Build Coastguard Worker std::string error;
2578*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2579*70a7ec85SAndroid Build Coastguard Worker
2580*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\"/>";
2581*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2582*70a7ec85SAndroid Build Coastguard Worker
2583*70a7ec85SAndroid Build Coastguard Worker xml =
2584*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2585*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2586*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2587*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-1</version>\n"
2588*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2589*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2590*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2591*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2592*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2593*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2594*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2595*70a7ec85SAndroid Build Coastguard Worker
2596*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2597*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2598*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2599*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2600*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
2601*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2602*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-1</version>\n"
2603*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2604*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2605*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2606*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2607*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2608*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2609*70a7ec85SAndroid Build Coastguard Worker }
2610*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddOptionalHalMinorVersion)2611*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddOptionalHalMinorVersion) {
2612*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2613*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2614*70a7ec85SAndroid Build Coastguard Worker std::string error;
2615*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2616*70a7ec85SAndroid Build Coastguard Worker
2617*70a7ec85SAndroid Build Coastguard Worker xml =
2618*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2619*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2620*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2621*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
2622*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2623*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2624*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2625*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2626*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2627*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2628*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2629*70a7ec85SAndroid Build Coastguard Worker
2630*70a7ec85SAndroid Build Coastguard Worker xml =
2631*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2632*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2633*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2634*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-4</version>\n"
2635*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2636*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2637*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2638*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2639*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2640*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2641*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2642*70a7ec85SAndroid Build Coastguard Worker
2643*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2644*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2645*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2646*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2647*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2648*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2649*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-4</version>\n"
2650*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2651*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2652*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2653*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2654*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2655*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2656*70a7ec85SAndroid Build Coastguard Worker }
2657*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddOptionalHalMajorVersion)2658*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddOptionalHalMajorVersion) {
2659*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2660*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2661*70a7ec85SAndroid Build Coastguard Worker std::string error;
2662*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2663*70a7ec85SAndroid Build Coastguard Worker
2664*70a7ec85SAndroid Build Coastguard Worker xml =
2665*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2666*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2667*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2668*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
2669*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2670*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2671*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2672*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2673*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2674*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2675*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2676*70a7ec85SAndroid Build Coastguard Worker
2677*70a7ec85SAndroid Build Coastguard Worker xml =
2678*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2679*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2680*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2681*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
2682*70a7ec85SAndroid Build Coastguard Worker " <version>2.0-4</version>\n"
2683*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2684*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2685*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2686*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2687*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2688*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2689*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2690*70a7ec85SAndroid Build Coastguard Worker
2691*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2692*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2693*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2694*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2695*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2696*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2697*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
2698*70a7ec85SAndroid Build Coastguard Worker " <version>2.0-4</version>\n"
2699*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2700*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2701*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2702*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2703*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2704*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2705*70a7ec85SAndroid Build Coastguard Worker }
2706*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddOptionalHalMinorVersionDiffInstance)2707*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddOptionalHalMinorVersionDiffInstance) {
2708*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2709*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2710*70a7ec85SAndroid Build Coastguard Worker std::string error;
2711*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2712*70a7ec85SAndroid Build Coastguard Worker
2713*70a7ec85SAndroid Build Coastguard Worker xml =
2714*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2715*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2716*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2717*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-1</version>\n"
2718*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2719*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2720*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2721*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2722*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2723*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2724*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2725*70a7ec85SAndroid Build Coastguard Worker
2726*70a7ec85SAndroid Build Coastguard Worker xml =
2727*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2728*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2729*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2730*70a7ec85SAndroid Build Coastguard Worker " <version>1.1-2</version>\n"
2731*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2732*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2733*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2734*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2735*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2736*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2737*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2738*70a7ec85SAndroid Build Coastguard Worker
2739*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2740*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2741*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2742*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2743*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2744*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2745*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-1</version>\n"
2746*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2747*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2748*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2749*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2750*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2751*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
2752*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2753*70a7ec85SAndroid Build Coastguard Worker " <version>1.1-2</version>\n"
2754*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2755*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2756*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2757*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2758*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2759*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2760*70a7ec85SAndroid Build Coastguard Worker }
2761*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddRequiredHalOverlapInstance)2762*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddRequiredHalOverlapInstance) {
2763*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2764*70a7ec85SAndroid Build Coastguard Worker std::string error;
2765*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2766*70a7ec85SAndroid Build Coastguard Worker
2767*70a7ec85SAndroid Build Coastguard Worker xml =
2768*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2769*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2770*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2771*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2772*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2773*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2774*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2775*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2776*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2777*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2778*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2779*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2780*70a7ec85SAndroid Build Coastguard Worker
2781*70a7ec85SAndroid Build Coastguard Worker {
2782*70a7ec85SAndroid Build Coastguard Worker // Test that 2.0 should be added to IFoo/default, so 1.0::IFoo/custom
2783*70a7ec85SAndroid Build Coastguard Worker // should be in a new <hal> tag
2784*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2785*70a7ec85SAndroid Build Coastguard Worker xml =
2786*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2787*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2788*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2789*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2790*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2791*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2792*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2793*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2794*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2795*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2796*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2797*70a7ec85SAndroid Build Coastguard Worker
2798*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2799*70a7ec85SAndroid Build Coastguard Worker
2800*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2801*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2802*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2803*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2804*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2805*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2806*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2807*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2808*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2809*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2810*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2811*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2812*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2813*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2814*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2815*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2816*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2817*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2818*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2819*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2820*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2821*70a7ec85SAndroid Build Coastguard Worker }
2822*70a7ec85SAndroid Build Coastguard Worker
2823*70a7ec85SAndroid Build Coastguard Worker {
2824*70a7ec85SAndroid Build Coastguard Worker // Test that 2.0::IFoo/strong should be added as an optional <hal> tag.
2825*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2826*70a7ec85SAndroid Build Coastguard Worker xml =
2827*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2828*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2829*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2830*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2831*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2832*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2833*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2834*70a7ec85SAndroid Build Coastguard Worker " <instance>strong</instance>\n"
2835*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2836*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2837*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2838*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2839*70a7ec85SAndroid Build Coastguard Worker
2840*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2841*70a7ec85SAndroid Build Coastguard Worker
2842*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2843*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2844*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2845*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2846*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2847*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2848*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2849*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2850*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2851*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2852*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2853*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2854*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2855*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2856*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2857*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2858*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2859*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2860*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2861*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2862*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
2863*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2864*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2865*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2866*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2867*70a7ec85SAndroid Build Coastguard Worker " <instance>strong</instance>\n"
2868*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2869*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2870*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2871*70a7ec85SAndroid Build Coastguard Worker }
2872*70a7ec85SAndroid Build Coastguard Worker }
2873*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddRequiredHalOverlapInstanceSplit)2874*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddRequiredHalOverlapInstanceSplit) {
2875*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2876*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2877*70a7ec85SAndroid Build Coastguard Worker std::string error;
2878*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2879*70a7ec85SAndroid Build Coastguard Worker
2880*70a7ec85SAndroid Build Coastguard Worker xml =
2881*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2882*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2883*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2884*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2885*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2886*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2887*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2888*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2889*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2890*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2891*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2892*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2893*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2894*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2895*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2896*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2897*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2898*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2899*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2900*70a7ec85SAndroid Build Coastguard Worker
2901*70a7ec85SAndroid Build Coastguard Worker xml =
2902*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2903*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2904*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2905*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2906*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2907*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2908*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2909*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2910*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2911*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2912*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2913*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2914*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2915*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2916*70a7ec85SAndroid Build Coastguard Worker " <instance>strong</instance>\n"
2917*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2918*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2919*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2920*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2921*70a7ec85SAndroid Build Coastguard Worker
2922*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2923*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2924*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
2925*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2926*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2927*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2928*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2929*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2930*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2931*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2932*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2933*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2934*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2935*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
2936*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2937*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
2938*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2939*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2940*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
2941*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2942*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2943*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
2944*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2945*70a7ec85SAndroid Build Coastguard Worker " <version>2.0</version>\n"
2946*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2947*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2948*70a7ec85SAndroid Build Coastguard Worker " <instance>strong</instance>\n"
2949*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2950*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2951*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
2952*70a7ec85SAndroid Build Coastguard Worker xml);
2953*70a7ec85SAndroid Build Coastguard Worker }
2954*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddOptionalHalUpdatableViaApex)2955*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddOptionalHalUpdatableViaApex) {
2956*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
2957*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
2958*70a7ec85SAndroid Build Coastguard Worker std::string error;
2959*70a7ec85SAndroid Build Coastguard Worker std::string xml;
2960*70a7ec85SAndroid Build Coastguard Worker
2961*70a7ec85SAndroid Build Coastguard Worker xml =
2962*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2963*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\">\n"
2964*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2965*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2966*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2967*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2968*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2969*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2970*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2971*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
2972*70a7ec85SAndroid Build Coastguard Worker
2973*70a7ec85SAndroid Build Coastguard Worker xml =
2974*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
2975*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\" updatable-via-apex=\"true\">\n"
2976*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2977*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2978*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2979*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2980*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2981*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2982*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
2983*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
2984*70a7ec85SAndroid Build Coastguard Worker
2985*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllHalsAsOptional(&cm1, &cm2, &error)) << error;
2986*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::HALS_ONLY);
2987*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
2988*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
2989*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\" updatable-via-apex=\"true\">\n"
2990*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
2991*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
2992*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
2993*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
2994*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
2995*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
2996*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
2997*70a7ec85SAndroid Build Coastguard Worker }
2998*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AddOptionalXmlFile)2999*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AddOptionalXmlFile) {
3000*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm1;
3001*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm2;
3002*70a7ec85SAndroid Build Coastguard Worker std::string error;
3003*70a7ec85SAndroid Build Coastguard Worker std::string xml;
3004*70a7ec85SAndroid Build Coastguard Worker
3005*70a7ec85SAndroid Build Coastguard Worker xml =
3006*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
3007*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"xsd\" optional=\"true\">\n"
3008*70a7ec85SAndroid Build Coastguard Worker " <name>foo</name>\n"
3009*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-2</version>\n"
3010*70a7ec85SAndroid Build Coastguard Worker " <path>/foo/bar/baz.xsd</path>\n"
3011*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
3012*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
3013*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm1, xml, &error)) << error;
3014*70a7ec85SAndroid Build Coastguard Worker
3015*70a7ec85SAndroid Build Coastguard Worker xml =
3016*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"
3017*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"xsd\" optional=\"true\">\n"
3018*70a7ec85SAndroid Build Coastguard Worker " <name>foo</name>\n"
3019*70a7ec85SAndroid Build Coastguard Worker " <version>1.1-3</version>\n"
3020*70a7ec85SAndroid Build Coastguard Worker " <path>/foo/bar/quux.xsd</path>\n"
3021*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
3022*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
3023*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm2, xml, &error)) << error;
3024*70a7ec85SAndroid Build Coastguard Worker
3025*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(addAllXmlFilesAsOptional(&cm1, &cm2, &error)) << error;
3026*70a7ec85SAndroid Build Coastguard Worker xml = toXml(cm1, SerializeFlags::XMLFILES_ONLY);
3027*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
3028*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
3029*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"xsd\" optional=\"true\">\n"
3030*70a7ec85SAndroid Build Coastguard Worker " <name>foo</name>\n"
3031*70a7ec85SAndroid Build Coastguard Worker " <version>1.0-2</version>\n"
3032*70a7ec85SAndroid Build Coastguard Worker " <path>/foo/bar/baz.xsd</path>\n"
3033*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
3034*70a7ec85SAndroid Build Coastguard Worker " <xmlfile format=\"xsd\" optional=\"true\">\n"
3035*70a7ec85SAndroid Build Coastguard Worker " <name>foo</name>\n"
3036*70a7ec85SAndroid Build Coastguard Worker " <version>1.1-3</version>\n"
3037*70a7ec85SAndroid Build Coastguard Worker " <path>/foo/bar/quux.xsd</path>\n"
3038*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
3039*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n");
3040*70a7ec85SAndroid Build Coastguard Worker }
3041*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,VendorNdk)3042*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, VendorNdk) {
3043*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
3044*70a7ec85SAndroid Build Coastguard Worker std::string error;
3045*70a7ec85SAndroid Build Coastguard Worker std::string xml;
3046*70a7ec85SAndroid Build Coastguard Worker
3047*70a7ec85SAndroid Build Coastguard Worker xml =
3048*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
3049*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3050*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3051*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
3052*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
3053*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3054*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
3055*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
3056*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(cm));
3057*70a7ec85SAndroid Build Coastguard Worker
3058*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("P", cm.getVendorNdkVersion());
3059*70a7ec85SAndroid Build Coastguard Worker
3060*70a7ec85SAndroid Build Coastguard Worker {
3061*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3062*70a7ec85SAndroid Build Coastguard Worker xml =
3063*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3064*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3065*70a7ec85SAndroid Build Coastguard Worker " <version>27</version>\n"
3066*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
3067*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
3068*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3069*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3070*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3071*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
3072*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
3073*70a7ec85SAndroid Build Coastguard Worker " <library>libtinyxml2.so</library>\n"
3074*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3075*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3076*70a7ec85SAndroid Build Coastguard Worker
3077*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3078*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest));
3079*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
3080*70a7ec85SAndroid Build Coastguard Worker }
3081*70a7ec85SAndroid Build Coastguard Worker
3082*70a7ec85SAndroid Build Coastguard Worker {
3083*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3084*70a7ec85SAndroid Build Coastguard Worker xml =
3085*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3086*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3087*70a7ec85SAndroid Build Coastguard Worker " <version>27</version>\n"
3088*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
3089*70a7ec85SAndroid Build Coastguard Worker " <library>libjpeg.so</library>\n"
3090*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3091*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3092*70a7ec85SAndroid Build Coastguard Worker
3093*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3094*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest));
3095*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
3096*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Vndk version P is not supported.", error);
3097*70a7ec85SAndroid Build Coastguard Worker }
3098*70a7ec85SAndroid Build Coastguard Worker
3099*70a7ec85SAndroid Build Coastguard Worker {
3100*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3101*70a7ec85SAndroid Build Coastguard Worker xml =
3102*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3103*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3104*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3105*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
3106*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3107*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3108*70a7ec85SAndroid Build Coastguard Worker
3109*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3110*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest));
3111*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
3112*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Vndk libs incompatible for version P.", error);
3113*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("libjpeg.so", error);
3114*70a7ec85SAndroid Build Coastguard Worker }
3115*70a7ec85SAndroid Build Coastguard Worker }
3116*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MissingVendorNdkInMatrix)3117*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MissingVendorNdkInMatrix) {
3118*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
3119*70a7ec85SAndroid Build Coastguard Worker std::string xml;
3120*70a7ec85SAndroid Build Coastguard Worker std::string error;
3121*70a7ec85SAndroid Build Coastguard Worker
3122*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr + " type=\"device\"/>\n";
3123*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
3124*70a7ec85SAndroid Build Coastguard Worker
3125*70a7ec85SAndroid Build Coastguard Worker {
3126*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3127*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n";
3128*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3129*70a7ec85SAndroid Build Coastguard Worker
3130*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
3131*70a7ec85SAndroid Build Coastguard Worker }
3132*70a7ec85SAndroid Build Coastguard Worker
3133*70a7ec85SAndroid Build Coastguard Worker {
3134*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3135*70a7ec85SAndroid Build Coastguard Worker xml =
3136*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3137*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3138*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3139*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
3140*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3141*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3142*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3143*70a7ec85SAndroid Build Coastguard Worker
3144*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
3145*70a7ec85SAndroid Build Coastguard Worker }
3146*70a7ec85SAndroid Build Coastguard Worker }
3147*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,DuplicatedVendorNdkVersion)3148*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, DuplicatedVendorNdkVersion) {
3149*70a7ec85SAndroid Build Coastguard Worker std::string error;
3150*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3151*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3152*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3153*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3154*70a7ec85SAndroid Build Coastguard Worker " <version>27</version>\n"
3155*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3156*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
3157*70a7ec85SAndroid Build Coastguard Worker " <version>27</version>\n"
3158*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
3159*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3160*70a7ec85SAndroid Build Coastguard Worker
3161*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, xml, &error));
3162*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("Duplicated manifest.vendor-ndk.version 27", error);
3163*70a7ec85SAndroid Build Coastguard Worker }
3164*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestHalOverride)3165*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestHalOverride) {
3166*70a7ec85SAndroid Build Coastguard Worker std::string error;
3167*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3168*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3169*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">\n"
3170*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3171*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3172*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3173*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
3174*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3175*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3176*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
3177*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3178*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
3179*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3180*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3181*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3182*70a7ec85SAndroid Build Coastguard Worker const auto& foo = getHals(manifest, "android.hardware.foo");
3183*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(foo.empty());
3184*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(foo.front()->isOverride());
3185*70a7ec85SAndroid Build Coastguard Worker const auto& bar = getHals(manifest, "android.hardware.bar");
3186*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(bar.empty());
3187*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(bar.front()->isOverride());
3188*70a7ec85SAndroid Build Coastguard Worker }
3189*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestHalOverrideLatest)3190*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestHalOverrideLatest) {
3191*70a7ec85SAndroid Build Coastguard Worker std::string error;
3192*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3193*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3194*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3195*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3196*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3197*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3198*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
3199*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3200*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3201*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3202*70a7ec85SAndroid Build Coastguard Worker const auto& foo = getHals(manifest, "android.hardware.foo");
3203*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(foo.empty());
3204*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(foo.front()->isOverride());
3205*70a7ec85SAndroid Build Coastguard Worker }
3206*70a7ec85SAndroid Build Coastguard Worker
3207*70a7ec85SAndroid Build Coastguard Worker // Test functionality of override="true" tag
TEST_F(LibVintfTest,ManifestAddOverrideHalSimple)3208*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalSimple) {
3209*70a7ec85SAndroid Build Coastguard Worker std::string error;
3210*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3211*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + " type=\"device\"/>\n";
3212*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3213*70a7ec85SAndroid Build Coastguard Worker
3214*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3215*70a7ec85SAndroid Build Coastguard Worker xml =
3216*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3217*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3218*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3219*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3220*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/default</fqname>\n"
3221*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3222*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3223*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3224*70a7ec85SAndroid Build Coastguard Worker
3225*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3226*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest, SerializeFlags::HALS_ONLY));
3227*70a7ec85SAndroid Build Coastguard Worker }
3228*70a7ec85SAndroid Build Coastguard Worker
3229*70a7ec85SAndroid Build Coastguard Worker // Test functionality of override="true" tag
TEST_F(LibVintfTest,ManifestAddOverrideHalSimpleWithInterface)3230*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleWithInterface) {
3231*70a7ec85SAndroid Build Coastguard Worker std::string error;
3232*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3233*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + " type=\"device\"/>\n";
3234*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3235*70a7ec85SAndroid Build Coastguard Worker
3236*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3237*70a7ec85SAndroid Build Coastguard Worker xml =
3238*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3239*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3240*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3241*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3242*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>\n"
3243*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3244*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3245*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3246*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3247*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3248*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3249*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3250*70a7ec85SAndroid Build Coastguard Worker
3251*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3252*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3253*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3254*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3255*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3256*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3257*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/default</fqname>\n"
3258*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3259*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3260*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3261*70a7ec85SAndroid Build Coastguard Worker }
3262*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddOverrideHalSimpleOverride)3263*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverride) {
3264*70a7ec85SAndroid Build Coastguard Worker std::string error;
3265*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3266*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3267*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">\n"
3268*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3269*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3270*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3271*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
3272*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3273*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3274*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3275*70a7ec85SAndroid Build Coastguard Worker
3276*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3277*70a7ec85SAndroid Build Coastguard Worker xml =
3278*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3279*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3280*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3281*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3282*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/default</fqname>\n"
3283*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3284*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3285*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3286*70a7ec85SAndroid Build Coastguard Worker
3287*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3288*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest, SerializeFlags::HALS_ONLY));
3289*70a7ec85SAndroid Build Coastguard Worker }
3290*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddOverrideHalSimpleOverrideWithInterface)3291*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalSimpleOverrideWithInterface) {
3292*70a7ec85SAndroid Build Coastguard Worker std::string error;
3293*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3294*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3295*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">\n"
3296*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3297*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3298*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3299*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
3300*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3301*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3302*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3303*70a7ec85SAndroid Build Coastguard Worker
3304*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3305*70a7ec85SAndroid Build Coastguard Worker xml =
3306*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3307*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3308*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3309*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3310*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>\n"
3311*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3312*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3313*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3314*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3315*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3316*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3317*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3318*70a7ec85SAndroid Build Coastguard Worker
3319*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3320*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3321*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3322*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3323*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3324*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3325*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/default</fqname>\n"
3326*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3327*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3328*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3329*70a7ec85SAndroid Build Coastguard Worker }
3330*70a7ec85SAndroid Build Coastguard Worker
3331*70a7ec85SAndroid Build Coastguard Worker // Existing major versions should be removed.
TEST_F(LibVintfTest,ManifestAddOverrideHalMultiVersion)3332*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion) {
3333*70a7ec85SAndroid Build Coastguard Worker std::string error;
3334*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3335*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3336*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">\n"
3337*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3338*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3339*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3340*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3341*70a7ec85SAndroid Build Coastguard Worker " <version>2.4</version>\n"
3342*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3343*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3344*70a7ec85SAndroid Build Coastguard Worker " <instance>slot1</instance>\n"
3345*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3346*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3347*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3348*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
3349*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3350*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3351*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3352*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3353*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3354*70a7ec85SAndroid Build Coastguard Worker
3355*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3356*70a7ec85SAndroid Build Coastguard Worker xml =
3357*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3358*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3359*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3360*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3361*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>\n"
3362*70a7ec85SAndroid Build Coastguard Worker " <version>3.1</version>\n"
3363*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3364*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3365*70a7ec85SAndroid Build Coastguard Worker " <instance>slot2</instance>\n"
3366*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3367*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3368*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3369*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3370*70a7ec85SAndroid Build Coastguard Worker
3371*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3372*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3373*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3374*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3375*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
3376*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3377*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3378*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3379*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3380*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3381*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3382*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.4::IFoo/slot1</fqname>\n"
3383*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3384*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3385*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3386*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3387*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/slot2</fqname>\n"
3388*70a7ec85SAndroid Build Coastguard Worker " <fqname>@3.1::IFoo/slot2</fqname>\n"
3389*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3390*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3391*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3392*70a7ec85SAndroid Build Coastguard Worker }
3393*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddOverrideHalMultiVersion2)3394*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2) {
3395*70a7ec85SAndroid Build Coastguard Worker std::string error;
3396*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3397*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3398*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3399*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3400*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3401*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3402*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3403*70a7ec85SAndroid Build Coastguard Worker " <version>2.4</version>\n"
3404*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3405*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3406*70a7ec85SAndroid Build Coastguard Worker " <instance>slot1</instance>\n"
3407*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3408*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3409*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3410*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3411*70a7ec85SAndroid Build Coastguard Worker
3412*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3413*70a7ec85SAndroid Build Coastguard Worker xml =
3414*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3415*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3416*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3417*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3418*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/slot2</fqname>\n"
3419*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.1::IFoo/slot2</fqname>\n"
3420*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3421*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3422*70a7ec85SAndroid Build Coastguard Worker
3423*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3424*70a7ec85SAndroid Build Coastguard Worker
3425*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3426*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest, SerializeFlags::HALS_ONLY));
3427*70a7ec85SAndroid Build Coastguard Worker }
3428*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddOverrideHalMultiVersion2WithInterface)3429*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalMultiVersion2WithInterface) {
3430*70a7ec85SAndroid Build Coastguard Worker std::string error;
3431*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3432*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3433*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3434*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3435*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3436*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3437*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3438*70a7ec85SAndroid Build Coastguard Worker " <version>2.4</version>\n"
3439*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3440*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3441*70a7ec85SAndroid Build Coastguard Worker " <instance>slot1</instance>\n"
3442*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3443*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3444*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3445*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3446*70a7ec85SAndroid Build Coastguard Worker
3447*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3448*70a7ec85SAndroid Build Coastguard Worker xml =
3449*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3450*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3451*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3452*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3453*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>\n"
3454*70a7ec85SAndroid Build Coastguard Worker " <version>2.1</version>\n"
3455*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3456*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3457*70a7ec85SAndroid Build Coastguard Worker " <instance>slot2</instance>\n"
3458*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3459*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3460*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3461*70a7ec85SAndroid Build Coastguard Worker
3462*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3463*70a7ec85SAndroid Build Coastguard Worker
3464*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3465*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3466*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3467*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3468*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3469*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3470*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/slot2</fqname>\n"
3471*70a7ec85SAndroid Build Coastguard Worker " <fqname>@2.1::IFoo/slot2</fqname>\n"
3472*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3473*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3474*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3475*70a7ec85SAndroid Build Coastguard Worker }
3476*70a7ec85SAndroid Build Coastguard Worker
3477*70a7ec85SAndroid Build Coastguard Worker // if no <versions>, remove all existing <hal> with given <name>.
TEST_F(LibVintfTest,ManifestAddOverrideHalRemoveAll)3478*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddOverrideHalRemoveAll) {
3479*70a7ec85SAndroid Build Coastguard Worker std::string error;
3480*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3481*70a7ec85SAndroid Build Coastguard Worker std::string xml =
3482*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"device\">\n"
3483*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3484*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3485*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3486*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3487*70a7ec85SAndroid Build Coastguard Worker " <version>2.4</version>\n"
3488*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3489*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3490*70a7ec85SAndroid Build Coastguard Worker " <instance>slot1</instance>\n"
3491*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3492*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3493*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3494*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3495*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3496*70a7ec85SAndroid Build Coastguard Worker " <version>3.1</version>\n"
3497*70a7ec85SAndroid Build Coastguard Worker " <version>4.3</version>\n"
3498*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3499*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
3500*70a7ec85SAndroid Build Coastguard Worker " <instance>slot2</instance>\n"
3501*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3502*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3503*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3504*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
3505*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3506*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3507*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3508*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3509*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3510*70a7ec85SAndroid Build Coastguard Worker
3511*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3512*70a7ec85SAndroid Build Coastguard Worker xml =
3513*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3514*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3515*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3516*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3517*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3518*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3519*70a7ec85SAndroid Build Coastguard Worker
3520*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, xml, &error)) << error;
3521*70a7ec85SAndroid Build Coastguard Worker
3522*70a7ec85SAndroid Build Coastguard Worker manifest.addAllHals(&newManifest);
3523*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3524*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3525*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3526*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
3527*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3528*70a7ec85SAndroid Build Coastguard Worker " <version>1.3</version>\n"
3529*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3530*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
3531*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3532*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
3533*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3534*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3535*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3536*70a7ec85SAndroid Build Coastguard Worker }
3537*70a7ec85SAndroid Build Coastguard Worker
3538*70a7ec85SAndroid Build Coastguard Worker // Make sure missing tags in old VINTF files does not cause incompatibilities.
TEST_F(LibVintfTest,Empty)3539*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, Empty) {
3540*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
3541*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3542*70a7ec85SAndroid Build Coastguard Worker std::string xml;
3543*70a7ec85SAndroid Build Coastguard Worker std::string error;
3544*70a7ec85SAndroid Build Coastguard Worker
3545*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr + " type=\"device\"/>\n";
3546*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
3547*70a7ec85SAndroid Build Coastguard Worker
3548*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr + " type=\"framework\"/>\n";
3549*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3550*70a7ec85SAndroid Build Coastguard Worker
3551*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
3552*70a7ec85SAndroid Build Coastguard Worker }
3553*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableHals)3554*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableHals) {
3555*70a7ec85SAndroid Build Coastguard Worker std::string error;
3556*70a7ec85SAndroid Build Coastguard Worker
3557*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3558*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3559*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3560*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-apex=\"com.android.foo\">\n"
3561*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3562*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3563*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3564*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3565*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3566*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3567*70a7ec85SAndroid Build Coastguard Worker
3568*70a7ec85SAndroid Build Coastguard Worker // check by calling the API: updatableViaApex()
3569*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3570*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3571*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaApex(), Optional(Eq("com.android.foo")));
3572*70a7ec85SAndroid Build Coastguard Worker }
3573*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableViaApex_EmptyIsValidForNonUpdatableHal)3574*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableViaApex_EmptyIsValidForNonUpdatableHal) {
3575*70a7ec85SAndroid Build Coastguard Worker std::string error;
3576*70a7ec85SAndroid Build Coastguard Worker
3577*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3578*70a7ec85SAndroid Build Coastguard Worker manifest.setFileName("/apex/com.foo/etc/vintf/manifest.xml");
3579*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3580*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3581*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-apex=\"\">\n"
3582*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3583*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3584*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3585*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3586*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3587*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3588*70a7ec85SAndroid Build Coastguard Worker
3589*70a7ec85SAndroid Build Coastguard Worker // check by calling the API: updatableViaApex()
3590*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3591*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3592*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaApex(), Optional(Eq("")));
3593*70a7ec85SAndroid Build Coastguard Worker }
3594*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableViaApex_UpdatableHalCanExplicitlySet)3595*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableViaApex_UpdatableHalCanExplicitlySet) {
3596*70a7ec85SAndroid Build Coastguard Worker std::string error;
3597*70a7ec85SAndroid Build Coastguard Worker
3598*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3599*70a7ec85SAndroid Build Coastguard Worker manifest.setFileName("/apex/com.foo/etc/vintf/manifest.xml");
3600*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3601*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3602*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-apex=\"com.foo\">\n"
3603*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3604*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3605*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3606*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3607*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3608*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3609*70a7ec85SAndroid Build Coastguard Worker
3610*70a7ec85SAndroid Build Coastguard Worker // check by calling the API: updatableViaApex()
3611*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3612*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3613*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaApex(), Optional(Eq("com.foo")));
3614*70a7ec85SAndroid Build Coastguard Worker }
3615*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableViaApex_ErrorIfExplicitValueMismatch)3616*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableViaApex_ErrorIfExplicitValueMismatch) {
3617*70a7ec85SAndroid Build Coastguard Worker std::string error;
3618*70a7ec85SAndroid Build Coastguard Worker
3619*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3620*70a7ec85SAndroid Build Coastguard Worker manifest.setFileName("/apex/com.bar/etc/vintf/manifest.xml");
3621*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3622*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3623*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-apex=\"com.foo\">\n"
3624*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3625*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3626*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3627*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3628*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3629*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("updatable-via-apex com.foo doesn't match", error);
3630*70a7ec85SAndroid Build Coastguard Worker }
3631*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableViaApex_SetToCurrentApex)3632*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableViaApex_SetToCurrentApex) {
3633*70a7ec85SAndroid Build Coastguard Worker std::string error;
3634*70a7ec85SAndroid Build Coastguard Worker
3635*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3636*70a7ec85SAndroid Build Coastguard Worker manifest.setFileName("/apex/com.foo/etc/vintf/manifest.xml");
3637*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3638*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3639*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3640*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3641*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3642*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3643*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3644*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error));
3645*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("updatable-via-apex=\"com.foo\"", toXml(manifest, SerializeFlags::HALS_ONLY));
3646*70a7ec85SAndroid Build Coastguard Worker
3647*70a7ec85SAndroid Build Coastguard Worker // check by calling the API: updatableViaApex()
3648*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3649*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3650*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaApex(), Optional(Eq("com.foo")));
3651*70a7ec85SAndroid Build Coastguard Worker }
3652*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableHalsWithInterface)3653*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableHalsWithInterface) {
3654*70a7ec85SAndroid Build Coastguard Worker std::string error;
3655*70a7ec85SAndroid Build Coastguard Worker
3656*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3657*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3658*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3659*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-apex=\"com.android.foo\">\n"
3660*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3661*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3662*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3663*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3664*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3665*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3666*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3667*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3668*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3669*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3670*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-apex=\"com.android.foo\">\n"
3671*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3672*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3673*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3674*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3675*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3676*70a7ec85SAndroid Build Coastguard Worker
3677*70a7ec85SAndroid Build Coastguard Worker // check by calling the API: updatableViaApex()
3678*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3679*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3680*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaApex(), Optional(Eq("com.android.foo")));
3681*70a7ec85SAndroid Build Coastguard Worker }
3682*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableViaSystemHals)3683*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableViaSystemHals) {
3684*70a7ec85SAndroid Build Coastguard Worker std::string error;
3685*70a7ec85SAndroid Build Coastguard Worker
3686*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3687*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3688*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3689*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" updatable-via-system=\"true\">\n"
3690*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3691*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3692*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3693*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3694*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3695*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3696*70a7ec85SAndroid Build Coastguard Worker
3697*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3698*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3699*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaSystem(), true);
3700*70a7ec85SAndroid Build Coastguard Worker }
3701*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingUpdatableViaSystemHals_defaultIsNonUpdatableHal)3702*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingUpdatableViaSystemHals_defaultIsNonUpdatableHal) {
3703*70a7ec85SAndroid Build Coastguard Worker std::string error;
3704*70a7ec85SAndroid Build Coastguard Worker
3705*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3706*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3707*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3708*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3709*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3710*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3711*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3712*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3713*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3714*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3715*70a7ec85SAndroid Build Coastguard Worker
3716*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3717*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3718*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(foo.front()->updatableViaSystem(), false);
3719*70a7ec85SAndroid Build Coastguard Worker }
3720*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingHalsAccessor)3721*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingHalsAccessor) {
3722*70a7ec85SAndroid Build Coastguard Worker std::string error;
3723*70a7ec85SAndroid Build Coastguard Worker
3724*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3725*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3726*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3727*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3728*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3729*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3730*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3731*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3732*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3733*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3734*70a7ec85SAndroid Build Coastguard Worker
3735*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3736*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3737*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(foo.front()->accessor().has_value());
3738*70a7ec85SAndroid Build Coastguard Worker
3739*70a7ec85SAndroid Build Coastguard Worker HalManifest newManifest;
3740*70a7ec85SAndroid Build Coastguard Worker std::string accessorName = "android.os.IAccessor/android.hardware.foo.IFoo/default";
3741*70a7ec85SAndroid Build Coastguard Worker manifestXml =
3742*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3743*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3744*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3745*70a7ec85SAndroid Build Coastguard Worker " <accessor>" + accessorName + "</accessor>\n"
3746*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3747*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3748*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3749*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&newManifest, manifestXml, &error)) << error;
3750*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(newManifest, SerializeFlags::HALS_ONLY));
3751*70a7ec85SAndroid Build Coastguard Worker
3752*70a7ec85SAndroid Build Coastguard Worker foo = getHals(newManifest, "android.hardware.foo");
3753*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3754*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(accessorName, foo.front()->accessor());
3755*70a7ec85SAndroid Build Coastguard Worker }
3756*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHalsAccessorNoValue)3757*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHalsAccessorNoValue) {
3758*70a7ec85SAndroid Build Coastguard Worker std::string error;
3759*70a7ec85SAndroid Build Coastguard Worker
3760*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3761*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3762*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3763*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3764*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3765*70a7ec85SAndroid Build Coastguard Worker " <accessor></accessor>\n"
3766*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3767*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3768*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3769*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3770*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Accessor requires a non-empty value", error);
3771*70a7ec85SAndroid Build Coastguard Worker }
3772*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHalsAccessorMoreThanOneValue)3773*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHalsAccessorMoreThanOneValue) {
3774*70a7ec85SAndroid Build Coastguard Worker std::string error;
3775*70a7ec85SAndroid Build Coastguard Worker
3776*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3777*70a7ec85SAndroid Build Coastguard Worker std::string accessorName1 = "android.os.IAccessor/android.hardware.foo.IFoo/default";
3778*70a7ec85SAndroid Build Coastguard Worker std::string accessorName2 = "android.os.IAccessor/android.hardware.foo.IFoo/vm";
3779*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3780*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3781*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3782*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3783*70a7ec85SAndroid Build Coastguard Worker " <accessor>" + accessorName1 + "</accessor>\n"
3784*70a7ec85SAndroid Build Coastguard Worker " <accessor>" + accessorName2 + "</accessor>\n"
3785*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3786*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3787*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3788*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3789*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("No more than one <accessor> is allowed in <hal>", error);
3790*70a7ec85SAndroid Build Coastguard Worker }
3791*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingHalsInetTransport)3792*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingHalsInetTransport) {
3793*70a7ec85SAndroid Build Coastguard Worker std::string error;
3794*70a7ec85SAndroid Build Coastguard Worker
3795*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3796*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3797*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3798*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3799*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3800*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\" port=\"12\">inet</transport>\n"
3801*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3802*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3803*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3804*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3805*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
3806*70a7ec85SAndroid Build Coastguard Worker
3807*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3808*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3809*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(foo.front()->ip().has_value());
3810*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(foo.front()->port().has_value());
3811*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("1.2.3.4", *foo.front()->ip());
3812*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(12, *foo.front()->port());
3813*70a7ec85SAndroid Build Coastguard Worker }
3814*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ParsingHalsInetTransportWithInterface)3815*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ParsingHalsInetTransportWithInterface) {
3816*70a7ec85SAndroid Build Coastguard Worker std::string error;
3817*70a7ec85SAndroid Build Coastguard Worker
3818*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3819*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3820*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3821*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3822*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3823*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\" port=\"12\">inet</transport>\n"
3824*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3825*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3826*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3827*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3828*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3829*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3830*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
3831*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
3832*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3833*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3834*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3835*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\" port=\"12\">inet</transport>\n"
3836*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
3837*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3838*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
3839*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
3840*70a7ec85SAndroid Build Coastguard Worker
3841*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
3842*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
3843*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(foo.front()->ip().has_value());
3844*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(foo.front()->port().has_value());
3845*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("1.2.3.4", *foo.front()->ip());
3846*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(12, *foo.front()->port());
3847*70a7ec85SAndroid Build Coastguard Worker }
3848*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHalsInetTransportNoAttrs)3849*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHalsInetTransportNoAttrs) {
3850*70a7ec85SAndroid Build Coastguard Worker std::string error;
3851*70a7ec85SAndroid Build Coastguard Worker
3852*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3853*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3854*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3855*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3856*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3857*70a7ec85SAndroid Build Coastguard Worker " <transport>inet</transport>\n"
3858*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3859*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3860*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3861*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3862*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3863*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3864*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3865*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Transport inet requires ip and port attributes", error);
3866*70a7ec85SAndroid Build Coastguard Worker }
3867*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHalsInetTransportMissingAttrs)3868*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHalsInetTransportMissingAttrs) {
3869*70a7ec85SAndroid Build Coastguard Worker std::string error;
3870*70a7ec85SAndroid Build Coastguard Worker
3871*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3872*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3873*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3874*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3875*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3876*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\">inet</transport>\n"
3877*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3878*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3879*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3880*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3881*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3882*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3883*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3884*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Transport inet requires ip and port", error);
3885*70a7ec85SAndroid Build Coastguard Worker }
3886*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHalsEmptyTransportWithInetAttrs)3887*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHalsEmptyTransportWithInetAttrs) {
3888*70a7ec85SAndroid Build Coastguard Worker std::string error;
3889*70a7ec85SAndroid Build Coastguard Worker
3890*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3891*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3892*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3893*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
3894*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3895*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\" port=\"12\"></transport>\n"
3896*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3897*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3898*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3899*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3900*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3901*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3902*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3903*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Transport requires empty ip and port attributes", error);
3904*70a7ec85SAndroid Build Coastguard Worker }
3905*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHidlHalsInetTransport)3906*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHidlHalsInetTransport) {
3907*70a7ec85SAndroid Build Coastguard Worker std::string error;
3908*70a7ec85SAndroid Build Coastguard Worker
3909*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3910*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3911*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3912*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3913*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3914*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\" port=\"12\">inet</transport>\n"
3915*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3916*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3917*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3918*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3919*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3920*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3921*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3922*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(
3923*70a7ec85SAndroid Build Coastguard Worker "HIDL HAL 'android.hardware.foo' should not have <transport> \"inet\" or ip or port",
3924*70a7ec85SAndroid Build Coastguard Worker error);
3925*70a7ec85SAndroid Build Coastguard Worker }
3926*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectHidlHalsHwbinderInetAttrs)3927*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectHidlHalsHwbinderInetAttrs) {
3928*70a7ec85SAndroid Build Coastguard Worker std::string error;
3929*70a7ec85SAndroid Build Coastguard Worker
3930*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3931*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
3932*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
3933*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
3934*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
3935*70a7ec85SAndroid Build Coastguard Worker " <transport ip=\"1.2.3.4\" port=\"12\">hwbinder</transport>\n"
3936*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
3937*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
3938*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
3939*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
3940*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
3941*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3942*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
3943*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Transport hwbinder requires empty ip and port attributes", error);
3944*70a7ec85SAndroid Build Coastguard Worker }
3945*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,SystemSdk)3946*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, SystemSdk) {
3947*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
3948*70a7ec85SAndroid Build Coastguard Worker std::string xml;
3949*70a7ec85SAndroid Build Coastguard Worker std::string error;
3950*70a7ec85SAndroid Build Coastguard Worker
3951*70a7ec85SAndroid Build Coastguard Worker xml =
3952*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
3953*70a7ec85SAndroid Build Coastguard Worker " <system-sdk>\n"
3954*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
3955*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3956*70a7ec85SAndroid Build Coastguard Worker " </system-sdk>\n"
3957*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
3958*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
3959*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(cm, SerializeFlags::SSDK_ONLY));
3960*70a7ec85SAndroid Build Coastguard Worker
3961*70a7ec85SAndroid Build Coastguard Worker {
3962*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3963*70a7ec85SAndroid Build Coastguard Worker xml =
3964*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3965*70a7ec85SAndroid Build Coastguard Worker " <system-sdk>\n"
3966*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
3967*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3968*70a7ec85SAndroid Build Coastguard Worker " </system-sdk>\n"
3969*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3970*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3971*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest, SerializeFlags::SSDK_ONLY));
3972*70a7ec85SAndroid Build Coastguard Worker
3973*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
3974*70a7ec85SAndroid Build Coastguard Worker }
3975*70a7ec85SAndroid Build Coastguard Worker
3976*70a7ec85SAndroid Build Coastguard Worker {
3977*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3978*70a7ec85SAndroid Build Coastguard Worker xml =
3979*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3980*70a7ec85SAndroid Build Coastguard Worker " <system-sdk>\n"
3981*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
3982*70a7ec85SAndroid Build Coastguard Worker " <version>3</version>\n"
3983*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
3984*70a7ec85SAndroid Build Coastguard Worker " </system-sdk>\n"
3985*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3986*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3987*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error));
3988*70a7ec85SAndroid Build Coastguard Worker }
3989*70a7ec85SAndroid Build Coastguard Worker
3990*70a7ec85SAndroid Build Coastguard Worker {
3991*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
3992*70a7ec85SAndroid Build Coastguard Worker xml =
3993*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
3994*70a7ec85SAndroid Build Coastguard Worker " <system-sdk>\n"
3995*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
3996*70a7ec85SAndroid Build Coastguard Worker " </system-sdk>\n"
3997*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
3998*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
3999*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
4000*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(error.find("System SDK") != std::string::npos) << error;
4001*70a7ec85SAndroid Build Coastguard Worker }
4002*70a7ec85SAndroid Build Coastguard Worker }
4003*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestEmpty)4004*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestEmpty) {
4005*70a7ec85SAndroid Build Coastguard Worker std::string error;
4006*70a7ec85SAndroid Build Coastguard Worker HalManifest e;
4007*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&e, "<manifest/>", &error));
4008*70a7ec85SAndroid Build Coastguard Worker EXPECT_NE("Not a valid XML", error);
4009*70a7ec85SAndroid Build Coastguard Worker
4010*70a7ec85SAndroid Build Coastguard Worker std::string prevError = error;
4011*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&e, "", &error));
4012*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("Not a valid XML", error);
4013*70a7ec85SAndroid Build Coastguard Worker }
4014*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixEmpty)4015*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixEmpty) {
4016*70a7ec85SAndroid Build Coastguard Worker std::string error;
4017*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix e;
4018*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&e, "<compatibility-matrix/>", &error));
4019*70a7ec85SAndroid Build Coastguard Worker EXPECT_NE("Not a valid XML", error);
4020*70a7ec85SAndroid Build Coastguard Worker
4021*70a7ec85SAndroid Build Coastguard Worker std::string prevError = error;
4022*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&e, "", &error));
4023*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("Not a valid XML", error);
4024*70a7ec85SAndroid Build Coastguard Worker }
4025*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixDetailErrorMsg)4026*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixDetailErrorMsg) {
4027*70a7ec85SAndroid Build Coastguard Worker std::string error;
4028*70a7ec85SAndroid Build Coastguard Worker std::string xml;
4029*70a7ec85SAndroid Build Coastguard Worker
4030*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4031*70a7ec85SAndroid Build Coastguard Worker xml =
4032*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"8\">\n"
4033*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4034*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4035*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4036*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4037*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4038*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4039*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4040*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4041*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4042*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4043*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
4044*70a7ec85SAndroid Build Coastguard Worker
4045*70a7ec85SAndroid Build Coastguard Worker {
4046*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
4047*70a7ec85SAndroid Build Coastguard Worker xml =
4048*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"7\">\n"
4049*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4050*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4051*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
4052*70a7ec85SAndroid Build Coastguard Worker " <version>4.5</version>\n"
4053*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4054*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4055*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4056*70a7ec85SAndroid Build Coastguard Worker " <instance>slot1</instance>\n"
4057*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4058*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4059*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
4060*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4061*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4062*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4063*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4064*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
4065*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
4066*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Manifest level = 8", error);
4067*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Matrix level = 7", error);
4068*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(
4069*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo:\n"
4070*70a7ec85SAndroid Build Coastguard Worker " required: \n"
4071*70a7ec85SAndroid Build Coastguard Worker " (@1.2-3::IBar/default AND @1.2-3::IFoo/default AND @1.2-3::IFoo/slot1) OR\n"
4072*70a7ec85SAndroid Build Coastguard Worker " (@4.5::IBar/default AND @4.5::IFoo/default AND @4.5::IFoo/slot1)\n"
4073*70a7ec85SAndroid Build Coastguard Worker " provided: @1.0::IFoo/default",
4074*70a7ec85SAndroid Build Coastguard Worker error);
4075*70a7ec85SAndroid Build Coastguard Worker }
4076*70a7ec85SAndroid Build Coastguard Worker
4077*70a7ec85SAndroid Build Coastguard Worker {
4078*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
4079*70a7ec85SAndroid Build Coastguard Worker xml =
4080*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
4081*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4082*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4083*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
4084*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4085*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4086*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4087*70a7ec85SAndroid Build Coastguard Worker " <instance>slot1</instance>\n"
4088*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4089*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4090*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4091*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
4092*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
4093*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(
4094*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo:\n"
4095*70a7ec85SAndroid Build Coastguard Worker " required: (@1.2-3::IFoo/default AND @1.2-3::IFoo/slot1)\n"
4096*70a7ec85SAndroid Build Coastguard Worker " provided: @1.0::IFoo/default",
4097*70a7ec85SAndroid Build Coastguard Worker error);
4098*70a7ec85SAndroid Build Coastguard Worker }
4099*70a7ec85SAndroid Build Coastguard Worker
4100*70a7ec85SAndroid Build Coastguard Worker // the most frequent use case.
4101*70a7ec85SAndroid Build Coastguard Worker {
4102*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
4103*70a7ec85SAndroid Build Coastguard Worker xml =
4104*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
4105*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4106*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4107*70a7ec85SAndroid Build Coastguard Worker " <version>1.2-3</version>\n"
4108*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4109*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4110*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4111*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4112*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4113*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4114*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
4115*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
4116*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(
4117*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo:\n"
4118*70a7ec85SAndroid Build Coastguard Worker " required: @1.2-3::IFoo/default\n"
4119*70a7ec85SAndroid Build Coastguard Worker " provided: @1.0::IFoo/default",
4120*70a7ec85SAndroid Build Coastguard Worker error);
4121*70a7ec85SAndroid Build Coastguard Worker }
4122*70a7ec85SAndroid Build Coastguard Worker }
4123*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,DisabledHal)4124*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, DisabledHal) {
4125*70a7ec85SAndroid Build Coastguard Worker std::string error;
4126*70a7ec85SAndroid Build Coastguard Worker std::string xml;
4127*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4128*70a7ec85SAndroid Build Coastguard Worker xml =
4129*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"framework\">\n"
4130*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
4131*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4132*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4133*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4134*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4135*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" override=\"true\">\n"
4136*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
4137*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4138*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/custom</fqname>\n"
4139*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4140*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4141*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.baz</name>\n"
4142*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4143*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4144*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4145*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
4146*70a7ec85SAndroid Build Coastguard Worker
4147*70a7ec85SAndroid Build Coastguard Worker auto foo = getHals(manifest, "android.hardware.foo");
4148*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, foo.size());
4149*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(foo.front()->isDisabledHal());
4150*70a7ec85SAndroid Build Coastguard Worker auto bar = getHals(manifest, "android.hardware.bar");
4151*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, bar.size());
4152*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(bar.front()->isDisabledHal());
4153*70a7ec85SAndroid Build Coastguard Worker auto baz = getHals(manifest, "android.hardware.baz");
4154*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, baz.size());
4155*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(baz.front()->isDisabledHal());
4156*70a7ec85SAndroid Build Coastguard Worker }
4157*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FqNameValid)4158*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FqNameValid) {
4159*70a7ec85SAndroid Build Coastguard Worker std::string error;
4160*70a7ec85SAndroid Build Coastguard Worker std::string xml;
4161*70a7ec85SAndroid Build Coastguard Worker
4162*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
4163*70a7ec85SAndroid Build Coastguard Worker xml =
4164*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
4165*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4166*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4167*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4168*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4169*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4170*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4171*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4172*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4173*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4174*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4175*70a7ec85SAndroid Build Coastguard Worker " <version>1.1</version>\n"
4176*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4177*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4178*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
4179*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4180*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4181*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4182*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
4183*70a7ec85SAndroid Build Coastguard Worker
4184*70a7ec85SAndroid Build Coastguard Worker {
4185*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4186*70a7ec85SAndroid Build Coastguard Worker xml =
4187*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"5.0\" type=\"framework\">\n"
4188*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4189*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4190*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4191*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4192*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4193*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4194*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4195*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
4196*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4197*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/custom</fqname>\n"
4198*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4199*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4200*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
4201*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
4202*70a7ec85SAndroid Build Coastguard Worker
4203*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::HWBINDER,
4204*70a7ec85SAndroid Build Coastguard Worker manifest.getHidlTransport("android.hardware.foo", {1, 1}, "IFoo", "custom"));
4205*70a7ec85SAndroid Build Coastguard Worker }
4206*70a7ec85SAndroid Build Coastguard Worker
4207*70a7ec85SAndroid Build Coastguard Worker {
4208*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4209*70a7ec85SAndroid Build Coastguard Worker xml =
4210*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4211*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4212*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4213*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4214*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
4215*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/custom</fqname>\n"
4216*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4217*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4218*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
4219*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
4220*70a7ec85SAndroid Build Coastguard Worker }
4221*70a7ec85SAndroid Build Coastguard Worker
4222*70a7ec85SAndroid Build Coastguard Worker {
4223*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4224*70a7ec85SAndroid Build Coastguard Worker xml =
4225*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4226*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4227*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4228*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4229*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4230*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4231*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4232*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4233*70a7ec85SAndroid Build Coastguard Worker " <instance>custom</instance>\n"
4234*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4235*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4236*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4237*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
4238*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(cm, &error));
4239*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(
4240*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo:\n"
4241*70a7ec85SAndroid Build Coastguard Worker " required: @1.1::IFoo/custom\n"
4242*70a7ec85SAndroid Build Coastguard Worker " provided: \n"
4243*70a7ec85SAndroid Build Coastguard Worker " @1.0::IFoo/custom\n"
4244*70a7ec85SAndroid Build Coastguard Worker " @1.0::IFoo/default",
4245*70a7ec85SAndroid Build Coastguard Worker error);
4246*70a7ec85SAndroid Build Coastguard Worker }
4247*70a7ec85SAndroid Build Coastguard Worker
4248*70a7ec85SAndroid Build Coastguard Worker {
4249*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4250*70a7ec85SAndroid Build Coastguard Worker xml =
4251*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4252*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4253*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4254*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4255*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
4256*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/custom</fqname>\n"
4257*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4258*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4259*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
4260*70a7ec85SAndroid Build Coastguard Worker }
4261*70a7ec85SAndroid Build Coastguard Worker }
4262*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FqNameInvalid)4263*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FqNameInvalid) {
4264*70a7ec85SAndroid Build Coastguard Worker std::string error;
4265*70a7ec85SAndroid Build Coastguard Worker std::string xml;
4266*70a7ec85SAndroid Build Coastguard Worker {
4267*70a7ec85SAndroid Build Coastguard Worker ManifestHal hal;
4268*70a7ec85SAndroid Build Coastguard Worker xml =
4269*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"hidl\">\n"
4270*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4271*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4272*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.1::IFoo/custom</fqname>\n"
4273*70a7ec85SAndroid Build Coastguard Worker "</hal>\n";
4274*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&hal, xml, &error)) << error;
4275*70a7ec85SAndroid Build Coastguard Worker }
4276*70a7ec85SAndroid Build Coastguard Worker ManifestHal hal;
4277*70a7ec85SAndroid Build Coastguard Worker xml =
4278*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"hidl\">\n"
4279*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4280*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4281*70a7ec85SAndroid Build Coastguard Worker " <fqname>1.1::IFoo/custom</fqname>\n"
4282*70a7ec85SAndroid Build Coastguard Worker "</hal>\n";
4283*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&hal, xml, &error));
4284*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Could not parse text \"1.1::IFoo/custom\" in element <fqname>", error);
4285*70a7ec85SAndroid Build Coastguard Worker xml =
4286*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"hidl\">\n"
4287*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4288*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4289*70a7ec85SAndroid Build Coastguard Worker " <fqname>[email protected]::IFoo/custom</fqname>\n"
4290*70a7ec85SAndroid Build Coastguard Worker "</hal>\n";
4291*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&hal, xml, &error));
4292*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Should not specify package", error);
4293*70a7ec85SAndroid Build Coastguard Worker xml =
4294*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"hidl\">\n"
4295*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4296*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4297*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/custom</fqname>\n"
4298*70a7ec85SAndroid Build Coastguard Worker "</hal>\n";
4299*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&hal, xml, &error));
4300*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Should specify version", error);
4301*70a7ec85SAndroid Build Coastguard Worker xml =
4302*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"hidl\">\n"
4303*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4304*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4305*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo</fqname>\n"
4306*70a7ec85SAndroid Build Coastguard Worker "</hal>\n";
4307*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&hal, xml, &error));
4308*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Could not parse text \"@1.0::IFoo\" in element <fqname>", error);
4309*70a7ec85SAndroid Build Coastguard Worker xml =
4310*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"hidl\">\n"
4311*70a7ec85SAndroid Build Coastguard Worker " <name>n07 4 v4l1d 1n73rf4c3</name>\n"
4312*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4313*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/custom</fqname>\n"
4314*70a7ec85SAndroid Build Coastguard Worker "</hal>\n";
4315*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&hal, xml, &error));
4316*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Cannot create FqInstance", error);
4317*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("n07 4 v4l1d 1n73rf4c3", error);
4318*70a7ec85SAndroid Build Coastguard Worker }
4319*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RegexInstanceValid)4320*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RegexInstanceValid) {
4321*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4322*70a7ec85SAndroid Build Coastguard Worker std::string error;
4323*70a7ec85SAndroid Build Coastguard Worker
4324*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4325*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
4326*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4327*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4328*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4329*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4330*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4331*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>legacy/[0-9]+</regex-instance>\n"
4332*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>slot[0-9]+</regex-instance>\n"
4333*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>.*</regex-instance>\n"
4334*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4335*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4336*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4337*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, xml, &error)) << error;
4338*70a7ec85SAndroid Build Coastguard Worker }
4339*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RegexInstanceInvalid)4340*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RegexInstanceInvalid) {
4341*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4342*70a7ec85SAndroid Build Coastguard Worker std::string error;
4343*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4344*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
4345*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4346*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4347*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4348*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4349*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4350*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>e{1,2,3}</regex-instance>\n"
4351*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>*</regex-instance>\n"
4352*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>+</regex-instance>\n"
4353*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>[0-9]+</regex-instance>\n"
4354*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>[0-9]+</regex-instance>\n"
4355*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4356*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4357*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4358*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&matrix, xml, &error));
4359*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Invalid regular expression 'e{1,2,3}'", error);
4360*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Invalid regular expression '*'", error);
4361*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Invalid regular expression '+'", error);
4362*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Duplicated regex-instance '[0-9]+'", error);
4363*70a7ec85SAndroid Build Coastguard Worker }
4364*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RegexInstanceCompat)4365*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RegexInstanceCompat) {
4366*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4367*70a7ec85SAndroid Build Coastguard Worker std::string error;
4368*70a7ec85SAndroid Build Coastguard Worker
4369*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
4370*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\">\n"
4371*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
4372*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4373*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4374*70a7ec85SAndroid Build Coastguard Worker " <version>3.1-2</version>\n"
4375*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4376*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4377*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4378*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>legacy/[0-9]+</regex-instance>\n"
4379*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4380*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4381*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
4382*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>0</kernel-sepolicy-version>\n"
4383*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>0</sepolicy-version>\n"
4384*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
4385*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4386*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml, &error)) << error;
4387*70a7ec85SAndroid Build Coastguard Worker
4388*70a7ec85SAndroid Build Coastguard Worker {
4389*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4390*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4391*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4392*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4393*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4394*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4395*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4396*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4397*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4398*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/0</instance>\n"
4399*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/1</instance>\n"
4400*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4401*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4402*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4403*70a7ec85SAndroid Build Coastguard Worker
4404*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4405*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml));
4406*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
4407*70a7ec85SAndroid Build Coastguard Worker
4408*70a7ec85SAndroid Build Coastguard Worker auto unused = checkUnusedHals(manifest, matrix);
4409*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(unused.empty())
4410*70a7ec85SAndroid Build Coastguard Worker << "Contains unused HALs: " << android::base::Join(unused, "\n");
4411*70a7ec85SAndroid Build Coastguard Worker }
4412*70a7ec85SAndroid Build Coastguard Worker
4413*70a7ec85SAndroid Build Coastguard Worker {
4414*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4415*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4416*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4417*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4418*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4419*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4420*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4421*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4422*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4423*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy0</instance>\n"
4424*70a7ec85SAndroid Build Coastguard Worker " <instance>nonmatch/legacy/0</instance>\n"
4425*70a7ec85SAndroid Build Coastguard Worker " <instance>legacy/0/nonmatch</instance>\n"
4426*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4427*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4428*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4429*70a7ec85SAndroid Build Coastguard Worker
4430*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4431*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml));
4432*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
4433*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because no legacy/[0-9]+ is provided.";
4434*70a7ec85SAndroid Build Coastguard Worker
4435*70a7ec85SAndroid Build Coastguard Worker auto unused = checkUnusedHals(manifest, matrix);
4436*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ((std::set<std::string>{"[email protected]::IFoo/nonmatch/legacy/0",
4437*70a7ec85SAndroid Build Coastguard Worker "[email protected]::IFoo/legacy/0/nonmatch",
4438*70a7ec85SAndroid Build Coastguard Worker "[email protected]::IFoo/legacy0"}),
4439*70a7ec85SAndroid Build Coastguard Worker unused);
4440*70a7ec85SAndroid Build Coastguard Worker }
4441*70a7ec85SAndroid Build Coastguard Worker }
4442*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,Regex)4443*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, Regex) {
4444*70a7ec85SAndroid Build Coastguard Worker details::Regex regex;
4445*70a7ec85SAndroid Build Coastguard Worker
4446*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(regex.compile("+"));
4447*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(regex.compile("*"));
4448*70a7ec85SAndroid Build Coastguard Worker
4449*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(regex.compile("legacy/[0-9]+"));
4450*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(regex.matches("legacy/0"));
4451*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(regex.matches("legacy/000"));
4452*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(regex.matches("legacy/"));
4453*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(regex.matches("ssslegacy/0"));
4454*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(regex.matches("legacy/0sss"));
4455*70a7ec85SAndroid Build Coastguard Worker }
4456*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestGetHalNamesAndVersions)4457*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestGetHalNamesAndVersions) {
4458*70a7ec85SAndroid Build Coastguard Worker HalManifest vm = testDeviceManifest();
4459*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vm.getHalNamesAndVersions(),
4460*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"[email protected]", "[email protected]"}));
4461*70a7ec85SAndroid Build Coastguard Worker }
4462*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelInfo)4463*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelInfo) {
4464*70a7ec85SAndroid Build Coastguard Worker KernelInfo ki = testKernelInfo();
4465*70a7ec85SAndroid Build Coastguard Worker
4466*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
4467*70a7ec85SAndroid Build Coastguard Worker "<kernel version=\"3.18.31\">\n"
4468*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
4469*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
4470*70a7ec85SAndroid Build Coastguard Worker " <value>y</value>\n"
4471*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
4472*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
4473*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
4474*70a7ec85SAndroid Build Coastguard Worker " <value>\"binder,hwbinder\"</value>\n"
4475*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
4476*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
4477*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
4478*70a7ec85SAndroid Build Coastguard Worker " <value>24</value>\n"
4479*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
4480*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
4481*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
4482*70a7ec85SAndroid Build Coastguard Worker " <value>\"\"</value>\n"
4483*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
4484*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
4485*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
4486*70a7ec85SAndroid Build Coastguard Worker " <value>0xdead000000000000</value>\n"
4487*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
4488*70a7ec85SAndroid Build Coastguard Worker "</kernel>\n",
4489*70a7ec85SAndroid Build Coastguard Worker toXml(ki, SerializeFlags::NO_TAGS.enableKernelConfigs()));
4490*70a7ec85SAndroid Build Coastguard Worker }
4491*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAllDeviceManifest)4492*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAllDeviceManifest) {
4493*70a7ec85SAndroid Build Coastguard Worker std::string xml1 = "<manifest " + kMetaVersionStr + " type=\"device\" />\n";
4494*70a7ec85SAndroid Build Coastguard Worker std::string xml2 =
4495*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"3\">\n"
4496*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4497*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4498*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4499*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
4500*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4501*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
4502*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
4503*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
4504*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.31\">\n"
4505*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
4506*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
4507*70a7ec85SAndroid Build Coastguard Worker " <value>y</value>\n"
4508*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
4509*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n"
4510*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>\n"
4511*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>\n"
4512*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4513*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
4514*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4515*70a7ec85SAndroid Build Coastguard Worker
4516*70a7ec85SAndroid Build Coastguard Worker std::string error;
4517*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
4518*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
4519*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
4520*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
4521*70a7ec85SAndroid Build Coastguard Worker
4522*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(manifest1.addAll(&manifest2, &error)) << error;
4523*70a7ec85SAndroid Build Coastguard Worker
4524*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml2, toXml(manifest1));
4525*70a7ec85SAndroid Build Coastguard Worker }
4526*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAllFrameworkManifest)4527*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAllFrameworkManifest) {
4528*70a7ec85SAndroid Build Coastguard Worker std::string xml1 = "<manifest " + kMetaVersionStr + " type=\"framework\" />\n";
4529*70a7ec85SAndroid Build Coastguard Worker std::string xml2 =
4530*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4531*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4532*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4533*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4534*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
4535*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4536*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
4537*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
4538*70a7ec85SAndroid Build Coastguard Worker " <library>libbase.so</library>\n"
4539*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
4540*70a7ec85SAndroid Build Coastguard Worker " <system-sdk>\n"
4541*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
4542*70a7ec85SAndroid Build Coastguard Worker " </system-sdk>\n"
4543*70a7ec85SAndroid Build Coastguard Worker " <xmlfile>\n"
4544*70a7ec85SAndroid Build Coastguard Worker " <name>media_profile</name>\n"
4545*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4546*70a7ec85SAndroid Build Coastguard Worker " </xmlfile>\n"
4547*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4548*70a7ec85SAndroid Build Coastguard Worker
4549*70a7ec85SAndroid Build Coastguard Worker std::string error;
4550*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
4551*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
4552*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
4553*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
4554*70a7ec85SAndroid Build Coastguard Worker
4555*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(manifest1.addAll(&manifest2, &error)) << error;
4556*70a7ec85SAndroid Build Coastguard Worker
4557*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml2, toXml(manifest1));
4558*70a7ec85SAndroid Build Coastguard Worker }
4559*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAllConflictMajorVersion)4560*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAllConflictMajorVersion) {
4561*70a7ec85SAndroid Build Coastguard Worker std::string head =
4562*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4563*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4564*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4565*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
4566*70a7ec85SAndroid Build Coastguard Worker " <version>";
4567*70a7ec85SAndroid Build Coastguard Worker std::string tail =
4568*70a7ec85SAndroid Build Coastguard Worker "</version>\n"
4569*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4570*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4571*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4572*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4573*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4574*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4575*70a7ec85SAndroid Build Coastguard Worker
4576*70a7ec85SAndroid Build Coastguard Worker std::string xml1 = head + "1.0" + tail;
4577*70a7ec85SAndroid Build Coastguard Worker std::string xml2 = head + "1.1" + tail;
4578*70a7ec85SAndroid Build Coastguard Worker
4579*70a7ec85SAndroid Build Coastguard Worker std::string error;
4580*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
4581*70a7ec85SAndroid Build Coastguard Worker manifest1.setFileName("1.xml");
4582*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
4583*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
4584*70a7ec85SAndroid Build Coastguard Worker manifest2.setFileName("2.xml");
4585*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
4586*70a7ec85SAndroid Build Coastguard Worker
4587*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(manifest1.addAll(&manifest2, &error));
4588*70a7ec85SAndroid Build Coastguard Worker
4589*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("android.hardware.foo", error);
4590*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("@1.0::IFoo/default (from 1.xml)", error);
4591*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("@1.1::IFoo/default (from 2.xml)", error);
4592*70a7ec85SAndroid Build Coastguard Worker }
4593*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAllConflictLevel)4594*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAllConflictLevel) {
4595*70a7ec85SAndroid Build Coastguard Worker std::string xml1 = "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"2\" />\n";
4596*70a7ec85SAndroid Build Coastguard Worker std::string xml2 = "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"3\" />\n";
4597*70a7ec85SAndroid Build Coastguard Worker
4598*70a7ec85SAndroid Build Coastguard Worker std::string error;
4599*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
4600*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
4601*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
4602*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
4603*70a7ec85SAndroid Build Coastguard Worker
4604*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(manifest1.addAll(&manifest2, &error));
4605*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Conflicting target-level", error);
4606*70a7ec85SAndroid Build Coastguard Worker }
4607*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAllConflictSepolicy)4608*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAllConflictSepolicy) {
4609*70a7ec85SAndroid Build Coastguard Worker std::string xml1 =
4610*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4611*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
4612*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
4613*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
4614*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4615*70a7ec85SAndroid Build Coastguard Worker std::string xml2 =
4616*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4617*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
4618*70a7ec85SAndroid Build Coastguard Worker " <version>30.0</version>\n"
4619*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
4620*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4621*70a7ec85SAndroid Build Coastguard Worker
4622*70a7ec85SAndroid Build Coastguard Worker std::string error;
4623*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
4624*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
4625*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
4626*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
4627*70a7ec85SAndroid Build Coastguard Worker
4628*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(manifest1.addAll(&manifest2, &error));
4629*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Conflicting sepolicy version", error);
4630*70a7ec85SAndroid Build Coastguard Worker }
4631*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAllConflictKernel)4632*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAllConflictKernel) {
4633*70a7ec85SAndroid Build Coastguard Worker std::string xml1 =
4634*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4635*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.0\" />\n"
4636*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4637*70a7ec85SAndroid Build Coastguard Worker std::string xml2 =
4638*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
4639*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.1\" />\n"
4640*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4641*70a7ec85SAndroid Build Coastguard Worker
4642*70a7ec85SAndroid Build Coastguard Worker std::string error;
4643*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
4644*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
4645*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
4646*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
4647*70a7ec85SAndroid Build Coastguard Worker
4648*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(manifest1.addAll(&manifest2, &error));
4649*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Conflicting kernel", error);
4650*70a7ec85SAndroid Build Coastguard Worker }
4651*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestMetaVersionCompat)4652*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestMetaVersionCompat) {
4653*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest version=\"2.0\" type=\"device\" />";
4654*70a7ec85SAndroid Build Coastguard Worker std::string error;
4655*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4656*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
4657*70a7ec85SAndroid Build Coastguard Worker }
4658*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestMetaVersionIncompat)4659*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestMetaVersionIncompat) {
4660*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest version=\"10000.0\" type=\"device\" />";
4661*70a7ec85SAndroid Build Coastguard Worker std::string error;
4662*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4663*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, xml, &error))
4664*70a7ec85SAndroid Build Coastguard Worker << "Should not parse metaversion 10000.0";
4665*70a7ec85SAndroid Build Coastguard Worker }
4666*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestMetaVersionWriteLatest)4667*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestMetaVersionWriteLatest) {
4668*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest version=\"1.0\" type=\"device\" />";
4669*70a7ec85SAndroid Build Coastguard Worker std::string error;
4670*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4671*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
4672*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(kMetaVersionStr, toXml(manifest, SerializeFlags::NO_TAGS));
4673*70a7ec85SAndroid Build Coastguard Worker }
4674*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixMetaVersionCompat)4675*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixMetaVersionCompat) {
4676*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<compatibility-matrix version=\"2.0\" type=\"framework\" />";
4677*70a7ec85SAndroid Build Coastguard Worker std::string error;
4678*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4679*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, xml, &error)) << error;
4680*70a7ec85SAndroid Build Coastguard Worker }
4681*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixMetaVersionIncompat)4682*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixMetaVersionIncompat) {
4683*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<compatibility-matrix version=\"10000.0\" type=\"framework\" />";
4684*70a7ec85SAndroid Build Coastguard Worker std::string error;
4685*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4686*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&matrix, xml, &error))
4687*70a7ec85SAndroid Build Coastguard Worker << "Should not parse metaversion 10000.0";
4688*70a7ec85SAndroid Build Coastguard Worker }
4689*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,MatrixMetaVersionWriteLatest)4690*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, MatrixMetaVersionWriteLatest) {
4691*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" />";
4692*70a7ec85SAndroid Build Coastguard Worker std::string error;
4693*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4694*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, xml, &error)) << error;
4695*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(kMetaVersionStr, toXml(matrix, SerializeFlags::NO_TAGS));
4696*70a7ec85SAndroid Build Coastguard Worker }
4697*70a7ec85SAndroid Build Coastguard Worker
4698*70a7ec85SAndroid Build Coastguard Worker // clang-format on
4699*70a7ec85SAndroid Build Coastguard Worker
4700*70a7ec85SAndroid Build Coastguard Worker struct InMemoryFileSystem : FileSystem {
4701*70a7ec85SAndroid Build Coastguard Worker std::map<std::string, std::string> files;
InMemoryFileSystemandroid::vintf::InMemoryFileSystem4702*70a7ec85SAndroid Build Coastguard Worker InMemoryFileSystem(std::map<std::string, std::string> files) : files(std::move(files)) {}
fetchandroid::vintf::InMemoryFileSystem4703*70a7ec85SAndroid Build Coastguard Worker status_t fetch(const std::string& path, std::string* fetched,
4704*70a7ec85SAndroid Build Coastguard Worker std::string* error) const override {
4705*70a7ec85SAndroid Build Coastguard Worker (void)error;
4706*70a7ec85SAndroid Build Coastguard Worker if (auto it = files.find(path); it != files.end()) {
4707*70a7ec85SAndroid Build Coastguard Worker *fetched = it->second;
4708*70a7ec85SAndroid Build Coastguard Worker return OK;
4709*70a7ec85SAndroid Build Coastguard Worker }
4710*70a7ec85SAndroid Build Coastguard Worker return NAME_NOT_FOUND;
4711*70a7ec85SAndroid Build Coastguard Worker }
listFilesandroid::vintf::InMemoryFileSystem4712*70a7ec85SAndroid Build Coastguard Worker status_t listFiles(const std::string& path, std::vector<std::string>* out,
4713*70a7ec85SAndroid Build Coastguard Worker std::string* error) const override {
4714*70a7ec85SAndroid Build Coastguard Worker (void)error;
4715*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> entries;
4716*70a7ec85SAndroid Build Coastguard Worker for (const auto& pair : files) {
4717*70a7ec85SAndroid Build Coastguard Worker std::string_view entry{pair.first};
4718*70a7ec85SAndroid Build Coastguard Worker if (android::base::ConsumePrefix(&entry, path)) {
4719*70a7ec85SAndroid Build Coastguard Worker android::base::ConsumePrefix(&entry, "/");
4720*70a7ec85SAndroid Build Coastguard Worker entries.emplace(entry.substr(0, entry.find('/')));
4721*70a7ec85SAndroid Build Coastguard Worker }
4722*70a7ec85SAndroid Build Coastguard Worker }
4723*70a7ec85SAndroid Build Coastguard Worker *out = std::vector<std::string>{begin(entries), end(entries)};
4724*70a7ec85SAndroid Build Coastguard Worker return OK;
4725*70a7ec85SAndroid Build Coastguard Worker }
modifiedTimeandroid::vintf::InMemoryFileSystem4726*70a7ec85SAndroid Build Coastguard Worker status_t modifiedTime(const std::string& path, timespec* mtime, std::string* error) const {
4727*70a7ec85SAndroid Build Coastguard Worker (void)error;
4728*70a7ec85SAndroid Build Coastguard Worker if (auto it = files.find(path); it != files.end()) {
4729*70a7ec85SAndroid Build Coastguard Worker *mtime = timespec{};
4730*70a7ec85SAndroid Build Coastguard Worker return OK;
4731*70a7ec85SAndroid Build Coastguard Worker }
4732*70a7ec85SAndroid Build Coastguard Worker return NAME_NOT_FOUND;
4733*70a7ec85SAndroid Build Coastguard Worker }
4734*70a7ec85SAndroid Build Coastguard Worker };
4735*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestWithMultipleFiles)4736*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestWithMultipleFiles) {
4737*70a7ec85SAndroid Build Coastguard Worker std::string vendorXmlPath = "/vendor/etc/vintf/manifest.xml";
4738*70a7ec85SAndroid Build Coastguard Worker std::string vendorXml = "<manifest " + kMetaVersionStr +
4739*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
4740*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4741*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
4742*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
4743*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4744*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
4745*70a7ec85SAndroid Build Coastguard Worker std::string apexXmlPath = "/apex/com.android.bar/etc/vintf/manifest.xml";
4746*70a7ec85SAndroid Build Coastguard Worker std::string apexXml = "<manifest " + kMetaVersionStr +
4747*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
4748*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4749*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
4750*70a7ec85SAndroid Build Coastguard Worker " <fqname>IBar/default</fqname>\n"
4751*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4752*70a7ec85SAndroid Build Coastguard Worker "</manifest>";
4753*70a7ec85SAndroid Build Coastguard Worker InMemoryFileSystem files{{
4754*70a7ec85SAndroid Build Coastguard Worker {vendorXmlPath, vendorXml},
4755*70a7ec85SAndroid Build Coastguard Worker {apexXmlPath, apexXml},
4756*70a7ec85SAndroid Build Coastguard Worker }};
4757*70a7ec85SAndroid Build Coastguard Worker // Read apexXml later. This shouldn't affect the result except HalManifest::fileName.
4758*70a7ec85SAndroid Build Coastguard Worker {
4759*70a7ec85SAndroid Build Coastguard Worker std::string error;
4760*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4761*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, fetchManifest(manifest, &files, vendorXmlPath, &error)) << error;
4762*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, fetchManifest(manifest, &files, apexXmlPath, &error)) << error;
4763*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(vendorXmlPath + ":" + apexXmlPath, manifest.fileName());
4764*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(std::nullopt, getAnyHal(manifest, "android.hardware.foo")->updatableViaApex());
4765*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(std::make_optional("com.android.bar"s),
4766*70a7ec85SAndroid Build Coastguard Worker getAnyHal(manifest, "android.hardware.bar")->updatableViaApex());
4767*70a7ec85SAndroid Build Coastguard Worker }
4768*70a7ec85SAndroid Build Coastguard Worker // Read apexXml first. This shouldn't affect the result except HalManifest::fileName.
4769*70a7ec85SAndroid Build Coastguard Worker {
4770*70a7ec85SAndroid Build Coastguard Worker std::string error;
4771*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4772*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, fetchManifest(manifest, &files, apexXmlPath, &error)) << error;
4773*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, fetchManifest(manifest, &files, vendorXmlPath, &error)) << error;
4774*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(apexXmlPath + ":" + vendorXmlPath, manifest.fileName());
4775*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(std::nullopt, getAnyHal(manifest, "android.hardware.foo")->updatableViaApex());
4776*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(std::make_optional("com.android.bar"s),
4777*70a7ec85SAndroid Build Coastguard Worker getAnyHal(manifest, "android.hardware.bar")->updatableViaApex());
4778*70a7ec85SAndroid Build Coastguard Worker }
4779*70a7ec85SAndroid Build Coastguard Worker }
4780*70a7ec85SAndroid Build Coastguard Worker
4781*70a7ec85SAndroid Build Coastguard Worker // clang-format off
4782*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,Aidl)4783*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, Aidl) {
4784*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4785*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
4786*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\">\n"
4787*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4788*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4789*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4790*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4791*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>test.*</regex-instance>\n"
4792*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4793*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4794*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4795*70a7ec85SAndroid Build Coastguard Worker std::string error;
4796*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4797*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, xml, &error)) << error;
4798*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(matrix, SerializeFlags::HALS_NO_FQNAME));
4799*70a7ec85SAndroid Build Coastguard Worker
4800*70a7ec85SAndroid Build Coastguard Worker {
4801*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4802*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
4803*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4804*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4805*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4806*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4807*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4808*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4809*70a7ec85SAndroid Build Coastguard Worker " <instance>test0</instance>\n"
4810*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4811*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4812*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4813*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
4814*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
4815*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4816*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4817*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4818*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
4819*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
4820*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4821*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
4822*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
4823*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
4824*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "default"));
4825*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "test0"));
4826*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IFoo", "does_not_exist"));
4827*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IDoesNotExist", "default"));
4828*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.does_not_exist", "IFoo", "default"));
4829*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.foo", "IFoo"),
4830*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "test0"}));
4831*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.does_not_exist", "IFoo"),
4832*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({}));
4833*70a7ec85SAndroid Build Coastguard Worker }
4834*70a7ec85SAndroid Build Coastguard Worker
4835*70a7ec85SAndroid Build Coastguard Worker {
4836*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4837*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
4838*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4839*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4840*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4841*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
4842*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
4843*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4844*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4845*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
4846*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
4847*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
4848*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "default"));
4849*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "test0"));
4850*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IFoo", "does_not_exist"));
4851*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IDoesNotExist", "default"));
4852*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.does_not_exist", "IFoo", "default"));
4853*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.foo", "IFoo"),
4854*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "test0"}));
4855*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.does_not_exist", "IFoo"),
4856*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({}));
4857*70a7ec85SAndroid Build Coastguard Worker }
4858*70a7ec85SAndroid Build Coastguard Worker
4859*70a7ec85SAndroid Build Coastguard Worker {
4860*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4861*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
4862*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4863*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4864*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4865*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
4866*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
4867*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4868*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4869*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
4870*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
4871*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
4872*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because default instance is missing";
4873*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@1) AND IFoo/test.* (@1))", error);
4874*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
4875*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@1)\n"
4876*70a7ec85SAndroid Build Coastguard Worker " IFoo/test0 (@1)",
4877*70a7ec85SAndroid Build Coastguard Worker error);
4878*70a7ec85SAndroid Build Coastguard Worker }
4879*70a7ec85SAndroid Build Coastguard Worker
4880*70a7ec85SAndroid Build Coastguard Worker {
4881*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4882*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
4883*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4884*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4885*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4886*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4887*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4888*70a7ec85SAndroid Build Coastguard Worker " <instance>incompat_instance</instance>\n"
4889*70a7ec85SAndroid Build Coastguard Worker " <instance>test0</instance>\n"
4890*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4891*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4892*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4893*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
4894*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
4895*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4896*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4897*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4898*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
4899*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
4900*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4901*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
4902*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
4903*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
4904*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because default instance is missing";
4905*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@1) AND IFoo/test.* (@1))", error);
4906*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
4907*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@1)\n"
4908*70a7ec85SAndroid Build Coastguard Worker " IFoo/test0 (@1)",
4909*70a7ec85SAndroid Build Coastguard Worker error);
4910*70a7ec85SAndroid Build Coastguard Worker }
4911*70a7ec85SAndroid Build Coastguard Worker
4912*70a7ec85SAndroid Build Coastguard Worker {
4913*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4914*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
4915*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4916*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4917*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4918*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
4919*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
4920*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4921*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4922*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
4923*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
4924*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
4925*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because test.* instance is missing";
4926*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@1) AND IFoo/test.* (@1))", error);
4927*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
4928*70a7ec85SAndroid Build Coastguard Worker " IFoo/default (@1)\n"
4929*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@1)\n",
4930*70a7ec85SAndroid Build Coastguard Worker error);
4931*70a7ec85SAndroid Build Coastguard Worker }
4932*70a7ec85SAndroid Build Coastguard Worker
4933*70a7ec85SAndroid Build Coastguard Worker {
4934*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
4935*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
4936*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4937*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4938*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4939*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4940*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4941*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4942*70a7ec85SAndroid Build Coastguard Worker " <instance>incompat_instance</instance>\n"
4943*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4944*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4945*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
4946*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
4947*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
4948*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4949*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4950*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4951*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
4952*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
4953*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4954*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
4955*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
4956*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
4957*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because test.* instance is missing";
4958*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@1) AND IFoo/test.* (@1))", error);
4959*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
4960*70a7ec85SAndroid Build Coastguard Worker " IFoo/default (@1)\n"
4961*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@1)\n",
4962*70a7ec85SAndroid Build Coastguard Worker error);
4963*70a7ec85SAndroid Build Coastguard Worker }
4964*70a7ec85SAndroid Build Coastguard Worker }
4965*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AidlAndHidlNamesMatrix)4966*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AidlAndHidlNamesMatrix) {
4967*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4968*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
4969*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"true\">\n"
4970*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4971*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4972*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4973*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4974*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4975*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4976*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
4977*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4978*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
4979*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
4980*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
4981*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
4982*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
4983*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4984*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
4985*70a7ec85SAndroid Build Coastguard Worker std::string error;
4986*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
4987*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, xml, &error)) << error;
4988*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(matrix, SerializeFlags::HALS_ONLY));
4989*70a7ec85SAndroid Build Coastguard Worker }
4990*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AidlAndHidlNamesManifest)4991*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AidlAndHidlNamesManifest) {
4992*70a7ec85SAndroid Build Coastguard Worker std::string xml =
4993*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
4994*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
4995*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
4996*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
4997*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
4998*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
4999*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5000*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
5001*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
5002*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5003*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5004*70a7ec85SAndroid Build Coastguard Worker std::string error;
5005*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5006*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5007*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(manifest, SerializeFlags::HALS_ONLY));
5008*70a7ec85SAndroid Build Coastguard Worker }
5009*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AidlAndHidlCheckUnused)5010*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AidlAndHidlCheckUnused) {
5011*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5012*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5013*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5014*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5015*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5016*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5017*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
5018*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5019*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
5020*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
5021*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5022*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5023*70a7ec85SAndroid Build Coastguard Worker std::string matrixXml =
5024*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
5025*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"true\">\n"
5026*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5027*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5028*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5029*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5030*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5031*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5032*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
5033*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5034*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
5035*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5036*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5037*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5038*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5039*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5040*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
5041*70a7ec85SAndroid Build Coastguard Worker std::string error;
5042*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5043*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
5044*70a7ec85SAndroid Build Coastguard Worker
5045*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5046*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, matrixXml, &error)) << error;
5047*70a7ec85SAndroid Build Coastguard Worker auto unused = checkUnusedHals(manifest, matrix);
5048*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(unused.empty()) << android::base::Join(unused, "\n");
5049*70a7ec85SAndroid Build Coastguard Worker }
5050*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AidlVersion)5051*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AidlVersion) {
5052*70a7ec85SAndroid Build Coastguard Worker std::string xml =
5053*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
5054*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\">\n"
5055*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5056*70a7ec85SAndroid Build Coastguard Worker " <version>4-100</version>\n"
5057*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5058*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5059*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5060*70a7ec85SAndroid Build Coastguard Worker " <regex-instance>test.*</regex-instance>\n"
5061*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5062*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5063*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
5064*70a7ec85SAndroid Build Coastguard Worker std::string error;
5065*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
5066*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&matrix, xml, &error)) << error;
5067*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(matrix, SerializeFlags::HALS_NO_FQNAME));
5068*70a7ec85SAndroid Build Coastguard Worker
5069*70a7ec85SAndroid Build Coastguard Worker {
5070*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> matrixInstances;
5071*70a7ec85SAndroid Build Coastguard Worker (void)matrix.forEachInstance([&](const MatrixInstance& matrixInstance) {
5072*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(matrixInstance.versionRange(),
5073*70a7ec85SAndroid Build Coastguard Worker VersionRange(details::kFakeAidlMajorVersion, 4, 100));
5074*70a7ec85SAndroid Build Coastguard Worker matrixInstances.push_back(matrixInstance.description(
5075*70a7ec85SAndroid Build Coastguard Worker matrixInstance.versionRange().minVer()));
5076*70a7ec85SAndroid Build Coastguard Worker return true;
5077*70a7ec85SAndroid Build Coastguard Worker });
5078*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(matrixInstances, SizeIs(2)) << android::base::Join(matrixInstances, ", ");
5079*70a7ec85SAndroid Build Coastguard Worker }
5080*70a7ec85SAndroid Build Coastguard Worker
5081*70a7ec85SAndroid Build Coastguard Worker {
5082*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5083*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5084*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5085*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5086*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5087*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5088*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5089*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5090*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5091*70a7ec85SAndroid Build Coastguard Worker " <instance>test0</instance>\n"
5092*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5093*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5094*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5095*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5096*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
5097*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5098*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5099*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5100*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5101*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5102*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
5103*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5104*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
5105*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
5106*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
5107*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "default"));
5108*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "test0"));
5109*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", 5, "IFoo", "default"));
5110*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", 5, "IFoo", "test0"));
5111*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IFoo", "does_not_exist"));
5112*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IDoesNotExist", "default"));
5113*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.does_not_exist", "IFoo", "default"));
5114*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.foo", "IFoo"),
5115*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "test0"}));
5116*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.foo", 5, "IFoo"),
5117*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "test0"}));
5118*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.does_not_exist", "IFoo"),
5119*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({}));
5120*70a7ec85SAndroid Build Coastguard Worker }
5121*70a7ec85SAndroid Build Coastguard Worker
5122*70a7ec85SAndroid Build Coastguard Worker {
5123*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5124*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5125*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5126*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5127*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5128*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5129*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5130*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
5131*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5132*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5133*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5134*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
5135*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
5136*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "default"));
5137*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", "IFoo", "test0"));
5138*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", 5, "IFoo", "default"));
5139*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.hasAidlInstance("android.system.foo", 5, "IFoo", "test0"));
5140*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IFoo", "does_not_exist"));
5141*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.foo", "IDoesNotExist", "default"));
5142*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.hasAidlInstance("android.system.does_not_exist", "IFoo", "default"));
5143*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.foo", "IFoo"),
5144*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "test0"}));
5145*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.foo", 5, "IFoo"),
5146*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({"default", "test0"}));
5147*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifest.getAidlInstances("android.system.does_not_exist", "IFoo"),
5148*70a7ec85SAndroid Build Coastguard Worker std::set<std::string>({}));
5149*70a7ec85SAndroid Build Coastguard Worker }
5150*70a7ec85SAndroid Build Coastguard Worker
5151*70a7ec85SAndroid Build Coastguard Worker {
5152*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5153*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5154*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5155*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5156*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5157*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5158*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
5159*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
5160*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5161*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5162*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5163*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
5164*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
5165*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because default instance is missing";
5166*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@4-100) AND IFoo/test.* (@4-100))", error);
5167*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
5168*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@5)\n"
5169*70a7ec85SAndroid Build Coastguard Worker " IFoo/test0 (@5)",
5170*70a7ec85SAndroid Build Coastguard Worker error);
5171*70a7ec85SAndroid Build Coastguard Worker }
5172*70a7ec85SAndroid Build Coastguard Worker
5173*70a7ec85SAndroid Build Coastguard Worker {
5174*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5175*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5176*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5177*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5178*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5179*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5180*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5181*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5182*70a7ec85SAndroid Build Coastguard Worker " <instance>incompat_instance</instance>\n"
5183*70a7ec85SAndroid Build Coastguard Worker " <instance>test0</instance>\n"
5184*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5185*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5186*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5187*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5188*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
5189*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5190*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5191*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5192*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5193*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
5194*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
5195*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5196*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
5197*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
5198*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
5199*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because default instance is missing";
5200*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@4-100) AND IFoo/test.* (@4-100))", error);
5201*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
5202*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@5)\n"
5203*70a7ec85SAndroid Build Coastguard Worker " IFoo/test0 (@5)",
5204*70a7ec85SAndroid Build Coastguard Worker error);
5205*70a7ec85SAndroid Build Coastguard Worker }
5206*70a7ec85SAndroid Build Coastguard Worker
5207*70a7ec85SAndroid Build Coastguard Worker {
5208*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5209*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5210*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5211*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5212*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5213*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5214*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5215*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
5216*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5217*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5218*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5219*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
5220*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
5221*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because test.* instance is missing";
5222*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@4-100) AND IFoo/test.* (@4-100))", error);
5223*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
5224*70a7ec85SAndroid Build Coastguard Worker " IFoo/default (@5)\n"
5225*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@5)",
5226*70a7ec85SAndroid Build Coastguard Worker error);
5227*70a7ec85SAndroid Build Coastguard Worker }
5228*70a7ec85SAndroid Build Coastguard Worker
5229*70a7ec85SAndroid Build Coastguard Worker {
5230*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5231*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5232*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5233*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5234*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5235*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5236*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5237*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5238*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5239*70a7ec85SAndroid Build Coastguard Worker " <instance>incompat_instance</instance>\n"
5240*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5241*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5242*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5243*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5244*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
5245*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5246*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5247*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5248*70a7ec85SAndroid Build Coastguard Worker " <version>5</version>\n"
5249*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5250*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/incompat_instance</fqname>\n"
5251*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5252*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
5253*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
5254*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
5255*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because test.* instance is missing";
5256*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@4-100) AND IFoo/test.* (@4-100))", error);
5257*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
5258*70a7ec85SAndroid Build Coastguard Worker " IFoo/default (@5)\n"
5259*70a7ec85SAndroid Build Coastguard Worker " IFoo/incompat_instance (@5)",
5260*70a7ec85SAndroid Build Coastguard Worker error);
5261*70a7ec85SAndroid Build Coastguard Worker }
5262*70a7ec85SAndroid Build Coastguard Worker
5263*70a7ec85SAndroid Build Coastguard Worker {
5264*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5265*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5266*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5267*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5268*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5269*70a7ec85SAndroid Build Coastguard Worker " <version>3</version>\n"
5270*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5271*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
5272*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5273*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5274*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5275*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(manifestXml, toXml(manifest, SerializeFlags::HALS_ONLY));
5276*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
5277*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because version 3 cannot satisfy version 4-100";
5278*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@4-100) AND IFoo/test.* (@4-100))", error);
5279*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
5280*70a7ec85SAndroid Build Coastguard Worker " IFoo/default (@3)\n"
5281*70a7ec85SAndroid Build Coastguard Worker " IFoo/test0 (@3)",
5282*70a7ec85SAndroid Build Coastguard Worker error);
5283*70a7ec85SAndroid Build Coastguard Worker
5284*70a7ec85SAndroid Build Coastguard Worker }
5285*70a7ec85SAndroid Build Coastguard Worker
5286*70a7ec85SAndroid Build Coastguard Worker {
5287*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5288*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5289*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5290*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5291*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5292*70a7ec85SAndroid Build Coastguard Worker " <version>3</version>\n"
5293*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5294*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5295*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5296*70a7ec85SAndroid Build Coastguard Worker " <instance>test0</instance>\n"
5297*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5298*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5299*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5300*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml, &error)) << error;
5301*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(
5302*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5303*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5304*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5305*70a7ec85SAndroid Build Coastguard Worker " <version>3</version>\n"
5306*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5307*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/test0</fqname>\n"
5308*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5309*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n",
5310*70a7ec85SAndroid Build Coastguard Worker toXml(manifest, SerializeFlags::HALS_ONLY));
5311*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(manifest.checkCompatibility(matrix, &error))
5312*70a7ec85SAndroid Build Coastguard Worker << "Should not be compatible because version 3 cannot satisfy version 4-100";
5313*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("required: (IFoo/default (@4-100) AND IFoo/test.* (@4-100))", error);
5314*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("provided: \n"
5315*70a7ec85SAndroid Build Coastguard Worker " IFoo/default (@3)\n"
5316*70a7ec85SAndroid Build Coastguard Worker " IFoo/test0 (@3)",
5317*70a7ec85SAndroid Build Coastguard Worker error);
5318*70a7ec85SAndroid Build Coastguard Worker }
5319*70a7ec85SAndroid Build Coastguard Worker }
5320*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AidlFqnameNoVersion)5321*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AidlFqnameNoVersion) {
5322*70a7ec85SAndroid Build Coastguard Worker std::string error;
5323*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5324*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5325*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5326*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5327*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5328*70a7ec85SAndroid Build Coastguard Worker " <fqname>@1.0::IFoo/default</fqname>\n"
5329*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5330*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5331*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error)) << error;
5332*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Should not specify version in <fqname> for AIDL HAL: \"@1.0::IFoo/default\"", error);
5333*70a7ec85SAndroid Build Coastguard Worker }
5334*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,GetTransportHidlHalWithFakeAidlVersion)5335*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, GetTransportHidlHalWithFakeAidlVersion) {
5336*70a7ec85SAndroid Build Coastguard Worker std::string xml =
5337*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5338*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\">\n"
5339*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5340*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
5341*70a7ec85SAndroid Build Coastguard Worker " <fqname>@" + to_string(details::kDefaultAidlVersion) + "::IFoo/default</fqname>\n"
5342*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5343*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5344*70a7ec85SAndroid Build Coastguard Worker std::string error;
5345*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5346*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5347*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::HWBINDER,
5348*70a7ec85SAndroid Build Coastguard Worker manifest.getHidlTransport("android.system.foo", details::kDefaultAidlVersion, "IFoo",
5349*70a7ec85SAndroid Build Coastguard Worker "default"));
5350*70a7ec85SAndroid Build Coastguard Worker }
5351*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RejectAidlHalsWithUnsupportedTransport)5352*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RejectAidlHalsWithUnsupportedTransport) {
5353*70a7ec85SAndroid Build Coastguard Worker std::string error;
5354*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5355*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml =
5356*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + R"( type="framework">"
5357*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
5358*70a7ec85SAndroid Build Coastguard Worker <name>android.system.foo</name>
5359*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
5360*70a7ec85SAndroid Build Coastguard Worker <fqname>IFoo/default</fqname>
5361*70a7ec85SAndroid Build Coastguard Worker </hal>
5362*70a7ec85SAndroid Build Coastguard Worker </manifest>)";
5363*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
5364*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("android.system.foo", error);
5365*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("hwbinder", error);
5366*70a7ec85SAndroid Build Coastguard Worker }
5367*70a7ec85SAndroid Build Coastguard Worker
5368*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, GetTransportAidlHalWithDummyTransport) {
5369*70a7ec85SAndroid Build Coastguard Worker // Check that even if <transport> is specified for AIDL, it is ignored and getHidlTransport
5370*70a7ec85SAndroid Build Coastguard Worker // will return EMPTY.
5371*70a7ec85SAndroid Build Coastguard Worker // This is only supported for libvintf 4.0 and below.
5372*70a7ec85SAndroid Build Coastguard Worker constexpr Version kLegacyMetaVersion{4, 0};
5373*70a7ec85SAndroid Build Coastguard Worker ASSERT_GE(kMetaVersionAidlInet, kLegacyMetaVersion);
5374*70a7ec85SAndroid Build Coastguard Worker std::string xml =
5375*70a7ec85SAndroid Build Coastguard Worker "<manifest version=\"" + to_string(kLegacyMetaVersion) + "\" type=\"framework\">\n"
5376*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5377*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5378*70a7ec85SAndroid Build Coastguard Worker " <transport>hwbinder</transport>\n"
5379*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5380*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5381*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5382*70a7ec85SAndroid Build Coastguard Worker std::string error;
5383*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5384*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5385*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Transport::EMPTY,
5386*70a7ec85SAndroid Build Coastguard Worker manifest.getHidlTransport("android.system.foo", details::kDefaultAidlVersion, "IFoo",
5387*70a7ec85SAndroid Build Coastguard Worker "default"));
5388*70a7ec85SAndroid Build Coastguard Worker }
5389*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AidlGetHalNamesAndVersions)5390*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AidlGetHalNamesAndVersions) {
5391*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5392*70a7ec85SAndroid Build Coastguard Worker std::string xml =
5393*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"framework\">\n"
5394*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5395*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
5396*70a7ec85SAndroid Build Coastguard Worker " <fqname>IFoo/default</fqname>\n"
5397*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5398*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5399*70a7ec85SAndroid Build Coastguard Worker std::string error;
5400*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5401*70a7ec85SAndroid Build Coastguard Worker auto names = manifest.getHalNamesAndVersions();
5402*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, names.size());
5403*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("android.system.foo@1", *names.begin());
5404*70a7ec85SAndroid Build Coastguard Worker }
5405*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,ManifestAddAidl)5406*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, ManifestAddAidl) {
5407*70a7ec85SAndroid Build Coastguard Worker std::string head =
5408*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\">\n"
5409*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5410*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5411*70a7ec85SAndroid Build Coastguard Worker " <fqname>";
5412*70a7ec85SAndroid Build Coastguard Worker std::string tail =
5413*70a7ec85SAndroid Build Coastguard Worker "</fqname>\n"
5414*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5415*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5416*70a7ec85SAndroid Build Coastguard Worker
5417*70a7ec85SAndroid Build Coastguard Worker std::string xml1 = head + "IFoo/default" + tail;
5418*70a7ec85SAndroid Build Coastguard Worker std::string xml2 = head + "IFoo/another" + tail;
5419*70a7ec85SAndroid Build Coastguard Worker
5420*70a7ec85SAndroid Build Coastguard Worker std::string error;
5421*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
5422*70a7ec85SAndroid Build Coastguard Worker manifest1.setFileName("1.xml");
5423*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, xml1, &error)) << error;
5424*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
5425*70a7ec85SAndroid Build Coastguard Worker manifest2.setFileName("2.xml");
5426*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, xml2, &error)) << error;
5427*70a7ec85SAndroid Build Coastguard Worker
5428*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(manifest1.addAll(&manifest2, &error)) << error;
5429*70a7ec85SAndroid Build Coastguard Worker }
5430*70a7ec85SAndroid Build Coastguard Worker
5431*70a7ec85SAndroid Build Coastguard Worker // clang-format on
5432*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,NativeGetHalNamesAndVersions)5433*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, NativeGetHalNamesAndVersions) {
5434*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5435*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
5436*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
5437*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
5438*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
5439*70a7ec85SAndroid Build Coastguard Worker <interface>
5440*70a7ec85SAndroid Build Coastguard Worker <instance>inst</instance>
5441*70a7ec85SAndroid Build Coastguard Worker </interface>
5442*70a7ec85SAndroid Build Coastguard Worker </hal>
5443*70a7ec85SAndroid Build Coastguard Worker </manifest>
5444*70a7ec85SAndroid Build Coastguard Worker )";
5445*70a7ec85SAndroid Build Coastguard Worker std::string error;
5446*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5447*70a7ec85SAndroid Build Coastguard Worker auto names = manifest.getHalNamesAndVersions();
5448*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, names.size());
5449*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("[email protected]", *names.begin());
5450*70a7ec85SAndroid Build Coastguard Worker }
5451*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,NativeGetHalNamesAndVersionsFqName)5452*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, NativeGetHalNamesAndVersionsFqName) {
5453*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5454*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="device">
5455*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
5456*70a7ec85SAndroid Build Coastguard Worker <name>foo</name>
5457*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0/inst</fqname>
5458*70a7ec85SAndroid Build Coastguard Worker </hal>
5459*70a7ec85SAndroid Build Coastguard Worker </manifest>
5460*70a7ec85SAndroid Build Coastguard Worker )";
5461*70a7ec85SAndroid Build Coastguard Worker std::string error;
5462*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5463*70a7ec85SAndroid Build Coastguard Worker auto names = manifest.getHalNamesAndVersions();
5464*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(1u, names.size());
5465*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("[email protected]", *names.begin());
5466*70a7ec85SAndroid Build Coastguard Worker }
5467*70a7ec85SAndroid Build Coastguard Worker
5468*70a7ec85SAndroid Build Coastguard Worker // clang-format off
5469*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,KernelInfoLevel)5470*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, KernelInfoLevel) {
5471*70a7ec85SAndroid Build Coastguard Worker std::string error;
5472*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<kernel version=\"3.18.31\" target-level=\"1\"/>\n";
5473*70a7ec85SAndroid Build Coastguard Worker KernelInfo ki;
5474*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&ki, xml, &error)) << error;
5475*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level{1}, getLevel(ki));
5476*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml, toXml(ki));
5477*70a7ec85SAndroid Build Coastguard Worker }
5478*70a7ec85SAndroid Build Coastguard Worker
5479*70a7ec85SAndroid Build Coastguard Worker // Test merge of <kernel target-level=""> with autogenerated <kernel> by parsing
5480*70a7ec85SAndroid Build Coastguard Worker // kernel prebuilt.
TEST_F(LibVintfTest,HalManifestMergeKernel)5481*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestMergeKernel) {
5482*70a7ec85SAndroid Build Coastguard Worker std::string head =
5483*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + " type=\"device\" target-level=\"1\">\n";
5484*70a7ec85SAndroid Build Coastguard Worker std::string tail =
5485*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5486*70a7ec85SAndroid Build Coastguard Worker std::string xml1 =
5487*70a7ec85SAndroid Build Coastguard Worker " <kernel target-level=\"2\"/>\n";
5488*70a7ec85SAndroid Build Coastguard Worker std::string xml2 =
5489*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.31\">\n"
5490*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
5491*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_64BIT</key>\n"
5492*70a7ec85SAndroid Build Coastguard Worker " <value>y</value>\n"
5493*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
5494*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n";
5495*70a7ec85SAndroid Build Coastguard Worker
5496*70a7ec85SAndroid Build Coastguard Worker std::string error;
5497*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest1;
5498*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest2;
5499*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest1, head + xml1 + tail, &error)) << error;
5500*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest2, head + xml2 + tail, &error)) << error;
5501*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(manifest1.addAll(&manifest2, &error)) << error;
5502*70a7ec85SAndroid Build Coastguard Worker std::string merged_xml = toXml(manifest1);
5503*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(head, merged_xml);
5504*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("target-level=\"2\"", merged_xml);
5505*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("version=\"3.18.31\"", merged_xml);
5506*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("CONFIG_64BIT", merged_xml);
5507*70a7ec85SAndroid Build Coastguard Worker }
5508*70a7ec85SAndroid Build Coastguard Worker
5509*70a7ec85SAndroid Build Coastguard Worker // clang-format on
5510*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FrameworkManifestHalMaxLevel)5511*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FrameworkManifestHalMaxLevel) {
5512*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="framework">
5513*70a7ec85SAndroid Build Coastguard Worker <hal max-level="3">
5514*70a7ec85SAndroid Build Coastguard Worker <name>android.frameworks.schedulerservice</name>
5515*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
5516*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::ISchedulingPolicyService/default</fqname>
5517*70a7ec85SAndroid Build Coastguard Worker </hal>
5518*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl" max-level="4">
5519*70a7ec85SAndroid Build Coastguard Worker <name>android.frameworks.myaidl</name>
5520*70a7ec85SAndroid Build Coastguard Worker <fqname>IAidl/default</fqname>
5521*70a7ec85SAndroid Build Coastguard Worker </hal>
5522*70a7ec85SAndroid Build Coastguard Worker <hal format="native" max-level="5">
5523*70a7ec85SAndroid Build Coastguard Worker <name>some-native-hal</name>
5524*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
5525*70a7ec85SAndroid Build Coastguard Worker </hal>
5526*70a7ec85SAndroid Build Coastguard Worker </manifest>)";
5527*70a7ec85SAndroid Build Coastguard Worker
5528*70a7ec85SAndroid Build Coastguard Worker std::string error;
5529*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5530*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
5531*70a7ec85SAndroid Build Coastguard Worker
5532*70a7ec85SAndroid Build Coastguard Worker auto hals = getHals(manifest, "android.frameworks.schedulerservice");
5533*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMaxLevel, Eq(static_cast<Level>(3)))));
5534*70a7ec85SAndroid Build Coastguard Worker
5535*70a7ec85SAndroid Build Coastguard Worker hals = getHals(manifest, "android.frameworks.myaidl");
5536*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMaxLevel, Eq(static_cast<Level>(4)))));
5537*70a7ec85SAndroid Build Coastguard Worker
5538*70a7ec85SAndroid Build Coastguard Worker hals = getHals(manifest, "some-native-hal");
5539*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMaxLevel, Eq(static_cast<Level>(5)))));
5540*70a7ec85SAndroid Build Coastguard Worker }
5541*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FrameworkManifestHalMinLevel)5542*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FrameworkManifestHalMinLevel) {
5543*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="framework">
5544*70a7ec85SAndroid Build Coastguard Worker <hal min-level="3">
5545*70a7ec85SAndroid Build Coastguard Worker <name>android.frameworks.schedulerservice</name>
5546*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
5547*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::ISchedulingPolicyService/default</fqname>
5548*70a7ec85SAndroid Build Coastguard Worker </hal>
5549*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl" min-level="4">
5550*70a7ec85SAndroid Build Coastguard Worker <name>android.frameworks.myaidl</name>
5551*70a7ec85SAndroid Build Coastguard Worker <fqname>IAidl/default</fqname>
5552*70a7ec85SAndroid Build Coastguard Worker </hal>
5553*70a7ec85SAndroid Build Coastguard Worker <hal format="native" min-level="5">
5554*70a7ec85SAndroid Build Coastguard Worker <name>some-native-hal</name>
5555*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
5556*70a7ec85SAndroid Build Coastguard Worker </hal>
5557*70a7ec85SAndroid Build Coastguard Worker </manifest>)";
5558*70a7ec85SAndroid Build Coastguard Worker
5559*70a7ec85SAndroid Build Coastguard Worker std::string error;
5560*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5561*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
5562*70a7ec85SAndroid Build Coastguard Worker
5563*70a7ec85SAndroid Build Coastguard Worker auto hals = getHals(manifest, "android.frameworks.schedulerservice");
5564*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMinLevel, Eq(static_cast<Level>(3)))));
5565*70a7ec85SAndroid Build Coastguard Worker
5566*70a7ec85SAndroid Build Coastguard Worker hals = getHals(manifest, "android.frameworks.myaidl");
5567*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMinLevel, Eq(static_cast<Level>(4)))));
5568*70a7ec85SAndroid Build Coastguard Worker
5569*70a7ec85SAndroid Build Coastguard Worker hals = getHals(manifest, "some-native-hal");
5570*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMinLevel, Eq(static_cast<Level>(5)))));
5571*70a7ec85SAndroid Build Coastguard Worker }
5572*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,FrameworkManifestHalMinMaxLevel)5573*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, FrameworkManifestHalMinMaxLevel) {
5574*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="framework">
5575*70a7ec85SAndroid Build Coastguard Worker <hal min-level="2" max-level="5">
5576*70a7ec85SAndroid Build Coastguard Worker <name>android.frameworks.schedulerservice</name>
5577*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
5578*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::ISchedulingPolicyService/default</fqname>
5579*70a7ec85SAndroid Build Coastguard Worker </hal>
5580*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl" min-level="3" max-level="6">
5581*70a7ec85SAndroid Build Coastguard Worker <name>android.frameworks.myaidl</name>
5582*70a7ec85SAndroid Build Coastguard Worker <fqname>IAidl/default</fqname>
5583*70a7ec85SAndroid Build Coastguard Worker </hal>
5584*70a7ec85SAndroid Build Coastguard Worker <hal format="native" min-level="4" max-level="7">
5585*70a7ec85SAndroid Build Coastguard Worker <name>some-native-hal</name>
5586*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
5587*70a7ec85SAndroid Build Coastguard Worker </hal>
5588*70a7ec85SAndroid Build Coastguard Worker </manifest>)";
5589*70a7ec85SAndroid Build Coastguard Worker
5590*70a7ec85SAndroid Build Coastguard Worker std::string error;
5591*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5592*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&manifest, xml, &error)) << error;
5593*70a7ec85SAndroid Build Coastguard Worker
5594*70a7ec85SAndroid Build Coastguard Worker auto hals = getHals(manifest, "android.frameworks.schedulerservice");
5595*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMinLevel, Eq(static_cast<Level>(2)))));
5596*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMaxLevel, Eq(static_cast<Level>(5)))));
5597*70a7ec85SAndroid Build Coastguard Worker
5598*70a7ec85SAndroid Build Coastguard Worker hals = getHals(manifest, "android.frameworks.myaidl");
5599*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMinLevel, Eq(static_cast<Level>(3)))));
5600*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMaxLevel, Eq(static_cast<Level>(6)))));
5601*70a7ec85SAndroid Build Coastguard Worker
5602*70a7ec85SAndroid Build Coastguard Worker hals = getHals(manifest, "some-native-hal");
5603*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMinLevel, Eq(static_cast<Level>(4)))));
5604*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(hals, ElementsAre(Property(&ManifestHal::getMaxLevel, Eq(static_cast<Level>(7)))));
5605*70a7ec85SAndroid Build Coastguard Worker }
5606*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RuntimeInfoParseGkiKernelReleaseOk)5607*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfoParseGkiKernelReleaseOk) {
5608*70a7ec85SAndroid Build Coastguard Worker KernelVersion version;
5609*70a7ec85SAndroid Build Coastguard Worker Level level = Level::UNSPECIFIED;
5610*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, parseGkiKernelRelease(RuntimeInfo::FetchFlag::ALL, "5.4.42-android12-0-something",
5611*70a7ec85SAndroid Build Coastguard Worker &version, &level));
5612*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(KernelVersion(5, 4, 42), version);
5613*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::S, level);
5614*70a7ec85SAndroid Build Coastguard Worker }
5615*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RuntimeInfoParseGkiKernelReleaseVersionOnly)5616*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfoParseGkiKernelReleaseVersionOnly) {
5617*70a7ec85SAndroid Build Coastguard Worker KernelVersion version;
5618*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, parseGkiKernelRelease(RuntimeInfo::FetchFlag::CPU_VERSION,
5619*70a7ec85SAndroid Build Coastguard Worker "5.4.42-android12-0-something", &version, nullptr));
5620*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(KernelVersion(5, 4, 42), version);
5621*70a7ec85SAndroid Build Coastguard Worker }
5622*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RuntimeInfoParseGkiKernelReleaseLevelOnly)5623*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfoParseGkiKernelReleaseLevelOnly) {
5624*70a7ec85SAndroid Build Coastguard Worker Level level = Level::UNSPECIFIED;
5625*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, parseGkiKernelRelease(RuntimeInfo::FetchFlag::KERNEL_FCM,
5626*70a7ec85SAndroid Build Coastguard Worker "5.4.42-android12-0-something", nullptr, &level));
5627*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::S, level);
5628*70a7ec85SAndroid Build Coastguard Worker }
5629*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RuntimeInfoParseGkiKernelReleaseLevelConsistent)5630*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfoParseGkiKernelReleaseLevelConsistent) {
5631*70a7ec85SAndroid Build Coastguard Worker Level level = Level::S;
5632*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, parseGkiKernelRelease(RuntimeInfo::FetchFlag::KERNEL_FCM,
5633*70a7ec85SAndroid Build Coastguard Worker "5.4.42-android12-0-something", nullptr, &level));
5634*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::S, level);
5635*70a7ec85SAndroid Build Coastguard Worker }
5636*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,RuntimeInfoParseGkiKernelReleaseLevelInconsistent)5637*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfoParseGkiKernelReleaseLevelInconsistent) {
5638*70a7ec85SAndroid Build Coastguard Worker Level level = Level::R;
5639*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(UNKNOWN_ERROR,
5640*70a7ec85SAndroid Build Coastguard Worker parseGkiKernelRelease(RuntimeInfo::FetchFlag::KERNEL_FCM,
5641*70a7ec85SAndroid Build Coastguard Worker "5.4.42-android12-0-something", nullptr, &level));
5642*70a7ec85SAndroid Build Coastguard Worker }
5643*70a7ec85SAndroid Build Coastguard Worker
5644*70a7ec85SAndroid Build Coastguard Worker // We bump level numbers for V, so check for consistency
TEST_F(LibVintfTest,RuntimeInfoGkiReleaseV)5645*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, RuntimeInfoGkiReleaseV) {
5646*70a7ec85SAndroid Build Coastguard Worker Level level = Level::UNSPECIFIED;
5647*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(OK, parseGkiKernelRelease(RuntimeInfo::FetchFlag::KERNEL_FCM, "6.1.0-android15-0",
5648*70a7ec85SAndroid Build Coastguard Worker nullptr, &level));
5649*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(Level::V, level);
5650*70a7ec85SAndroid Build Coastguard Worker }
5651*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AccessEntryInManifest)5652*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AccessEntryInManifest) {
5653*70a7ec85SAndroid Build Coastguard Worker HalManifest expectedManifest;
5654*70a7ec85SAndroid Build Coastguard Worker expectedManifest.add(createManifestHal(HalFormat::AIDL, "android.hardware.foo",
5655*70a7ec85SAndroid Build Coastguard Worker {Transport::EMPTY, Arch::ARCH_EMPTY}, ExclusiveTo::VM,
5656*70a7ec85SAndroid Build Coastguard Worker {*FqInstance::from(SIZE_MAX, 1, "IFoo", "default")}));
5657*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml = "<manifest " + kMetaVersionStr +
5658*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
5659*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" exclusive-to=\"virtual-machine\">\n"
5660*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5661*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
5662*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5663*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5664*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5665*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5666*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5667*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5668*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5669*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
5670*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(expectedManifest, manifest)
5671*70a7ec85SAndroid Build Coastguard Worker << dump(expectedManifest) << " is expected but got " << dump(manifest);
5672*70a7ec85SAndroid Build Coastguard Worker }
5673*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,NoAccessEntryInManifestIsEmpty)5674*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, NoAccessEntryInManifestIsEmpty) {
5675*70a7ec85SAndroid Build Coastguard Worker HalManifest expectedManifest;
5676*70a7ec85SAndroid Build Coastguard Worker expectedManifest.add(createManifestHal(HalFormat::AIDL, "android.hardware.foo",
5677*70a7ec85SAndroid Build Coastguard Worker {Transport::EMPTY, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
5678*70a7ec85SAndroid Build Coastguard Worker {*FqInstance::from(SIZE_MAX, 1, "IFoo", "default")}));
5679*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml = "<manifest " + kMetaVersionStr +
5680*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
5681*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5682*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5683*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
5684*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5685*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5686*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5687*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5688*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5689*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5690*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5691*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, manifestXml));
5692*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(expectedManifest, manifest)
5693*70a7ec85SAndroid Build Coastguard Worker << dump(expectedManifest) << " is expected but got " << dump(manifest);
5694*70a7ec85SAndroid Build Coastguard Worker }
5695*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,UnknownAccessEntryInManifestIsEmpty)5696*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, UnknownAccessEntryInManifestIsEmpty) {
5697*70a7ec85SAndroid Build Coastguard Worker HalManifest expectedManifest;
5698*70a7ec85SAndroid Build Coastguard Worker expectedManifest.add(createManifestHal(HalFormat::AIDL, "android.hardware.foo",
5699*70a7ec85SAndroid Build Coastguard Worker {Transport::EMPTY, Arch::ARCH_EMPTY}, ExclusiveTo::EMPTY,
5700*70a7ec85SAndroid Build Coastguard Worker {*FqInstance::from(SIZE_MAX, 1, "IFoo", "default")}));
5701*70a7ec85SAndroid Build Coastguard Worker std::string manifestXml = "<manifest " + kMetaVersionStr +
5702*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
5703*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" exclusive-to=\"blooper\">\n"
5704*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5705*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
5706*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5707*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5708*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5709*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5710*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5711*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5712*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5713*70a7ec85SAndroid Build Coastguard Worker std::string error;
5714*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&manifest, manifestXml, &error));
5715*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(error,
5716*70a7ec85SAndroid Build Coastguard Worker "Could not parse element with name <hal> in element <manifest>: Unknown value "
5717*70a7ec85SAndroid Build Coastguard Worker "(\"blooper\") for attribute 'exclusive-to' is considered a failure.");
5718*70a7ec85SAndroid Build Coastguard Worker }
5719*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,AccessEntryInMatrix)5720*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AccessEntryInMatrix) {
5721*70a7ec85SAndroid Build Coastguard Worker MatrixHal mh{HalFormat::AIDL,
5722*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo",
5723*70a7ec85SAndroid Build Coastguard Worker {{SIZE_MAX, 1}},
5724*70a7ec85SAndroid Build Coastguard Worker false /* optional */,
5725*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::VM,
5726*70a7ec85SAndroid Build Coastguard Worker false /* updatableViaApex */,
5727*70a7ec85SAndroid Build Coastguard Worker {}};
5728*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(insert(&mh.interfaces, {"IFoo", {"default"}}));
5729*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(mh);
5730*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
5731*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"aidl\" optional=\"false\" exclusive-to=\"virtual-machine\">\n"
5732*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5733*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5734*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5735*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5736*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5737*70a7ec85SAndroid Build Coastguard Worker "</hal>\n");
5738*70a7ec85SAndroid Build Coastguard Worker MatrixHal mh2;
5739*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&mh2, xml));
5740*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(mh, mh2);
5741*70a7ec85SAndroid Build Coastguard Worker }
5742*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,NoAccessEntryInMatrix)5743*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, NoAccessEntryInMatrix) {
5744*70a7ec85SAndroid Build Coastguard Worker MatrixHal mh{HalFormat::AIDL,
5745*70a7ec85SAndroid Build Coastguard Worker "android.hardware.foo",
5746*70a7ec85SAndroid Build Coastguard Worker {{SIZE_MAX, 1}},
5747*70a7ec85SAndroid Build Coastguard Worker false /* optional */,
5748*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo::EMPTY,
5749*70a7ec85SAndroid Build Coastguard Worker false /* updatableViaApex */,
5750*70a7ec85SAndroid Build Coastguard Worker {}};
5751*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(insert(&mh.interfaces, {"IFoo", {"default"}}));
5752*70a7ec85SAndroid Build Coastguard Worker std::string xml = toXml(mh);
5753*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(xml,
5754*70a7ec85SAndroid Build Coastguard Worker "<hal format=\"aidl\" optional=\"false\">\n"
5755*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5756*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5757*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5758*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5759*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5760*70a7ec85SAndroid Build Coastguard Worker "</hal>\n");
5761*70a7ec85SAndroid Build Coastguard Worker MatrixHal mh2;
5762*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&mh2, xml));
5763*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ(mh, mh2);
5764*70a7ec85SAndroid Build Coastguard Worker }
5765*70a7ec85SAndroid Build Coastguard Worker
5766*70a7ec85SAndroid Build Coastguard Worker // Specific access desired and declared
TEST_F(LibVintfTest,AccessCompatibleSimple)5767*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AccessCompatibleSimple) {
5768*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
5769*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5770*70a7ec85SAndroid Build Coastguard Worker std::string xml;
5771*70a7ec85SAndroid Build Coastguard Worker std::string error;
5772*70a7ec85SAndroid Build Coastguard Worker
5773*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr +
5774*70a7ec85SAndroid Build Coastguard Worker " type=\"framework\">\n"
5775*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" exclusive-to=\"virtual-machine\">\n"
5776*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5777*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5778*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5779*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5780*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5781*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5782*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
5783*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
5784*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
5785*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
5786*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
5787*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
5788*70a7ec85SAndroid Build Coastguard Worker
5789*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr +
5790*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
5791*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" exclusive-to=\"virtual-machine\">\n"
5792*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5793*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
5794*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5795*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5796*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5797*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5798*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5799*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
5800*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
5801*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
5802*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5803*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5804*70a7ec85SAndroid Build Coastguard Worker
5805*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
5806*70a7ec85SAndroid Build Coastguard Worker }
5807*70a7ec85SAndroid Build Coastguard Worker
5808*70a7ec85SAndroid Build Coastguard Worker // FCM expects specific access, but device provides normal access to host
TEST_F(LibVintfTest,AccessIncompatibleNoAccess)5809*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AccessIncompatibleNoAccess) {
5810*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
5811*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5812*70a7ec85SAndroid Build Coastguard Worker std::string xml;
5813*70a7ec85SAndroid Build Coastguard Worker std::string error;
5814*70a7ec85SAndroid Build Coastguard Worker
5815*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr +
5816*70a7ec85SAndroid Build Coastguard Worker " type=\"framework\">\n"
5817*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\" exclusive-to=\"virtual-machine\">\n"
5818*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5819*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5820*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5821*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5822*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5823*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5824*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
5825*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
5826*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
5827*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
5828*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
5829*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
5830*70a7ec85SAndroid Build Coastguard Worker
5831*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr +
5832*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
5833*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5834*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5835*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
5836*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5837*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5838*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5839*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5840*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5841*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
5842*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
5843*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
5844*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5845*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5846*70a7ec85SAndroid Build Coastguard Worker
5847*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
5848*70a7ec85SAndroid Build Coastguard Worker
5849*70a7ec85SAndroid Build Coastguard Worker // Error comes from unused HALs because the manifest provided a service
5850*70a7ec85SAndroid Build Coastguard Worker // with access that the matrix doesn't expect
5851*70a7ec85SAndroid Build Coastguard Worker auto unused = checkUnusedHals(manifest, cm);
5852*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(unused.empty())
5853*70a7ec85SAndroid Build Coastguard Worker << "Should conatin 'android.hardware.foo' HAL with ExclusiveTo::EMPTY but doesn't";
5854*70a7ec85SAndroid Build Coastguard Worker }
5855*70a7ec85SAndroid Build Coastguard Worker
5856*70a7ec85SAndroid Build Coastguard Worker // FCM expects normal, non-exclusive, access for service but device
5857*70a7ec85SAndroid Build Coastguard Worker // only provides exclusive access to virtual-machine clients
TEST_F(LibVintfTest,AccessIncompatibleWrongAccess)5858*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, AccessIncompatibleWrongAccess) {
5859*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix cm;
5860*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5861*70a7ec85SAndroid Build Coastguard Worker std::string xml;
5862*70a7ec85SAndroid Build Coastguard Worker std::string error;
5863*70a7ec85SAndroid Build Coastguard Worker
5864*70a7ec85SAndroid Build Coastguard Worker xml = "<compatibility-matrix " + kMetaVersionStr +
5865*70a7ec85SAndroid Build Coastguard Worker " type=\"framework\">\n"
5866*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\">\n"
5867*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5868*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5869*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5870*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5871*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5872*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5873*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
5874*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
5875*70a7ec85SAndroid Build Coastguard Worker " <sepolicy-version>25.5</sepolicy-version>\n"
5876*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
5877*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n";
5878*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&cm, xml, &error)) << error;
5879*70a7ec85SAndroid Build Coastguard Worker
5880*70a7ec85SAndroid Build Coastguard Worker xml = "<manifest " + kMetaVersionStr +
5881*70a7ec85SAndroid Build Coastguard Worker " type=\"device\">\n"
5882*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" exclusive-to=\"virtual-machine\">\n"
5883*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
5884*70a7ec85SAndroid Build Coastguard Worker " <version>1</version>\n"
5885*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
5886*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
5887*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
5888*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
5889*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"
5890*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
5891*70a7ec85SAndroid Build Coastguard Worker " <version>25.5</version>\n"
5892*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
5893*70a7ec85SAndroid Build Coastguard Worker "</manifest>\n";
5894*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&manifest, xml, &error)) << error;
5895*70a7ec85SAndroid Build Coastguard Worker
5896*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(manifest.checkCompatibility(cm, &error)) << error;
5897*70a7ec85SAndroid Build Coastguard Worker // Error comes from unused HALs because the manifest provided a service
5898*70a7ec85SAndroid Build Coastguard Worker // with access that the matrix doesn't expect
5899*70a7ec85SAndroid Build Coastguard Worker auto unused = checkUnusedHals(manifest, cm);
5900*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(unused.empty())
5901*70a7ec85SAndroid Build Coastguard Worker << "Should contain 'android.hardware.foo' HAL with ExclusiveTo::VM but doesn't";
5902*70a7ec85SAndroid Build Coastguard Worker }
5903*70a7ec85SAndroid Build Coastguard Worker
5904*70a7ec85SAndroid Build Coastguard Worker class ManifestMissingITest : public LibVintfTest,
5905*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<std::string> {
5906*70a7ec85SAndroid Build Coastguard Worker public:
createParams()5907*70a7ec85SAndroid Build Coastguard Worker static std::vector<std::string> createParams() {
5908*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> ret;
5909*70a7ec85SAndroid Build Coastguard Worker
5910*70a7ec85SAndroid Build Coastguard Worker ret.push_back("<manifest " + kMetaVersionStr + R"( type="device">
5911*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
5912*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
5913*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
5914*70a7ec85SAndroid Build Coastguard Worker <interface>
5915*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
5916*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
5917*70a7ec85SAndroid Build Coastguard Worker </interface>
5918*70a7ec85SAndroid Build Coastguard Worker </hal>
5919*70a7ec85SAndroid Build Coastguard Worker </manifest>)");
5920*70a7ec85SAndroid Build Coastguard Worker
5921*70a7ec85SAndroid Build Coastguard Worker ret.push_back("<manifest " + kMetaVersionStr + R"( type="device">
5922*70a7ec85SAndroid Build Coastguard Worker <hal format="hidl">
5923*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
5924*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
5925*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
5926*70a7ec85SAndroid Build Coastguard Worker <interface>
5927*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
5928*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
5929*70a7ec85SAndroid Build Coastguard Worker </interface>
5930*70a7ec85SAndroid Build Coastguard Worker </hal>
5931*70a7ec85SAndroid Build Coastguard Worker </manifest>)");
5932*70a7ec85SAndroid Build Coastguard Worker
5933*70a7ec85SAndroid Build Coastguard Worker ret.push_back("<manifest " + kMetaVersionStr + R"( type="device">
5934*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
5935*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
5936*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
5937*70a7ec85SAndroid Build Coastguard Worker <interface>
5938*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
5939*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
5940*70a7ec85SAndroid Build Coastguard Worker </interface>
5941*70a7ec85SAndroid Build Coastguard Worker </hal>
5942*70a7ec85SAndroid Build Coastguard Worker </manifest>)");
5943*70a7ec85SAndroid Build Coastguard Worker
5944*70a7ec85SAndroid Build Coastguard Worker return ret;
5945*70a7ec85SAndroid Build Coastguard Worker }
5946*70a7ec85SAndroid Build Coastguard Worker };
5947*70a7ec85SAndroid Build Coastguard Worker
TEST_P(ManifestMissingITest,CheckErrorMsg)5948*70a7ec85SAndroid Build Coastguard Worker TEST_P(ManifestMissingITest, CheckErrorMsg) {
5949*70a7ec85SAndroid Build Coastguard Worker std::string xml = GetParam();
5950*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
5951*70a7ec85SAndroid Build Coastguard Worker std::string error;
5952*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&manifest, xml, &error)) << "Should not be valid:\n" << xml;
5953*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr("Interface 'MyFoo' should have the format I[a-zA-Z0-9_]*")) << "\n"
5954*70a7ec85SAndroid Build Coastguard Worker << xml;
5955*70a7ec85SAndroid Build Coastguard Worker }
5956*70a7ec85SAndroid Build Coastguard Worker
5957*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, ManifestMissingITest,
5958*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(ManifestMissingITest::createParams()));
5959*70a7ec85SAndroid Build Coastguard Worker
5960*70a7ec85SAndroid Build Coastguard Worker struct ManifestMissingInterfaceTestParam {
5961*70a7ec85SAndroid Build Coastguard Worker std::string xml;
5962*70a7ec85SAndroid Build Coastguard Worker std::string expectedError;
5963*70a7ec85SAndroid Build Coastguard Worker };
5964*70a7ec85SAndroid Build Coastguard Worker
5965*70a7ec85SAndroid Build Coastguard Worker class ManifestMissingInterfaceTest
5966*70a7ec85SAndroid Build Coastguard Worker : public LibVintfTest,
5967*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<ManifestMissingInterfaceTestParam> {
5968*70a7ec85SAndroid Build Coastguard Worker public:
createParams()5969*70a7ec85SAndroid Build Coastguard Worker static std::vector<ManifestMissingInterfaceTestParam> createParams() {
5970*70a7ec85SAndroid Build Coastguard Worker std::vector<ManifestMissingInterfaceTestParam> ret;
5971*70a7ec85SAndroid Build Coastguard Worker
5972*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(ManifestMissingInterfaceTestParam{
5973*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + R"( type="device">
5974*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
5975*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
5976*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
5977*70a7ec85SAndroid Build Coastguard Worker <interface>
5978*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
5979*70a7ec85SAndroid Build Coastguard Worker </interface>
5980*70a7ec85SAndroid Build Coastguard Worker </hal>
5981*70a7ec85SAndroid Build Coastguard Worker </manifest>)",
5982*70a7ec85SAndroid Build Coastguard Worker "Interface '' should have the format I[a-zA-Z0-9_]*",
5983*70a7ec85SAndroid Build Coastguard Worker });
5984*70a7ec85SAndroid Build Coastguard Worker
5985*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(ManifestMissingInterfaceTestParam{
5986*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + R"( type="device">
5987*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
5988*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
5989*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
5990*70a7ec85SAndroid Build Coastguard Worker <fqname>/default</fqname>
5991*70a7ec85SAndroid Build Coastguard Worker </hal>
5992*70a7ec85SAndroid Build Coastguard Worker </manifest>)",
5993*70a7ec85SAndroid Build Coastguard Worker "Could not parse text \"/default\" in element <fqname>",
5994*70a7ec85SAndroid Build Coastguard Worker });
5995*70a7ec85SAndroid Build Coastguard Worker
5996*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(ManifestMissingInterfaceTestParam{
5997*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + R"( type="device">
5998*70a7ec85SAndroid Build Coastguard Worker <hal format="hidl">
5999*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6000*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6001*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6002*70a7ec85SAndroid Build Coastguard Worker <interface>
6003*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6004*70a7ec85SAndroid Build Coastguard Worker </interface>
6005*70a7ec85SAndroid Build Coastguard Worker </hal>
6006*70a7ec85SAndroid Build Coastguard Worker </manifest>)",
6007*70a7ec85SAndroid Build Coastguard Worker "Interface '' should have the format I[a-zA-Z0-9_]*",
6008*70a7ec85SAndroid Build Coastguard Worker });
6009*70a7ec85SAndroid Build Coastguard Worker
6010*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(ManifestMissingInterfaceTestParam{
6011*70a7ec85SAndroid Build Coastguard Worker "<manifest " + kMetaVersionStr + R"( type="device">
6012*70a7ec85SAndroid Build Coastguard Worker <hal format="hidl">
6013*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6014*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6015*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0/default</fqname>
6016*70a7ec85SAndroid Build Coastguard Worker </hal>
6017*70a7ec85SAndroid Build Coastguard Worker </manifest>)",
6018*70a7ec85SAndroid Build Coastguard Worker "Should specify interface: \"@1.0/default\"",
6019*70a7ec85SAndroid Build Coastguard Worker });
6020*70a7ec85SAndroid Build Coastguard Worker
6021*70a7ec85SAndroid Build Coastguard Worker return ret;
6022*70a7ec85SAndroid Build Coastguard Worker }
6023*70a7ec85SAndroid Build Coastguard Worker };
6024*70a7ec85SAndroid Build Coastguard Worker
TEST_P(ManifestMissingInterfaceTest,CheckErrorMsg)6025*70a7ec85SAndroid Build Coastguard Worker TEST_P(ManifestMissingInterfaceTest, CheckErrorMsg) {
6026*70a7ec85SAndroid Build Coastguard Worker auto&& [xml, expectedError] = GetParam();
6027*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
6028*70a7ec85SAndroid Build Coastguard Worker std::string error;
6029*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&manifest, xml, &error)) << "Should not be valid:\n" << xml;
6030*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(expectedError)) << "\n" << xml;
6031*70a7ec85SAndroid Build Coastguard Worker }
6032*70a7ec85SAndroid Build Coastguard Worker
6033*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, ManifestMissingInterfaceTest,
6034*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(ManifestMissingInterfaceTest::createParams()));
6035*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,HalManifestInvalidPackage)6036*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, HalManifestInvalidPackage) {
6037*70a7ec85SAndroid Build Coastguard Worker // If package name, interface or instance contains characters invalid to FqInstance,
6038*70a7ec85SAndroid Build Coastguard Worker // it must be rejected because forEachInstance requires them to fit into FqInstance.
6039*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<manifest " + kMetaVersionStr + R"( type="framework">
6040*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6041*70a7ec85SAndroid Build Coastguard Worker <name>not_a_valid_package!</name>
6042*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
6043*70a7ec85SAndroid Build Coastguard Worker <interface>
6044*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
6045*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6046*70a7ec85SAndroid Build Coastguard Worker </interface>
6047*70a7ec85SAndroid Build Coastguard Worker </hal>
6048*70a7ec85SAndroid Build Coastguard Worker </manifest>)";
6049*70a7ec85SAndroid Build Coastguard Worker HalManifest manifest;
6050*70a7ec85SAndroid Build Coastguard Worker std::string error;
6051*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&manifest, xml, &error)) << "Should not be valid:\n" << xml;
6052*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr("not_a_valid_package!"));
6053*70a7ec85SAndroid Build Coastguard Worker }
6054*70a7ec85SAndroid Build Coastguard Worker
6055*70a7ec85SAndroid Build Coastguard Worker class MatrixMissingITest : public LibVintfTest, public ::testing::WithParamInterface<std::string> {
6056*70a7ec85SAndroid Build Coastguard Worker public:
createParams()6057*70a7ec85SAndroid Build Coastguard Worker static std::vector<std::string> createParams() {
6058*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> ret;
6059*70a7ec85SAndroid Build Coastguard Worker
6060*70a7ec85SAndroid Build Coastguard Worker ret.push_back("<compatibility-matrix " + kMetaVersionStr + R"( type="device">
6061*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6062*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6063*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
6064*70a7ec85SAndroid Build Coastguard Worker <interface>
6065*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
6066*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6067*70a7ec85SAndroid Build Coastguard Worker </interface>
6068*70a7ec85SAndroid Build Coastguard Worker </hal>
6069*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)");
6070*70a7ec85SAndroid Build Coastguard Worker
6071*70a7ec85SAndroid Build Coastguard Worker ret.push_back("<compatibility-matrix " + kMetaVersionStr + R"( type="device">
6072*70a7ec85SAndroid Build Coastguard Worker <hal format="hidl">
6073*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6074*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6075*70a7ec85SAndroid Build Coastguard Worker <interface>
6076*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
6077*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6078*70a7ec85SAndroid Build Coastguard Worker </interface>
6079*70a7ec85SAndroid Build Coastguard Worker </hal>
6080*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)");
6081*70a7ec85SAndroid Build Coastguard Worker
6082*70a7ec85SAndroid Build Coastguard Worker ret.push_back("<compatibility-matrix " + kMetaVersionStr + R"( type="device">
6083*70a7ec85SAndroid Build Coastguard Worker <hal format="native">
6084*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6085*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6086*70a7ec85SAndroid Build Coastguard Worker <interface>
6087*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
6088*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6089*70a7ec85SAndroid Build Coastguard Worker </interface>
6090*70a7ec85SAndroid Build Coastguard Worker </hal>
6091*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)");
6092*70a7ec85SAndroid Build Coastguard Worker
6093*70a7ec85SAndroid Build Coastguard Worker return ret;
6094*70a7ec85SAndroid Build Coastguard Worker }
6095*70a7ec85SAndroid Build Coastguard Worker };
6096*70a7ec85SAndroid Build Coastguard Worker
TEST_P(MatrixMissingITest,CheckErrorMsg)6097*70a7ec85SAndroid Build Coastguard Worker TEST_P(MatrixMissingITest, CheckErrorMsg) {
6098*70a7ec85SAndroid Build Coastguard Worker std::string xml = GetParam();
6099*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
6100*70a7ec85SAndroid Build Coastguard Worker std::string error;
6101*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&matrix, xml, &error)) << "Should not be valid:\n" << xml;
6102*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr("Interface 'MyFoo' should have the format I[a-zA-Z0-9_]*"));
6103*70a7ec85SAndroid Build Coastguard Worker }
6104*70a7ec85SAndroid Build Coastguard Worker
6105*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, MatrixMissingITest,
6106*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(MatrixMissingITest::createParams()));
6107*70a7ec85SAndroid Build Coastguard Worker
6108*70a7ec85SAndroid Build Coastguard Worker struct MatrixMissingInterfaceTestParam {
6109*70a7ec85SAndroid Build Coastguard Worker std::string xml;
6110*70a7ec85SAndroid Build Coastguard Worker std::string expectedError;
6111*70a7ec85SAndroid Build Coastguard Worker };
6112*70a7ec85SAndroid Build Coastguard Worker
6113*70a7ec85SAndroid Build Coastguard Worker class MatrixMissingInterfaceTest
6114*70a7ec85SAndroid Build Coastguard Worker : public LibVintfTest,
6115*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<MatrixMissingInterfaceTestParam> {
6116*70a7ec85SAndroid Build Coastguard Worker public:
createParams()6117*70a7ec85SAndroid Build Coastguard Worker static std::vector<MatrixMissingInterfaceTestParam> createParams() {
6118*70a7ec85SAndroid Build Coastguard Worker std::vector<MatrixMissingInterfaceTestParam> ret;
6119*70a7ec85SAndroid Build Coastguard Worker
6120*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(MatrixMissingInterfaceTestParam{
6121*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + R"( type="device">
6122*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6123*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6124*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
6125*70a7ec85SAndroid Build Coastguard Worker <interface>
6126*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6127*70a7ec85SAndroid Build Coastguard Worker </interface>
6128*70a7ec85SAndroid Build Coastguard Worker </hal>
6129*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)",
6130*70a7ec85SAndroid Build Coastguard Worker "Interface '' should have the format I[a-zA-Z0-9_]*",
6131*70a7ec85SAndroid Build Coastguard Worker });
6132*70a7ec85SAndroid Build Coastguard Worker
6133*70a7ec85SAndroid Build Coastguard Worker ret.emplace_back(MatrixMissingInterfaceTestParam{
6134*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + R"( type="device">
6135*70a7ec85SAndroid Build Coastguard Worker <hal format="hidl">
6136*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.foo</name>
6137*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6138*70a7ec85SAndroid Build Coastguard Worker <interface>
6139*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6140*70a7ec85SAndroid Build Coastguard Worker </interface>
6141*70a7ec85SAndroid Build Coastguard Worker </hal>
6142*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)",
6143*70a7ec85SAndroid Build Coastguard Worker "Interface '' should have the format I[a-zA-Z0-9_]*",
6144*70a7ec85SAndroid Build Coastguard Worker });
6145*70a7ec85SAndroid Build Coastguard Worker
6146*70a7ec85SAndroid Build Coastguard Worker return ret;
6147*70a7ec85SAndroid Build Coastguard Worker }
6148*70a7ec85SAndroid Build Coastguard Worker };
6149*70a7ec85SAndroid Build Coastguard Worker
TEST_P(MatrixMissingInterfaceTest,CheckErrorMsg)6150*70a7ec85SAndroid Build Coastguard Worker TEST_P(MatrixMissingInterfaceTest, CheckErrorMsg) {
6151*70a7ec85SAndroid Build Coastguard Worker auto&& [xml, expectedError] = GetParam();
6152*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
6153*70a7ec85SAndroid Build Coastguard Worker std::string error;
6154*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&matrix, xml, &error)) << "Should not be valid:\n" << xml;
6155*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(expectedError)) << "\n" << xml;
6156*70a7ec85SAndroid Build Coastguard Worker }
6157*70a7ec85SAndroid Build Coastguard Worker
6158*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, MatrixMissingInterfaceTest,
6159*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(MatrixMissingInterfaceTest::createParams()));
6160*70a7ec85SAndroid Build Coastguard Worker
TEST_F(LibVintfTest,CompatibilityMatrixInvalidPackage)6161*70a7ec85SAndroid Build Coastguard Worker TEST_F(LibVintfTest, CompatibilityMatrixInvalidPackage) {
6162*70a7ec85SAndroid Build Coastguard Worker // If package name, interface or instance contains characters invalid to FqInstance,
6163*70a7ec85SAndroid Build Coastguard Worker // it must be rejected because forEachInstance requires them to fit into FqInstance.
6164*70a7ec85SAndroid Build Coastguard Worker std::string xml = "<compatibility-matrix " + kMetaVersionStr + R"( type="framework">
6165*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6166*70a7ec85SAndroid Build Coastguard Worker <name>not_a_valid_package!</name>
6167*70a7ec85SAndroid Build Coastguard Worker <version>1-2</version>
6168*70a7ec85SAndroid Build Coastguard Worker <interface>
6169*70a7ec85SAndroid Build Coastguard Worker <name>MyFoo</name>
6170*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6171*70a7ec85SAndroid Build Coastguard Worker </interface>
6172*70a7ec85SAndroid Build Coastguard Worker </hal>
6173*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>)";
6174*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix matrix;
6175*70a7ec85SAndroid Build Coastguard Worker std::string error;
6176*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(fromXml(&matrix, xml, &error)) << "Should not be valid:\n" << xml;
6177*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr("not_a_valid_package!"));
6178*70a7ec85SAndroid Build Coastguard Worker }
6179*70a7ec85SAndroid Build Coastguard Worker
6180*70a7ec85SAndroid Build Coastguard Worker struct DupInterfaceAndFqnameTestParam {
6181*70a7ec85SAndroid Build Coastguard Worker HalFormat format;
6182*70a7ec85SAndroid Build Coastguard Worker std::string footer;
6183*70a7ec85SAndroid Build Coastguard Worker std::string halName;
6184*70a7ec85SAndroid Build Coastguard Worker };
6185*70a7ec85SAndroid Build Coastguard Worker
6186*70a7ec85SAndroid Build Coastguard Worker class DupInterfaceAndFqnameTest
6187*70a7ec85SAndroid Build Coastguard Worker : public LibVintfTest,
6188*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<DupInterfaceAndFqnameTestParam> {
6189*70a7ec85SAndroid Build Coastguard Worker public:
createParams()6190*70a7ec85SAndroid Build Coastguard Worker static std::vector<DupInterfaceAndFqnameTestParam> createParams() {
6191*70a7ec85SAndroid Build Coastguard Worker std::vector<DupInterfaceAndFqnameTestParam> ret;
6192*70a7ec85SAndroid Build Coastguard Worker
6193*70a7ec85SAndroid Build Coastguard Worker std::string hidlFooter = R"(
6194*70a7ec85SAndroid Build Coastguard Worker <hal>
6195*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6196*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6197*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6198*70a7ec85SAndroid Build Coastguard Worker <interface>
6199*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6200*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6201*70a7ec85SAndroid Build Coastguard Worker </interface>
6202*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::INfc/default</fqname>
6203*70a7ec85SAndroid Build Coastguard Worker </hal>
6204*70a7ec85SAndroid Build Coastguard Worker </manifest>
6205*70a7ec85SAndroid Build Coastguard Worker )";
6206*70a7ec85SAndroid Build Coastguard Worker
6207*70a7ec85SAndroid Build Coastguard Worker std::string aidlFooter = R"(
6208*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6209*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6210*70a7ec85SAndroid Build Coastguard Worker <interface>
6211*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6212*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6213*70a7ec85SAndroid Build Coastguard Worker </interface>
6214*70a7ec85SAndroid Build Coastguard Worker <fqname>INfc/default</fqname>
6215*70a7ec85SAndroid Build Coastguard Worker </hal>
6216*70a7ec85SAndroid Build Coastguard Worker </manifest>
6217*70a7ec85SAndroid Build Coastguard Worker )";
6218*70a7ec85SAndroid Build Coastguard Worker
6219*70a7ec85SAndroid Build Coastguard Worker return {
6220*70a7ec85SAndroid Build Coastguard Worker {HalFormat::HIDL, hidlFooter, "[email protected]::INfc/default"},
6221*70a7ec85SAndroid Build Coastguard Worker {HalFormat::AIDL, aidlFooter, "android.hardware.nfc.INfc/default"},
6222*70a7ec85SAndroid Build Coastguard Worker };
6223*70a7ec85SAndroid Build Coastguard Worker }
getTestSuffix(const TestParamInfo<ParamType> & info)6224*70a7ec85SAndroid Build Coastguard Worker static std::string getTestSuffix(const TestParamInfo<ParamType>& info) {
6225*70a7ec85SAndroid Build Coastguard Worker return to_string(info.param.format);
6226*70a7ec85SAndroid Build Coastguard Worker }
6227*70a7ec85SAndroid Build Coastguard Worker };
6228*70a7ec85SAndroid Build Coastguard Worker
TEST_P(DupInterfaceAndFqnameTest,Test5_0)6229*70a7ec85SAndroid Build Coastguard Worker TEST_P(DupInterfaceAndFqnameTest, Test5_0) {
6230*70a7ec85SAndroid Build Coastguard Worker auto&& [_, footer, halName] = GetParam();
6231*70a7ec85SAndroid Build Coastguard Worker std::string xml = R"(<manifest version="5.0" type="device">)" + footer;
6232*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6233*70a7ec85SAndroid Build Coastguard Worker std::string error;
6234*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm, xml, &error))
6235*70a7ec85SAndroid Build Coastguard Worker << "<fqname> and <interface> are allowed to exist "
6236*70a7ec85SAndroid Build Coastguard Worker "together for the same instance for libvintf 5.0, but error is: "
6237*70a7ec85SAndroid Build Coastguard Worker << error;
6238*70a7ec85SAndroid Build Coastguard Worker }
6239*70a7ec85SAndroid Build Coastguard Worker
TEST_P(DupInterfaceAndFqnameTest,Test6_0)6240*70a7ec85SAndroid Build Coastguard Worker TEST_P(DupInterfaceAndFqnameTest, Test6_0) {
6241*70a7ec85SAndroid Build Coastguard Worker auto&& [_, footer, halName] = GetParam();
6242*70a7ec85SAndroid Build Coastguard Worker std::string xml = R"(<manifest version=")" + to_string(kMetaVersionNoHalInterfaceInstance) +
6243*70a7ec85SAndroid Build Coastguard Worker R"(" type="device">)" + footer;
6244*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6245*70a7ec85SAndroid Build Coastguard Worker std::string error;
6246*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm, xml, &error));
6247*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error,
6248*70a7ec85SAndroid Build Coastguard Worker HasSubstr("Duplicated " + halName + " in <interface><instance> and <fqname>."))
6249*70a7ec85SAndroid Build Coastguard Worker << "<fqname> and <interface> are not allowed to exist "
6250*70a7ec85SAndroid Build Coastguard Worker "together for the same instance for libvintf "
6251*70a7ec85SAndroid Build Coastguard Worker << kMetaVersionNoHalInterfaceInstance << ".";
6252*70a7ec85SAndroid Build Coastguard Worker }
6253*70a7ec85SAndroid Build Coastguard Worker
6254*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, DupInterfaceAndFqnameTest,
6255*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(DupInterfaceAndFqnameTest::createParams()),
6256*70a7ec85SAndroid Build Coastguard Worker &DupInterfaceAndFqnameTest::getTestSuffix);
6257*70a7ec85SAndroid Build Coastguard Worker
6258*70a7ec85SAndroid Build Coastguard Worker struct AllowDupMajorVersionTestParam {
6259*70a7ec85SAndroid Build Coastguard Worker std::string testName;
6260*70a7ec85SAndroid Build Coastguard Worker std::string expectedError;
6261*70a7ec85SAndroid Build Coastguard Worker std::string footer;
6262*70a7ec85SAndroid Build Coastguard Worker };
6263*70a7ec85SAndroid Build Coastguard Worker
6264*70a7ec85SAndroid Build Coastguard Worker class AllowDupMajorVersionTest
6265*70a7ec85SAndroid Build Coastguard Worker : public LibVintfTest,
6266*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<AllowDupMajorVersionTestParam> {
6267*70a7ec85SAndroid Build Coastguard Worker public:
createParams()6268*70a7ec85SAndroid Build Coastguard Worker static std::vector<AllowDupMajorVersionTestParam> createParams() {
6269*70a7ec85SAndroid Build Coastguard Worker std::vector<AllowDupMajorVersionTestParam> ret;
6270*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"HidlInterfaceAndFqName", "Duplicated major version", R"(
6271*70a7ec85SAndroid Build Coastguard Worker <hal>
6272*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6273*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6274*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6275*70a7ec85SAndroid Build Coastguard Worker <interface>
6276*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6277*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6278*70a7ec85SAndroid Build Coastguard Worker </interface>
6279*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.1::INfc/default</fqname>
6280*70a7ec85SAndroid Build Coastguard Worker </hal>
6281*70a7ec85SAndroid Build Coastguard Worker </manifest>
6282*70a7ec85SAndroid Build Coastguard Worker )"});
6283*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"HidlFqNameInTheSameHal", "Duplicated major version", R"(
6284*70a7ec85SAndroid Build Coastguard Worker <hal>
6285*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6286*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6287*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::INfc/default</fqname>
6288*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.1::INfc/default</fqname>
6289*70a7ec85SAndroid Build Coastguard Worker </hal>
6290*70a7ec85SAndroid Build Coastguard Worker </manifest>
6291*70a7ec85SAndroid Build Coastguard Worker )"});
6292*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"HidlFqNameInDifferentHals", "Conflicting FqInstance", R"(
6293*70a7ec85SAndroid Build Coastguard Worker <hal>
6294*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6295*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6296*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.0::INfc/default</fqname>
6297*70a7ec85SAndroid Build Coastguard Worker </hal>
6298*70a7ec85SAndroid Build Coastguard Worker <hal>
6299*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6300*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6301*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.1::INfc/default</fqname>
6302*70a7ec85SAndroid Build Coastguard Worker </hal>
6303*70a7ec85SAndroid Build Coastguard Worker </manifest>
6304*70a7ec85SAndroid Build Coastguard Worker )"});
6305*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"HidlInterfaceAndFqNameInDifferentHals", "Conflicting FqInstance", R"(
6306*70a7ec85SAndroid Build Coastguard Worker <hal>
6307*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6308*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6309*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6310*70a7ec85SAndroid Build Coastguard Worker <interface>
6311*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6312*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6313*70a7ec85SAndroid Build Coastguard Worker </interface>
6314*70a7ec85SAndroid Build Coastguard Worker </hal>
6315*70a7ec85SAndroid Build Coastguard Worker <hal>
6316*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6317*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6318*70a7ec85SAndroid Build Coastguard Worker <fqname>@1.1::INfc/default</fqname>
6319*70a7ec85SAndroid Build Coastguard Worker </hal>
6320*70a7ec85SAndroid Build Coastguard Worker </manifest>
6321*70a7ec85SAndroid Build Coastguard Worker )"});
6322*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"AidlInterfaceInDifferentHals", "Conflicting FqInstance", R"(
6323*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6324*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6325*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
6326*70a7ec85SAndroid Build Coastguard Worker <interface>
6327*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6328*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6329*70a7ec85SAndroid Build Coastguard Worker </interface>
6330*70a7ec85SAndroid Build Coastguard Worker </hal>
6331*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6332*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6333*70a7ec85SAndroid Build Coastguard Worker <version>2</version>
6334*70a7ec85SAndroid Build Coastguard Worker <interface>
6335*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6336*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6337*70a7ec85SAndroid Build Coastguard Worker </interface>
6338*70a7ec85SAndroid Build Coastguard Worker </hal>
6339*70a7ec85SAndroid Build Coastguard Worker </manifest>
6340*70a7ec85SAndroid Build Coastguard Worker )"});
6341*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"AidlFqNameInDifferentHals", "Conflicting FqInstance", R"(
6342*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6343*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6344*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
6345*70a7ec85SAndroid Build Coastguard Worker <fqname>INfc/default</fqname>
6346*70a7ec85SAndroid Build Coastguard Worker </hal>
6347*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6348*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6349*70a7ec85SAndroid Build Coastguard Worker <version>2</version>
6350*70a7ec85SAndroid Build Coastguard Worker <fqname>INfc/default</fqname>
6351*70a7ec85SAndroid Build Coastguard Worker </hal>
6352*70a7ec85SAndroid Build Coastguard Worker </manifest>
6353*70a7ec85SAndroid Build Coastguard Worker )"});
6354*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"AidlInterfaceAndFqNameInDifferentHals", "Conflicting FqInstance", R"(
6355*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6356*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6357*70a7ec85SAndroid Build Coastguard Worker <version>1</version>
6358*70a7ec85SAndroid Build Coastguard Worker <interface>
6359*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6360*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6361*70a7ec85SAndroid Build Coastguard Worker </interface>
6362*70a7ec85SAndroid Build Coastguard Worker </hal>
6363*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6364*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6365*70a7ec85SAndroid Build Coastguard Worker <version>2</version>
6366*70a7ec85SAndroid Build Coastguard Worker <fqname>INfc/default</fqname>
6367*70a7ec85SAndroid Build Coastguard Worker </hal>
6368*70a7ec85SAndroid Build Coastguard Worker </manifest>
6369*70a7ec85SAndroid Build Coastguard Worker )"});
6370*70a7ec85SAndroid Build Coastguard Worker ret.push_back({"AidlAccessorInDifferentHals", "Conflicting Accessor", R"(
6371*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6372*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6373*70a7ec85SAndroid Build Coastguard Worker <version>2</version>
6374*70a7ec85SAndroid Build Coastguard Worker <accessor>android.os.accessor.IAccessor/android.hardware.nfc.INfc/a</accessor>
6375*70a7ec85SAndroid Build Coastguard Worker <fqname>INfc/default</fqname>
6376*70a7ec85SAndroid Build Coastguard Worker </hal>
6377*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6378*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6379*70a7ec85SAndroid Build Coastguard Worker <version>2</version>
6380*70a7ec85SAndroid Build Coastguard Worker <accessor>android.os.accessor.IAccessor/android.hardware.nfc.INfc/a</accessor>
6381*70a7ec85SAndroid Build Coastguard Worker <fqname>INfc/foo</fqname>
6382*70a7ec85SAndroid Build Coastguard Worker </hal>
6383*70a7ec85SAndroid Build Coastguard Worker </manifest>
6384*70a7ec85SAndroid Build Coastguard Worker )"});
6385*70a7ec85SAndroid Build Coastguard Worker return ret;
6386*70a7ec85SAndroid Build Coastguard Worker }
getTestSuffix(const TestParamInfo<ParamType> & info)6387*70a7ec85SAndroid Build Coastguard Worker static std::string getTestSuffix(const TestParamInfo<ParamType>& info) {
6388*70a7ec85SAndroid Build Coastguard Worker return info.param.testName;
6389*70a7ec85SAndroid Build Coastguard Worker }
6390*70a7ec85SAndroid Build Coastguard Worker };
6391*70a7ec85SAndroid Build Coastguard Worker
TEST_P(AllowDupMajorVersionTest,Allow5_0)6392*70a7ec85SAndroid Build Coastguard Worker TEST_P(AllowDupMajorVersionTest, Allow5_0) {
6393*70a7ec85SAndroid Build Coastguard Worker auto&& [_, expectedError, footer] = GetParam();
6394*70a7ec85SAndroid Build Coastguard Worker std::string xml = R"(<manifest version="5.0" type="device">)" + footer;
6395*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6396*70a7ec85SAndroid Build Coastguard Worker std::string error;
6397*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm, xml, &error))
6398*70a7ec85SAndroid Build Coastguard Worker << "Conflicting major version in <fqname> is allowed in libvintf 5.0. However, error is: "
6399*70a7ec85SAndroid Build Coastguard Worker << error;
6400*70a7ec85SAndroid Build Coastguard Worker }
6401*70a7ec85SAndroid Build Coastguard Worker
TEST_P(AllowDupMajorVersionTest,DoNotAllow6_0)6402*70a7ec85SAndroid Build Coastguard Worker TEST_P(AllowDupMajorVersionTest, DoNotAllow6_0) {
6403*70a7ec85SAndroid Build Coastguard Worker auto&& [_, expectedError, footer] = GetParam();
6404*70a7ec85SAndroid Build Coastguard Worker std::string xml = R"(<manifest version=")" + to_string(kMetaVersionNoHalInterfaceInstance) +
6405*70a7ec85SAndroid Build Coastguard Worker R"(" type="device">)" + footer;
6406*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6407*70a7ec85SAndroid Build Coastguard Worker std::string error;
6408*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm, xml, &error));
6409*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr(expectedError));
6410*70a7ec85SAndroid Build Coastguard Worker }
6411*70a7ec85SAndroid Build Coastguard Worker
6412*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, AllowDupMajorVersionTest,
6413*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(AllowDupMajorVersionTest::createParams()),
6414*70a7ec85SAndroid Build Coastguard Worker &AllowDupMajorVersionTest::getTestSuffix);
6415*70a7ec85SAndroid Build Coastguard Worker
6416*70a7ec85SAndroid Build Coastguard Worker struct InterfaceMissingInstanceTestParam {
6417*70a7ec85SAndroid Build Coastguard Worker HalFormat format;
6418*70a7ec85SAndroid Build Coastguard Worker std::string footer;
6419*70a7ec85SAndroid Build Coastguard Worker };
6420*70a7ec85SAndroid Build Coastguard Worker
6421*70a7ec85SAndroid Build Coastguard Worker class InterfaceMissingInstanceTest
6422*70a7ec85SAndroid Build Coastguard Worker : public LibVintfTest,
6423*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<InterfaceMissingInstanceTestParam> {
6424*70a7ec85SAndroid Build Coastguard Worker public:
createParams()6425*70a7ec85SAndroid Build Coastguard Worker static std::vector<InterfaceMissingInstanceTestParam> createParams() {
6426*70a7ec85SAndroid Build Coastguard Worker std::vector<InterfaceMissingInstanceTestParam> ret;
6427*70a7ec85SAndroid Build Coastguard Worker
6428*70a7ec85SAndroid Build Coastguard Worker std::string hidlFooter = R"(
6429*70a7ec85SAndroid Build Coastguard Worker <hal>
6430*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6431*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6432*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6433*70a7ec85SAndroid Build Coastguard Worker <interface>
6434*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6435*70a7ec85SAndroid Build Coastguard Worker </interface>
6436*70a7ec85SAndroid Build Coastguard Worker </hal>
6437*70a7ec85SAndroid Build Coastguard Worker </manifest>
6438*70a7ec85SAndroid Build Coastguard Worker )";
6439*70a7ec85SAndroid Build Coastguard Worker std::string aidlFooter = R"(
6440*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6441*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6442*70a7ec85SAndroid Build Coastguard Worker <interface>
6443*70a7ec85SAndroid Build Coastguard Worker <name>INfc</name>
6444*70a7ec85SAndroid Build Coastguard Worker </interface>
6445*70a7ec85SAndroid Build Coastguard Worker </hal>
6446*70a7ec85SAndroid Build Coastguard Worker </manifest>
6447*70a7ec85SAndroid Build Coastguard Worker )";
6448*70a7ec85SAndroid Build Coastguard Worker
6449*70a7ec85SAndroid Build Coastguard Worker return {{HalFormat::HIDL, hidlFooter}, {HalFormat::AIDL, aidlFooter}};
6450*70a7ec85SAndroid Build Coastguard Worker }
getTestSuffix(const TestParamInfo<ParamType> & info)6451*70a7ec85SAndroid Build Coastguard Worker static std::string getTestSuffix(const TestParamInfo<ParamType>& info) {
6452*70a7ec85SAndroid Build Coastguard Worker return to_string(info.param.format);
6453*70a7ec85SAndroid Build Coastguard Worker }
6454*70a7ec85SAndroid Build Coastguard Worker };
6455*70a7ec85SAndroid Build Coastguard Worker
TEST_P(InterfaceMissingInstanceTest,Test5_0)6456*70a7ec85SAndroid Build Coastguard Worker TEST_P(InterfaceMissingInstanceTest, Test5_0) {
6457*70a7ec85SAndroid Build Coastguard Worker auto&& [testName, footer] = GetParam();
6458*70a7ec85SAndroid Build Coastguard Worker std::string header = R"(<manifest version="5.0" type="device">)";
6459*70a7ec85SAndroid Build Coastguard Worker std::string xml = header + footer;
6460*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6461*70a7ec85SAndroid Build Coastguard Worker std::string error;
6462*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm, xml, &error)) << error;
6463*70a7ec85SAndroid Build Coastguard Worker }
6464*70a7ec85SAndroid Build Coastguard Worker
TEST_P(InterfaceMissingInstanceTest,Test6_0)6465*70a7ec85SAndroid Build Coastguard Worker TEST_P(InterfaceMissingInstanceTest, Test6_0) {
6466*70a7ec85SAndroid Build Coastguard Worker auto&& [testName, footer] = GetParam();
6467*70a7ec85SAndroid Build Coastguard Worker std::string header = R"(<manifest version=")" + to_string(kMetaVersionNoHalInterfaceInstance) +
6468*70a7ec85SAndroid Build Coastguard Worker R"(" type="device">)";
6469*70a7ec85SAndroid Build Coastguard Worker std::string xml = header + footer;
6470*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6471*70a7ec85SAndroid Build Coastguard Worker std::string error;
6472*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm, xml, &error));
6473*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error, HasSubstr("<hal> android.hardware.nfc <interface> INfc has no <instance>."));
6474*70a7ec85SAndroid Build Coastguard Worker }
6475*70a7ec85SAndroid Build Coastguard Worker
6476*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, InterfaceMissingInstanceTest,
6477*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(InterfaceMissingInstanceTest::createParams()),
6478*70a7ec85SAndroid Build Coastguard Worker &InterfaceMissingInstanceTest::getTestSuffix);
6479*70a7ec85SAndroid Build Coastguard Worker
6480*70a7ec85SAndroid Build Coastguard Worker struct ManifestHalNoInstanceTestParam {
6481*70a7ec85SAndroid Build Coastguard Worker HalFormat format;
6482*70a7ec85SAndroid Build Coastguard Worker std::string footer;
6483*70a7ec85SAndroid Build Coastguard Worker };
6484*70a7ec85SAndroid Build Coastguard Worker
6485*70a7ec85SAndroid Build Coastguard Worker class ManifestHalNoInstanceTest
6486*70a7ec85SAndroid Build Coastguard Worker : public LibVintfTest,
6487*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<ManifestHalNoInstanceTestParam> {
6488*70a7ec85SAndroid Build Coastguard Worker public:
createParams()6489*70a7ec85SAndroid Build Coastguard Worker static std::vector<ManifestHalNoInstanceTestParam> createParams() {
6490*70a7ec85SAndroid Build Coastguard Worker std::vector<ManifestHalNoInstanceTestParam> ret;
6491*70a7ec85SAndroid Build Coastguard Worker
6492*70a7ec85SAndroid Build Coastguard Worker std::string hidlFooter = R"(
6493*70a7ec85SAndroid Build Coastguard Worker <hal>
6494*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6495*70a7ec85SAndroid Build Coastguard Worker <transport>hwbinder</transport>
6496*70a7ec85SAndroid Build Coastguard Worker <version>1.0</version>
6497*70a7ec85SAndroid Build Coastguard Worker </hal>
6498*70a7ec85SAndroid Build Coastguard Worker </manifest>
6499*70a7ec85SAndroid Build Coastguard Worker )";
6500*70a7ec85SAndroid Build Coastguard Worker std::string aidlFooter = R"(
6501*70a7ec85SAndroid Build Coastguard Worker <hal format="aidl">
6502*70a7ec85SAndroid Build Coastguard Worker <name>android.hardware.nfc</name>
6503*70a7ec85SAndroid Build Coastguard Worker </hal>
6504*70a7ec85SAndroid Build Coastguard Worker </manifest>
6505*70a7ec85SAndroid Build Coastguard Worker )";
6506*70a7ec85SAndroid Build Coastguard Worker
6507*70a7ec85SAndroid Build Coastguard Worker return {{HalFormat::HIDL, hidlFooter}, {HalFormat::AIDL, aidlFooter}};
6508*70a7ec85SAndroid Build Coastguard Worker }
getTestSuffix(const TestParamInfo<ParamType> & info)6509*70a7ec85SAndroid Build Coastguard Worker static std::string getTestSuffix(const TestParamInfo<ParamType>& info) {
6510*70a7ec85SAndroid Build Coastguard Worker return to_string(info.param.format);
6511*70a7ec85SAndroid Build Coastguard Worker }
6512*70a7ec85SAndroid Build Coastguard Worker };
6513*70a7ec85SAndroid Build Coastguard Worker
TEST_P(ManifestHalNoInstanceTest,Test5_0)6514*70a7ec85SAndroid Build Coastguard Worker TEST_P(ManifestHalNoInstanceTest, Test5_0) {
6515*70a7ec85SAndroid Build Coastguard Worker auto&& [testName, footer] = GetParam();
6516*70a7ec85SAndroid Build Coastguard Worker std::string header = R"(<manifest version="5.0" type="device">)";
6517*70a7ec85SAndroid Build Coastguard Worker std::string xml = header + footer;
6518*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6519*70a7ec85SAndroid Build Coastguard Worker std::string error;
6520*70a7ec85SAndroid Build Coastguard Worker EXPECT_TRUE(fromXml(&vm, xml, &error)) << error;
6521*70a7ec85SAndroid Build Coastguard Worker }
6522*70a7ec85SAndroid Build Coastguard Worker
TEST_P(ManifestHalNoInstanceTest,Test6_0)6523*70a7ec85SAndroid Build Coastguard Worker TEST_P(ManifestHalNoInstanceTest, Test6_0) {
6524*70a7ec85SAndroid Build Coastguard Worker auto&& [testName, footer] = GetParam();
6525*70a7ec85SAndroid Build Coastguard Worker std::string header = R"(<manifest version=")" + to_string(kMetaVersionNoHalInterfaceInstance) +
6526*70a7ec85SAndroid Build Coastguard Worker R"(" type="device">)";
6527*70a7ec85SAndroid Build Coastguard Worker std::string xml = header + footer;
6528*70a7ec85SAndroid Build Coastguard Worker HalManifest vm;
6529*70a7ec85SAndroid Build Coastguard Worker std::string error;
6530*70a7ec85SAndroid Build Coastguard Worker EXPECT_FALSE(fromXml(&vm, xml, &error));
6531*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(error,
6532*70a7ec85SAndroid Build Coastguard Worker HasSubstr("<hal> android.hardware.nfc has no instance. Fix by adding <fqname>."));
6533*70a7ec85SAndroid Build Coastguard Worker }
6534*70a7ec85SAndroid Build Coastguard Worker
6535*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LibVintfTest, ManifestHalNoInstanceTest,
6536*70a7ec85SAndroid Build Coastguard Worker ::testing::ValuesIn(ManifestHalNoInstanceTest::createParams()),
6537*70a7ec85SAndroid Build Coastguard Worker &ManifestHalNoInstanceTest::getTestSuffix);
6538*70a7ec85SAndroid Build Coastguard Worker
6539*70a7ec85SAndroid Build Coastguard Worker // clang-format off
6540*70a7ec85SAndroid Build Coastguard Worker
6541*70a7ec85SAndroid Build Coastguard Worker struct FrameworkCompatibilityMatrixCombineTest : public LibVintfTest {
SetUpandroid::vintf::FrameworkCompatibilityMatrixCombineTest6542*70a7ec85SAndroid Build Coastguard Worker virtual void SetUp() override {
6543*70a7ec85SAndroid Build Coastguard Worker matrices.resize(2);
6544*70a7ec85SAndroid Build Coastguard Worker matrices[0].setFileName("compatibility_matrix.1_1.xml");
6545*70a7ec85SAndroid Build Coastguard Worker matrices[1].setFileName("compatibility_matrix.1_2.xml");
6546*70a7ec85SAndroid Build Coastguard Worker }
6547*70a7ec85SAndroid Build Coastguard Worker // Access to private methods.
combineandroid::vintf::FrameworkCompatibilityMatrixCombineTest6548*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<CompatibilityMatrix> combine(Level deviceLevel,
6549*70a7ec85SAndroid Build Coastguard Worker std::vector<CompatibilityMatrix>* theMatrices,
6550*70a7ec85SAndroid Build Coastguard Worker std::string* errorPtr) {
6551*70a7ec85SAndroid Build Coastguard Worker return CompatibilityMatrix::combine(deviceLevel, Level::UNSPECIFIED, theMatrices, errorPtr);
6552*70a7ec85SAndroid Build Coastguard Worker }
combineandroid::vintf::FrameworkCompatibilityMatrixCombineTest6553*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<CompatibilityMatrix> combine(Level deviceLevel, Level kernellevel,
6554*70a7ec85SAndroid Build Coastguard Worker std::vector<CompatibilityMatrix>* theMatrices,
6555*70a7ec85SAndroid Build Coastguard Worker std::string* errorPtr) {
6556*70a7ec85SAndroid Build Coastguard Worker return CompatibilityMatrix::combine(deviceLevel, kernellevel, theMatrices, errorPtr);
6557*70a7ec85SAndroid Build Coastguard Worker }
6558*70a7ec85SAndroid Build Coastguard Worker
6559*70a7ec85SAndroid Build Coastguard Worker std::vector<CompatibilityMatrix> matrices;
6560*70a7ec85SAndroid Build Coastguard Worker std::string error;
6561*70a7ec85SAndroid Build Coastguard Worker };
6562*70a7ec85SAndroid Build Coastguard Worker
6563*70a7ec85SAndroid Build Coastguard Worker // Combining framework compatibility matrix with conflicting minlts fails
TEST_F(FrameworkCompatibilityMatrixCombineTest,ConflictMinlts)6564*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkCompatibilityMatrixCombineTest, ConflictMinlts) {
6565*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6566*70a7ec85SAndroid Build Coastguard Worker &matrices[0],
6567*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6568*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.5\" />\n"
6569*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6570*70a7ec85SAndroid Build Coastguard Worker &error))
6571*70a7ec85SAndroid Build Coastguard Worker << error;
6572*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6573*70a7ec85SAndroid Build Coastguard Worker &matrices[1],
6574*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6575*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.6\" />\n"
6576*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6577*70a7ec85SAndroid Build Coastguard Worker &error))
6578*70a7ec85SAndroid Build Coastguard Worker << error;
6579*70a7ec85SAndroid Build Coastguard Worker
6580*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6581*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, combined) << toXml(*combined);
6582*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("Kernel version mismatch", error);
6583*70a7ec85SAndroid Build Coastguard Worker }
6584*70a7ec85SAndroid Build Coastguard Worker
6585*70a7ec85SAndroid Build Coastguard Worker // <kernel> without <conditions> always comes first
TEST_F(FrameworkCompatibilityMatrixCombineTest,KernelNoConditions)6586*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkCompatibilityMatrixCombineTest, KernelNoConditions) {
6587*70a7ec85SAndroid Build Coastguard Worker std::string conditionedKernel =
6588*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.5\" level=\"1\">\n"
6589*70a7ec85SAndroid Build Coastguard Worker " <conditions>\n"
6590*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
6591*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_ARM</key>\n"
6592*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
6593*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
6594*70a7ec85SAndroid Build Coastguard Worker " </conditions>\n"
6595*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
6596*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_FOO</key>\n"
6597*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
6598*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
6599*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n";
6600*70a7ec85SAndroid Build Coastguard Worker std::string simpleKernel =
6601*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.5\" level=\"1\">\n"
6602*70a7ec85SAndroid Build Coastguard Worker " <config>\n"
6603*70a7ec85SAndroid Build Coastguard Worker " <key>CONFIG_BAR</key>\n"
6604*70a7ec85SAndroid Build Coastguard Worker " <value type=\"tristate\">y</value>\n"
6605*70a7ec85SAndroid Build Coastguard Worker " </config>\n"
6606*70a7ec85SAndroid Build Coastguard Worker " </kernel>\n";
6607*70a7ec85SAndroid Build Coastguard Worker
6608*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6609*70a7ec85SAndroid Build Coastguard Worker &matrices[0],
6610*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6611*70a7ec85SAndroid Build Coastguard Worker " <kernel version=\"3.18.5\" />\n" +
6612*70a7ec85SAndroid Build Coastguard Worker conditionedKernel + "</compatibility-matrix>\n",
6613*70a7ec85SAndroid Build Coastguard Worker &error))
6614*70a7ec85SAndroid Build Coastguard Worker << error;
6615*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6616*70a7ec85SAndroid Build Coastguard Worker &matrices[1],
6617*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n" + simpleKernel +
6618*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6619*70a7ec85SAndroid Build Coastguard Worker &error))
6620*70a7ec85SAndroid Build Coastguard Worker << error;
6621*70a7ec85SAndroid Build Coastguard Worker
6622*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6623*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined);
6624*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("", error);
6625*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n" +
6626*70a7ec85SAndroid Build Coastguard Worker simpleKernel + conditionedKernel + "</compatibility-matrix>\n",
6627*70a7ec85SAndroid Build Coastguard Worker toXml(*combined));
6628*70a7ec85SAndroid Build Coastguard Worker }
6629*70a7ec85SAndroid Build Coastguard Worker
6630*70a7ec85SAndroid Build Coastguard Worker // Combining framework compatibility matrix with conflicting sepolicy fails
TEST_F(FrameworkCompatibilityMatrixCombineTest,ConflictSepolicy)6631*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkCompatibilityMatrixCombineTest, ConflictSepolicy) {
6632*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6633*70a7ec85SAndroid Build Coastguard Worker &matrices[0],
6634*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6635*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
6636*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
6637*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
6638*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6639*70a7ec85SAndroid Build Coastguard Worker &error))
6640*70a7ec85SAndroid Build Coastguard Worker << error;
6641*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6642*70a7ec85SAndroid Build Coastguard Worker &matrices[1],
6643*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6644*70a7ec85SAndroid Build Coastguard Worker " <sepolicy>\n"
6645*70a7ec85SAndroid Build Coastguard Worker " <kernel-sepolicy-version>29</kernel-sepolicy-version>\n"
6646*70a7ec85SAndroid Build Coastguard Worker " </sepolicy>\n"
6647*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6648*70a7ec85SAndroid Build Coastguard Worker &error))
6649*70a7ec85SAndroid Build Coastguard Worker << error;
6650*70a7ec85SAndroid Build Coastguard Worker
6651*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6652*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, combined) << toXml(*combined);
6653*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("<sepolicy> is already defined", error);
6654*70a7ec85SAndroid Build Coastguard Worker }
6655*70a7ec85SAndroid Build Coastguard Worker
6656*70a7ec85SAndroid Build Coastguard Worker // Combining framework compatibility matrix with conflicting avb fails
TEST_F(FrameworkCompatibilityMatrixCombineTest,ConflictAvb)6657*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkCompatibilityMatrixCombineTest, ConflictAvb) {
6658*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6659*70a7ec85SAndroid Build Coastguard Worker &matrices[0],
6660*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6661*70a7ec85SAndroid Build Coastguard Worker " <avb>\n"
6662*70a7ec85SAndroid Build Coastguard Worker " <vbmeta-version>1.1</vbmeta-version>\n"
6663*70a7ec85SAndroid Build Coastguard Worker " </avb>\n"
6664*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6665*70a7ec85SAndroid Build Coastguard Worker &error))
6666*70a7ec85SAndroid Build Coastguard Worker << error;
6667*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(
6668*70a7ec85SAndroid Build Coastguard Worker &matrices[1],
6669*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"
6670*70a7ec85SAndroid Build Coastguard Worker " <avb>\n"
6671*70a7ec85SAndroid Build Coastguard Worker " <vbmeta-version>1.0</vbmeta-version>\n"
6672*70a7ec85SAndroid Build Coastguard Worker " </avb>\n"
6673*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n",
6674*70a7ec85SAndroid Build Coastguard Worker &error))
6675*70a7ec85SAndroid Build Coastguard Worker << error;
6676*70a7ec85SAndroid Build Coastguard Worker
6677*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6678*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, combined) << toXml(*combined);
6679*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("<avb><vbmeta-version> is already defined", error);
6680*70a7ec85SAndroid Build Coastguard Worker }
6681*70a7ec85SAndroid Build Coastguard Worker
TEST_F(FrameworkCompatibilityMatrixCombineTest,AidlAndHidlNames)6682*70a7ec85SAndroid Build Coastguard Worker TEST_F(FrameworkCompatibilityMatrixCombineTest, AidlAndHidlNames) {
6683*70a7ec85SAndroid Build Coastguard Worker std::string head1{"<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"1\">\n"};
6684*70a7ec85SAndroid Build Coastguard Worker std::string head2{"<compatibility-matrix " + kMetaVersionStr + " type=\"framework\" level=\"2\">\n"};
6685*70a7ec85SAndroid Build Coastguard Worker std::string tail{"</compatibility-matrix>\n"};
6686*70a7ec85SAndroid Build Coastguard Worker std::string aidl =
6687*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"false\">\n"
6688*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
6689*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
6690*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
6691*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
6692*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
6693*70a7ec85SAndroid Build Coastguard Worker " </hal>\n";
6694*70a7ec85SAndroid Build Coastguard Worker std::string hidl =
6695*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
6696*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
6697*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
6698*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
6699*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
6700*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
6701*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
6702*70a7ec85SAndroid Build Coastguard Worker " </hal>\n";
6703*70a7ec85SAndroid Build Coastguard Worker std::string aidlOptional = std::string(aidl).replace(hidl.find("false"), 5, "true");
6704*70a7ec85SAndroid Build Coastguard Worker std::string hidlOptional = std::string(hidl).replace(hidl.find("false"), 5, "true");
6705*70a7ec85SAndroid Build Coastguard Worker std::string error;
6706*70a7ec85SAndroid Build Coastguard Worker {
6707*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[0], head1 + aidl + tail, &error))
6708*70a7ec85SAndroid Build Coastguard Worker << error;
6709*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[1], head1 + hidl + tail, &error))
6710*70a7ec85SAndroid Build Coastguard Worker << error;
6711*70a7ec85SAndroid Build Coastguard Worker
6712*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6713*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined) << error;
6714*70a7ec85SAndroid Build Coastguard Worker
6715*70a7ec85SAndroid Build Coastguard Worker auto combinedXml = toXml(*combined);
6716*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(aidl, combinedXml);
6717*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(hidl, combinedXml);
6718*70a7ec85SAndroid Build Coastguard Worker }
6719*70a7ec85SAndroid Build Coastguard Worker {
6720*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[0], head1 + aidl + tail, &error))
6721*70a7ec85SAndroid Build Coastguard Worker << error;
6722*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[1], head2 + hidl + tail, &error))
6723*70a7ec85SAndroid Build Coastguard Worker << error;
6724*70a7ec85SAndroid Build Coastguard Worker
6725*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6726*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined) << error;
6727*70a7ec85SAndroid Build Coastguard Worker
6728*70a7ec85SAndroid Build Coastguard Worker auto combinedXml = toXml(*combined);
6729*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(aidl, combinedXml);
6730*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(hidlOptional, combinedXml);
6731*70a7ec85SAndroid Build Coastguard Worker }
6732*70a7ec85SAndroid Build Coastguard Worker {
6733*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[0], head2 + aidl + tail, &error))
6734*70a7ec85SAndroid Build Coastguard Worker << error;
6735*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[1], head1 + hidl + tail, &error))
6736*70a7ec85SAndroid Build Coastguard Worker << error;
6737*70a7ec85SAndroid Build Coastguard Worker
6738*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level{1}, &matrices, &error);
6739*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined) << error;
6740*70a7ec85SAndroid Build Coastguard Worker
6741*70a7ec85SAndroid Build Coastguard Worker auto combinedXml = toXml(*combined);
6742*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(aidlOptional, combinedXml);
6743*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(hidl, combinedXml);
6744*70a7ec85SAndroid Build Coastguard Worker }
6745*70a7ec85SAndroid Build Coastguard Worker }
6746*70a7ec85SAndroid Build Coastguard Worker
6747*70a7ec85SAndroid Build Coastguard Worker // clang-format on
6748*70a7ec85SAndroid Build Coastguard Worker
6749*70a7ec85SAndroid Build Coastguard Worker class FcmCombineKernelTest : public FrameworkCompatibilityMatrixCombineTest,
6750*70a7ec85SAndroid Build Coastguard Worker public ::testing::WithParamInterface<std::tuple<size_t, size_t>> {
6751*70a7ec85SAndroid Build Coastguard Worker public:
PrintTestParams(const TestParamInfo<FcmCombineKernelTest::ParamType> & info)6752*70a7ec85SAndroid Build Coastguard Worker static std::string PrintTestParams(const TestParamInfo<FcmCombineKernelTest::ParamType>& info) {
6753*70a7ec85SAndroid Build Coastguard Worker auto [deviceLevelNum, kernelLevelNum] = info.param;
6754*70a7ec85SAndroid Build Coastguard Worker return "device_" + std::to_string(deviceLevelNum) + "_kernel_" +
6755*70a7ec85SAndroid Build Coastguard Worker std::to_string(kernelLevelNum);
6756*70a7ec85SAndroid Build Coastguard Worker }
6757*70a7ec85SAndroid Build Coastguard Worker static constexpr size_t kMinLevel = 1;
6758*70a7ec85SAndroid Build Coastguard Worker static constexpr size_t kMaxLevel = 5;
6759*70a7ec85SAndroid Build Coastguard Worker };
6760*70a7ec85SAndroid Build Coastguard Worker
TEST_P(FcmCombineKernelTest,OlderKernel)6761*70a7ec85SAndroid Build Coastguard Worker TEST_P(FcmCombineKernelTest, OlderKernel) {
6762*70a7ec85SAndroid Build Coastguard Worker auto [deviceLevelNum, kernelLevelNum] = GetParam();
6763*70a7ec85SAndroid Build Coastguard Worker
6764*70a7ec85SAndroid Build Coastguard Worker std::vector<size_t> levelNums;
6765*70a7ec85SAndroid Build Coastguard Worker for (size_t i = kMinLevel; i <= kMaxLevel; ++i) levelNums.push_back(i);
6766*70a7ec85SAndroid Build Coastguard Worker
6767*70a7ec85SAndroid Build Coastguard Worker constexpr auto fmt = R"(
6768*70a7ec85SAndroid Build Coastguard Worker <compatibility-matrix %s type="framework" level="%s">
6769*70a7ec85SAndroid Build Coastguard Worker <hal format="hidl" optional="false">
6770*70a7ec85SAndroid Build Coastguard Worker <name>android.system.foo</name>
6771*70a7ec85SAndroid Build Coastguard Worker <version>%zu.0</version>
6772*70a7ec85SAndroid Build Coastguard Worker <interface>
6773*70a7ec85SAndroid Build Coastguard Worker <name>IFoo</name>
6774*70a7ec85SAndroid Build Coastguard Worker <instance>default</instance>
6775*70a7ec85SAndroid Build Coastguard Worker </interface>
6776*70a7ec85SAndroid Build Coastguard Worker </hal>
6777*70a7ec85SAndroid Build Coastguard Worker <kernel version="%zu.0.0">
6778*70a7ec85SAndroid Build Coastguard Worker <config>
6779*70a7ec85SAndroid Build Coastguard Worker <key>CONFIG_%zu</key>
6780*70a7ec85SAndroid Build Coastguard Worker <value type="tristate">y</value>
6781*70a7ec85SAndroid Build Coastguard Worker </config>
6782*70a7ec85SAndroid Build Coastguard Worker </kernel>
6783*70a7ec85SAndroid Build Coastguard Worker </compatibility-matrix>
6784*70a7ec85SAndroid Build Coastguard Worker )";
6785*70a7ec85SAndroid Build Coastguard Worker std::string error;
6786*70a7ec85SAndroid Build Coastguard Worker std::vector<CompatibilityMatrix> matrices;
6787*70a7ec85SAndroid Build Coastguard Worker for (size_t levelNum : levelNums) {
6788*70a7ec85SAndroid Build Coastguard Worker auto levelStr = android::vintf::to_string((Level)levelNum);
6789*70a7ec85SAndroid Build Coastguard Worker auto xml = StringPrintf(fmt, kMetaVersionStr.c_str(), levelStr.c_str(), levelNum, levelNum,
6790*70a7ec85SAndroid Build Coastguard Worker levelNum);
6791*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix& matrix = matrices.emplace_back();
6792*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrix, xml, &error)) << error;
6793*70a7ec85SAndroid Build Coastguard Worker }
6794*70a7ec85SAndroid Build Coastguard Worker ASSERT_FALSE(matrices.empty());
6795*70a7ec85SAndroid Build Coastguard Worker
6796*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(Level(deviceLevelNum), Level(kernelLevelNum), &matrices, &error);
6797*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined);
6798*70a7ec85SAndroid Build Coastguard Worker auto combinedXml = toXml(*combined);
6799*70a7ec85SAndroid Build Coastguard Worker
6800*70a7ec85SAndroid Build Coastguard Worker // Check that HALs are combined correctly.
6801*70a7ec85SAndroid Build Coastguard Worker for (size_t i = kMinLevel; i < deviceLevelNum; ++i)
6802*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(combinedXml, Not(HasSubstr(StringPrintf("<version>%zu.0</version>", i))));
6803*70a7ec85SAndroid Build Coastguard Worker
6804*70a7ec85SAndroid Build Coastguard Worker for (size_t i = deviceLevelNum; i <= kMaxLevel; ++i)
6805*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(combinedXml, HasSubstr(StringPrintf("<version>%zu.0</version>", i)));
6806*70a7ec85SAndroid Build Coastguard Worker
6807*70a7ec85SAndroid Build Coastguard Worker // Check that kernels are combined correctly. <kernel> tags from
6808*70a7ec85SAndroid Build Coastguard Worker // matrices with level >= min(kernelLevel, deviceLevel) are added.
6809*70a7ec85SAndroid Build Coastguard Worker // The "level" tag on <kernel> must also be set properly so that old kernel requirements from
6810*70a7ec85SAndroid Build Coastguard Worker // deviceLevel <= x < kernelLevel won't be used.
6811*70a7ec85SAndroid Build Coastguard Worker auto hasKernelFrom = std::min(kernelLevelNum, deviceLevelNum);
6812*70a7ec85SAndroid Build Coastguard Worker for (size_t i = kMinLevel; i < hasKernelFrom; ++i) {
6813*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(combinedXml,
6814*70a7ec85SAndroid Build Coastguard Worker Not(HasSubstr(StringPrintf(R"(<kernel version="%zu.0.0" level="%zu")", i, i))));
6815*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(combinedXml, Not(HasSubstr(StringPrintf("CONFIG_%zu", i))));
6816*70a7ec85SAndroid Build Coastguard Worker }
6817*70a7ec85SAndroid Build Coastguard Worker
6818*70a7ec85SAndroid Build Coastguard Worker for (size_t i = hasKernelFrom; i <= kMaxLevel; ++i) {
6819*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(combinedXml,
6820*70a7ec85SAndroid Build Coastguard Worker HasSubstr(StringPrintf(R"(<kernel version="%zu.0.0" level="%zu")", i, i)));
6821*70a7ec85SAndroid Build Coastguard Worker EXPECT_THAT(combinedXml, HasSubstr(StringPrintf("CONFIG_%zu", i)));
6822*70a7ec85SAndroid Build Coastguard Worker }
6823*70a7ec85SAndroid Build Coastguard Worker
6824*70a7ec85SAndroid Build Coastguard Worker if (::testing::Test::HasFailure()) ADD_FAILURE() << "Resulting matrix is \n" << combinedXml;
6825*70a7ec85SAndroid Build Coastguard Worker }
6826*70a7ec85SAndroid Build Coastguard Worker
6827*70a7ec85SAndroid Build Coastguard Worker INSTANTIATE_TEST_CASE_P(
6828*70a7ec85SAndroid Build Coastguard Worker FrameworkCompatibilityMatrixCombineTest, FcmCombineKernelTest,
6829*70a7ec85SAndroid Build Coastguard Worker Combine(Range(FcmCombineKernelTest::kMinLevel, FcmCombineKernelTest::kMaxLevel + 1),
6830*70a7ec85SAndroid Build Coastguard Worker Range(FcmCombineKernelTest::kMinLevel, FcmCombineKernelTest::kMaxLevel + 1)),
6831*70a7ec85SAndroid Build Coastguard Worker FcmCombineKernelTest::PrintTestParams);
6832*70a7ec85SAndroid Build Coastguard Worker
6833*70a7ec85SAndroid Build Coastguard Worker // clang-format off
6834*70a7ec85SAndroid Build Coastguard Worker
6835*70a7ec85SAndroid Build Coastguard Worker struct DeviceCompatibilityMatrixCombineTest : public LibVintfTest {
SetUpandroid::vintf::DeviceCompatibilityMatrixCombineTest6836*70a7ec85SAndroid Build Coastguard Worker virtual void SetUp() override {
6837*70a7ec85SAndroid Build Coastguard Worker matrices.resize(2);
6838*70a7ec85SAndroid Build Coastguard Worker matrices[0].setFileName("compatibility_matrix.1.xml");
6839*70a7ec85SAndroid Build Coastguard Worker matrices[1].setFileName("compatibility_matrix.2.xml");
6840*70a7ec85SAndroid Build Coastguard Worker }
6841*70a7ec85SAndroid Build Coastguard Worker // Access to private methods.
combineandroid::vintf::DeviceCompatibilityMatrixCombineTest6842*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<CompatibilityMatrix> combine(std::vector<CompatibilityMatrix>* theMatrices,
6843*70a7ec85SAndroid Build Coastguard Worker std::string* errorPtr) {
6844*70a7ec85SAndroid Build Coastguard Worker return CompatibilityMatrix::combineDeviceMatrices(theMatrices, errorPtr);
6845*70a7ec85SAndroid Build Coastguard Worker }
6846*70a7ec85SAndroid Build Coastguard Worker
6847*70a7ec85SAndroid Build Coastguard Worker std::vector<CompatibilityMatrix> matrices;
6848*70a7ec85SAndroid Build Coastguard Worker std::string error;
6849*70a7ec85SAndroid Build Coastguard Worker };
6850*70a7ec85SAndroid Build Coastguard Worker
TEST_F(DeviceCompatibilityMatrixCombineTest,Success)6851*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceCompatibilityMatrixCombineTest, Success) {
6852*70a7ec85SAndroid Build Coastguard Worker std::string head{"<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"};
6853*70a7ec85SAndroid Build Coastguard Worker std::string tail{"</compatibility-matrix>\n"};
6854*70a7ec85SAndroid Build Coastguard Worker std::string halFoo{
6855*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
6856*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.foo</name>\n"
6857*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
6858*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
6859*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
6860*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
6861*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
6862*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"};
6863*70a7ec85SAndroid Build Coastguard Worker std::string halBar{
6864*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"false\">\n"
6865*70a7ec85SAndroid Build Coastguard Worker " <name>android.hardware.bar</name>\n"
6866*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
6867*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
6868*70a7ec85SAndroid Build Coastguard Worker " <name>IBar</name>\n"
6869*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
6870*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
6871*70a7ec85SAndroid Build Coastguard Worker " </hal>\n"};
6872*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[0], head + halFoo + tail, &error))
6873*70a7ec85SAndroid Build Coastguard Worker << error;
6874*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[1], head + halBar + tail, &error))
6875*70a7ec85SAndroid Build Coastguard Worker << error;
6876*70a7ec85SAndroid Build Coastguard Worker
6877*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(&matrices, &error);
6878*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined) << error;
6879*70a7ec85SAndroid Build Coastguard Worker EXPECT_EQ("", error);
6880*70a7ec85SAndroid Build Coastguard Worker auto combinedXml = toXml(*combined);
6881*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(halFoo, combinedXml);
6882*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(halBar, combinedXml);
6883*70a7ec85SAndroid Build Coastguard Worker }
6884*70a7ec85SAndroid Build Coastguard Worker
TEST_F(DeviceCompatibilityMatrixCombineTest,ConflictVendorNdk)6885*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceCompatibilityMatrixCombineTest, ConflictVendorNdk) {
6886*70a7ec85SAndroid Build Coastguard Worker std::string vendorNdkP{
6887*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
6888*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
6889*70a7ec85SAndroid Build Coastguard Worker " <version>P</version>\n"
6890*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
6891*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n"};
6892*70a7ec85SAndroid Build Coastguard Worker std::string vendorNdkQ{
6893*70a7ec85SAndroid Build Coastguard Worker "<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"
6894*70a7ec85SAndroid Build Coastguard Worker " <vendor-ndk>\n"
6895*70a7ec85SAndroid Build Coastguard Worker " <version>Q</version>\n"
6896*70a7ec85SAndroid Build Coastguard Worker " </vendor-ndk>\n"
6897*70a7ec85SAndroid Build Coastguard Worker "</compatibility-matrix>\n"};
6898*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[0], vendorNdkP, &error)) << error;
6899*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[1], vendorNdkQ, &error)) << error;
6900*70a7ec85SAndroid Build Coastguard Worker
6901*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(&matrices, &error);
6902*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, combined) << toXml(*combined);
6903*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN("<vendor-ndk> is already defined", error);
6904*70a7ec85SAndroid Build Coastguard Worker }
6905*70a7ec85SAndroid Build Coastguard Worker
TEST_F(DeviceCompatibilityMatrixCombineTest,AidlAndHidlNames)6906*70a7ec85SAndroid Build Coastguard Worker TEST_F(DeviceCompatibilityMatrixCombineTest, AidlAndHidlNames) {
6907*70a7ec85SAndroid Build Coastguard Worker std::string head{"<compatibility-matrix " + kMetaVersionStr + " type=\"device\">\n"};
6908*70a7ec85SAndroid Build Coastguard Worker std::string tail{"</compatibility-matrix>\n"};
6909*70a7ec85SAndroid Build Coastguard Worker std::string aidl =
6910*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"aidl\" optional=\"true\">\n"
6911*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
6912*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
6913*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
6914*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
6915*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
6916*70a7ec85SAndroid Build Coastguard Worker " </hal>\n";
6917*70a7ec85SAndroid Build Coastguard Worker std::string hidl =
6918*70a7ec85SAndroid Build Coastguard Worker " <hal format=\"hidl\" optional=\"true\">\n"
6919*70a7ec85SAndroid Build Coastguard Worker " <name>android.system.foo</name>\n"
6920*70a7ec85SAndroid Build Coastguard Worker " <version>1.0</version>\n"
6921*70a7ec85SAndroid Build Coastguard Worker " <interface>\n"
6922*70a7ec85SAndroid Build Coastguard Worker " <name>IFoo</name>\n"
6923*70a7ec85SAndroid Build Coastguard Worker " <instance>default</instance>\n"
6924*70a7ec85SAndroid Build Coastguard Worker " </interface>\n"
6925*70a7ec85SAndroid Build Coastguard Worker " </hal>\n";
6926*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[0], head + aidl + tail, &error))
6927*70a7ec85SAndroid Build Coastguard Worker << error;
6928*70a7ec85SAndroid Build Coastguard Worker ASSERT_TRUE(fromXml(&matrices[1], head + hidl + tail, &error))
6929*70a7ec85SAndroid Build Coastguard Worker << error;
6930*70a7ec85SAndroid Build Coastguard Worker
6931*70a7ec85SAndroid Build Coastguard Worker auto combined = combine(&matrices, &error);
6932*70a7ec85SAndroid Build Coastguard Worker ASSERT_NE(nullptr, combined) << error;
6933*70a7ec85SAndroid Build Coastguard Worker
6934*70a7ec85SAndroid Build Coastguard Worker auto combinedXml = toXml(*combined);
6935*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(aidl, combinedXml);
6936*70a7ec85SAndroid Build Coastguard Worker EXPECT_IN(hidl, combinedXml);
6937*70a7ec85SAndroid Build Coastguard Worker }
6938*70a7ec85SAndroid Build Coastguard Worker
6939*70a7ec85SAndroid Build Coastguard Worker // clang-format on
6940*70a7ec85SAndroid Build Coastguard Worker
TEST(FileSystem,PathReplacingFileSystem)6941*70a7ec85SAndroid Build Coastguard Worker TEST(FileSystem, PathReplacingFileSystem) {
6942*70a7ec85SAndroid Build Coastguard Worker std::map<std::string, std::string> files = {
6943*70a7ec85SAndroid Build Coastguard Worker {"a/a", "a/a"}, {"aa/aa", "aa/aa"}, {"b/b", "b/b"}, {"bb/bb", "bb/bb"}, {"x/y/z", "x/y/z"},
6944*70a7ec85SAndroid Build Coastguard Worker };
6945*70a7ec85SAndroid Build Coastguard Worker std::map<std::string, std::string> replacements = {
6946*70a7ec85SAndroid Build Coastguard Worker {"a", "b"},
6947*70a7ec85SAndroid Build Coastguard Worker {"aa", "bb"},
6948*70a7ec85SAndroid Build Coastguard Worker {"x", "a"},
6949*70a7ec85SAndroid Build Coastguard Worker {"x/y", "b"},
6950*70a7ec85SAndroid Build Coastguard Worker };
6951*70a7ec85SAndroid Build Coastguard Worker details::PathReplacingFileSystem fs(std::make_unique<InMemoryFileSystem>(files), replacements);
6952*70a7ec85SAndroid Build Coastguard Worker
6953*70a7ec85SAndroid Build Coastguard Worker std::string fetched;
6954*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> list;
6955*70a7ec85SAndroid Build Coastguard Worker
6956*70a7ec85SAndroid Build Coastguard Worker // no replace
6957*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.fetch("b/b", &fetched, nullptr));
6958*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ("b/b", fetched);
6959*70a7ec85SAndroid Build Coastguard Worker
6960*70a7ec85SAndroid Build Coastguard Worker // replace
6961*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.fetch("a/b", &fetched, nullptr));
6962*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ("b/b", fetched);
6963*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.fetch("aa/bb", &fetched, nullptr));
6964*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ("bb/bb", fetched);
6965*70a7ec85SAndroid Build Coastguard Worker
6966*70a7ec85SAndroid Build Coastguard Worker // "a" doesn't match with "aa"
6967*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.listFiles("aa/", &list, nullptr));
6968*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(std::vector{"bb"s}, list);
6969*70a7ec85SAndroid Build Coastguard Worker
6970*70a7ec85SAndroid Build Coastguard Worker // do not replace recursively
6971*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.fetch("x/a", &fetched, nullptr));
6972*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ("a/a", fetched);
6973*70a7ec85SAndroid Build Coastguard Worker
6974*70a7ec85SAndroid Build Coastguard Worker // longer match wins.
6975*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.fetch("x/y/b", &fetched, nullptr));
6976*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ("b/b", fetched);
6977*70a7ec85SAndroid Build Coastguard Worker
6978*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ(OK, fs.fetch("x/a", &fetched, nullptr));
6979*70a7ec85SAndroid Build Coastguard Worker ASSERT_EQ("a/a", fetched);
6980*70a7ec85SAndroid Build Coastguard Worker }
6981*70a7ec85SAndroid Build Coastguard Worker
6982*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf
6983*70a7ec85SAndroid Build Coastguard Worker } // namespace android
6984*70a7ec85SAndroid Build Coastguard Worker
main(int argc,char ** argv)6985*70a7ec85SAndroid Build Coastguard Worker int main(int argc, char **argv) {
6986*70a7ec85SAndroid Build Coastguard Worker ::testing::InitGoogleMock(&argc, argv);
6987*70a7ec85SAndroid Build Coastguard Worker return RUN_ALL_TESTS();
6988*70a7ec85SAndroid Build Coastguard Worker }
6989