174339de52d7066f22771d914e698da503232c107Peter Qiu/*
274339de52d7066f22771d914e698da503232c107Peter Qiu * Copyright (C) 2016 The Android Open Source Project
374339de52d7066f22771d914e698da503232c107Peter Qiu *
474339de52d7066f22771d914e698da503232c107Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
574339de52d7066f22771d914e698da503232c107Peter Qiu * you may not use this file except in compliance with the License.
674339de52d7066f22771d914e698da503232c107Peter Qiu * You may obtain a copy of the License at
774339de52d7066f22771d914e698da503232c107Peter Qiu *
874339de52d7066f22771d914e698da503232c107Peter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
974339de52d7066f22771d914e698da503232c107Peter Qiu *
1074339de52d7066f22771d914e698da503232c107Peter Qiu * Unless required by applicable law or agreed to in writing, software
1174339de52d7066f22771d914e698da503232c107Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
1274339de52d7066f22771d914e698da503232c107Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1374339de52d7066f22771d914e698da503232c107Peter Qiu * See the License for the specific language governing permissions and
1474339de52d7066f22771d914e698da503232c107Peter Qiu * limitations under the License.
1574339de52d7066f22771d914e698da503232c107Peter Qiu */
1674339de52d7066f22771d914e698da503232c107Peter Qiu
1774339de52d7066f22771d914e698da503232c107Peter Qiupackage com.android.server.wifi.hotspot2.anqp;
1874339de52d7066f22771d914e698da503232c107Peter Qiu
1974339de52d7066f22771d914e698da503232c107Peter Qiuimport static org.junit.Assert.assertEquals;
2074339de52d7066f22771d914e698da503232c107Peter Qiuimport static org.junit.Assert.assertTrue;
2174339de52d7066f22771d914e698da503232c107Peter Qiu
227f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0Etan Cohenimport android.support.test.filters.SmallTest;
2374339de52d7066f22771d914e698da503232c107Peter Qiu
2474339de52d7066f22771d914e698da503232c107Peter Qiuimport org.junit.Test;
2574339de52d7066f22771d914e698da503232c107Peter Qiu
2674339de52d7066f22771d914e698da503232c107Peter Qiuimport java.io.ByteArrayOutputStream;
2774339de52d7066f22771d914e698da503232c107Peter Qiuimport java.io.IOException;
2874339de52d7066f22771d914e698da503232c107Peter Qiuimport java.net.ProtocolException;
2974339de52d7066f22771d914e698da503232c107Peter Qiuimport java.nio.BufferUnderflowException;
3074339de52d7066f22771d914e698da503232c107Peter Qiuimport java.nio.ByteBuffer;
3174339de52d7066f22771d914e698da503232c107Peter Qiuimport java.nio.charset.StandardCharsets;
3274339de52d7066f22771d914e698da503232c107Peter Qiuimport java.util.ArrayList;
3374339de52d7066f22771d914e698da503232c107Peter Qiuimport java.util.Arrays;
3474339de52d7066f22771d914e698da503232c107Peter Qiuimport java.util.List;
3574339de52d7066f22771d914e698da503232c107Peter Qiuimport java.util.Locale;
3674339de52d7066f22771d914e698da503232c107Peter Qiu
3774339de52d7066f22771d914e698da503232c107Peter Qiu/**
3874339de52d7066f22771d914e698da503232c107Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.anqp.HSFriendlyNameElement}.
3974339de52d7066f22771d914e698da503232c107Peter Qiu */
4074339de52d7066f22771d914e698da503232c107Peter Qiu@SmallTest
4174339de52d7066f22771d914e698da503232c107Peter Qiupublic class HSFriendlyNameElementTest {
4274339de52d7066f22771d914e698da503232c107Peter Qiu    private static final String TEST_LANGUAGE = "en";
4374339de52d7066f22771d914e698da503232c107Peter Qiu    private static final Locale TEST_LOCALE = Locale.forLanguageTag(TEST_LANGUAGE);
4474339de52d7066f22771d914e698da503232c107Peter Qiu    private static final String TEST_OPERATOR_NAME1 = "Operator1";
4574339de52d7066f22771d914e698da503232c107Peter Qiu    private static final String TEST_OPERATOR_NAME2 = "Operator2";
4674339de52d7066f22771d914e698da503232c107Peter Qiu
4774339de52d7066f22771d914e698da503232c107Peter Qiu    /**
4874339de52d7066f22771d914e698da503232c107Peter Qiu     * Helper function for appending a Operator Name to an output stream.
4974339de52d7066f22771d914e698da503232c107Peter Qiu     *
5074339de52d7066f22771d914e698da503232c107Peter Qiu     * @param stream Stream to write to
5174339de52d7066f22771d914e698da503232c107Peter Qiu     * @param operator The name of the operator
5274339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws IOException
5374339de52d7066f22771d914e698da503232c107Peter Qiu     */
5474339de52d7066f22771d914e698da503232c107Peter Qiu    private void appendOperatorName(ByteArrayOutputStream stream, String operator)
5574339de52d7066f22771d914e698da503232c107Peter Qiu            throws IOException {
5674339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] nameBytes = operator.getBytes(StandardCharsets.UTF_8);
5774339de52d7066f22771d914e698da503232c107Peter Qiu        int length = I18Name.LANGUAGE_CODE_LENGTH + operator.length();
5874339de52d7066f22771d914e698da503232c107Peter Qiu        stream.write((byte) length);
5974339de52d7066f22771d914e698da503232c107Peter Qiu        stream.write(TEST_LANGUAGE.getBytes(StandardCharsets.US_ASCII));
6074339de52d7066f22771d914e698da503232c107Peter Qiu        stream.write(new byte[]{(byte) 0x0});  // Padding for language code.
6174339de52d7066f22771d914e698da503232c107Peter Qiu        stream.write(nameBytes);
6274339de52d7066f22771d914e698da503232c107Peter Qiu    }
6374339de52d7066f22771d914e698da503232c107Peter Qiu
6474339de52d7066f22771d914e698da503232c107Peter Qiu    /**
6574339de52d7066f22771d914e698da503232c107Peter Qiu     * Helper function for generating test data.
6674339de52d7066f22771d914e698da503232c107Peter Qiu     *
6774339de52d7066f22771d914e698da503232c107Peter Qiu     * @return byte[] of data
6874339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws IOException
6974339de52d7066f22771d914e698da503232c107Peter Qiu     */
7074339de52d7066f22771d914e698da503232c107Peter Qiu    private byte[] getTestData(String[] names) throws IOException {
7174339de52d7066f22771d914e698da503232c107Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
7274339de52d7066f22771d914e698da503232c107Peter Qiu        for (String name : names) {
7374339de52d7066f22771d914e698da503232c107Peter Qiu            appendOperatorName(stream, name);
7474339de52d7066f22771d914e698da503232c107Peter Qiu        }
7574339de52d7066f22771d914e698da503232c107Peter Qiu        return stream.toByteArray();
7674339de52d7066f22771d914e698da503232c107Peter Qiu    }
7774339de52d7066f22771d914e698da503232c107Peter Qiu
7874339de52d7066f22771d914e698da503232c107Peter Qiu    /**
7974339de52d7066f22771d914e698da503232c107Peter Qiu     * Verify that HSFriendlyNameElement with a empty operator name list will be returned when
8074339de52d7066f22771d914e698da503232c107Peter Qiu     * parsing an empty buffer.
8174339de52d7066f22771d914e698da503232c107Peter Qiu     *
8274339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws Exception
8374339de52d7066f22771d914e698da503232c107Peter Qiu     */
8474339de52d7066f22771d914e698da503232c107Peter Qiu    @Test
8574339de52d7066f22771d914e698da503232c107Peter Qiu    public void parseBufferWithEmptyBuffer() throws Exception {
8674339de52d7066f22771d914e698da503232c107Peter Qiu        assertTrue(HSFriendlyNameElement.parse(ByteBuffer.allocate(0)).getNames().isEmpty());
8774339de52d7066f22771d914e698da503232c107Peter Qiu    }
8874339de52d7066f22771d914e698da503232c107Peter Qiu
8974339de52d7066f22771d914e698da503232c107Peter Qiu    /**
9074339de52d7066f22771d914e698da503232c107Peter Qiu     * Verify that BufferUnderflowException will be thrown when parsing a truncated buffer
9174339de52d7066f22771d914e698da503232c107Peter Qiu     * (missing a byte at the end).
9274339de52d7066f22771d914e698da503232c107Peter Qiu     *
9374339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws Exception
9474339de52d7066f22771d914e698da503232c107Peter Qiu     */
9574339de52d7066f22771d914e698da503232c107Peter Qiu    @Test(expected = BufferUnderflowException.class)
9674339de52d7066f22771d914e698da503232c107Peter Qiu    public void parseBufferWithTruncatedByte() throws Exception {
9774339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] testData = getTestData(new String[] {TEST_OPERATOR_NAME1});
9874339de52d7066f22771d914e698da503232c107Peter Qiu        // Truncate a byte at the end.
9974339de52d7066f22771d914e698da503232c107Peter Qiu        ByteBuffer buffer = ByteBuffer.allocate(testData.length - 1);
10074339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.put(testData, 0, testData.length - 1);
10174339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.position(0);
10274339de52d7066f22771d914e698da503232c107Peter Qiu        HSFriendlyNameElement.parse(buffer);
10374339de52d7066f22771d914e698da503232c107Peter Qiu    }
10474339de52d7066f22771d914e698da503232c107Peter Qiu
10574339de52d7066f22771d914e698da503232c107Peter Qiu    /**
10674339de52d7066f22771d914e698da503232c107Peter Qiu     * Verify that an expected HSFriendlyNameElement will be returned when parsing a buffer
10774339de52d7066f22771d914e698da503232c107Peter Qiu     * containing the default test data.
10874339de52d7066f22771d914e698da503232c107Peter Qiu     *
10974339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws Exception
11074339de52d7066f22771d914e698da503232c107Peter Qiu     */
11174339de52d7066f22771d914e698da503232c107Peter Qiu    @Test
11274339de52d7066f22771d914e698da503232c107Peter Qiu    public void parseBufferWithDefaultTestData() throws Exception {
11374339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] testData = getTestData(new String[] {TEST_OPERATOR_NAME1, TEST_OPERATOR_NAME2});
11474339de52d7066f22771d914e698da503232c107Peter Qiu        ByteBuffer buffer = ByteBuffer.allocate(testData.length);
11574339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.put(testData);
11674339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.position(0);
11774339de52d7066f22771d914e698da503232c107Peter Qiu
11874339de52d7066f22771d914e698da503232c107Peter Qiu        // Setup expected element.
11974339de52d7066f22771d914e698da503232c107Peter Qiu        List<I18Name> nameList = new ArrayList<>();
12074339de52d7066f22771d914e698da503232c107Peter Qiu        nameList.add(new I18Name(TEST_LANGUAGE, TEST_LOCALE, TEST_OPERATOR_NAME1));
12174339de52d7066f22771d914e698da503232c107Peter Qiu        nameList.add(new I18Name(TEST_LANGUAGE, TEST_LOCALE, TEST_OPERATOR_NAME2));
12274339de52d7066f22771d914e698da503232c107Peter Qiu        HSFriendlyNameElement expectedElement = new HSFriendlyNameElement(nameList);
12374339de52d7066f22771d914e698da503232c107Peter Qiu
12474339de52d7066f22771d914e698da503232c107Peter Qiu        assertEquals(expectedElement, HSFriendlyNameElement.parse(buffer));
12574339de52d7066f22771d914e698da503232c107Peter Qiu    }
12674339de52d7066f22771d914e698da503232c107Peter Qiu
12774339de52d7066f22771d914e698da503232c107Peter Qiu    /**
12874339de52d7066f22771d914e698da503232c107Peter Qiu     * Verify that an expected HSFriendlyNameElement will be returned when parsing a buffer
12974339de52d7066f22771d914e698da503232c107Peter Qiu     * containing a operator name with the maximum length.
13074339de52d7066f22771d914e698da503232c107Peter Qiu     *
13174339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws Exception
13274339de52d7066f22771d914e698da503232c107Peter Qiu     */
13374339de52d7066f22771d914e698da503232c107Peter Qiu    @Test
13474339de52d7066f22771d914e698da503232c107Peter Qiu    public void parseBufferWithMaxLengthOperatoreName() throws Exception {
13574339de52d7066f22771d914e698da503232c107Peter Qiu        // Operator name with the maximum length.
13674339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] textData = new byte[HSFriendlyNameElement.MAXIMUM_OPERATOR_NAME_LENGTH];
13774339de52d7066f22771d914e698da503232c107Peter Qiu        Arrays.fill(textData, (byte) 'a');
13874339de52d7066f22771d914e698da503232c107Peter Qiu        String text = new String(textData);
13974339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] testData = getTestData(new String[] {text});
14074339de52d7066f22771d914e698da503232c107Peter Qiu        ByteBuffer buffer = ByteBuffer.allocate(testData.length);
14174339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.put(testData);
14274339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.position(0);
14374339de52d7066f22771d914e698da503232c107Peter Qiu
14474339de52d7066f22771d914e698da503232c107Peter Qiu        // Setup expected element.
14574339de52d7066f22771d914e698da503232c107Peter Qiu        List<I18Name> nameList = new ArrayList<>();
14674339de52d7066f22771d914e698da503232c107Peter Qiu        nameList.add(new I18Name(TEST_LANGUAGE, TEST_LOCALE, text));
14774339de52d7066f22771d914e698da503232c107Peter Qiu        HSFriendlyNameElement expectedElement = new HSFriendlyNameElement(nameList);
14874339de52d7066f22771d914e698da503232c107Peter Qiu
14974339de52d7066f22771d914e698da503232c107Peter Qiu        assertEquals(expectedElement, HSFriendlyNameElement.parse(buffer));
15074339de52d7066f22771d914e698da503232c107Peter Qiu    }
15174339de52d7066f22771d914e698da503232c107Peter Qiu
15274339de52d7066f22771d914e698da503232c107Peter Qiu    /**
15374339de52d7066f22771d914e698da503232c107Peter Qiu     * Verify that ProtocolException will be thrown when parsing a buffer containing a
15474339de52d7066f22771d914e698da503232c107Peter Qiu     * operator name that exceeds the maximum length.
15574339de52d7066f22771d914e698da503232c107Peter Qiu     *
15674339de52d7066f22771d914e698da503232c107Peter Qiu     * @throws Exception
15774339de52d7066f22771d914e698da503232c107Peter Qiu     */
15874339de52d7066f22771d914e698da503232c107Peter Qiu    @Test(expected = ProtocolException.class)
15974339de52d7066f22771d914e698da503232c107Peter Qiu    public void parseBufferWithOperatorNameLengthExceedMax() throws Exception {
16074339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] textData = new byte[HSFriendlyNameElement.MAXIMUM_OPERATOR_NAME_LENGTH + 1];
16174339de52d7066f22771d914e698da503232c107Peter Qiu        Arrays.fill(textData, (byte) 'a');
16274339de52d7066f22771d914e698da503232c107Peter Qiu        String text = new String(textData);
16374339de52d7066f22771d914e698da503232c107Peter Qiu        byte[] testData = getTestData(new String[] {text});
16474339de52d7066f22771d914e698da503232c107Peter Qiu        ByteBuffer buffer = ByteBuffer.allocate(testData.length);
16574339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.put(testData);
16674339de52d7066f22771d914e698da503232c107Peter Qiu        buffer.position(0);
16774339de52d7066f22771d914e698da503232c107Peter Qiu        HSFriendlyNameElement.parse(buffer);
16874339de52d7066f22771d914e698da503232c107Peter Qiu    }
16974339de52d7066f22771d914e698da503232c107Peter Qiu
17074339de52d7066f22771d914e698da503232c107Peter Qiu}
171