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

Commit fb1b2e3b authored by Hyundo Moon's avatar Hyundo Moon Committed by Gerrit Code Review
Browse files

Merge "Add ObexAppParametersTest"

parents b9753a90 9dfe5d20
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();
        }
    }
}