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

Commit 7206f3b9 authored by Nick Chalko's avatar Nick Chalko
Browse files

Extract a FakeNativeWrapper to share between tests

Change-Id: I666496132e0dcbd4b0d36eb87fc06a99f306ca93
Test: atest FrameworksServicesTests:com.android.server.hdmi
(cherry picked from commit f19f1d9f0404586945ba1492ed2d9af172fce761)
parent 7acf09e4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ LOCAL_SRC_FILES += $(call all-java-files-under, test-apps/SuspendTestApp/src)

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 \

+113 −0
Original line number Diff line number Diff line
/*
 * 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;
    }
}
+16 −94
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package com.android.server.hdmi;

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;
@@ -48,69 +49,7 @@ import org.junit.runners.JUnit4;
@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 {

@@ -129,10 +68,8 @@ public class HdmiCecControllerTest {
        }
    }

    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
@@ -148,8 +85,9 @@ public class HdmiCecControllerTest {
        mMyLooper = mTestLooper.getLooper();
        mMyLooper = mTestLooper.getLooper();
        mHdmiControlService = new MyHdmiControlService(null);
        mNativeWrapper = new FakeNativeWrapper();
        mHdmiCecController = HdmiCecController.createWithNativeWrapper(
            mHdmiControlService, new NativeWrapperImpl());
            mHdmiControlService, mNativeWrapper);
    }

    /**
@@ -157,8 +95,6 @@ public class HdmiCecControllerTest {
     */
    @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);
@@ -166,8 +102,7 @@ public class HdmiCecControllerTest {

    @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);
@@ -175,8 +110,7 @@ public class HdmiCecControllerTest {

    @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);
@@ -184,8 +118,8 @@ public class HdmiCecControllerTest {

    @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);
@@ -193,7 +127,6 @@ public class HdmiCecControllerTest {

    @Test
    public void testAllocatLogicalAddress_AudioSystemNonPreferredNotOcupied() {
        mOccupied[ADDR_AUDIO_SYSTEM] = false;
        mHdmiCecController.allocateLogicalAddress(
            DEVICE_AUDIO_SYSTEM, ADDR_UNREGISTERED, mCallback);
        mTestLooper.dispatchAll();
@@ -202,7 +135,7 @@ public class HdmiCecControllerTest {

    @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();
@@ -211,9 +144,6 @@ public class HdmiCecControllerTest {

    @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);
@@ -221,9 +151,7 @@ public class HdmiCecControllerTest {

    @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();
@@ -232,9 +160,6 @@ public class HdmiCecControllerTest {

    @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);
@@ -242,9 +167,7 @@ public class HdmiCecControllerTest {

    @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);
@@ -252,9 +175,8 @@ public class HdmiCecControllerTest {

    @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);
@@ -262,9 +184,9 @@ public class HdmiCecControllerTest {

    @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);
+3 −81
Original line number Diff line number Diff line
@@ -23,14 +23,11 @@ import static junit.framework.Assert.assertFalse;
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;
@@ -44,85 +41,10 @@ import org.junit.runners.JUnit4;
 */
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<>();
@@ -186,7 +108,7 @@ public class HdmiCecLocalDeviceAudioSystemTest {
        mHdmiCecLocalDeviceAudioSystem.init();
        mHdmiControlService.setIoLooper(mMyLooper);

        mNativeWrapper = new NativeWrapperImpl();
        mNativeWrapper = new FakeNativeWrapper();
        mHdmiCecController = HdmiCecController.createWithNativeWrapper(
            mHdmiControlService, mNativeWrapper);
        mHdmiControlService.setCecController(mHdmiCecController);
+1 −64
Original line number Diff line number Diff line
@@ -44,69 +44,6 @@ import org.junit.runners.JUnit4;
 */
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) {
@@ -160,7 +97,7 @@ public class HdmiCecLocalDeviceTest {
        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);