/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "VtsTestabilityChecker.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include <vintf/CompatibilityMatrix.h>
#include <vintf/HalManifest.h>
#include <vintf/parse_xml.h>

using namespace testing;

using android::hardware::hidl_array;
using android::hardware::hidl_death_recipient;
using android::hardware::hidl_handle;
using android::hardware::hidl_string;
using android::hardware::hidl_vec;
using android::hidl::base::V1_0::IBase;
using android::hidl::manager::V1_0::IServiceManager;
using android::hidl::manager::V1_0::IServiceNotification;
using android::vintf::Arch;
using android::vintf::CompatibilityMatrix;
using android::vintf::fromXml;
using android::vintf::HalManifest;
using android::vintf::ManifestHal;
using android::vintf::MatrixHal;
using android::vintf::Version;
using std::set;
using std::string;

namespace android {
namespace vts {

class MockServiceManager : public IServiceManager {
 public:
  template <typename T>
  using R = ::android::hardware::Return<T>;
  using String = const hidl_string &;
  ~MockServiceManager() = default;

#define MOCK_METHOD_CB(name) \
  MOCK_METHOD1(name, R<void>(IServiceManager::name##_cb))

  MOCK_METHOD2(get, R<sp<IBase>>(String, String));
  MOCK_METHOD2(add, R<bool>(String, const sp<IBase> &));
  MOCK_METHOD2(getTransport, R<IServiceManager::Transport>(String, String));
  MOCK_METHOD_CB(list);
  MOCK_METHOD2(listByInterface, R<void>(String, listByInterface_cb));
  MOCK_METHOD3(registerForNotifications,
               R<bool>(String, String, const sp<IServiceNotification> &));
  MOCK_METHOD_CB(debugDump);
  MOCK_METHOD2(registerPassthroughClient, R<void>(String, String));
  MOCK_METHOD_CB(interfaceChain);
  MOCK_METHOD2(debug,
               R<void>(const hidl_handle &, const hidl_vec<hidl_string> &));
  MOCK_METHOD_CB(interfaceDescriptor);
  MOCK_METHOD_CB(getHashChain);
  MOCK_METHOD0(setHalInstrumentation, R<void>());
  MOCK_METHOD2(linkToDeath,
               R<bool>(const sp<hidl_death_recipient> &, uint64_t));
  MOCK_METHOD0(ping, R<void>());
  MOCK_METHOD_CB(getDebugInfo);
  MOCK_METHOD0(notifySyspropsChanged, R<void>());
  MOCK_METHOD1(unlinkToDeath, R<bool>(const sp<hidl_death_recipient> &));
};

class VtsTestabilityCheckerTest : public ::testing::Test {
 public:
  virtual void SetUp() override {
    test_cm_ = testFrameworkCompMatrix();
    test_fm_ = testFrameworkManfiest();
    test_vm_ = testDeviceManifest();
    sm_ = new NiceMock<MockServiceManager>();
    checker_.reset(
        new VtsTestabilityChecker(&test_cm_, &test_fm_, &test_vm_, sm_));
  }
  virtual void TearDown() override {}

  HalManifest testDeviceManifest() {
    HalManifest vm;
    string xml =
        "<manifest version=\"1.0\" type=\"framework\">\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.audio</name>\n"
        "        <transport arch=\"32\">passthrough</transport>\n"
        "        <version>2.0</version>\n"
        "        <interface>\n"
        "            <name>IAudio</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.camera</name>\n"
        "        <transport>hwbinder</transport>\n"
        "        <version>1.2</version>\n"
        "        <version>2.5</version>\n"
        "        <interface>\n"
        "            <name>ICamera</name>\n"
        "            <instance>legacy/0</instance>\n"
        "        </interface>\n"
        "        <interface>\n"
        "            <name>IBetterCamera</name>\n"
        "            <instance>camera</instance>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.drm</name>\n"
        "        <transport>hwbinder</transport>\n"
        "        <version>2.0</version>\n"
        "        <interface>\n"
        "            <name>IDrm</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.nfc</name>\n"
        "        <transport>hwbinder</transport>\n"
        "        <version>1.0</version>\n"
        "        <interface>\n"
        "            <name>INfc</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.renderscript</name>\n"
        "        <transport arch=\"32+64\">passthrough</transport>\n"
        "        <version>1.0</version>\n"
        "        <interface>\n"
        "            <name>IRenderscript</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.vibrator</name>\n"
        "        <transport>hwbinder</transport>\n"
        "        <version>1.0</version>\n"
        "        <interface>\n"
        "            <name>IVibrator</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "</manifest>\n";
    EXPECT_TRUE(fromXml(&vm, xml));
    return vm;
  }

  HalManifest testFrameworkManfiest() {
    HalManifest fm;
    string xml =
        "<manifest version=\"1.0\" type=\"framework\">\n"
        "    <hal format=\"hidl\">\n"
        "        <name>android.hardware.nfc</name>\n"
        "        <transport>hwbinder</transport>\n"
        "        <version>1.0</version>\n"
        "        <interface>\n"
        "            <name>INfc</name>\n"
        "            <instance>default</instance>\n"
        "            <instance>fnfc</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "</manifest>\n";
    EXPECT_TRUE(fromXml(&fm, xml));
    return fm;
  }

  CompatibilityMatrix testFrameworkCompMatrix() {
    CompatibilityMatrix cm;
    string xml =
        "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
        "    <hal format=\"native\" optional=\"true\">\n"
        "        <name>android.hardware.audio</name>\n"
        "        <version>2.0-1</version>\n"
        "        <interface>\n"
        "            <name>IAudio</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"native\" optional=\"true\">\n"
        "        <name>android.hardware.camera</name>\n"
        "        <version>2.2-3</version>\n"
        "        <version>4.5-6</version>\n"
        "        <interface>\n"
        "            <name>ICamera</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "        <interface>\n"
        "            <name>IBetterCamera</name>\n"
        "            <instance>camera</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"native\" optional=\"false\">\n"
        "        <name>android.hardware.drm</name>\n"
        "        <version>1.0-1</version>\n"
        "        <interface>\n"
        "            <name>IDrm</name>\n"
        "            <instance>default</instance>\n"
        "            <instance>drm</instance>\n"
        "        </interface>\n"
        "        <interface>\n"
        "            <name>IDrmTest</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"native\" optional=\"false\">\n"
        "        <name>android.hardware.light</name>\n"
        "        <version>2.0-1</version>\n"
        "        <interface>\n"
        "            <name>ILight</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"native\" optional=\"true\">\n"
        "        <name>android.hardware.nfc</name>\n"
        "        <version>1.0-2</version>\n"
        "        <interface>\n"
        "            <name>INfc</name>\n"
        "            <instance>default</instance>\n"
        "            <instance>nfc</instance>\n"
        "        </interface>\n"
        "        <interface>\n"
        "            <name>INfcTest</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"native\" optional=\"true\">\n"
        "        <name>android.hardware.radio</name>\n"
        "        <version>1.0-1</version>\n"
        "        <interface>\n"
        "            <name>IRadio</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "    <hal format=\"native\" optional=\"false\">\n"
        "        <name>android.hardware.vibrator</name>\n"
        "        <version>2.0</version>\n"
        "        <interface>\n"
        "            <name>IVibrator</name>\n"
        "            <instance>default</instance>\n"
        "        </interface>\n"
        "    </hal>\n"
        "</compatibility-matrix>\n";
    EXPECT_TRUE(fromXml(&cm, xml));
    return cm;
  }

 protected:
  CompatibilityMatrix test_cm_;
  HalManifest test_fm_;
  HalManifest test_vm_;
  sp<MockServiceManager> sm_;
  std::unique_ptr<VtsTestabilityChecker> checker_;
};

TEST_F(VtsTestabilityCheckerTest, CheckComplianceTest) {
  set<string> instances;
  // Check non-existent hal.
  EXPECT_FALSE(checker_->CheckHalForComplianceTest(
      "nonexistent", {1, 0}, "None", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal with unsupported version by vendor.
  EXPECT_FALSE(checker_->CheckHalForComplianceTest(
      "android.hardware.nfc", {2, 0}, "INfc", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal with unsupported interface by vendor.
  EXPECT_FALSE(checker_->CheckHalForComplianceTest(
      "android.hardware.nfc", {1, 0}, "INfcTest", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal with unsupported arch by vendor.
  EXPECT_FALSE(checker_->CheckHalForComplianceTest(
      "android.hardware.audio", {1, 0}, "IAudio", Arch::ARCH_64, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal claimed by framework but not supported by vendor (error case).
  EXPECT_FALSE(checker_->CheckHalForComplianceTest(
      "android.hardware.light", {2, 0}, "ILight", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal interface claimed by framework but not supported by vendor (error
  // case).
  EXPECT_FALSE(checker_->CheckHalForComplianceTest(
      "android.hardware.drm", {1, 0}, "IDrmTest", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());

  // Check hal claimed by framework and supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest("android.hardware.vibrator",
                                                  {1, 0}, "IVibrator",
                                                  Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal not claimed by framework but supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest(
      "android.hardware.renderscript", {1, 0}, "IRenderscript", Arch::ARCH_32,
      &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal with version not claimed by framework by supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest("android.hardware.vibrator",
                                                  {1, 0}, "IVibrator",
                                                  Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal with instance not claimed by framework but supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest(
      "android.hardware.camera", {2, 2}, "ICamera", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"legacy/0"})));

  // Check hal with additional vendor instance not claimed by framework.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest("android.hardware.camera",
                                                  {1, 2}, "IBetterCamera",
                                                  Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default", "camera"})));

  // Check hal supported by both framework and vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest(
      "android.hardware.nfc", {1, 0}, "INfc", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default", "fnfc"})));

  // Check hal instance claimed by framework but not supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest(
      "android.hardware.drm", {2, 0}, "IDrm", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check an optional hal with empty interface (legacy input).
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForComplianceTest(
      "android.hardware.vibrator", {1, 0}, "" /*interface*/, Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());
}

TEST_F(VtsTestabilityCheckerTest, CheckNonComplianceTest) {
  set<string> instances;
  ON_CALL(*sm_, listByInterface(_, _))
      .WillByDefault(
          Invoke([](hidl_string str, IServiceManager::listByInterface_cb cb) {
            if (str == "android.hardware.foo@1.0::IFoo") {
              cb({"default", "footest"});
            } else if (str == "android.hardware.nfc@3.0::INfc") {
              cb({"default"});
            } else if (str == "android.hardware.drm@2.0::IDrm") {
              cb({"drmtest"});
            }
            return hardware::Void();
          }));

  ON_CALL(*sm_, list(_)).WillByDefault(Invoke([](IServiceManager::list_cb cb) {
    cb({"android.hardware.foo@1.0::IFoo/default",
        "android.hardware.foo@1.0::IFoo/footest",
        "android.hardware.nfc@3.0::INfc/default",
        "android.hardware.drm@2.0::IDrm/drmtest"});
    return hardware::Void();
  }));

  // Check non-existent hal.
  EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
      "non-existent", {1, 0}, "None", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal with unsupported version by vendor.
  EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.nfc", {2, 0}, "INfc", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal with unsupported interface by vendor.
  EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.nfc", {1, 0}, "INfcTest", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal with unsupported arch by vendor.
  EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.audio", {1, 0}, "IAudio", Arch::ARCH_64, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal claimed by framework but not supported by vendor (error case).
  EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.light", {2, 0}, "ILight", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());
  // Check hal interface claimed by framework but not supported by vendor (error
  // case).
  EXPECT_FALSE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.drm", {1, 0}, "IDrmTest", Arch::ARCH_32, &instances));
  EXPECT_TRUE(instances.empty());

  // Check hal claimed by framework and supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.vibrator", {1, 0}, "IVibrator", Arch::ARCH_32,
      &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal not claimed by framework but supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.renderscript", {1, 0}, "IRenderscript", Arch::ARCH_32,
      &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal with version not claimed by framework by supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.vibrator", {1, 0}, "IVibrator", Arch::ARCH_32,
      &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal with instance not claimed by framework but supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.camera", {2, 2}, "ICamera", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"legacy/0"})));

  // Check hal with additional vendor instance not claimed by framework.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.camera", {1, 2}, "IBetterCamera", Arch::ARCH_32,
      &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default", "camera"})));

  // Check hal supported by both framework and vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.nfc", {1, 0}, "INfc", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check an optional hal with empty interface (legacy input).
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.vibrator", {1, 0}, "" /*interface*/, Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());

  // Check hal only registered with hwmanger.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.foo", {1, 0}, "IFoo", Arch::ARCH_EMPTY, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default", "footest"})));

  // Check hal with version only registered with hwmanger.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.nfc", {3, 0}, "INfc", Arch::ARCH_EMPTY, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check hal with additional instance registered with hwmanger.
  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.drm", {2, 0}, "IDrm", Arch::ARCH_EMPTY, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default", "drmtest"})));

  instances.clear();
  EXPECT_TRUE(checker_->CheckHalForNonComplianceTest(
      "android.hardware.foo", {1, 0}, "", Arch::ARCH_EMPTY, &instances));
  EXPECT_TRUE(instances.empty());
}

TEST_F(VtsTestabilityCheckerTest, CheckFrameworkCompatibleHalOptional) {
  set<string> instances;
  // Check non-existent hal.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "nonexistent", {1, 0}, "None", Arch::ARCH_EMPTY, &instances));
  EXPECT_TRUE(instances.empty());

  // Check hal not required by framework
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.renderscript", {1, 0}, "IRenderscript",
      Arch::ARCH_EMPTY, &instances));
  EXPECT_TRUE(instances.empty());

  // Check hal with unsupported version.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.camera", {1, 0}, "ICamera", Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());

  // Check hal with non-existent interface.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.camera", {1, 2}, "None", Arch::ARCH_EMPTY, &instances));
  EXPECT_TRUE(instances.empty());

  // Check an optional hal not supported by vendor.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.radio", {1, 0}, "IRadio", Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());

  // Check an optional hal with version not supported by vendor.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.camera", {4, 5}, "ICamera", Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());

  // Check an optional hal with interface not supported by vendor.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.nfc", {4, 5}, "INfcTest", Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());

  // Check an option passthrough hal with unsupported arch.
  EXPECT_FALSE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.audio", {2, 0}, "IAudio", Arch::ARCH_64, &instances));
  EXPECT_TRUE(instances.empty());

  // Check an optional hal supported by vendor but with no compatible
  // instance.
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.camera", {2, 2}, "ICamera", Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());

  // Check an optional hal supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.camera", {2, 2}, "IBetterCamera", Arch::ARCH_EMPTY,
      &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"camera"})));

  // Check an optional passthrough hal supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.audio", {2, 0}, "IAudio", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check an optional hal with empty interface (legacy input).
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.camera", {2, 2}, "" /*interface*/, Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());
}

TEST_F(VtsTestabilityCheckerTest, CheckFrameworkCompatibleHalRequired) {
  set<string> instances;
  // Check a required hal not supported by vendor.
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.light", {2, 0}, "ILight", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check a required hal with version not supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal("android.hardware.vibrator",
                                                    {2, 0}, "IVibrator",
                                                    Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check a required hal with interface not supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.drm", {1, 0}, "IDrmTest", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default"})));

  // Check a required hal supported by vendor.
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.drm", {1, 0}, "IDrm", Arch::ARCH_32, &instances));
  EXPECT_THAT(instances, ContainerEq(set<string>({"default", "drm"})));

  // Check an optional hal with empty interface (legacy input).
  instances.clear();
  EXPECT_TRUE(checker_->CheckFrameworkCompatibleHal(
      "android.hardware.vibrator", {2, 0}, "" /*interface*/, Arch::ARCH_EMPTY,
      &instances));
  EXPECT_TRUE(instances.empty());
}

}  // namespace vts
}  // namespace android

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
