Loading services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +120 −67 Original line number Diff line number Diff line Loading @@ -19,11 +19,18 @@ import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC import static com.google.common.truth.Truth.assertThat; import android.annotation.Nullable; import android.app.Instrumentation; import android.hardware.hdmi.HdmiDeviceInfo; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.ContextWrapper; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.media.AudioManager; import android.os.Handler; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; Loading @@ -31,10 +38,11 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; Loading @@ -44,7 +52,7 @@ import java.util.ArrayList; @RunWith(JUnit4.class) public class ArcInitiationActionFromAvrTest { private HdmiDeviceInfo mDeviceInfoForTests; private Context mContextSpy; private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; private HdmiCecController mHdmiCecController; private HdmiControlService mHdmiControlService; Loading @@ -52,56 +60,43 @@ public class ArcInitiationActionFromAvrTest { private ArcInitiationActionFromAvr mAction; private TestLooper mTestLooper = new TestLooper(); private boolean mSendCecCommandSuccess; private boolean mShouldDispatchARCInitiated; private boolean mArcInitSent; private boolean mRequestActiveSourceSent; private Instrumentation mInstrumentation; private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Mock private AudioManager mAudioManager; @Before public void setUp() { mDeviceInfoForTests = new HdmiDeviceInfo(1000, 1); public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mInstrumentation = InstrumentationRegistry.getInstrumentation(); PowerManager powerManager = new PowerManager(mContextSpy, mIPowerManagerMock, mIThermalServiceMock, new Handler(mTestLooper.getLooper())); when(mContextSpy.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager); when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager); when(mIPowerManagerMock.isInteractive()).thenReturn(true); mHdmiControlService = new HdmiControlService(mInstrumentation.getTargetContext()) { new HdmiControlService(mContextSpy) { @Override void sendCecCommand( HdmiCecMessage command, @Nullable SendMessageCallback callback) { switch (command.getOpcode()) { case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE: if (callback != null) { callback.onSendCompleted( mSendCecCommandSuccess ? SendMessageResult.SUCCESS : SendMessageResult.NACK); } mRequestActiveSourceSent = true; break; case Constants.MESSAGE_INITIATE_ARC: if (callback != null) { callback.onSendCompleted( mSendCecCommandSuccess ? SendMessageResult.SUCCESS : SendMessageResult.NACK); } mArcInitSent = true; if (mShouldDispatchARCInitiated) { mHdmiCecLocalDeviceAudioSystem.dispatchMessage( HdmiCecMessageBuilder.buildReportArcInitiated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM)); boolean isPowerStandby() { return false; } break; default: @Override void wakeUp() { } @Override PowerManager getPowerManager() { return powerManager; } @Override boolean isPowerStandby() { return false; AudioManager getAudioManager() { return mAudioManager; } @Override Loading @@ -115,21 +110,9 @@ public class ArcInitiationActionFromAvrTest { } }; mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { @Override HdmiDeviceInfo getDeviceInfo() { return mDeviceInfoForTests; } mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { @Override void setArcStatus(boolean enabled) { // do nothing } @Override protected boolean isSystemAudioActivated() { return true; protected void setPreferredAddress(int addr) { } }; Loading @@ -150,18 +133,88 @@ public class ArcInitiationActionFromAvrTest { mTestLooper.dispatchAll(); } @Ignore("b/120845532") @Test public void arcInitiation_requestActiveSource() { mSendCecCommandSuccess = true; mShouldDispatchARCInitiated = true; mRequestActiveSourceSent = false; mArcInitSent = false; public void arcInitiation_initiated() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mHdmiControlService.sendCecCommand( HdmiCecMessageBuilder.buildReportArcInitiated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM)); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); } @Test public void arcInitiation_sendFailed() { mNativeWrapper.setMessageSendResult(Constants.MESSAGE_INITIATE_ARC, SendMessageResult.NACK); mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mArcInitSent).isTrue(); assertThat(mRequestActiveSourceSent).isTrue(); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } @Test public void arcInitiation_terminated() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mHdmiControlService.handleCecCommand(HdmiCecMessageBuilder.buildReportArcTerminated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM)); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } @Test public void arcInitiation_abort() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mHdmiControlService.handleCecCommand( HdmiCecMessageBuilder.buildFeatureAbortCommand( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM, Constants.MESSAGE_INITIATE_ARC, Constants.ABORT_REFUSED)); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } //Fail @Test public void arcInitiation_timeout() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mTestLooper.moveTimeForward(1001); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); } } services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java +95 −65 Original line number Diff line number Diff line Loading @@ -15,13 +15,22 @@ */ package com.android.server.hdmi; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.google.common.truth.Truth.assertThat; import android.annotation.Nullable; import android.app.Instrumentation; import android.hardware.hdmi.HdmiDeviceInfo; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.ContextWrapper; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.media.AudioManager; import android.os.Handler; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; Loading @@ -29,10 +38,13 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; /** Tests for {@link ArcTerminationActionFromAvr} */ @SmallTest Loading @@ -40,45 +52,47 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ArcTerminationActionFromAvrTest { private HdmiDeviceInfo mDeviceInfoForTests; private Context mContextSpy; private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; private ArcTerminationActionFromAvr mAction; private HdmiCecController mHdmiCecController; private HdmiControlService mHdmiControlService; private FakeNativeWrapper mNativeWrapper; private TestLooper mTestLooper = new TestLooper(); private boolean mSendCecCommandSuccess; private boolean mShouldDispatchReportArcTerminated; private Instrumentation mInstrumentation; @Nullable private Boolean mArcEnabled = null; private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Mock private AudioManager mAudioManager; @Before public void setUp() { mDeviceInfoForTests = new HdmiDeviceInfo(1000, 1); public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mInstrumentation = InstrumentationRegistry.getInstrumentation(); PowerManager powerManager = new PowerManager(mContextSpy, mIPowerManagerMock, mIThermalServiceMock, new Handler(mTestLooper.getLooper())); when(mContextSpy.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager); when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager); when(mIPowerManagerMock.isInteractive()).thenReturn(true); HdmiControlService hdmiControlService = new HdmiControlService(mInstrumentation.getTargetContext()) { mHdmiControlService = new HdmiControlService(mContextSpy) { @Override void sendCecCommand( HdmiCecMessage command, @Nullable SendMessageCallback callback) { switch (command.getOpcode()) { case Constants.MESSAGE_TERMINATE_ARC: if (callback != null) { callback.onSendCompleted( mSendCecCommandSuccess ? SendMessageResult.SUCCESS : SendMessageResult.NACK); void wakeUp() { } if (mShouldDispatchReportArcTerminated) { mHdmiCecLocalDeviceAudioSystem.dispatchMessage( HdmiCecMessageBuilder.buildReportArcTerminated( Constants.ADDR_TV, mHdmiCecLocalDeviceAudioSystem.mAddress)); } break; default: throw new IllegalArgumentException("Unexpected message"); @Override PowerManager getPowerManager() { return powerManager; } @Override AudioManager getAudioManager() { return mAudioManager; } @Override Loading @@ -97,55 +111,71 @@ public class ArcTerminationActionFromAvrTest { } }; mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(hdmiControlService) { @Override HdmiDeviceInfo getDeviceInfo() { return mDeviceInfoForTests; } Looper looper = mTestLooper.getLooper(); mHdmiControlService.setIoLooper(looper); mNativeWrapper = new FakeNativeWrapper(); mHdmiCecController = HdmiCecController.createWithNativeWrapper(this.mHdmiControlService, mNativeWrapper); mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService)); mHdmiControlService.initPortInfo(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { @Override void setArcStatus(boolean enabled) { mArcEnabled = enabled; protected void setPreferredAddress(int addr) { } }; mHdmiCecLocalDeviceAudioSystem.init(); Looper looper = mTestLooper.getLooper(); hdmiControlService.setIoLooper(looper); mAction = new ArcTerminationActionFromAvr(mHdmiCecLocalDeviceAudioSystem); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiCecLocalDeviceAudioSystem.setArcStatus(true); mTestLooper.dispatchAll(); } @Test @Ignore("b/120845532") public void testSendMessage_notSuccess() { mSendCecCommandSuccess = false; mShouldDispatchReportArcTerminated = false; public void testSendMessage_sendFailed() { mNativeWrapper.setMessageSendResult(Constants.MESSAGE_TERMINATE_ARC, SendMessageResult.NACK); mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); assertThat(mArcEnabled).isNull(); HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } @Test public void testReportArcTerminated_notReceived() { mSendCecCommandSuccess = true; mShouldDispatchReportArcTerminated = false; public void testReportArcTerminated_timeout() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.moveTimeForward(1000); mTestLooper.dispatchAll(); assertThat(mArcEnabled).isNull(); HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); } @Test public void testReportArcTerminated_received() { mSendCecCommandSuccess = true; mShouldDispatchReportArcTerminated = true; mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); mTestLooper.moveTimeForward(1000); assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); HdmiCecMessage arcTerminatedResponse = HdmiCecMessageBuilder.buildReportArcTerminated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM); mHdmiControlService.handleCecCommand(arcTerminatedResponse); mTestLooper.dispatchAll(); assertThat(mArcEnabled).isFalse(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } } services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java +9 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.server.hdmi.HdmiCecController.NativeWrapper; import com.google.common.collect.Iterables; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** Fake {@link NativeWrapper} useful for testing. */ Loading @@ -48,6 +49,7 @@ final class FakeNativeWrapper implements NativeWrapper { }; private final List<HdmiCecMessage> mResultMessages = new ArrayList<>(); private final HashMap<Integer, Integer> mMessageSendResult = new HashMap<>(); private int mMyPhysicalAddress = 0; private HdmiPortInfo[] mHdmiPortInfo = null; Loading @@ -65,9 +67,10 @@ final class FakeNativeWrapper implements NativeWrapper { if (body.length == 0) { return mPollAddressResponse[dstAddress]; } else { mResultMessages.add(HdmiCecMessageBuilder.of(srcAddress, dstAddress, body)); HdmiCecMessage message = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body); mResultMessages.add(message); return mMessageSendResult.getOrDefault(message.getOpcode(), SendMessageResult.SUCCESS); } return SendMessageResult.SUCCESS; } @Override Loading Loading @@ -132,6 +135,10 @@ final class FakeNativeWrapper implements NativeWrapper { mPollAddressResponse[logicalAddress] = response; } public void setMessageSendResult(int opcode, int result) { mMessageSendResult.put(opcode, result); } @VisibleForTesting protected void setPhysicalAddress(int physicalAddress) { mMyPhysicalAddress = physicalAddress; Loading Loading
services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +120 −67 Original line number Diff line number Diff line Loading @@ -19,11 +19,18 @@ import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC import static com.google.common.truth.Truth.assertThat; import android.annotation.Nullable; import android.app.Instrumentation; import android.hardware.hdmi.HdmiDeviceInfo; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.ContextWrapper; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.media.AudioManager; import android.os.Handler; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; Loading @@ -31,10 +38,11 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; Loading @@ -44,7 +52,7 @@ import java.util.ArrayList; @RunWith(JUnit4.class) public class ArcInitiationActionFromAvrTest { private HdmiDeviceInfo mDeviceInfoForTests; private Context mContextSpy; private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; private HdmiCecController mHdmiCecController; private HdmiControlService mHdmiControlService; Loading @@ -52,56 +60,43 @@ public class ArcInitiationActionFromAvrTest { private ArcInitiationActionFromAvr mAction; private TestLooper mTestLooper = new TestLooper(); private boolean mSendCecCommandSuccess; private boolean mShouldDispatchARCInitiated; private boolean mArcInitSent; private boolean mRequestActiveSourceSent; private Instrumentation mInstrumentation; private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Mock private AudioManager mAudioManager; @Before public void setUp() { mDeviceInfoForTests = new HdmiDeviceInfo(1000, 1); public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mInstrumentation = InstrumentationRegistry.getInstrumentation(); PowerManager powerManager = new PowerManager(mContextSpy, mIPowerManagerMock, mIThermalServiceMock, new Handler(mTestLooper.getLooper())); when(mContextSpy.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager); when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager); when(mIPowerManagerMock.isInteractive()).thenReturn(true); mHdmiControlService = new HdmiControlService(mInstrumentation.getTargetContext()) { new HdmiControlService(mContextSpy) { @Override void sendCecCommand( HdmiCecMessage command, @Nullable SendMessageCallback callback) { switch (command.getOpcode()) { case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE: if (callback != null) { callback.onSendCompleted( mSendCecCommandSuccess ? SendMessageResult.SUCCESS : SendMessageResult.NACK); } mRequestActiveSourceSent = true; break; case Constants.MESSAGE_INITIATE_ARC: if (callback != null) { callback.onSendCompleted( mSendCecCommandSuccess ? SendMessageResult.SUCCESS : SendMessageResult.NACK); } mArcInitSent = true; if (mShouldDispatchARCInitiated) { mHdmiCecLocalDeviceAudioSystem.dispatchMessage( HdmiCecMessageBuilder.buildReportArcInitiated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM)); boolean isPowerStandby() { return false; } break; default: @Override void wakeUp() { } @Override PowerManager getPowerManager() { return powerManager; } @Override boolean isPowerStandby() { return false; AudioManager getAudioManager() { return mAudioManager; } @Override Loading @@ -115,21 +110,9 @@ public class ArcInitiationActionFromAvrTest { } }; mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { @Override HdmiDeviceInfo getDeviceInfo() { return mDeviceInfoForTests; } mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { @Override void setArcStatus(boolean enabled) { // do nothing } @Override protected boolean isSystemAudioActivated() { return true; protected void setPreferredAddress(int addr) { } }; Loading @@ -150,18 +133,88 @@ public class ArcInitiationActionFromAvrTest { mTestLooper.dispatchAll(); } @Ignore("b/120845532") @Test public void arcInitiation_requestActiveSource() { mSendCecCommandSuccess = true; mShouldDispatchARCInitiated = true; mRequestActiveSourceSent = false; mArcInitSent = false; public void arcInitiation_initiated() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mHdmiControlService.sendCecCommand( HdmiCecMessageBuilder.buildReportArcInitiated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM)); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); } @Test public void arcInitiation_sendFailed() { mNativeWrapper.setMessageSendResult(Constants.MESSAGE_INITIATE_ARC, SendMessageResult.NACK); mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mArcInitSent).isTrue(); assertThat(mRequestActiveSourceSent).isTrue(); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } @Test public void arcInitiation_terminated() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mHdmiControlService.handleCecCommand(HdmiCecMessageBuilder.buildReportArcTerminated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM)); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } @Test public void arcInitiation_abort() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mHdmiControlService.handleCecCommand( HdmiCecMessageBuilder.buildFeatureAbortCommand( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM, Constants.MESSAGE_INITIATE_ARC, Constants.ABORT_REFUSED)); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } //Fail @Test public void arcInitiation_timeout() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(initiateArc); mTestLooper.moveTimeForward(1001); mTestLooper.dispatchAll(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); } }
services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java +95 −65 Original line number Diff line number Diff line Loading @@ -15,13 +15,22 @@ */ package com.android.server.hdmi; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.google.common.truth.Truth.assertThat; import android.annotation.Nullable; import android.app.Instrumentation; import android.hardware.hdmi.HdmiDeviceInfo; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.ContextWrapper; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.media.AudioManager; import android.os.Handler; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; Loading @@ -29,10 +38,13 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; /** Tests for {@link ArcTerminationActionFromAvr} */ @SmallTest Loading @@ -40,45 +52,47 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ArcTerminationActionFromAvrTest { private HdmiDeviceInfo mDeviceInfoForTests; private Context mContextSpy; private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; private ArcTerminationActionFromAvr mAction; private HdmiCecController mHdmiCecController; private HdmiControlService mHdmiControlService; private FakeNativeWrapper mNativeWrapper; private TestLooper mTestLooper = new TestLooper(); private boolean mSendCecCommandSuccess; private boolean mShouldDispatchReportArcTerminated; private Instrumentation mInstrumentation; @Nullable private Boolean mArcEnabled = null; private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Mock private AudioManager mAudioManager; @Before public void setUp() { mDeviceInfoForTests = new HdmiDeviceInfo(1000, 1); public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mInstrumentation = InstrumentationRegistry.getInstrumentation(); PowerManager powerManager = new PowerManager(mContextSpy, mIPowerManagerMock, mIThermalServiceMock, new Handler(mTestLooper.getLooper())); when(mContextSpy.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager); when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager); when(mIPowerManagerMock.isInteractive()).thenReturn(true); HdmiControlService hdmiControlService = new HdmiControlService(mInstrumentation.getTargetContext()) { mHdmiControlService = new HdmiControlService(mContextSpy) { @Override void sendCecCommand( HdmiCecMessage command, @Nullable SendMessageCallback callback) { switch (command.getOpcode()) { case Constants.MESSAGE_TERMINATE_ARC: if (callback != null) { callback.onSendCompleted( mSendCecCommandSuccess ? SendMessageResult.SUCCESS : SendMessageResult.NACK); void wakeUp() { } if (mShouldDispatchReportArcTerminated) { mHdmiCecLocalDeviceAudioSystem.dispatchMessage( HdmiCecMessageBuilder.buildReportArcTerminated( Constants.ADDR_TV, mHdmiCecLocalDeviceAudioSystem.mAddress)); } break; default: throw new IllegalArgumentException("Unexpected message"); @Override PowerManager getPowerManager() { return powerManager; } @Override AudioManager getAudioManager() { return mAudioManager; } @Override Loading @@ -97,55 +111,71 @@ public class ArcTerminationActionFromAvrTest { } }; mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(hdmiControlService) { @Override HdmiDeviceInfo getDeviceInfo() { return mDeviceInfoForTests; } Looper looper = mTestLooper.getLooper(); mHdmiControlService.setIoLooper(looper); mNativeWrapper = new FakeNativeWrapper(); mHdmiCecController = HdmiCecController.createWithNativeWrapper(this.mHdmiControlService, mNativeWrapper); mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService)); mHdmiControlService.initPortInfo(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { @Override void setArcStatus(boolean enabled) { mArcEnabled = enabled; protected void setPreferredAddress(int addr) { } }; mHdmiCecLocalDeviceAudioSystem.init(); Looper looper = mTestLooper.getLooper(); hdmiControlService.setIoLooper(looper); mAction = new ArcTerminationActionFromAvr(mHdmiCecLocalDeviceAudioSystem); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiCecLocalDeviceAudioSystem.setArcStatus(true); mTestLooper.dispatchAll(); } @Test @Ignore("b/120845532") public void testSendMessage_notSuccess() { mSendCecCommandSuccess = false; mShouldDispatchReportArcTerminated = false; public void testSendMessage_sendFailed() { mNativeWrapper.setMessageSendResult(Constants.MESSAGE_TERMINATE_ARC, SendMessageResult.NACK); mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); assertThat(mArcEnabled).isNull(); HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } @Test public void testReportArcTerminated_notReceived() { mSendCecCommandSuccess = true; mShouldDispatchReportArcTerminated = false; public void testReportArcTerminated_timeout() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.moveTimeForward(1000); mTestLooper.dispatchAll(); assertThat(mArcEnabled).isNull(); HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue(); } @Test public void testReportArcTerminated_received() { mSendCecCommandSuccess = true; mShouldDispatchReportArcTerminated = true; mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); mTestLooper.moveTimeForward(1000); assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); HdmiCecMessage arcTerminatedResponse = HdmiCecMessageBuilder.buildReportArcTerminated( Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM); mHdmiControlService.handleCecCommand(arcTerminatedResponse); mTestLooper.dispatchAll(); assertThat(mArcEnabled).isFalse(); assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } }
services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java +9 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.server.hdmi.HdmiCecController.NativeWrapper; import com.google.common.collect.Iterables; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** Fake {@link NativeWrapper} useful for testing. */ Loading @@ -48,6 +49,7 @@ final class FakeNativeWrapper implements NativeWrapper { }; private final List<HdmiCecMessage> mResultMessages = new ArrayList<>(); private final HashMap<Integer, Integer> mMessageSendResult = new HashMap<>(); private int mMyPhysicalAddress = 0; private HdmiPortInfo[] mHdmiPortInfo = null; Loading @@ -65,9 +67,10 @@ final class FakeNativeWrapper implements NativeWrapper { if (body.length == 0) { return mPollAddressResponse[dstAddress]; } else { mResultMessages.add(HdmiCecMessageBuilder.of(srcAddress, dstAddress, body)); HdmiCecMessage message = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body); mResultMessages.add(message); return mMessageSendResult.getOrDefault(message.getOpcode(), SendMessageResult.SUCCESS); } return SendMessageResult.SUCCESS; } @Override Loading Loading @@ -132,6 +135,10 @@ final class FakeNativeWrapper implements NativeWrapper { mPollAddressResponse[logicalAddress] = response; } public void setMessageSendResult(int opcode, int result) { mMessageSendResult.put(opcode, result); } @VisibleForTesting protected void setPhysicalAddress(int physicalAddress) { mMyPhysicalAddress = physicalAddress; Loading