11dc52f076977039a6bf112885feca6638c05cd29Peter Qiu/* 21dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Copyright (C) 2016 The Android Open Source Project 31dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 41dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 51dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * you may not use this file except in compliance with the License. 61dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * You may obtain a copy of the License at 71dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 81dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * http://www.apache.org/licenses/LICENSE-2.0 91dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 101dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Unless required by applicable law or agreed to in writing, software 111dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 121dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * See the License for the specific language governing permissions and 141dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * limitations under the License. 151dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 161dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 171dc52f076977039a6bf112885feca6638c05cd29Peter Qiupackage com.android.server.wifi.hotspot2.anqp; 181dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 191dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport static org.junit.Assert.assertEquals; 201dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport static org.junit.Assert.assertTrue; 211dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 227f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0Etan Cohenimport android.support.test.filters.SmallTest; 231dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 241dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport org.junit.Test; 251dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 261dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.io.ByteArrayOutputStream; 271dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.io.IOException; 281dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.BufferUnderflowException; 291dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.ByteBuffer; 301dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.charset.StandardCharsets; 311dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.util.ArrayList; 321dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.util.List; 331dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 341dc52f076977039a6bf112885feca6638c05cd29Peter Qiu/** 351dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.anqp.DomainNameElement}. 361dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 371dc52f076977039a6bf112885feca6638c05cd29Peter Qiu@SmallTest 381dc52f076977039a6bf112885feca6638c05cd29Peter Qiupublic class DomainNameElementTest { 391dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private static final String TEST_DOMAIN_NAME1 = "test1.com"; 401dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private static final String TEST_DOMAIN_NAME2 = "test2.com"; 411dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 421dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 431dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Helper function for appending a Domain Name to an output stream. 441dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 451dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @param stream Stream to write to 461dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @param domain The domain name string 471dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws IOException 481dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 491dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private void appendDomain(ByteArrayOutputStream stream, String domain) throws IOException { 501dc52f076977039a6bf112885feca6638c05cd29Peter Qiu byte[] domainBytes = domain.getBytes(StandardCharsets.ISO_8859_1); 511dc52f076977039a6bf112885feca6638c05cd29Peter Qiu stream.write((byte) domainBytes.length); 521dc52f076977039a6bf112885feca6638c05cd29Peter Qiu stream.write(domainBytes); 531dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 541dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 551dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 561dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Helper function for generating test data. 571dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 581dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @return byte[] of data 591dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws IOException 601dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 611dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private byte[] getTestData(String[] domains) throws IOException { 621dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteArrayOutputStream stream = new ByteArrayOutputStream(); 631dc52f076977039a6bf112885feca6638c05cd29Peter Qiu for (String domain : domains) { 641dc52f076977039a6bf112885feca6638c05cd29Peter Qiu appendDomain(stream, domain); 651dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 661dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return stream.toByteArray(); 671dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 681dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 691dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 701dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that a DomainNameElement with empty domain list will be returned when parsing an 711dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * empty buffer. 721dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 731dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 741dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 751dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test 761dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseEmptyBuffer() throws Exception { 771dc52f076977039a6bf112885feca6638c05cd29Peter Qiu assertTrue(DomainNameElement.parse(ByteBuffer.allocate(0)).getDomains().isEmpty()); 781dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 791dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 801dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 811dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that BufferUnderflowException will be thrown when parsing a truncated buffer 821dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * (missing a byte at the end). 831dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 841dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 851dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 861dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test(expected = BufferUnderflowException.class) 871dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseTruncatedBuffer() throws Exception { 881dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteBuffer buffer = ByteBuffer.wrap(getTestData(new String[] {TEST_DOMAIN_NAME1})); 891dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.limit(buffer.remaining() - 1); 901dc52f076977039a6bf112885feca6638c05cd29Peter Qiu DomainNameElement.parse(buffer); 911dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 921dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 931dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 941dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that a DomainNameElement with expected domain list will be returned when parsing a 951dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * buffer contained valid domain name list. 961dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 971dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 981dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 991dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test 1001dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseBufferWithValidDomainNames() throws Exception { 1011dc52f076977039a6bf112885feca6638c05cd29Peter Qiu byte[] testData = getTestData(new String[] {TEST_DOMAIN_NAME1, TEST_DOMAIN_NAME2}); 1021dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteBuffer buffer = ByteBuffer.wrap(testData); 1031dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 1041dc52f076977039a6bf112885feca6638c05cd29Peter Qiu // Setup expected element. 1051dc52f076977039a6bf112885feca6638c05cd29Peter Qiu List<String> domainList = new ArrayList<>(); 1061dc52f076977039a6bf112885feca6638c05cd29Peter Qiu domainList.add(TEST_DOMAIN_NAME1); 1071dc52f076977039a6bf112885feca6638c05cd29Peter Qiu domainList.add(TEST_DOMAIN_NAME2); 1081dc52f076977039a6bf112885feca6638c05cd29Peter Qiu DomainNameElement expectedElement = new DomainNameElement(domainList); 1091dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 1101dc52f076977039a6bf112885feca6638c05cd29Peter Qiu assertEquals(expectedElement, DomainNameElement.parse(buffer)); 1111dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 1121dc52f076977039a6bf112885feca6638c05cd29Peter Qiu} 113