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