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

Commit 1e1e125d authored by Hyundo Moon's avatar Hyundo Moon
Browse files

Add MnsObexServerTest

Bug: 237467631
Test: atest MnsObexServerTest
Change-Id: Ib73845a9ec30cb424d359892cb055a58f5d7355e
parent 605153ab
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.util.Log;

import com.android.bluetooth.ObexAppParameters;
import com.android.bluetooth.ObexServerSockets;
import com.android.internal.annotations.VisibleForTesting;
import com.android.obex.HeaderSet;
import com.android.obex.Operation;
import com.android.obex.ResponseCodes;
@@ -34,7 +35,8 @@ class MnsObexServer extends ServerRequestHandler {
    private static final String TAG = "MnsObexServer";
    private static final boolean VDBG = MapClientService.VDBG;

    private static final byte[] MNS_TARGET = new byte[]{
    @VisibleForTesting
    static final byte[] MNS_TARGET = new byte[]{
            (byte) 0xbb,
            0x58,
            0x2b,
@@ -53,7 +55,8 @@ class MnsObexServer extends ServerRequestHandler {
            0x66
    };

    private static final String TYPE = "x-bt/MAP-event-report";
    @VisibleForTesting
    static final String TYPE = "x-bt/MAP-event-report";

    private final WeakReference<MceStateMachine> mStateMachineReference;
    private final ObexServerSockets mObexServerSockets;
+169 −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.mapclient;

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

import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import android.os.Handler;

import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.obex.HeaderSet;
import com.android.obex.Operation;
import com.android.obex.ResponseCodes;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class MnsObexServerTest {

    @Mock
    MceStateMachine mStateMachine;

    MnsObexServer mServer;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mServer = new MnsObexServer(mStateMachine, null);
    }

    @Test
    public void onConnect_whenUuidIsWrong() {
        byte[] wrongUuid = new byte[]{};
        HeaderSet request = new HeaderSet();
        request.setHeader(HeaderSet.TARGET, wrongUuid);
        HeaderSet reply = new HeaderSet();

        assertThat(mServer.onConnect(request, reply))
                .isEqualTo(ResponseCodes.OBEX_HTTP_NOT_ACCEPTABLE);
    }

    @Test
    public void onConnect_withCorrectUuid() throws Exception {
        HeaderSet request = new HeaderSet();
        request.setHeader(HeaderSet.TARGET, MnsObexServer.MNS_TARGET);
        HeaderSet reply = new HeaderSet();

        assertThat(mServer.onConnect(request, reply)).isEqualTo(ResponseCodes.OBEX_HTTP_OK);
        assertThat(reply.getHeader(HeaderSet.WHO)).isEqualTo(MnsObexServer.MNS_TARGET);
    }

    @Test
    public void onDisconnect_callsStateMachineDisconnect() {
        HeaderSet request = new HeaderSet();
        HeaderSet reply = new HeaderSet();

        mServer.onDisconnect(request, reply);

        verify(mStateMachine).disconnect();
    }

    @Test
    public void onGet_returnsBadRequest() {
        Operation op = mock(Operation.class);

        assertThat(mServer.onGet(op)).isEqualTo(ResponseCodes.OBEX_HTTP_BAD_REQUEST);
    }

    @Test
    public void onPut_whenTypeIsInvalid_returnsBadRequest() throws Exception {
        HeaderSet headerSet = new HeaderSet();
        headerSet.setHeader(HeaderSet.TYPE, "some_invalid_type");
        Operation op = mock(Operation.class);
        when(op.getReceivedHeader()).thenReturn(headerSet);

        assertThat(mServer.onPut(op)).isEqualTo(ResponseCodes.OBEX_HTTP_BAD_REQUEST);
    }

    @Test
    public void onPut_whenHeaderSetIsValid_returnsOk() throws Exception {
        final StringBuilder xml = new StringBuilder();
        xml.append("<event\n");
        xml.append("    type=\"test_type\"\n");
        xml.append("    handle=\"FFAB\"\n");
        xml.append("    folder=\"test_folder\"\n");
        xml.append("    old_folder=\"test_old_folder\"\n");
        xml.append("    msg_type=\"MMS\"\n");
        xml.append("/>\n");
        DataInputStream stream = new DataInputStream(
                new ByteArrayInputStream(xml.toString().getBytes()));

        byte[] applicationParameter = new byte[] {
                Request.OAP_TAGID_MAS_INSTANCE_ID,
                1, // length in byte
                (byte) 55
        };

        HeaderSet headerSet = new HeaderSet();
        headerSet.setHeader(HeaderSet.TYPE, MnsObexServer.TYPE);
        headerSet.setHeader(HeaderSet.APPLICATION_PARAMETER, applicationParameter);

        Operation op = mock(Operation.class);
        when(op.getReceivedHeader()).thenReturn(headerSet);
        when(op.openDataInputStream()).thenReturn(stream);

        assertThat(mServer.onPut(op)).isEqualTo(ResponseCodes.OBEX_HTTP_OK);

        verify(mStateMachine).receiveEvent(any());
    }

    @Test
    public void onAbort_returnsNotImplemented() {
        HeaderSet request = new HeaderSet();
        HeaderSet reply = new HeaderSet();

        assertThat(mServer.onAbort(request, reply))
                .isEqualTo(ResponseCodes.OBEX_HTTP_NOT_IMPLEMENTED);
    }

    @Test
    public void onSetPath_returnsBadRequest() {
        HeaderSet request = new HeaderSet();
        HeaderSet reply = new HeaderSet();

        assertThat(mServer.onSetPath(request, reply, false, false))
                .isEqualTo(ResponseCodes.OBEX_HTTP_BAD_REQUEST);
    }

    @Test
    public void onClose_doesNotCrash() {
        mServer.onClose();
    }
}