Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9be028d authored by Nathalie Le Clair's avatar Nathalie Le Clair
Browse files

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
parent d261ad7b
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -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);
    }
}