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 <Report Power Status> 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
This commit is contained in:
Nathalie Le Clair
2021-05-26 10:10:07 +02:00
parent d261ad7bfe
commit d9be028d41

View File

@@ -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<HdmiCecLocalDevice> 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);
}
}