blob: b88573ae168a9fb6b1cb87a9511425bbf2d54b2c [file] [log] [blame]
Marvin Ramin1c7270a2020-06-22 13:55:50 +02001/*
2 * Copyright (C) 2020 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 */
16package com.android.server.hdmi;
17
18import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
19import static com.android.server.hdmi.Constants.ADDR_TV;
20import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
21
22import static com.google.common.truth.Truth.assertThat;
23
24import android.content.Context;
25import android.hardware.hdmi.HdmiControlManager;
26import android.hardware.tv.cec.V1_0.SendMessageResult;
27import android.os.Handler;
28import android.os.IPowerManager;
29import android.os.IThermalService;
30import android.os.Looper;
31import android.os.PowerManager;
32import android.os.test.TestLooper;
33
34import androidx.test.InstrumentationRegistry;
35import androidx.test.filters.SmallTest;
36
37import org.junit.Before;
38import org.junit.Test;
39import org.junit.runner.RunWith;
40import org.junit.runners.JUnit4;
41import org.mockito.Mock;
42import org.mockito.MockitoAnnotations;
43
44import java.util.ArrayList;
45
46@SmallTest
47@RunWith(JUnit4.class)
48/** Tests for {@link HdmiCecLocalDeviceTv} class. */
49public class HdmiCecLocalDeviceTvTest {
50
51 private HdmiControlService mHdmiControlService;
52 private HdmiCecController mHdmiCecController;
53 private HdmiCecLocalDeviceTv mHdmiCecLocalDeviceTv;
54 private FakeNativeWrapper mNativeWrapper;
55 private Looper mMyLooper;
56 private TestLooper mTestLooper = new TestLooper();
57 private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
58 private int mTvPhysicalAddress;
59
60 @Mock
61 private IPowerManager mIPowerManagerMock;
62 @Mock
63 private IThermalService mIThermalServiceMock;
64
65 @Before
66 public void setUp() {
67 MockitoAnnotations.initMocks(this);
68
69 Context context = InstrumentationRegistry.getTargetContext();
70 mMyLooper = mTestLooper.getLooper();
71 PowerManager powerManager = new PowerManager(context, mIPowerManagerMock,
72 mIThermalServiceMock, new Handler(mMyLooper));
73 mHdmiControlService =
74 new HdmiControlService(InstrumentationRegistry.getTargetContext()) {
75 @Override
76 boolean isControlEnabled() {
77 return true;
78 }
79
80 @Override
81 boolean isTvDevice() {
82 return true;
83 }
84
85 @Override
86 void writeStringSystemProperty(String key, String value) {
87 // do nothing
88 }
89
90 @Override
91 PowerManager getPowerManager() {
92 return powerManager;
93 }
94 };
95
96 mHdmiCecLocalDeviceTv = new HdmiCecLocalDeviceTv(mHdmiControlService);
97 mHdmiCecLocalDeviceTv.init();
98 mHdmiControlService.setIoLooper(mMyLooper);
99 mNativeWrapper = new FakeNativeWrapper();
100 mHdmiCecController =
101 HdmiCecController.createWithNativeWrapper(mHdmiControlService, mNativeWrapper);
102 mHdmiControlService.setCecController(mHdmiCecController);
103 mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
104 mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
105 mLocalDevices.add(mHdmiCecLocalDeviceTv);
106 mHdmiControlService.initPortInfo();
107 mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
108 mTvPhysicalAddress = 0x0000;
109 mNativeWrapper.setPhysicalAddress(mTvPhysicalAddress);
110 mTestLooper.dispatchAll();
111 mNativeWrapper.clearResultMessages();
112 }
113
114 @Test
115 public void initialPowerStateIsStandby() {
116 assertThat(mHdmiCecLocalDeviceTv.getPowerStatus()).isEqualTo(
117 HdmiControlManager.POWER_STATUS_STANDBY);
118 }
119
120 @Test
121 public void onAddressAllocated_invokesDeviceDiscovery() {
122 mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
123 mHdmiCecLocalDeviceTv.onAddressAllocated(0, HdmiControlService.INITIATED_BY_BOOT_UP);
124
125 mTestLooper.dispatchAll();
126
127 // Check for for <Give Physical Address> being sent to available device (ADDR_PLAYBACK_1).
128 // This message is sent as part of the DeviceDiscoveryAction to available devices.
129 HdmiCecMessage givePhysicalAddress = HdmiCecMessageBuilder.buildGivePhysicalAddress(ADDR_TV,
130 ADDR_PLAYBACK_1);
131 assertThat(mNativeWrapper.getResultMessages()).contains(givePhysicalAddress);
132 }
133}