blob: fd4d94f6287815d9079f161c9c4b660dd50f08d7 [file] [log] [blame]
Venkatarama Avadhani820b5482022-05-18 15:19:04 +05301/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Hdmi_hal_test"
18
19#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
21#include <aidl/android/hardware/tv/hdmi/BnHdmi.h>
22#include <aidl/android/hardware/tv/hdmi/BnHdmiCallback.h>
23#include <android-base/logging.h>
24#include <android/binder_manager.h>
25#include <android/binder_process.h>
26#include <gtest/gtest.h>
27#include <log/log.h>
28#include <sstream>
29#include <vector>
30
31using ::aidl::android::hardware::tv::hdmi::BnHdmiCallback;
32using ::aidl::android::hardware::tv::hdmi::HdmiPortInfo;
33using ::aidl::android::hardware::tv::hdmi::HdmiPortType;
Venkatarama Avadhani04ee1a42022-11-09 16:21:55 +053034using ::aidl::android::hardware::tv::hdmi::HpdSignal;
Venkatarama Avadhani820b5482022-05-18 15:19:04 +053035using ::aidl::android::hardware::tv::hdmi::IHdmi;
36using ::aidl::android::hardware::tv::hdmi::IHdmiCallback;
37using ::ndk::SpAIBinder;
38
39#define INCORRECT_VENDOR_ID 0x00
40#define TV_PHYSICAL_ADDRESS 0x0000
41
42// The main test class for TV HDMI HAL.
43class HdmiTest : public ::testing::TestWithParam<std::string> {
44 static void serviceDied(void* /* cookie */) { ALOGE("VtsHalTvCecAidlTargetTest died"); }
45
46 public:
47 void SetUp() override {
48 hdmi = IHdmi::fromBinder(SpAIBinder(AServiceManager_waitForService(GetParam().c_str())));
49 ASSERT_NE(hdmi, nullptr);
50 ALOGI("%s: getService() for hdmi is %s", __func__, hdmi->isRemote() ? "remote" : "local");
51
52 hdmiCallback = ::ndk::SharedRefBase::make<HdmiCallback>();
53 ASSERT_NE(hdmiCallback, nullptr);
54 hdmiDeathRecipient =
55 ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(&serviceDied));
56 ASSERT_EQ(AIBinder_linkToDeath(hdmi->asBinder().get(), hdmiDeathRecipient.get(), 0),
57 STATUS_OK);
58 }
59
60 class HdmiCallback : public BnHdmiCallback {
61 public:
62 ::ndk::ScopedAStatus onHotplugEvent(bool connected __unused, int32_t portId __unused) {
63 return ::ndk::ScopedAStatus::ok();
64 };
65 };
66
67 std::shared_ptr<IHdmi> hdmi;
68 std::shared_ptr<IHdmiCallback> hdmiCallback;
69 ::ndk::ScopedAIBinder_DeathRecipient hdmiDeathRecipient;
70};
71
72GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(HdmiTest);
73INSTANTIATE_TEST_SUITE_P(PerInstance, HdmiTest,
74 testing::ValuesIn(android::getAidlHalInstanceNames(IHdmi::descriptor)),
75 android::PrintInstanceNameToString);
76
77TEST_P(HdmiTest, SetCallback) {
78 ASSERT_TRUE(hdmi->setCallback(::ndk::SharedRefBase::make<HdmiCallback>()).isOk());
79}
80
81TEST_P(HdmiTest, GetPortInfo) {
82 std::vector<HdmiPortInfo> ports;
83 ASSERT_TRUE(hdmi->getPortInfo(&ports).isOk());
84
85 bool cecSupportedOnDevice = false;
86 for (size_t i = 0; i < ports.size(); ++i) {
87 EXPECT_TRUE((ports[i].type == HdmiPortType::OUTPUT) ||
88 (ports[i].type == HdmiPortType::INPUT));
89 if (ports[i].portId == 0) {
90 ALOGW("%s: Port id should start from 1", __func__);
91 }
92 cecSupportedOnDevice = cecSupportedOnDevice | ports[i].cecSupported;
93 }
94 EXPECT_NE(cecSupportedOnDevice, false) << "At least one port should support CEC";
95}
96
97TEST_P(HdmiTest, IsConnected) {
98 std::vector<HdmiPortInfo> ports;
99 ASSERT_TRUE(hdmi->getPortInfo(&ports).isOk());
100 for (size_t i = 0; i < ports.size(); ++i) {
101 bool connected;
102 ASSERT_TRUE(hdmi->isConnected(ports[i].portId, &connected).isOk());
103 }
104}
Venkatarama Avadhani04ee1a42022-11-09 16:21:55 +0530105
106TEST_P(HdmiTest, HdpSignal) {
107 HpdSignal originalSignal;
108 HpdSignal signal = HpdSignal::HDMI_HPD_STATUS_BIT;
109 HpdSignal readSignal;
110 ASSERT_TRUE(hdmi->getHpdSignal(&originalSignal).isOk());
111 ASSERT_TRUE(hdmi->setHpdSignal(signal).isOk());
112 ASSERT_TRUE(hdmi->getHpdSignal(&readSignal).isOk());
113 EXPECT_EQ(readSignal, signal);
114 signal = HpdSignal::HDMI_HPD_PHYSICAL;
115 ASSERT_TRUE(hdmi->setHpdSignal(signal).isOk());
116 ASSERT_TRUE(hdmi->getHpdSignal(&readSignal).isOk());
117 EXPECT_EQ(readSignal, signal);
118 ASSERT_TRUE(hdmi->setHpdSignal(originalSignal).isOk());
119}