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

Commit 2712ed6d authored by hieudz's avatar hieudz Committed by Hieu Dang
Browse files

Add BluetoothOppUtilityTest

Bug: 237467631
Tag: #refactor
Test: atest BluetoothOppUtilityTest
Change-Id: I152976f5bdb473730fc71f27ec3c3471d760fac6
parent 9e292d6d
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -45,9 +45,11 @@ public class BluetoothOppServiceTest {
    private BluetoothOppService mService = null;
    private BluetoothAdapter mAdapter = null;

    @Rule public final ServiceTestRule mServiceRule = new ServiceTestRule();
    @Rule
    public final ServiceTestRule mServiceRule = new ServiceTestRule();

    @Mock private AdapterService mAdapterService;
    @Mock
    private AdapterService mAdapterService;

    @Before
    public void setUp() throws Exception {
+270 −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.opp;

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.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;

import androidx.test.platform.app.InstrumentationRegistry;

import com.android.bluetooth.BluetoothMethodProxy;
import com.android.bluetooth.opp.BluetoothOppTestUtils.CursorMockData;

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

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class BluetoothOppUtilityTest {

    private static final Uri CORRECT_FORMAT_BUT_INVALID_FILE_URI = Uri.parse(
            "content://com.android.bluetooth.opp/btopp/0123455343467");
    private static final Uri INCORRECT_FORMAT_URI = Uri.parse("www.google.com");

    Context mContext;
    @Mock
    Cursor mCursor;

    @Spy
    BluetoothMethodProxy mCallProxy = BluetoothMethodProxy.getInstance();


    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        BluetoothMethodProxy.setInstanceForTesting(mCallProxy);
    }

    @After
    public void tearDown() {
        BluetoothMethodProxy.setInstanceForTesting(null);
    }

    @Test
    public void isBluetoothShareUri_correctlyCheckUri() {
        assertThat(BluetoothOppUtility.isBluetoothShareUri(INCORRECT_FORMAT_URI)).isFalse();
        assertThat(BluetoothOppUtility.isBluetoothShareUri(CORRECT_FORMAT_BUT_INVALID_FILE_URI))
                .isTrue();
    }

    @Test
    public void queryRecord_withInvalidFileUrl_returnsNull() {
        doReturn(null).when(mCallProxy).contentResolverQuery(any(),
                eq(CORRECT_FORMAT_BUT_INVALID_FILE_URI), eq(null), eq(null),
                eq(null), eq(null));
        assertThat(BluetoothOppUtility.queryRecord(mContext,
                CORRECT_FORMAT_BUT_INVALID_FILE_URI)).isNull();
    }

    @Test
    public void queryRecord_mockCursor_returnsInstance() {
        String destinationValue = "AA:BB:CC:00:11:22";

        doReturn(mCursor).when(mCallProxy).contentResolverQuery(any(),
                eq(CORRECT_FORMAT_BUT_INVALID_FILE_URI), eq(null), eq(null),
                eq(null), eq(null));
        doReturn(true).when(mCursor).moveToFirst();
        doReturn(destinationValue).when(mCursor).getString(anyInt());
        assertThat(BluetoothOppUtility.queryRecord(mContext,
                CORRECT_FORMAT_BUT_INVALID_FILE_URI)).isInstanceOf(BluetoothOppTransferInfo.class);
    }

    @Test
    public void queryTransfersInBatch_returnsCorrectUrlArrayList() {
        long timestampValue = 123456;
        String where = BluetoothShare.TIMESTAMP + " == " + timestampValue;
        AtomicInteger cnt = new AtomicInteger(1);

        doReturn(mCursor).when(mCallProxy).contentResolverQuery(any(),
                eq(BluetoothShare.CONTENT_URI), eq(new String[]{
                        BluetoothShare._DATA
                }), eq(where), eq(null), eq(BluetoothShare._ID));


        doAnswer(invocation -> cnt.incrementAndGet() > 5).when(mCursor).isAfterLast();
        doReturn(CORRECT_FORMAT_BUT_INVALID_FILE_URI.toString()).when(mCursor)
                .getString(0);

        ArrayList<String> answer = BluetoothOppUtility.queryTransfersInBatch(mContext,
                timestampValue);
        for (String url : answer) {
            assertThat(url).isEqualTo(CORRECT_FORMAT_BUT_INVALID_FILE_URI.toString());
        }
    }

    @Test
    public void fillRecord_filledAllProperties() {
        int idValue = 1234;
        int directionValue = BluetoothShare.DIRECTION_OUTBOUND;
        long totalBytesValue = 10;
        long currentBytesValue = 1;
        int statusValue = BluetoothShare.STATUS_PENDING;
        Long timestampValue = 123456789L;
        String destinationValue = "AA:BB:CC:00:11:22";
        String fileNameValue = "Unknown file";
        String deviceNameValue = "Unknown device"; // bt device name
        String fileTypeValue = "text/plain";

        List<CursorMockData> cursorMockDataList = List.of(
            new CursorMockData(BluetoothShare._ID, 0, idValue),
            new CursorMockData(BluetoothShare.STATUS, 1, statusValue),
            new CursorMockData(BluetoothShare.DIRECTION, 2, directionValue),
            new CursorMockData(BluetoothShare.TOTAL_BYTES, 3, totalBytesValue),
            new CursorMockData(BluetoothShare.CURRENT_BYTES, 4, currentBytesValue),
            new CursorMockData(BluetoothShare.TIMESTAMP, 5, timestampValue),
            new CursorMockData(BluetoothShare.DESTINATION, 6, destinationValue),
            new CursorMockData(BluetoothShare._DATA, 7, null),
            new CursorMockData(BluetoothShare.FILENAME_HINT, 8, null),
            new CursorMockData(BluetoothShare.MIMETYPE, 9, fileTypeValue)
        );

        BluetoothOppTestUtils.setUpMockCursor(mCursor, cursorMockDataList);

        BluetoothOppTransferInfo info = new BluetoothOppTransferInfo();
        BluetoothOppUtility.fillRecord(mContext, mCursor, info);

        assertThat(info.mID).isEqualTo(idValue);
        assertThat(info.mStatus).isEqualTo(statusValue);
        assertThat(info.mDirection).isEqualTo(directionValue);
        assertThat(info.mTotalBytes).isEqualTo(totalBytesValue);
        assertThat(info.mCurrentBytes).isEqualTo(currentBytesValue);
        assertThat(info.mTimeStamp).isEqualTo(timestampValue);
        assertThat(info.mDestAddr).isEqualTo(destinationValue);
        assertThat(info.mFileUri).isEqualTo(null);
        assertThat(info.mFileType).isEqualTo(fileTypeValue);
        assertThat(info.mDeviceName).isEqualTo(deviceNameValue);
        assertThat(info.mHandoverInitiated).isEqualTo(false);
        assertThat(info.mFileName).isEqualTo(fileNameValue);
    }

    @Test
    public void fileExists_returnFalse() {
        assertThat(
                BluetoothOppUtility.fileExists(mContext, CORRECT_FORMAT_BUT_INVALID_FILE_URI)
        ).isFalse();
    }

    @Test
    public void isRecognizedFileType_withWrongFileUriAndMimeType_returnFalse() {
        assertThat(
                BluetoothOppUtility.isRecognizedFileType(mContext,
                        CORRECT_FORMAT_BUT_INVALID_FILE_URI,
                        "aWrongMimeType")
        ).isFalse();
    }

    @Test
    public void formatProgressText() {
        assertThat(BluetoothOppUtility.formatProgressText(100, 42)).isEqualTo("42%");
    }

    @Test
    public void formatResultText() {
        assertThat(BluetoothOppUtility.formatResultText(1, 2, mContext)).isEqualTo(
                "1 successful, 2 unsuccessful.");
    }

    @Test
    public void getStatusDescription_returnCorrectString() {
        String deviceName = "randomName";
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_PENDING, deviceName)).isEqualTo(
                "File transfer not started yet.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_RUNNING, deviceName)).isEqualTo(
                "File transfer is ongoing.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_SUCCESS, deviceName)).isEqualTo(
                "File transfer completed successfully.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_NOT_ACCEPTABLE, deviceName)).isEqualTo(
                "Content isn\'t supported.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_FORBIDDEN, deviceName)).isEqualTo(
                "Transfer forbidden by target device.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_CANCELED, deviceName)).isEqualTo(
                "Transfer canceled by user.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_FILE_ERROR, deviceName)).isEqualTo("Storage issue.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_CONNECTION_ERROR, deviceName)).isEqualTo(
                "Connection unsuccessful.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_ERROR_NO_SDCARD, deviceName)).isEqualTo(
                BluetoothOppUtility.deviceHasNoSdCard() ?
                        "No USB storage." :
                        "No SD card. Insert an SD card to save transferred files."
        );
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_ERROR_SDCARD_FULL, deviceName)).isEqualTo(
                BluetoothOppUtility.deviceHasNoSdCard() ?
                        "There isn\'t enough space in USB storage to save the file." :
                        "There isn\'t enough space on the SD card to save the file."
        );
        assertThat(BluetoothOppUtility.getStatusDescription(mContext,
                BluetoothShare.STATUS_BAD_REQUEST, deviceName)).isEqualTo(
                "Request can\'t be handled correctly.");
        assertThat(BluetoothOppUtility.getStatusDescription(mContext, 12345465,
                deviceName)).isEqualTo("Unknown error.");
    }

    @Test
    public void originalUri_trimBeforeAt() {
        Uri originalUri = Uri.parse("com.android.bluetooth.opp.BluetoothOppSendFileInfo");
        Uri uri = Uri.parse("com.android.bluetooth.opp.BluetoothOppSendFileInfo@dfe15a6");
        assertThat(BluetoothOppUtility.originalUri(uri)).isEqualTo(originalUri);
    }

    @Test
    public void fileInfo_testFileInfoFunctions() {
        assertThat(
                BluetoothOppUtility.getSendFileInfo(CORRECT_FORMAT_BUT_INVALID_FILE_URI)
        ).isEqualTo(
                BluetoothOppSendFileInfo.SEND_FILE_INFO_ERROR
        );
        assertThat(BluetoothOppUtility.generateUri(CORRECT_FORMAT_BUT_INVALID_FILE_URI,
                BluetoothOppSendFileInfo.SEND_FILE_INFO_ERROR).toString()
        ).contains(
                CORRECT_FORMAT_BUT_INVALID_FILE_URI.toString());
        try {
            BluetoothOppUtility.putSendFileInfo(CORRECT_FORMAT_BUT_INVALID_FILE_URI,
                    BluetoothOppSendFileInfo.SEND_FILE_INFO_ERROR);
            BluetoothOppUtility.closeSendFileInfo(CORRECT_FORMAT_BUT_INVALID_FILE_URI);
        } catch (Exception e) {
            assertWithMessage("Exception should not happen.").fail();
        }
    }

}