From d9be028d41b3ca81026016c4ddd2312ec3298fdb Mon Sep 17 00:00:00 2001 From: Nathalie Le Clair Date: Wed, 26 May 2021 10:10:07 +0200 Subject: [PATCH] Fix OneTouchPlayActionTest failure on playback devices Playback devices have HdmiProperties.cec_device_types() set to 'playback' and as a consequence, initializing HdmiControlService will automatically initialize a local playback device. This local playback device interferes with the playback device that is added in tests. Concretely, in the failing test the messages was being fed to the local playback device, instead of the test one. To resolve this, HdmiControlService is initialized with empty local devices, practically ignoring HdmiProperties.cec_device_types(). This will also avoid interference with other local devices while running these unit tests on f.e. a TV panel device. Also, isActiveSource() doesn't guarantee that oneTouchPlay() was executed, since the active source might have been set in a different method. We should additionally check if the correct CEC messages were sent. Bug: 187909454 Test: atest OneTouchPlayActionTest on cuttlefish and ADT3 Change-Id: I4599a240fa8a32f47a23c1f183d41e0d280152c3 --- .../server/hdmi/OneTouchPlayActionTest.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java index 826438fc8ddfd..792c80e749f6d 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java @@ -37,7 +37,6 @@ import android.os.IThermalService; import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; -import android.provider.Settings; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -51,6 +50,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; +import java.util.Collections; /** Tests for {@link OneTouchPlayAction} */ @SmallTest @@ -69,6 +69,7 @@ public class OneTouchPlayActionTest { private Context mContextSpy; private HdmiControlService mHdmiControlService; private FakeNativeWrapper mNativeWrapper; + private FakeHdmiCecConfig mHdmiCecConfig; private TestLooper mTestLooper = new TestLooper(); private ArrayList mLocalDevices = new ArrayList<>(); @@ -88,6 +89,7 @@ public class OneTouchPlayActionTest { MockitoAnnotations.initMocks(this); mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); + mHdmiCecConfig = new FakeHdmiCecConfig(mContextSpy); setHdmiControlEnabled(hdmiControlEnabled); @@ -97,7 +99,7 @@ public class OneTouchPlayActionTest { when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager); when(mIPowerManagerMock.isInteractive()).thenReturn(true); - mHdmiControlService = new HdmiControlService(mContextSpy) { + mHdmiControlService = new HdmiControlService(mContextSpy, Collections.emptyList()) { @Override AudioManager getAudioManager() { return new AudioManager() { @@ -131,7 +133,7 @@ public class OneTouchPlayActionTest { Looper looper = mTestLooper.getLooper(); mHdmiControlService.setIoLooper(looper); - mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); + mHdmiControlService.setHdmiCecConfig(mHdmiCecConfig); mNativeWrapper = new FakeNativeWrapper(); HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); @@ -476,7 +478,7 @@ public class OneTouchPlayActionTest { mTestLooper.dispatchAll(); assertThat(callback.hasResult()).isFalse(); - assertThat(playbackDevice.isActiveSource()).isFalse(); + mNativeWrapper.clearResultMessages(); setHdmiControlEnabled(true); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); @@ -495,6 +497,12 @@ public class OneTouchPlayActionTest { assertThat(mHdmiControlService.isAddressAllocated()).isTrue(); assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS); assertThat(playbackDevice.isActiveSource()).isTrue(); + HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource( + playbackDevice.mAddress, mPhysicalAddress); + HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(playbackDevice.mAddress, + ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); + assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn); } @Test @@ -524,6 +532,12 @@ public class OneTouchPlayActionTest { assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS); assertThat(playbackDevice.isActiveSource()).isTrue(); + HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource( + playbackDevice.mAddress, mPhysicalAddress); + HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(playbackDevice.mAddress, + ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); + assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn); } @Test @@ -599,8 +613,8 @@ public class OneTouchPlayActionTest { } private void setHdmiControlEnabled(boolean enabled) { - int value = enabled ? 1 : 0; - Settings.Global.putInt(mContextSpy.getContentResolver(), - Settings.Global.HDMI_CONTROL_ENABLED, value); + int value = enabled ? HdmiControlManager.HDMI_CEC_CONTROL_ENABLED : + HdmiControlManager.HDMI_CEC_CONTROL_DISABLED; + mHdmiCecConfig.setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, value); } }