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

Commit c59cb7b1 authored by Sungsoo Lim's avatar Sungsoo Lim
Browse files

Add HfpNativeInterfaceTest

Bug: 237467631
Test: atest BluetoothInsrumentationTests:HfpNativeInterfaceTest
Change-Id: I8f24ef776a0e89a46b8736767e74d04552385371
parent 4e0b17f4
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -248,7 +248,13 @@ public class AdapterService extends Service {
        return sAdapterService;
    }

    private static synchronized void setAdapterService(AdapterService instance) {
    /**
     * Sets AdapterService for testing.
     *
     * @hide
     */
    @VisibleForTesting
    public static synchronized void setAdapterService(AdapterService instance) {
        Log.d(TAG, "setAdapterService() - trying to set service to " + instance);
        if (instance == null) {
            return;
+44 −22
Original line number Diff line number Diff line
@@ -330,7 +330,8 @@ public class NativeInterface {

    // Callbacks from the native back into the java framework. All callbacks are routed via the
    // Service which will disambiguate which state machine the message should be routed through.
    private void onConnectionStateChanged(int state, int peerFeat, int chldFeat, byte[] address) {
    @VisibleForTesting
    void onConnectionStateChanged(int state, int peerFeat, int chldFeat, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED);
        event.valueInt = state;
        event.valueInt2 = peerFeat;
@@ -349,7 +350,8 @@ public class NativeInterface {
        }
    }

    private void onAudioStateChanged(int state, byte[] address) {
    @VisibleForTesting
    void onAudioStateChanged(int state, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED);
        event.valueInt = state;
        event.device = getDevice(address);
@@ -365,7 +367,8 @@ public class NativeInterface {
        }
    }

    private void onVrStateChanged(int state, byte[] address) {
    @VisibleForTesting
    void onVrStateChanged(int state, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_VR_STATE_CHANGED);
        event.valueInt = state;
        event.device = getDevice(address);
@@ -382,7 +385,8 @@ public class NativeInterface {
        }
    }

    private void onNetworkState(int state, byte[] address) {
    @VisibleForTesting
    void onNetworkState(int state, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_NETWORK_STATE);
        event.valueInt = state;
        event.device = getDevice(address);
@@ -400,7 +404,8 @@ public class NativeInterface {
        }
    }

    private void onNetworkRoaming(int state, byte[] address) {
    @VisibleForTesting
    void onNetworkRoaming(int state, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_ROAMING_STATE);
        event.valueInt = state;
        event.device = getDevice(address);
@@ -416,7 +421,8 @@ public class NativeInterface {
        }
    }

    private void onNetworkSignal(int signal, byte[] address) {
    @VisibleForTesting
    void onNetworkSignal(int signal, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_NETWORK_SIGNAL);
        event.valueInt = signal;
        event.device = getDevice(address);
@@ -431,7 +437,8 @@ public class NativeInterface {
        }
    }

    private void onBatteryLevel(int level, byte[] address) {
    @VisibleForTesting
    void onBatteryLevel(int level, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_BATTERY_LEVEL);
        event.valueInt = level;
        event.device = getDevice(address);
@@ -446,7 +453,8 @@ public class NativeInterface {
        }
    }

    private void onCurrentOperator(String name, byte[] address) {
    @VisibleForTesting
    void onCurrentOperator(String name, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_OPERATOR_NAME);
        event.valueString = name;
        event.device = getDevice(address);
@@ -462,7 +470,8 @@ public class NativeInterface {
        }
    }

    private void onCall(int call, byte[] address) {
    @VisibleForTesting
    void onCall(int call, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALL);
        event.valueInt = call;
        event.device = getDevice(address);
@@ -486,7 +495,8 @@ public class NativeInterface {
     * 2 - Outgoing call process ongoing
     * 3 - Remote party being alerted for outgoing call
     */
    private void onCallSetup(int callsetup, byte[] address) {
    @VisibleForTesting
    void onCallSetup(int callsetup, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALLSETUP);
        event.valueInt = callsetup;
        event.device = getDevice(address);
@@ -511,7 +521,8 @@ public class NativeInterface {
     * call)
     * 2 - Call on hold, no active call
     */
    private void onCallHeld(int callheld, byte[] address) {
    @VisibleForTesting
    void onCallHeld(int callheld, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALLHELD);
        event.valueInt = callheld;
        event.device = getDevice(address);
@@ -526,7 +537,8 @@ public class NativeInterface {
        }
    }

    private void onRespAndHold(int respAndHold, byte[] address) {
    @VisibleForTesting
    void onRespAndHold(int respAndHold, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_RESP_AND_HOLD);
        event.valueInt = respAndHold;
        event.device = getDevice(address);
@@ -541,7 +553,8 @@ public class NativeInterface {
        }
    }

    private void onClip(String number, byte[] address) {
    @VisibleForTesting
    void onClip(String number, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CLIP);
        event.valueString = number;
        event.device = getDevice(address);
@@ -556,7 +569,8 @@ public class NativeInterface {
        }
    }

    private void onCallWaiting(String number, byte[] address) {
    @VisibleForTesting
    void onCallWaiting(String number, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CALL_WAITING);
        event.valueString = number;
        event.device = getDevice(address);
@@ -571,7 +585,8 @@ public class NativeInterface {
        }
    }

    private void onCurrentCalls(int index, int dir, int state, int mparty, String number,
    @VisibleForTesting
    void onCurrentCalls(int index, int dir, int state, int mparty, String number,
            byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CURRENT_CALLS);
        event.valueInt = index;
@@ -591,7 +606,8 @@ public class NativeInterface {
        }
    }

    private void onVolumeChange(int type, int volume, byte[] address) {
    @VisibleForTesting
    void onVolumeChange(int type, int volume, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_VOLUME_CHANGED);
        event.valueInt = type;
        event.valueInt2 = volume;
@@ -607,7 +623,8 @@ public class NativeInterface {
        }
    }

    private void onCmdResult(int type, int cme, byte[] address) {
    @VisibleForTesting
    void onCmdResult(int type, int cme, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_CMD_RESULT);
        event.valueInt = type;
        event.valueInt2 = cme;
@@ -623,7 +640,8 @@ public class NativeInterface {
        }
    }

    private void onSubscriberInfo(String number, int type, byte[] address) {
    @VisibleForTesting
    void onSubscriberInfo(String number, int type, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_SUBSCRIBER_INFO);
        event.valueInt = type;
        event.valueString = number;
@@ -640,7 +658,8 @@ public class NativeInterface {
        }
    }

    private void onInBandRing(int inBand, byte[] address) {
    @VisibleForTesting
    void onInBandRing(int inBand, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_IN_BAND_RINGTONE);
        event.valueInt = inBand;
        event.device = getDevice(address);
@@ -656,11 +675,13 @@ public class NativeInterface {
        }
    }

    private void onLastVoiceTagNumber(String number, byte[] address) {
    @VisibleForTesting
    void onLastVoiceTagNumber(String number, byte[] address) {
        Log.w(TAG, "onLastVoiceTagNumber not supported");
    }

    private void onRingIndication(byte[] address) {
    @VisibleForTesting
    void onRingIndication(byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_RING_INDICATION);
        event.device = getDevice(address);
        if (DBG) {
@@ -675,7 +696,8 @@ public class NativeInterface {
        }
    }

    private void onUnknownEvent(String eventString, byte[] address) {
    @VisibleForTesting
    void onUnknownEvent(String eventString, byte[] address) {
        StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_UNKNOWN_EVENT);
        event.device = getDevice(address);
        event.valueString = eventString;
+310 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 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.bluetooth.hfpclient;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.android.bluetooth.btservice.AdapterService;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class HfpNativeInterfaceTest {
    private static final byte[] TEST_DEVICE_ADDRESS =
            new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    @Mock
    HeadsetClientService mService;
    @Mock
    AdapterService mAdapterService;

    private NativeInterface mNativeInterface;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        when(mService.isAvailable()).thenReturn(true);
        HeadsetClientService.setHeadsetClientService(mService);
        AdapterService.setAdapterService(mAdapterService);
        mNativeInterface = NativeInterface.getInstance();
    }

    @After
    public void tearDown() {
        HeadsetClientService.setHeadsetClientService(null);
        AdapterService.setAdapterService(null);
    }

    @Test
    public void onConnectionStateChanged() {
        int state = HeadsetClientHalConstants.CONNECTION_STATE_CONNECTED;
        int peerFeat = HeadsetClientHalConstants.PEER_FEAT_HF_IND;
        int chldFeat = HeadsetClientHalConstants.PEER_FEAT_ECS;
        mNativeInterface.onConnectionStateChanged(state, peerFeat, chldFeat, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED);
        assertThat(event.getValue().valueInt).isEqualTo(state);
        assertThat(event.getValue().valueInt2).isEqualTo(peerFeat);
        assertThat(event.getValue().valueInt3).isEqualTo(chldFeat);
    }

    @Test
    public void onAudioStateChanged() {
        int state = HeadsetClientHalConstants.AUDIO_STATE_DISCONNECTED;
        mNativeInterface.onAudioStateChanged(state, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED);
        assertThat(event.getValue().valueInt).isEqualTo(state);
    }

    @Test
    public void onVrStateChanged() {
        int state = 1;
        mNativeInterface.onVrStateChanged(state, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_VR_STATE_CHANGED);
        assertThat(event.getValue().valueInt).isEqualTo(state);
    }

    @Test
    public void onNetworkState() {
        int state = HeadsetClientHalConstants.NETWORK_STATE_NOT_AVAILABLE;
        mNativeInterface.onNetworkState(state, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_NETWORK_STATE);
        assertThat(event.getValue().valueInt).isEqualTo(state);
    }

    @Test
    public void onNetworkRoaming() {
        int state = HeadsetClientHalConstants.SERVICE_TYPE_ROAMING;
        mNativeInterface.onNetworkRoaming(state, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_ROAMING_STATE);
        assertThat(event.getValue().valueInt).isEqualTo(state);
    }

    @Test
    public void onNetworkSignal() {
        int signal = 3;
        mNativeInterface.onNetworkSignal(signal, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_NETWORK_SIGNAL);
        assertThat(event.getValue().valueInt).isEqualTo(signal);
    }

    @Test
    public void onBatteryLevel() {
        int level = 15;
        mNativeInterface.onBatteryLevel(level, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_BATTERY_LEVEL);
        assertThat(event.getValue().valueInt).isEqualTo(level);
    }

    @Test
    public void onCurrentOperator() {
        String name = "test";
        mNativeInterface.onCurrentOperator(name, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_OPERATOR_NAME);
        assertThat(event.getValue().valueString).isEqualTo(name);
    }

    @Test
    public void onCall() {
        int call = 1;
        mNativeInterface.onCall(call, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CALL);
        assertThat(event.getValue().valueInt).isEqualTo(call);
    }

    @Test
    public void onCallSetup() {
        int callsetup = 1;
        mNativeInterface.onCallSetup(callsetup, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CALLSETUP);
        assertThat(event.getValue().valueInt).isEqualTo(callsetup);
    }

    @Test
    public void onCallHeld() {
        int callheld = 1;
        mNativeInterface.onCallSetup(callheld, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CALLSETUP);
        assertThat(event.getValue().valueInt).isEqualTo(callheld);
    }

    @Test
    public void onRespAndHold() {
        int respAndHold = 1;
        mNativeInterface.onRespAndHold(respAndHold, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_RESP_AND_HOLD);
        assertThat(event.getValue().valueInt).isEqualTo(respAndHold);
    }

    @Test
    public void onClip() {
        String number = "000-000-0000";
        mNativeInterface.onClip(number, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CLIP);
        assertThat(event.getValue().valueString).isEqualTo(number);
    }

    @Test
    public void onCallWaiting() {
        String number = "000-000-0000";
        mNativeInterface.onCallWaiting(number, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CALL_WAITING);
        assertThat(event.getValue().valueString).isEqualTo(number);
    }

    @Test
    public void onCurrentCalls() {
        int index = 2;
        int dir = HeadsetClientHalConstants.CALL_DIRECTION_OUTGOING;
        int state = HfpClientCall.CALL_STATE_WAITING;
        int mparty = HeadsetClientHalConstants.CALL_MPTY_TYPE_MULTI;
        String number = "000-000-0000";
        mNativeInterface.onCurrentCalls(index, dir, state, mparty, number, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CURRENT_CALLS);
        assertThat(event.getValue().valueInt).isEqualTo(index);
        assertThat(event.getValue().valueInt2).isEqualTo(dir);
        assertThat(event.getValue().valueInt3).isEqualTo(state);
        assertThat(event.getValue().valueInt4).isEqualTo(mparty);
        assertThat(event.getValue().valueString).isEqualTo(number);
    }

    @Test
    public void onVolumeChange() {
        int type = HeadsetClientHalConstants.VOLUME_TYPE_SPK;
        int volume = 10;
        mNativeInterface.onVolumeChange(type, volume, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_VOLUME_CHANGED);
        assertThat(event.getValue().valueInt).isEqualTo(type);
        assertThat(event.getValue().valueInt2).isEqualTo(volume);
    }

    @Test
    public void onCmdResult() {
        int type = HeadsetClientStateMachine.AT_OK;
        int cme = 10;
        mNativeInterface.onCmdResult(type, cme, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_CMD_RESULT);
        assertThat(event.getValue().valueInt).isEqualTo(type);
        assertThat(event.getValue().valueInt2).isEqualTo(cme);
    }

    @Test
    public void onSubscriberInfo() {
        String number = "000-000-0000";
        int type = 5;
        mNativeInterface.onSubscriberInfo(number, type, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_SUBSCRIBER_INFO);
        assertThat(event.getValue().valueString).isEqualTo(number);
    }

    @Test
    public void onInBandRing() {
        int inBand = 1;
        mNativeInterface.onInBandRing(inBand, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_IN_BAND_RINGTONE);
        assertThat(event.getValue().valueInt).isEqualTo(inBand);
    }

    @Test
    // onLastVoiceTagNumber is not supported.
    public void onLastVoiceTagNumber_doesNotCrash() {
        String number = "000-000-0000";
        mNativeInterface.onLastVoiceTagNumber(number, TEST_DEVICE_ADDRESS);
    }

    @Test
    public void onRingIndication() {
        mNativeInterface.onRingIndication(TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_RING_INDICATION);
    }

    @Test
    public void onUnknownEvent() {
        String eventString = "unknown";
        mNativeInterface.onUnknownEvent(eventString, TEST_DEVICE_ADDRESS);

        ArgumentCaptor<StackEvent> event = ArgumentCaptor.forClass(StackEvent.class);
        verify(mService).messageFromNative(event.capture());
        assertThat(event.getValue().type).isEqualTo(StackEvent.EVENT_TYPE_UNKNOWN_EVENT);
        assertThat(event.getValue().valueString).isEqualTo(eventString);
    }
}