From 9e92c76604a59ff7964b57799f7d9f5568745042 Mon Sep 17 00:00:00 2001 From: Marvin Ramin Date: Tue, 15 Sep 2020 15:07:52 +0200 Subject: [PATCH 1/2] Fix and improve ArcInitiationActionFromAvrTest Update test to be more realistic. Un-Ignore a test. Add more tests to cover more cases. Bug: 120845532 Test: atest ArcInitiationActionFromAvrTest Change-Id: I049221e8a2bb5014f30aa3605eca3c225487a576 --- .../hdmi/ArcInitiationActionFromAvrTest.java | 197 +++++++++++------- .../server/hdmi/FakeNativeWrapper.java | 11 +- 2 files changed, 134 insertions(+), 74 deletions(-) diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java index 83df406290856..c0d5f7b5aa9e0 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java @@ -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; @@ -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; @@ -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; @@ -52,58 +60,45 @@ 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 mLocalDevices = new ArrayList<>(); - @Before - public void setUp() { - mDeviceInfoForTests = new HdmiDeviceInfo(1000, 1); + @Mock private IPowerManager mIPowerManagerMock; + @Mock private IThermalService mIThermalServiceMock; + @Mock private AudioManager mAudioManager; - mInstrumentation = InstrumentationRegistry.getInstrumentation(); + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); + + 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()) { - @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)); - } - break; - default: - } - } - + new HdmiControlService(mContextSpy) { @Override boolean isPowerStandby() { return false; } + @Override + void wakeUp() { + } + + @Override + PowerManager getPowerManager() { + return powerManager; + } + + @Override + AudioManager getAudioManager() { + return mAudioManager; + } + @Override boolean isAddressAllocated() { return true; @@ -115,23 +110,11 @@ public class ArcInitiationActionFromAvrTest { } }; - mHdmiCecLocalDeviceAudioSystem = - new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { - @Override - HdmiDeviceInfo getDeviceInfo() { - return mDeviceInfoForTests; - } - - @Override - void setArcStatus(boolean enabled) { - // do nothing - } - - @Override - protected boolean isSystemAudioActivated() { - return true; - } - }; + mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService) { + @Override + protected void setPreferredAddress(int addr) { + } + }; mHdmiCecLocalDeviceAudioSystem.init(); Looper looper = mTestLooper.getLooper(); @@ -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(mNativeWrapper.getResultMessages()).contains(initiateArc); + + assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); + } + + @Test + public void arcInitiation_terminated() { mHdmiCecLocalDeviceAudioSystem.addAndStartAction(mAction); mTestLooper.dispatchAll(); - assertThat(mArcInitSent).isTrue(); - assertThat(mRequestActiveSourceSent).isTrue(); + 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(); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java index 7538468fbe31b..01f0a3d398df0 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java @@ -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. */ @@ -48,6 +49,7 @@ final class FakeNativeWrapper implements NativeWrapper { }; private final List mResultMessages = new ArrayList<>(); + private final HashMap mMessageSendResult = new HashMap<>(); private int mMyPhysicalAddress = 0; private HdmiPortInfo[] mHdmiPortInfo = null; @@ -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 @@ -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; From 82f84a95a03e2d423aa572017c8072ff6260a33d Mon Sep 17 00:00:00 2001 From: Marvin Ramin Date: Tue, 15 Sep 2020 15:09:09 +0200 Subject: [PATCH 2/2] Fix and improve ArcTerminationActionFromAvrTest Update tests to be more realistic and un-ignore an ignored test. Bug: 120845532 Test: atest ArcTerminationActionFromAvrTest Change-Id: I1db699dbab7f3713954c8f3d05032f3127a758a5 --- .../hdmi/ArcTerminationActionFromAvrTest.java | 160 +++++++++++------- 1 file changed, 95 insertions(+), 65 deletions(-) diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java index dc326eefbc9ba..f986a70804f6a 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java @@ -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; @@ -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 @@ -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 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); - mInstrumentation = InstrumentationRegistry.getInstrumentation(); + mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); - HdmiControlService hdmiControlService = - new HdmiControlService(mInstrumentation.getTargetContext()) { + 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(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); - } - if (mShouldDispatchReportArcTerminated) { - mHdmiCecLocalDeviceAudioSystem.dispatchMessage( - HdmiCecMessageBuilder.buildReportArcTerminated( - Constants.ADDR_TV, - mHdmiCecLocalDeviceAudioSystem.mAddress)); - } - break; - default: - throw new IllegalArgumentException("Unexpected message"); - } + void wakeUp() { + } + + @Override + PowerManager getPowerManager() { + return powerManager; + } + + @Override + AudioManager getAudioManager() { + return mAudioManager; } @Override @@ -97,55 +111,71 @@ public class ArcTerminationActionFromAvrTest { } }; - mHdmiCecLocalDeviceAudioSystem = - new HdmiCecLocalDeviceAudioSystem(hdmiControlService) { - @Override - HdmiDeviceInfo getDeviceInfo() { - return mDeviceInfoForTests; - } - - @Override - void setArcStatus(boolean enabled) { - mArcEnabled = enabled; - } - }; - mHdmiCecLocalDeviceAudioSystem.init(); Looper looper = mTestLooper.getLooper(); - hdmiControlService.setIoLooper(looper); + 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 + protected void setPreferredAddress(int addr) { + } + }; + mHdmiCecLocalDeviceAudioSystem.init(); 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.moveTimeForward(1000); mTestLooper.dispatchAll(); - assertThat(mArcEnabled).isFalse(); + HdmiCecMessage terminateArc = HdmiCecMessageBuilder.buildTerminateArc( + Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_TV); + + assertThat(mNativeWrapper.getResultMessages()).contains(terminateArc); + + HdmiCecMessage arcTerminatedResponse = HdmiCecMessageBuilder.buildReportArcTerminated( + Constants.ADDR_TV, Constants.ADDR_AUDIO_SYSTEM); + + mHdmiControlService.handleCecCommand(arcTerminatedResponse); + mTestLooper.dispatchAll(); + + assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse(); } }