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

Commit 9dfe5d20 authored by Hyundo Moon's avatar Hyundo Moon
Browse files

Add ObexAppParametersTest

Also removes an unused class PhonebookEntry.

Bug: 237467631
Test: atest ObexAppParametersTest
Change-Id: Ifbf89b797669fa71003d5a61cf36f05299239ea9
parent 893178e9
Loading
Loading
Loading
Loading
+0 −172
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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.pbapclient;

import com.android.vcard.VCardEntry;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 *  A simpler more public version of VCardEntry.
 */
public class PhonebookEntry {
    public static class Name {
        public String family;
        public String given;
        public String middle;
        public String prefix;
        public String suffix;

        public Name() { }

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Name)) {
                return false;
            }

            Name n = ((Name) o);
            return (Objects.equals(family, n.family) || family != null && family.equals(n.family))
                    && (Objects.equals(given, n.given) || given != null && given.equals(n.given))
                    && (Objects.equals(middle, n.middle) || middle != null && middle.equals(
                    n.middle)) && (Objects.equals(prefix, n.prefix)
                    || prefix != null && prefix.equals(n.prefix)) && (
                    Objects.equals(suffix, n.suffix) || suffix != null && suffix.equals(n.suffix));
        }

        @Override
        public int hashCode() {
            int result = 23 * (family == null ? 0 : family.hashCode());
            result = 23 * result + (given == null ? 0 : given.hashCode());
            result = 23 * result + (middle == null ? 0 : middle.hashCode());
            result = 23 * result + (prefix == null ? 0 : prefix.hashCode());
            result = 23 * result + (suffix == null ? 0 : suffix.hashCode());
            return result;
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("Name: { family: ");
            sb.append(family);
            sb.append(" given: ");
            sb.append(given);
            sb.append(" middle: ");
            sb.append(middle);
            sb.append(" prefix: ");
            sb.append(prefix);
            sb.append(" suffix: ");
            sb.append(suffix);
            sb.append(" }");
            return sb.toString();
        }
    }

    public static class Phone {
        public int type;
        public String number;

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Phone)) {
                return false;
            }

            Phone p = (Phone) o;
            return (Objects.equals(number, p.number) || number != null && number.equals(p.number))
                    && type == p.type;
        }

        @Override
        public int hashCode() {
            return 23 * type + number.hashCode();
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(" Phone: { number: ");
            sb.append(number);
            sb.append(" type: " + type);
            sb.append(" }");
            return sb.toString();
        }
    }

    @Override
    public boolean equals(Object object) {
        if (object instanceof PhonebookEntry) {
            return equals((PhonebookEntry) object);
        }
        return false;
    }

    public PhonebookEntry() {
        name = new Name();
        phones = new ArrayList<Phone>();
    }

    public PhonebookEntry(VCardEntry v) {
        name = new Name();
        phones = new ArrayList<Phone>();

        VCardEntry.NameData n = v.getNameData();
        name.family = n.getFamily();
        name.given = n.getGiven();
        name.middle = n.getMiddle();
        name.prefix = n.getPrefix();
        name.suffix = n.getSuffix();

        List<VCardEntry.PhoneData> vp = v.getPhoneList();
        if (vp == null || vp.isEmpty()) {
            return;
        }

        for (VCardEntry.PhoneData p : vp) {
            Phone phone = new Phone();
            phone.type = p.getType();
            phone.number = p.getNumber();
            phones.add(phone);
        }
    }

    private boolean equals(PhonebookEntry p) {
        return name.equals(p.name) && phones.equals(p.phones);
    }

    @Override
    public int hashCode() {
        return name.hashCode() + 23 * phones.hashCode();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("PhonebookEntry { id: ");
        sb.append(id);
        sb.append(" ");
        sb.append(name.toString());
        sb.append(phones.toString());
        sb.append(" }");
        return sb.toString();
    }

    public Name name;
    public List<Phone> phones;
    public String id;
}
+201 −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.pbapclient;

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

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

import com.android.obex.HeaderSet;

import org.junit.Test;
import org.junit.runner.RunWith;

import java.nio.ByteBuffer;
import java.util.Arrays;

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

    private static final byte KEY = 0x12;

    @Test
    public void constructorWithByteArrays_withOneInvalidElement() {
        final int length = 4;

        byte[] byteArray = new byte[] {KEY, length, 0x12, 0x34, 0x56, 0x78,
                0x66}; // Last one is invalid. It will be filtered out.

        ObexAppParameters params = new ObexAppParameters(byteArray);
        assertThat(params.exists(KEY)).isTrue();

        byte[] expected = Arrays.copyOfRange(byteArray, 2, 6);
        assertThat(params.getByteArray(KEY)).isEqualTo(expected);
    }

    @Test
    public void constructorWithByteArrays_withTwoInvalidElements() {
        final int length = 4;
        byte[] byteArray = new byte[] {KEY, length, 0x12, 0x34, 0x56, 0x78,
                0x66, 0x77}; // Last two are invalid. It will be filtered out.

        ObexAppParameters params = new ObexAppParameters(byteArray);
        assertThat(params.exists(KEY)).isTrue();

        byte[] expected = Arrays.copyOfRange(byteArray, 2, 6);
        assertThat(params.getByteArray(KEY)).isEqualTo(expected);
    }

    @Test
    public void fromHeaderSet() {
        final int length = 4;
        byte[] byteArray = new byte[] {KEY, length, 0x12, 0x34, 0x56, 0x78};

        HeaderSet headerSet = new HeaderSet();
        headerSet.setHeader(HeaderSet.APPLICATION_PARAMETER, byteArray);

        ObexAppParameters params = ObexAppParameters.fromHeaderSet(headerSet);
        assertThat(params).isNotNull();

        byte[] expected = Arrays.copyOfRange(byteArray, 2, 6);
        assertThat(params.getByteArray(KEY)).isEqualTo(expected);
    }

    @Test
    public void addToHeaderSet() throws Exception {
        final int length = 4;
        byte[] byteArray = new byte[] {KEY, length, 0x12, 0x34, 0x56, 0x78};

        HeaderSet headerSet = new HeaderSet();
        ObexAppParameters params = new ObexAppParameters(byteArray);
        params.addToHeaderSet(headerSet);

        assertThat(byteArray).isEqualTo(headerSet.getHeader(HeaderSet.APPLICATION_PARAMETER));
    }

    @Test
    public void add_byte() {
        ObexAppParameters params = new ObexAppParameters();
        final byte value = 0x34;
        params.add(KEY, value);

        assertThat(params.getByte(KEY)).isEqualTo(value);
    }

    @Test
    public void add_short() {
        ObexAppParameters params = new ObexAppParameters();
        final short value = 0x99; // More than max byte value
        params.add(KEY, value);

        assertThat(params.getShort(KEY)).isEqualTo(value);
    }

    @Test
    public void add_int() {
        ObexAppParameters params = new ObexAppParameters();
        final int value = 12345678; // More than max short value
        params.add(KEY, value);

        assertThat(params.getInt(KEY)).isEqualTo(value);
    }

    @Test
    public void add_long() {
        ObexAppParameters params = new ObexAppParameters();
        final long value = 1234567890123456L; // More than max integer value
        params.add(KEY, value);

        // Note: getLong() does not exist
        byte[] byteArray = params.getByteArray(KEY);
        assertThat(ByteBuffer.wrap(byteArray).getLong()).isEqualTo(value);
    }

    @Test
    public void add_string() {
        ObexAppParameters params = new ObexAppParameters();
        final String value = "Some string value";
        params.add(KEY, value);

        assertThat(params.getString(KEY)).isEqualTo(value);
    }

    @Test
    public void add_byteArray() {
        ObexAppParameters params = new ObexAppParameters();
        final byte[] value = new byte[] {0x00, 0x01, 0x02, 0x03};
        params.add(KEY, value);

        assertThat(params.getByteArray(KEY)).isEqualTo(value);
    }

    @Test
    public void get_errorCases() {
        ObexAppParameters emptyParams = new ObexAppParameters();

        assertThat(emptyParams.getByte(KEY)).isEqualTo(0);
        assertThat(emptyParams.getShort(KEY)).isEqualTo(0);
        assertThat(emptyParams.getInt(KEY)).isEqualTo(0);
        // Note: getLong() does not exist
        assertThat(emptyParams.getString(KEY)).isNull();
        assertThat(emptyParams.getByteArray(KEY)).isNull();
    }

    @Test
    public void toString_isNotNull() {
        ObexAppParameters params = new ObexAppParameters();
        assertThat(params.toString()).isNotNull();
    }

    @Test
    public void getHeader_withTwoEntries() {
        ObexAppParameters params = new ObexAppParameters();

        final byte key1 = 0x01;
        final int value1 = 12345;
        params.add(key1, value1);

        final byte key2 = 0x02;
        final int value2 = 56789;
        params.add(key2, value2);

        ByteBuffer result = ByteBuffer.wrap(params.getHeader());
        final byte firstKey = result.get();

        final int sizeOfInt = 4;
        if (firstKey == key1) {
            assertThat(result.get()).isEqualTo(sizeOfInt);
            assertThat(result.getInt()).isEqualTo(value1);

            assertThat(result.get()).isEqualTo(key2);
            assertThat(result.get()).isEqualTo(sizeOfInt);
            assertThat(result.getInt()).isEqualTo(value2);
        } else if (firstKey == key2) {
            assertThat(result.get()).isEqualTo(sizeOfInt);
            assertThat(result.getInt()).isEqualTo(value2);

            assertThat(result.get()).isEqualTo(key1);
            assertThat(result.get()).isEqualTo(sizeOfInt);
            assertThat(result.getInt()).isEqualTo(value1);
        } else {
            assertWithMessage("Key should be one of two keys").fail();
        }
    }
}