19fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu/*
29fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * Copyright (C) 2017 The Android Open Source Project
39fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu *
49fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
59fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * you may not use this file except in compliance with the License.
69fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * You may obtain a copy of the License at
79fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu *
89fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
99fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu *
109fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * Unless required by applicable law or agreed to in writing, software
119fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
129fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * See the License for the specific language governing permissions and
149fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * limitations under the License.
159fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu */
169fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
179fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiupackage com.android.server.wifi.hotspot2.anqp;
189fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
199fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiuimport static org.junit.Assert.assertEquals;
209fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
217f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0Etan Cohenimport android.support.test.filters.SmallTest;
229fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
239fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiuimport org.junit.Test;
249fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
259fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiuimport java.net.ProtocolException;
269fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiuimport java.nio.BufferUnderflowException;
279fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiuimport java.nio.ByteBuffer;
280169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiuimport java.util.ArrayList;
290169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiuimport java.util.List;
300169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiuimport java.util.Locale;
319fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
329fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu/**
339fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.anqp.OsuProviderInfo}.
349fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu */
359fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu@SmallTest
369fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiupublic class OsuProviderInfoTest {
379fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    /**
389fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * Verify that BufferUnderflowException will be thrown when parsing an empty buffer.
399fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * @throws Exception
409fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     */
419fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    @Test(expected = BufferUnderflowException.class)
429fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    public void parseEmptyBuffer() throws Exception {
439fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        OsuProviderInfo.parse(ByteBuffer.allocate(0));
449fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    }
459fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
469fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    /**
479fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * Verify that BufferUnderflowException will be thrown when parsing a truncated buffer
489fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * (missing a byte at the end).
499fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     *
509fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * @throws Exception
519fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     */
529fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    @Test(expected = BufferUnderflowException.class)
539fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    public void parseTruncatedBuffer() throws Exception {
549fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(
559fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu                OsuProviderInfoTestUtil.TEST_OSU_PROVIDER_INFO_RAW_BYTES);
569fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        buffer.limit(buffer.remaining() - 1);
579fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        OsuProviderInfo.parse(buffer);
589fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    }
599fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
609fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    /**
619fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * Verify that ProtocolException will be thrown when parsing a buffer containing an
629fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * invalid length value.
639fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     *
649fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * @throws Exception
659fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     */
669fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    @Test(expected = ProtocolException.class)
679fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    public void parseBufferWithInvalidLength() throws Exception {
689fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(
699fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu                OsuProviderInfoTestUtil.TEST_OSU_PROVIDER_INFO_RAW_BYTES_WITH_INVALID_LENGTH);
709fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        OsuProviderInfo.parse(buffer);
719fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    }
729fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu
739fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    /**
749fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * Verify that an expected {@link OsuProviderInfo} will be returned when parsing a buffer
759fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * containing pre-defined test data.
769fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     *
779fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     * @throws Exception
789fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu     */
799fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    @Test
809fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    public void parseBufferWithTestData() throws Exception {
819fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(
829fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu                OsuProviderInfoTestUtil.TEST_OSU_PROVIDER_INFO_RAW_BYTES);
839fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu        assertEquals(OsuProviderInfoTestUtil.TEST_OSU_PROVIDER_INFO,
849fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu                OsuProviderInfo.parse(buffer));
859fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu    }
860169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu
870169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    /**
880169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * Verify that when a provider contained multiple friendly names in different languages, the
890169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * friendly name that's in default language is returned.
900169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     *
910169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * @throws Exception
920169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     */
930169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    @Test
940169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    public void getFriendlyNameMatchingDefaultLocale() throws Exception {
950169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        List<I18Name> friendlyNames = new ArrayList<>();
960169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        Locale defaultLocale = Locale.getDefault();
970169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        Locale nonDefaultLocale = Locale.FRENCH;
980169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        if (defaultLocale.equals(nonDefaultLocale)) {
990169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu            nonDefaultLocale = Locale.ENGLISH;
1000169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        }
1010169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String nonDefaultString = "Non-default";
1020169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String defaultString = "Default";
1030169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        friendlyNames.add(
1040169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(nonDefaultLocale.getLanguage(), nonDefaultLocale, nonDefaultString));
1050169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        friendlyNames.add(new I18Name(defaultLocale.getLanguage(), defaultLocale, defaultString));
1060169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        OsuProviderInfo providerInfo =
1070169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new OsuProviderInfo(friendlyNames, null, null, null, null, null);
1080169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        assertEquals(defaultString, providerInfo.getFriendlyName());
1090169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    }
1100169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu
1110169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    /**
1120169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * Verify that when a provider contained multiple friendly names where no friendly name
1130169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * is in default language, the first name in the list is returned.
1140169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     *
1150169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * @throws Exception
1160169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     */
1170169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    @Test
1180169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    public void getFriendlyNameNotMatchingDefaultLocale() throws Exception {
1190169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        List<I18Name> friendlyNames = new ArrayList<>();
1200169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        Locale nonDefaultLocale = Locale.FRENCH;
1210169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        if (nonDefaultLocale.equals(Locale.getDefault())) {
1220169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu            nonDefaultLocale = Locale.ENGLISH;
1230169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        }
1240169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String firstString = "First name";
1250169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String secondString = "Second name";
1260169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        friendlyNames.add(
1270169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(nonDefaultLocale.getLanguage(), nonDefaultLocale, firstString));
1280169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        friendlyNames.add(
1290169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(nonDefaultLocale.getLanguage(), nonDefaultLocale, secondString));
1300169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        OsuProviderInfo providerInfo =
1310169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new OsuProviderInfo(friendlyNames, null, null, null, null, null);
1320169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        assertEquals(firstString, providerInfo.getFriendlyName());
1330169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    }
1340169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu
1350169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    /**
1360169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * Verify that null will be returned for a provider containing empty friendly name list.
1370169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     *
1380169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * @throws Exception
1390169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     */
1400169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    @Test
1410169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    public void getFriendlyNameWithEmptyList() throws Exception {
1420169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        OsuProviderInfo providerInfo =
1430169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new OsuProviderInfo(new ArrayList<I18Name>(), null, null, null, null, null);
1440169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        assertEquals(null, providerInfo.getFriendlyName());
1450169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    }
1460169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu
1470169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    /**
1480169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * Verify that when a provider contained multiple service descriptions in different languages,
1490169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * the service description that's in default language is returned.
1500169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     *
1510169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * @throws Exception
1520169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     */
1530169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    @Test
1540169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    public void getServiceDescriptionMatchingDefaultLocale() throws Exception {
1550169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        List<I18Name> serviceDescriptions = new ArrayList<>();
1560169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        Locale defaultLocale = Locale.getDefault();
1570169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        Locale nonDefaultLocale = Locale.FRENCH;
1580169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        if (defaultLocale.equals(nonDefaultLocale)) {
1590169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu            nonDefaultLocale = Locale.ENGLISH;
1600169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        }
1610169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String nonDefaultString = "Non-default";
1620169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String defaultString = "Default";
1630169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        serviceDescriptions.add(
1640169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(nonDefaultLocale.getLanguage(), nonDefaultLocale, nonDefaultString));
1650169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        serviceDescriptions.add(
1660169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(defaultLocale.getLanguage(), defaultLocale, defaultString));
1670169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        OsuProviderInfo providerInfo =
1680169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new OsuProviderInfo(null, null, null, null, null, serviceDescriptions);
1690169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        assertEquals(defaultString, providerInfo.getServiceDescription());
1700169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    }
1710169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu
1720169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    /**
1730169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * Verify that when a provider contained multiple service descriptions where none of them
1740169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * is in default language, the first element in the list is returned.
1750169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     *
1760169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * @throws Exception
1770169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     */
1780169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    @Test
1790169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    public void getServiceDescriptionNotMatchingDefaultLocale() throws Exception {
1800169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        List<I18Name> serviceDescriptions = new ArrayList<>();
1810169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        Locale nonDefaultLocale = Locale.FRENCH;
1820169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        if (nonDefaultLocale.equals(Locale.getDefault())) {
1830169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu            nonDefaultLocale = Locale.ENGLISH;
1840169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        }
1850169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String firstString = "First name";
1860169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        String secondString = "Second name";
1870169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        serviceDescriptions.add(
1880169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(nonDefaultLocale.getLanguage(), nonDefaultLocale, firstString));
1890169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        serviceDescriptions.add(
1900169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new I18Name(nonDefaultLocale.getLanguage(), nonDefaultLocale, secondString));
1910169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        OsuProviderInfo providerInfo =
1920169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new OsuProviderInfo(null, null, null, null, null, serviceDescriptions);
1930169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        assertEquals(firstString, providerInfo.getServiceDescription());
1940169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    }
1950169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu
1960169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    /**
1970169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * Verify that null will be returned for a provider containing empty friendly name list.
1980169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     *
1990169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     * @throws Exception
2000169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu     */
2010169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    @Test
2020169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    public void getServiceDescriptionWithEmptyList() throws Exception {
2030169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        OsuProviderInfo providerInfo =
2040169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu                new OsuProviderInfo(null, null, null, null, null, new ArrayList<I18Name>());
2050169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu        assertEquals(null, providerInfo.getServiceDescription());
2060169c9350c355acbfe790859a1cc77a1594b4c1bPeter Qiu    }
2079fa8195087be42baed9f21ebdedadda9f509c7c6Peter Qiu}
208