1 /* 2 * Copyright (C) 2018 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 package com.android.server.hdmi; 17 18 import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; 19 import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.Mockito.spy; 24 25 import android.content.Context; 26 import android.content.ContextWrapper; 27 import android.hardware.tv.cec.V1_0.SendMessageResult; 28 import android.os.Looper; 29 import android.os.test.TestLooper; 30 import android.platform.test.annotations.Presubmit; 31 32 import androidx.test.InstrumentationRegistry; 33 import androidx.test.filters.SmallTest; 34 35 import org.junit.Before; 36 import org.junit.Test; 37 import org.junit.runner.RunWith; 38 import org.junit.runners.JUnit4; 39 40 import java.util.ArrayList; 41 import java.util.Collections; 42 43 /** Tests for {@link ArcInitiationActionFromAvrTest} */ 44 @SmallTest 45 @Presubmit 46 @RunWith(JUnit4.class) 47 public class ArcInitiationActionFromAvrTest { 48 49 private Context mContextSpy; 50 private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; 51 private FakeNativeWrapper mNativeWrapper; 52 private FakePowerManagerWrapper mPowerManager; 53 private ArcInitiationActionFromAvr mAction; 54 55 private TestLooper mTestLooper = new TestLooper(); 56 private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); 57 58 @Before setUp()59 public void setUp() throws Exception { 60 mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); 61 62 FakeAudioFramework audioFramework = new FakeAudioFramework(); 63 64 HdmiControlService hdmiControlService = 65 new HdmiControlService(mContextSpy, Collections.emptyList(), 66 audioFramework.getAudioManager(), 67 audioFramework.getAudioDeviceVolumeManager()) { 68 @Override 69 boolean isPowerStandby() { 70 return false; 71 } 72 73 74 @Override 75 boolean isAddressAllocated() { 76 return true; 77 } 78 79 @Override 80 protected void writeStringSystemProperty(String key, String value) { 81 } 82 83 @Override 84 protected Looper getServiceLooper() { 85 return mTestLooper.getLooper(); 86 } 87 }; 88 89 mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(hdmiControlService) { 90 @Override 91 protected void setPreferredAddress(int addr) { 92 } 93 }; 94 95 mHdmiCecLocalDeviceAudioSystem.init(); 96 Looper looper = mTestLooper.getLooper(); 97 hdmiControlService.setIoLooper(looper); 98 hdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); 99 hdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper()); 100 mNativeWrapper = new FakeNativeWrapper(); 101 HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( 102 hdmiControlService, mNativeWrapper, hdmiControlService.getAtomWriter()); 103 hdmiControlService.setCecController(hdmiCecController); 104 hdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(hdmiControlService)); 105 hdmiControlService.initService(); 106 mPowerManager = new FakePowerManagerWrapper(mContextSpy); 107 hdmiControlService.setPowerManager(mPowerManager); 108 mAction = new ArcInitiationActionFromAvr(mHdmiCecLocalDeviceAudioSystem); 109 110 mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); 111 hdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); 112 hdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); 113 mTestLooper.dispatchAll(); 114 } 115 116 @Test arcInitiation_initiated()117 public void arcInitiation_initiated() { 118 mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); 119 mTestLooper.dispatchAll(); 120 HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( 121 Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); 122 123 assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); 124 125 mNativeWrapper.onCecMessage( 126 HdmiCecMessageBuilder.buildReportArcInitiated( 127 Constants.ADDR_TV, 128 Constants.ADDR_AUDIO_SYSTEM)); 129 mTestLooper.dispatchAll(); 130 131 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); 132 } 133 134 @Test arcInitiation_sendFailed()135 public void arcInitiation_sendFailed() { 136 mNativeWrapper.setMessageSendResult(Constants.MESSAGE_INITIATE_ARC, SendMessageResult.NACK); 137 mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); 138 mTestLooper.dispatchAll(); 139 HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( 140 Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); 141 142 assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); 143 144 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); 145 } 146 147 @Test arcInitiation_terminated()148 public void arcInitiation_terminated() { 149 mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); 150 mTestLooper.dispatchAll(); 151 152 HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( 153 Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); 154 155 assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); 156 157 mNativeWrapper.onCecMessage(HdmiCecMessageBuilder.buildReportArcTerminated( 158 Constants.ADDR_TV, 159 Constants.ADDR_AUDIO_SYSTEM)); 160 mTestLooper.dispatchAll(); 161 162 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); 163 } 164 165 @Test arcInitiation_abort()166 public void arcInitiation_abort() { 167 mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); 168 mTestLooper.dispatchAll(); 169 170 HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( 171 Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); 172 173 assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); 174 175 mNativeWrapper.onCecMessage( 176 HdmiCecMessageBuilder.buildFeatureAbortCommand( 177 Constants.ADDR_TV, 178 Constants.ADDR_AUDIO_SYSTEM, Constants.MESSAGE_INITIATE_ARC, 179 Constants.ABORT_REFUSED)); 180 mTestLooper.dispatchAll(); 181 182 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); 183 } 184 185 //Fail 186 @Test arcInitiation_timeout()187 public void arcInitiation_timeout() { 188 mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); 189 mTestLooper.dispatchAll(); 190 191 HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( 192 Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); 193 194 assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); 195 196 mTestLooper.moveTimeForward(1001); 197 mTestLooper.dispatchAll(); 198 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); 199 } 200 } 201