1 /* 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 */ 16 17 package com.android.server.hdmi; 18 19 import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; 20 import static com.android.server.hdmi.Constants.ADDR_TV; 21 import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; 22 23 import static com.google.common.truth.Truth.assertThat; 24 25 import static org.mockito.Mockito.spy; 26 27 import android.content.Context; 28 import android.content.ContextWrapper; 29 import android.os.Looper; 30 import android.os.test.TestLooper; 31 import android.platform.test.annotations.Presubmit; 32 33 import androidx.test.InstrumentationRegistry; 34 import androidx.test.filters.SmallTest; 35 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.junit.runners.JUnit4; 40 41 import java.util.ArrayList; 42 import java.util.Collections; 43 44 /** Tests for {@link ActiveSourceAction} */ 45 @SmallTest 46 @Presubmit 47 @RunWith(JUnit4.class) 48 public class ActiveSourceActionTest { 49 50 private Context mContextSpy; 51 private HdmiControlService mHdmiControlService; 52 private FakeNativeWrapper mNativeWrapper; 53 private FakePowerManagerWrapper mPowerManager; 54 55 private TestLooper mTestLooper = new TestLooper(); 56 private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); 57 private int mPhysicalAddress; 58 59 @Before setUp()60 public void setUp() throws Exception { 61 mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); 62 63 FakeAudioFramework audioFramework = new FakeAudioFramework(); 64 mHdmiControlService = new HdmiControlService(mContextSpy, Collections.emptyList(), 65 audioFramework.getAudioManager(), audioFramework.getAudioDeviceVolumeManager()) { 66 @Override 67 boolean isPowerStandby() { 68 return false; 69 } 70 71 @Override 72 protected void writeStringSystemProperty(String key, String value) { 73 // do nothing 74 } 75 }; 76 77 Looper looper = mTestLooper.getLooper(); 78 mHdmiControlService.setIoLooper(looper); 79 mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); 80 mHdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper()); 81 mNativeWrapper = new FakeNativeWrapper(); 82 HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( 83 this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); 84 mHdmiControlService.setCecController(hdmiCecController); 85 mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); 86 mHdmiControlService.initService(); 87 mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); 88 mPowerManager = new FakePowerManagerWrapper(mContextSpy); 89 mHdmiControlService.setPowerManager(mPowerManager); 90 mPhysicalAddress = 0x2000; 91 mNativeWrapper.setPhysicalAddress(mPhysicalAddress); 92 mTestLooper.dispatchAll(); 93 } 94 95 @Test playbackDevice_sendsActiveSource_sendsMenuStatus()96 public void playbackDevice_sendsActiveSource_sendsMenuStatus() { 97 HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback( 98 mHdmiControlService); 99 playbackDevice.init(); 100 mLocalDevices.add(playbackDevice); 101 mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); 102 mTestLooper.dispatchAll(); 103 104 HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction( 105 playbackDevice, ADDR_TV); 106 playbackDevice.addAndStartAction(action); 107 mTestLooper.dispatchAll(); 108 109 HdmiCecMessage activeSource = 110 HdmiCecMessageBuilder.buildActiveSource( 111 playbackDevice.getDeviceInfo().getLogicalAddress(), mPhysicalAddress); 112 HdmiCecMessage menuStatus = 113 HdmiCecMessageBuilder.buildReportMenuStatus( 114 playbackDevice.getDeviceInfo().getLogicalAddress(), 115 ADDR_TV, 116 Constants.MENU_STATE_ACTIVATED); 117 118 assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); 119 assertThat(mNativeWrapper.getResultMessages()).contains(menuStatus); 120 } 121 122 @Test playbackDevice_updatesActiveSourceState()123 public void playbackDevice_updatesActiveSourceState() { 124 HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback( 125 mHdmiControlService); 126 playbackDevice.init(); 127 mLocalDevices.add(playbackDevice); 128 mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); 129 mTestLooper.dispatchAll(); 130 131 HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction( 132 playbackDevice, ADDR_TV); 133 playbackDevice.addAndStartAction(action); 134 mTestLooper.dispatchAll(); 135 136 assertThat(playbackDevice.getActiveSource().logicalAddress) 137 .isEqualTo(playbackDevice.getDeviceInfo().getLogicalAddress()); 138 assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress); 139 assertThat(playbackDevice.isActiveSource()).isTrue(); 140 } 141 } 142