LOCAL_JAVA_LIBRARIES := \
android.hidl.manager-V1.0-java \
+ android.hardware.tv.cec-V1.0-java \
android.test.mock \
android.test.base android.test.runner \
--- /dev/null
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.hdmi;
+
+import android.hardware.hdmi.HdmiPortInfo;
+import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.os.MessageQueue;
+import com.android.server.hdmi.HdmiCecController.NativeWrapper;
+
+/** Fake {@link NativeWrapper} useful for testing. */
+final class FakeNativeWrapper implements NativeWrapper {
+ private final int[] mPollAddressResponse =
+ new int[] {
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ SendMessageResult.NACK,
+ };
+
+ private HdmiCecMessage mResultMessage;
+
+ @Override
+ public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
+ return 1L;
+ }
+
+ @Override
+ public int nativeSendCecCommand(
+ long controllerPtr, int srcAddress, int dstAddress, byte[] body) {
+ if (body.length == 0) {
+ return mPollAddressResponse[dstAddress];
+ } else {
+ mResultMessage = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body);
+ }
+ return SendMessageResult.SUCCESS;
+ }
+
+ @Override
+ public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
+ return 0;
+ }
+
+ @Override
+ public void nativeClearLogicalAddress(long controllerPtr) {}
+
+ @Override
+ public int nativeGetPhysicalAddress(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVersion(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVendorId(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
+ HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1];
+ hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000, true, true, true);
+ return hdmiPortInfo;
+ }
+
+ @Override
+ public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {}
+
+ @Override
+ public void nativeSetLanguage(long controllerPtr, String language) {}
+
+ @Override
+ public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {}
+
+ @Override
+ public boolean nativeIsConnected(long controllerPtr, int port) {
+ return false;
+ }
+
+ public HdmiCecMessage getResultMessage() {
+ return mResultMessage;
+ }
+
+ public void setPollAddressResponse(int logicalAddress, int response) {
+ mPollAddressResponse[logicalAddress] = response;
+ }
+}
import android.content.Context;
import android.hardware.hdmi.HdmiPortInfo;
+import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.test.TestLooper;
@RunWith(JUnit4.class)
public class HdmiCecControllerTest {
- private static final class NativeWrapperImpl implements NativeWrapper {
-
- @Override
- public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
- return 1L;
- }
-
- @Override
- public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
- byte[] body) {
- return mOccupied[srcAddress] ? 0 : 1;
- }
-
- @Override
- public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
- return 0;
- }
-
- @Override
- public void nativeClearLogicalAddress(long controllerPtr) {
-
- }
-
- @Override
- public int nativeGetPhysicalAddress(long controllerPtr) {
- return 0;
- }
-
- @Override
- public int nativeGetVersion(long controllerPtr) {
- return 0;
- }
-
- @Override
- public int nativeGetVendorId(long controllerPtr) {
- return 0;
- }
-
- @Override
- public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
- return new HdmiPortInfo[0];
- }
-
- @Override
- public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
-
- }
-
- @Override
- public void nativeSetLanguage(long controllerPtr, String language) {
-
- }
-
- @Override
- public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
-
- }
-
- @Override
- public boolean nativeIsConnected(long controllerPtr, int port) {
- return false;
- }
- }
+ private FakeNativeWrapper mNativeWrapper;
private class MyHdmiControlService extends HdmiControlService {
}
}
- private static final String TAG = HdmiCecControllerTest.class.getSimpleName();
private HdmiControlService mHdmiControlService;
private HdmiCecController mHdmiCecController;
- private static boolean[] mOccupied = new boolean[15];
private int mLogicalAddress = 16;
private AllocateAddressCallback mCallback = new AllocateAddressCallback() {
@Override
mMyLooper = mTestLooper.getLooper();
mMyLooper = mTestLooper.getLooper();
mHdmiControlService = new MyHdmiControlService(null);
+ mNativeWrapper = new FakeNativeWrapper();
mHdmiCecController = HdmiCecController.createWithNativeWrapper(
- mHdmiControlService, new NativeWrapperImpl());
+ mHdmiControlService, mNativeWrapper);
}
/**
*/
@Test
public void testAllocatLogicalAddress_TvDevicePreferredNotOcupied() {
- mOccupied[ADDR_TV] = false;
- mOccupied[ADDR_SPECIFIC_USE] = false;
mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_TV, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_TV, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_TvDeviceNonPreferredNotOcupied() {
- mOccupied[ADDR_TV] = false;
- mOccupied[ADDR_SPECIFIC_USE] = false;
+
mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_TV, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_TvDeviceNonPreferredFirstOcupied() {
- mOccupied[ADDR_TV] = true;
- mOccupied[ADDR_SPECIFIC_USE] = false;
+ mNativeWrapper.setPollAddressResponse(ADDR_TV, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_SPECIFIC_USE, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_TvDeviceNonPreferredAllOcupied() {
- mOccupied[ADDR_TV] = true;
- mOccupied[ADDR_SPECIFIC_USE] = true;
+ mNativeWrapper.setPollAddressResponse(ADDR_TV, SendMessageResult.SUCCESS);
+ mNativeWrapper.setPollAddressResponse(ADDR_SPECIFIC_USE, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_AudioSystemNonPreferredNotOcupied() {
- mOccupied[ADDR_AUDIO_SYSTEM] = false;
mHdmiCecController.allocateLogicalAddress(
DEVICE_AUDIO_SYSTEM, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
@Test
public void testAllocatLogicalAddress_AudioSystemNonPreferredAllOcupied() {
- mOccupied[ADDR_AUDIO_SYSTEM] = true;
+ mNativeWrapper.setPollAddressResponse(ADDR_AUDIO_SYSTEM, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(
DEVICE_AUDIO_SYSTEM, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
@Test
public void testAllocatLogicalAddress_PlaybackPreferredNotOccupied() {
- mOccupied[ADDR_PLAYBACK_1] = false;
- mOccupied[ADDR_PLAYBACK_2] = false;
- mOccupied[ADDR_PLAYBACK_3] = false;
mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_PLAYBACK_1, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_PLAYBACK_1, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_PlaybackPreferredOcuppied() {
- mOccupied[ADDR_PLAYBACK_1] = true;
- mOccupied[ADDR_PLAYBACK_2] = false;
- mOccupied[ADDR_PLAYBACK_3] = false;
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(
DEVICE_PLAYBACK, ADDR_PLAYBACK_1, mCallback);
mTestLooper.dispatchAll();
@Test
public void testAllocatLogicalAddress_PlaybackNoPreferredNotOcuppied() {
- mOccupied[ADDR_PLAYBACK_1] = false;
- mOccupied[ADDR_PLAYBACK_2] = false;
- mOccupied[ADDR_PLAYBACK_3] = false;
mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_PLAYBACK_1, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_PlaybackNoPreferredFirstOcuppied() {
- mOccupied[ADDR_PLAYBACK_1] = true;
- mOccupied[ADDR_PLAYBACK_2] = false;
- mOccupied[ADDR_PLAYBACK_3] = false;
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_PLAYBACK_2, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_PlaybackNonPreferredFirstTwoOcuppied() {
- mOccupied[ADDR_PLAYBACK_1] = true;
- mOccupied[ADDR_PLAYBACK_2] = true;
- mOccupied[ADDR_PLAYBACK_3] = false;
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_2, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_PLAYBACK_3, mLogicalAddress);
@Test
public void testAllocatLogicalAddress_PlaybackNonPreferredAllOcupied() {
- mOccupied[ADDR_PLAYBACK_1] = true;
- mOccupied[ADDR_PLAYBACK_2] = true;
- mOccupied[ADDR_PLAYBACK_3] = true;
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_2, SendMessageResult.SUCCESS);
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_3, SendMessageResult.SUCCESS);
mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll();
assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertEquals;
-import android.hardware.hdmi.HdmiPortInfo;
import android.media.AudioManager;
import android.os.Looper;
-import android.os.MessageQueue;
import android.os.test.TestLooper;
import android.support.test.filters.SmallTest;
-import com.android.server.hdmi.HdmiCecController.NativeWrapper;
-import java.util.Arrays;
+
import java.util.ArrayList;
import org.junit.Before;
import org.junit.Test;
*/
public class HdmiCecLocalDeviceAudioSystemTest {
- private static final class NativeWrapperImpl implements NativeWrapper {
-
- private HdmiCecMessage mResultMessage;
-
- @Override
- public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
- return 1L;
- }
-
- @Override
- public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
- byte[] body) {
- if (body.length != 0) {
- mResultMessage = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body);
- }
- return 1;
- }
-
- @Override
- public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
- return 0;
- }
-
- @Override
- public void nativeClearLogicalAddress(long controllerPtr) {
-
- }
-
- @Override
- public int nativeGetPhysicalAddress(long controllerPtr) {
- return 0;
- }
-
- @Override
- public int nativeGetVersion(long controllerPtr) {
- return 0;
- }
-
- @Override
- public int nativeGetVendorId(long controllerPtr) {
- return 0;
- }
-
- @Override
- public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
- HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1];
- hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000,true, true, true);
- return hdmiPortInfo;
- }
-
- @Override
- public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
-
- }
-
- @Override
- public void nativeSetLanguage(long controllerPtr, String language) {
-
- }
-
- @Override
- public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
-
- }
-
- @Override
- public boolean nativeIsConnected(long controllerPtr, int port) {
- return false;
- }
-
- public HdmiCecMessage getResultMessage() {
- return mResultMessage;
- }
- }
-
private HdmiControlService mHdmiControlService;
private HdmiCecController mHdmiCecController;
private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
- private NativeWrapperImpl mNativeWrapper;
+ private FakeNativeWrapper mNativeWrapper;
private Looper mMyLooper;
private TestLooper mTestLooper = new TestLooper();
private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
mHdmiCecLocalDeviceAudioSystem.init();
mHdmiControlService.setIoLooper(mMyLooper);
- mNativeWrapper = new NativeWrapperImpl();
+ mNativeWrapper = new FakeNativeWrapper();
mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlService, mNativeWrapper);
mHdmiControlService.setCecController(mHdmiCecController);
*/
public class HdmiCecLocalDeviceTest {
- private static final class NativeWrapperImpl implements NativeWrapper {
-
- @Override
- public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
- return 1L;
- }
-
- @Override
- public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
- byte[] body) {
- return SendCecCommandFactory(srcAddress, dstAddress, body);
- }
-
- @Override
- public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
- return 0;
- }
-
- @Override
- public void nativeClearLogicalAddress(long controllerPtr) {
-
- }
-
- @Override
- public int nativeGetPhysicalAddress(long controllerPtr) {
- return mPhysicalAddr;
- }
-
- @Override
- public int nativeGetVersion(long controllerPtr) {
- return 0;
- }
-
- @Override
- public int nativeGetVendorId(long controllerPtr) {
- return 0;
- }
-
- @Override
- public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
- return new HdmiPortInfo[0];
- }
-
- @Override
- public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
-
- }
-
- @Override
- public void nativeSetLanguage(long controllerPtr, String language) {
-
- }
-
- @Override
- public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
-
- }
-
- @Override
- public boolean nativeIsConnected(long controllerPtr, int port) {
- return false;
- }
- }
private static int SendCecCommandFactory(int srcAddress, int dstAddress, byte[] body) {
switch(body[0] & 0xFF) {
mHdmiControlService = new HdmiControlService(null);
mHdmiControlService.setIoLooper(mTestLooper.getLooper());
mHdmiCecController = HdmiCecController.createWithNativeWrapper(
- mHdmiControlService, new NativeWrapperImpl());
+ mHdmiControlService, new FakeNativeWrapper());
mHdmiControlService.setCecController(mHdmiCecController);
mHdmiLocalDevice = new MyHdmiCecLocalDevice(
mHdmiControlService, DEVICE_TV);