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.nio.BufferUnderflowException; 271dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.ByteBuffer; 281dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.ByteOrder; 291dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.util.ArrayList; 301dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.util.List; 311dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 321dc52f076977039a6bf112885feca6638c05cd29Peter Qiu/** 331dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.anqp.HSConnectionCapabilityElement}. 341dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 351dc52f076977039a6bf112885feca6638c05cd29Peter Qiu@SmallTest 361dc52f076977039a6bf112885feca6638c05cd29Peter Qiupublic class HSConnectionCapabilityElementTest { 371dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private static final ProtocolPortTuple TEST_TUPLE1 = 381dc52f076977039a6bf112885feca6638c05cd29Peter Qiu new ProtocolPortTuple(1, 2, ProtocolPortTuple.PROTO_STATUS_CLOSED); 391dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private static final ProtocolPortTuple TEST_TUPLE2 = 401dc52f076977039a6bf112885feca6638c05cd29Peter Qiu new ProtocolPortTuple(3, 4, ProtocolPortTuple.PROTO_STATUS_OPEN); 411dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 421dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 431dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Helper function for writing a ProtocolPortTuple into a buffer. 441dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 451dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @param buffer The buffer to write to 461dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @param tuple The tuple to write 471dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 481dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private void appendProtocolPortTuple(ByteBuffer buffer, ProtocolPortTuple tuple) { 491dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.put((byte) tuple.getProtocol()); 501dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.putShort((short) tuple.getPort()); 511dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.put((byte) tuple.getStatus()); 521dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 531dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 541dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 551dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Helper function for generating a buffer with test data. 561dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 571dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @param tuples Tuples to put in the buffer 581dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @return {@link ByteBuffer} 591dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 601dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private ByteBuffer getTestBuffer(ProtocolPortTuple[] tuples) { 611dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteBuffer buffer = ByteBuffer.allocate(tuples.length * ProtocolPortTuple.RAW_BYTE_SIZE) 621dc52f076977039a6bf112885feca6638c05cd29Peter Qiu .order(ByteOrder.LITTLE_ENDIAN); 631dc52f076977039a6bf112885feca6638c05cd29Peter Qiu for (ProtocolPortTuple tuple : tuples) { 641dc52f076977039a6bf112885feca6638c05cd29Peter Qiu appendProtocolPortTuple(buffer, tuple); 651dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 661dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.position(0); 671dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return buffer; 681dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 691dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 701dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 711dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that a HSConnectionCapabilityElement with an empty status list will be returned 721dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * when parsing an empty buffer. 731dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 741dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 751dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 761dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test 771dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseEmptyBuffer() throws Exception { 781dc52f076977039a6bf112885feca6638c05cd29Peter Qiu HSConnectionCapabilityElement element = 791dc52f076977039a6bf112885feca6638c05cd29Peter Qiu HSConnectionCapabilityElement.parse(ByteBuffer.allocate(0)); 801dc52f076977039a6bf112885feca6638c05cd29Peter Qiu assertTrue(element.getStatusList().isEmpty()); 811dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 821dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 831dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 841dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that BufferUnderflowException will be thrown when parsing a buffer without 851dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * the complete tuple data (missing status field). 861dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 871dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 881dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 891dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test(expected = BufferUnderflowException.class) 901dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseBufferWithLessThanMinimumSize() throws Exception { 911dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteBuffer buffer = ByteBuffer.allocate(ProtocolPortTuple.RAW_BYTE_SIZE - 1); 921dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.put(new byte[ProtocolPortTuple.RAW_BYTE_SIZE - 1]); 931dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.position(0); 941dc52f076977039a6bf112885feca6638c05cd29Peter Qiu HSConnectionCapabilityElement.parse(buffer); 951dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 961dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 971dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 981dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that BufferUnderflowException will be thrown when parsing a buffer that contained 991dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * incomplete bytes for a tuple. 1001dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 1011dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 1021dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 1031dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test(expected = BufferUnderflowException.class) 1041dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseBufferWithIncompleteTupleBytes() throws Exception { 1051dc52f076977039a6bf112885feca6638c05cd29Peter Qiu // Construct a buffer which will contained a tuple and an extra byte at the end. 1061dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteBuffer buffer = ByteBuffer.allocate(ProtocolPortTuple.RAW_BYTE_SIZE + 1); 1071dc52f076977039a6bf112885feca6638c05cd29Peter Qiu appendProtocolPortTuple(buffer, TEST_TUPLE1); 1081dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.put((byte) 0); 1091dc52f076977039a6bf112885feca6638c05cd29Peter Qiu buffer.position(0); 1101dc52f076977039a6bf112885feca6638c05cd29Peter Qiu HSConnectionCapabilityElement.parse(buffer); 1111dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 1121dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 1131dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 1141dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Verify that the expected HSConnectionCapabilityElement is returned when parsing 1151dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * a buffer containing the test data. 1161dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 1171dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws Exception 1181dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 1191dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Test 1201dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public void parseBufferWithTestData() throws Exception { 1211dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ByteBuffer buffer = getTestBuffer(new ProtocolPortTuple[] {TEST_TUPLE1, TEST_TUPLE2}); 1221dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 1231dc52f076977039a6bf112885feca6638c05cd29Peter Qiu // Setup expected element. 1241dc52f076977039a6bf112885feca6638c05cd29Peter Qiu List<ProtocolPortTuple> tupleList = new ArrayList<>(); 1251dc52f076977039a6bf112885feca6638c05cd29Peter Qiu tupleList.add(TEST_TUPLE1); 1261dc52f076977039a6bf112885feca6638c05cd29Peter Qiu tupleList.add(TEST_TUPLE2); 1271dc52f076977039a6bf112885feca6638c05cd29Peter Qiu HSConnectionCapabilityElement expected = new HSConnectionCapabilityElement(tupleList); 1281dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 1291dc52f076977039a6bf112885feca6638c05cd29Peter Qiu assertEquals(expected, HSConnectionCapabilityElement.parse(buffer)); 1301dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 1311dc52f076977039a6bf112885feca6638c05cd29Peter Qiu} 132