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