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