129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu/*
229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Copyright (C) 2016 The Android Open Source Project
329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu *
429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * you may not use this file except in compliance with the License.
629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * You may obtain a copy of the License at
729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu *
829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu *
1029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Unless required by applicable law or agreed to in writing, software
1129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
1229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * See the License for the specific language governing permissions and
1429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * limitations under the License.
1529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu */
1629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
1729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiupackage com.android.server.wifi.hotspot2.anqp;
1829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
1929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.junit.Assert.assertEquals;
2029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
2129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport android.test.suitebuilder.annotation.SmallTest;
2229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
2329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport org.junit.Test;
2429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
2529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.io.ByteArrayOutputStream;
2629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.io.IOException;
2729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.net.ProtocolException;
2829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.nio.ByteBuffer;
2929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.nio.ByteOrder;
3029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.nio.charset.StandardCharsets;
3129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.util.ArrayList;
3229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.util.Arrays;
3329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.util.List;
3429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport java.util.Locale;
3529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
3629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu/**
3729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.anqp.ANQPParser}.
3829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu */
3929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu@SmallTest
4029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiupublic class ANQPParserTest {
4129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
4229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a Venue Name ANQP element.
4329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
4429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param language Array of languages
4529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param text Array of text
4629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
4729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
4829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
4929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getVenueNamePayload(String[] language, String[] text)
5029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            throws IOException {
5129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
5229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write(new byte[VenueNameElement.VENUE_INFO_LENGTH]);
5329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write(getI18NameListPayload(language, text));
5429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
5529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
5629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
5729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
5829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a Domain Name ANQP element.
5929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
6029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param names Array of domain names
6129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
6229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
6329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
6429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getDomainNamePayload(String[] names) throws IOException {
6529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
6629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        for (String name : names) {
6729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            byte[] nameBytes = name.getBytes(StandardCharsets.ISO_8859_1);
6829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write((byte) nameBytes.length);
6929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write(nameBytes);
7029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        }
7129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
7229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
7329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
7429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
7529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a Roaming Consortium ANQP element.
7629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
7729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param ois Array of OIs
7829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param oisLength Array of length of each corresponding OI
7929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
8029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
8129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
8229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getRoamingConsortiumPayload(Long[] ois, int[] oisLength)
8329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            throws IOException {
8429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
8529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        for (int i = 0; i < ois.length; i++) {
8629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write((byte) oisLength[i]);
8729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            // Write the OI data in big-endian.
8829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            for (int l = oisLength[i] - 1; l >= 0; l--) {
8929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                stream.write((byte) ((ois[i].longValue() >> l * Byte.SIZE) & 0xFF));
9029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            }
9129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        }
9229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
9329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
9429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
9529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
9629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a NAI Realm ANQP element.
9729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
9829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param realmDataList Array of realm data.
9929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
10029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
10129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
10229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getNAIRealmPayload(byte[][] realmDataList) throws IOException {
10329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
10429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Data count in little-endian
10529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) (realmDataList.length & 0xFF));
10629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) ((realmDataList.length >> 8) & 0xFF));
10729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        for (byte[] realmData : realmDataList) {
10829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write(realmData);
10929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        }
11029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
11129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
11229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
11329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
11429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for 3GPP Network ANQP element.
11529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
11629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param ieiList Array of IEI data
11729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
11829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
11929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
12029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getThreeGPPNetworkPayload(byte[][] ieiList) throws IOException {
12129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
12229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int totalIeiSize = CellularNetworkTestUtil.getDataSize(ieiList);
12329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) ThreeGPPNetworkElement.GUD_VERSION_1);
12429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) totalIeiSize);
12529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        for (byte[] iei : ieiList) {
12629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write(iei);
12729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        }
12829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
12929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
13029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
13129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
13229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for Vendor Specific ANQP element.
13329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
13429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param oi The OI of the vendor
13529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param type The type of the element
13629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param subtype The subtype of the element
13729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param payload The vendor specific data
13829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
13929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
14029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
14129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getVendorSpecificPayload(int oi, int type, int subtype, byte[] payload)
14229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            throws IOException {
14329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
14429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) ((oi >> 16) & 0xFF));
14529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) ((oi >> 8) & 0xFF));
14629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) (oi & 0xFF));
14729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) type);
14829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) subtype);
14929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) 0);    // Reserved
15029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write(payload);
15129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
15229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
15329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
15429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
15529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a Hotspot 2.0 Operator Friendly Name ANQP element.
15629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
15729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param language Array of language
15829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param text Array of text
15929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
16029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
16129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
16229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getHSFriendlyNamePayload(String[] language, String[] text)
16329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            throws IOException {
16429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return getI18NameListPayload(language, text);
16529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
16629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
16729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
16829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a Hotspot 2.0 WAN Metrics ANQP element.
16929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
17029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param status Link status
17129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param symmetric Flag indicating symmetric link speed
17229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param capped Flag indicating link operating at max capacity
17329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param downlinkSpeed Downlink speed
17429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param uplinkSpeed Uplink speed
17529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param downlinkLoad Downlink load
17629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param uplinkLoad Uplink load
17729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param lmd Load measurement duration
17829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
17929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
18029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getHSWanMetricsPayload(int status, boolean symmetric, boolean capped,
18129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            long downlinkSpeed, long uplinkSpeed, int downlinkLoad, int uplinkLoad, int lmd) {
18229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.allocate(HSWanMetricsElement.EXPECTED_BUFFER_SIZE)
18329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                .order(ByteOrder.LITTLE_ENDIAN);
18429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int wanInfo = status & HSWanMetricsElement.LINK_STATUS_MASK;
18529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        if (symmetric) wanInfo |= HSWanMetricsElement.SYMMETRIC_LINK_MASK;
18629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        if (capped) wanInfo |= HSWanMetricsElement.AT_CAPACITY_MASK;
18729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.put((byte) wanInfo);
18829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.putInt((int) (downlinkSpeed & 0xFFFFFFFFL));
18929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.putInt((int) (uplinkSpeed & 0xFFFFFFFFL));
19029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.put((byte) (downlinkLoad & 0xFF));
19129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.put((byte) (uplinkLoad & 0xFF));
19229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.putShort((short) (lmd & 0xFFFF));
19329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.position(0);
19429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[] data = new byte[HSWanMetricsElement.EXPECTED_BUFFER_SIZE];
19529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        buffer.get(data);
19629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return data;
19729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
19829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
19929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
20029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a Hotspot 2.0 Connection Capability ANQP
20129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * element.
20229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
20329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param protocol Network protocol
20429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param port Network port
20529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param status Status of the port
20629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
20729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
20829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getHSConnectionCapabilityPayload(int protocol, int port, int status) {
20929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
21029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) protocol);
21129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Write 2-byte port in little-endian.
21229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) (port & 0xFF));
21329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) ((port >> 8) & 0xFF));
21429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        stream.write((byte) status);
21529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
21629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
21729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
21829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
21929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Helper function for generating payload for a list of I18Name.
22029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
22129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param language Array of language
22229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @param text Array of text
22329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @return byte[]
22429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws IOException
22529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
22629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    private static byte[] getI18NameListPayload(String[] language, String[] text)
22729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            throws IOException {
22829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteArrayOutputStream stream = new ByteArrayOutputStream();
22929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        for (int i = 0; i < language.length; i++) {
23029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            byte[] textBytes = text[i].getBytes(StandardCharsets.UTF_8);
23129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            int length = I18Name.LANGUAGE_CODE_LENGTH + text[i].length();
23229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write((byte) length);
23329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write(language[i].getBytes(StandardCharsets.US_ASCII));
23429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            // Add padding for two-character language code.
23529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            if (language[i].getBytes(StandardCharsets.US_ASCII).length
23629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                    < I18Name.LANGUAGE_CODE_LENGTH) {
23729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                stream.write(new byte[]{(byte) 0x0});
23829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            }
23929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu            stream.write(textBytes);
24029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        }
24129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        return stream.toByteArray();
24229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
24329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
24429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
24529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected VenueNameElement will be returned when parsing a buffer that
24629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a Venue Name ANQP element.
24729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
24829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
24929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
25029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
25129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseVenueNameElement() throws Exception {
25229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Test data.
25329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] language = new String[] {"en"};
25429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] text = new String[] {"test"};
25529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
25629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Setup expectation.
25729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        List<I18Name> nameList = new ArrayList<>();
25829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        nameList.add(new I18Name(language[0], Locale.forLanguageTag(language[0]), text[0]));
25929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        VenueNameElement expected = new VenueNameElement(nameList);
26029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
26129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(getVenueNamePayload(language, text));
26229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
26329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseElement(Constants.ANQPElementType.ANQPVenueName, buffer));
26429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
26529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
26629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
26729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected IPAddressTypeAvailabilityElement will be returned when parsing a
26829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * buffer that contained an IP Address Type Availability ANQP element.
26929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
27029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
27129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
27229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
27329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseIPAddressTypeAvailabilityElement() throws Exception {
27429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Test data.
27529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int ipAddressAvailability = IPAddressTypeAvailabilityElement.IPV4_PUBLIC << 2
27629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                | IPAddressTypeAvailabilityElement.IPV6_AVAILABLE;
27729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
27829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Setup expectation.
27929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        IPAddressTypeAvailabilityElement expected = new IPAddressTypeAvailabilityElement(
28029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                IPAddressTypeAvailabilityElement.IPV4_PUBLIC,
28129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                IPAddressTypeAvailabilityElement.IPV6_AVAILABLE);
28229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
28329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(new byte[] {(byte) ipAddressAvailability});
28429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
28529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseElement(Constants.ANQPElementType.ANQPIPAddrAvailability, buffer));
28629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
28729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
28829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
28929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected DomainNameElement will be returned when parsing a buffer that
29029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a Domain Name ANQP element.
29129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
29229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
29329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
29429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
29529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseDomainNameElement() throws Exception {
29629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] testNames = new String[] {"test.com", "abc.com"};
29729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        DomainNameElement expected = new DomainNameElement(Arrays.asList(testNames));
29829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
29929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(getDomainNamePayload(testNames));
30029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
30129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseElement(Constants.ANQPElementType.ANQPDomName, buffer));
30229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
30329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
30429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
30529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected RoamingConsortiumElement will be returned when parsing a buffer that
30629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a Roaming Consortium ANQP element.
30729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
30829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
30929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
31029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
31129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseRoamingConsortium() throws Exception {
31229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        Long[] ois = new Long[] {0x12345678L, 0x5678L};
31329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int[] oisLength = new int[] {4, 2};
31429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        RoamingConsortiumElement expected = new RoamingConsortiumElement(Arrays.asList(ois));
31529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
31629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(getRoamingConsortiumPayload(ois, oisLength));
31729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
31829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseElement(Constants.ANQPElementType.ANQPRoamingConsortium, buffer));
31929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
32029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
32129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
32229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected NAIRealmElement will be returned when parsing a buffer that
32329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a NAI Realm ANQP element.
32429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
32529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
32629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
32729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
32829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseNAIRealmElement() throws Exception {
32929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[][] testBytes = new byte[][] {NAIRealmDataTestUtil.TEST_REAML_WITH_UTF8_DATA_BYTES};
33029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        NAIRealmData[] realmDataList = new NAIRealmData[] {NAIRealmDataTestUtil.TEST_REALM_DATA};
33129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        NAIRealmElement expected = new NAIRealmElement(Arrays.asList(realmDataList));
33229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
33329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(getNAIRealmPayload(testBytes));
33429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
33529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseElement(Constants.ANQPElementType.ANQPNAIRealm, buffer));
33629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
33729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
33829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
33929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected ThreeGPPNetworkElement will be returned when parsing a buffer that
34029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a 3GPP Network ANQP element.
34129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
34229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
34329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
34429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
34529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseThreeGPPNetworkElement() throws Exception {
34629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[][] plmnBytes = new byte[][] {new byte[] {(byte) 0x87, 0x29, 0x10}};
34729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] plmnList = new String[] {"789012"};
34829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
34929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        List<CellularNetwork> networkList = new ArrayList<>();
35029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        networkList.add(new CellularNetwork(Arrays.asList(plmnList)));
35129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ThreeGPPNetworkElement expected = new ThreeGPPNetworkElement(networkList);
35229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
35329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(getThreeGPPNetworkPayload(
35429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                new byte[][] {CellularNetworkTestUtil.formatPLMNListIEI(plmnBytes)}));
35529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
35629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseElement(Constants.ANQPElementType.ANQP3GPPNetwork, buffer));
35729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
35829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
35929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
36029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that ProtocolException will be thrown when parsing a buffer that contained a
36129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * vendor specific element that contained a non-Hotspot 2.0 ANQP-element.
36229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
36329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
36429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
36529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test(expected = ProtocolException.class)
36629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseNonHS20VendorSpecificElement() throws Exception {
36729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(
36829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                getVendorSpecificPayload(0x123456, 0x12, 1, new byte[0]));
36929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ANQPParser.parseElement(Constants.ANQPElementType.ANQPVendorSpec, buffer);
37029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
37129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
37229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
37329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected HSFriendlyNameElement will be returned when parsing a buffer that
37429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a vendor specific element that contained a Hotspot 2.0 friendly name
37529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * ANQP element.
37629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
37729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
37829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
37929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
38029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseVendorSpecificElementWithHSFriendlyName() throws Exception {
38129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] language = new String[] {"en"};
38229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] text = new String[] {"test"};
38329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
38429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Setup expectation.
38529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        List<I18Name> nameList = new ArrayList<>();
38629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        nameList.add(new I18Name(language[0], Locale.forLanguageTag(language[0]), text[0]));
38729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        HSFriendlyNameElement expected = new HSFriendlyNameElement(nameList);
38829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
38929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[] hsFriendlyNameBytes = getHSFriendlyNamePayload(language, text);
39029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[] data = getVendorSpecificPayload(
39129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.VENDOR_SPECIFIC_HS20_OI, ANQPParser.VENDOR_SPECIFIC_HS20_TYPE,
39229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                Constants.HS_FRIENDLY_NAME, hsFriendlyNameBytes);
39329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected, ANQPParser.parseElement(
39429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                Constants.ANQPElementType.ANQPVendorSpec, ByteBuffer.wrap(data)));
39529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
39629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
39729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
39829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected HSFriendlyNameElement will be returned when parsing a buffer that
39929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a Hotspot 2.0 Friendly Name ANQP element.
40029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
40129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
40229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
40329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
40429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseHSFrendlyNameElement() throws Exception {
40529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Test data.
40629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] language = new String[] {"en"};
40729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        String[] text = new String[] {"test"};
40829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
40929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        // Setup expectation.
41029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        List<I18Name> nameList = new ArrayList<>();
41129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        nameList.add(new I18Name(language[0], Locale.forLanguageTag(language[0]), text[0]));
41229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        HSFriendlyNameElement expected = new HSFriendlyNameElement(nameList);
41329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
41429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(getHSFriendlyNamePayload(language, text));
41529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
41629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseHS20Element(Constants.ANQPElementType.HSFriendlyName, buffer));
41729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
41829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
41929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
42029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected HSWanMetricsElement will be returned when parsing a buffer that
42129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a Hotspot 2.0 WAN Metrics ANQP element.
42229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
42329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
42429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
42529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
42629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseHSWANMetricsElement() throws Exception {
42729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int status = HSWanMetricsElement.LINK_STATUS_UP;
42829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        boolean symmetric = false;
42929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        boolean capped = true;
43029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        long downlinkSpeed = 0x12453L;
43129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        long uplinkSpeed = 0x12423L;
43229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int downlinkLoad = 0x12;
43329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int uplinkLoad = 0x23;
43429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int lmd = 0x2321;
43529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
43629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        HSWanMetricsElement expected = new HSWanMetricsElement(status, symmetric, capped,
43729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                downlinkSpeed, uplinkSpeed, downlinkLoad, uplinkLoad, lmd);
43829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
43929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[] data = getHSWanMetricsPayload(status, symmetric, capped, downlinkSpeed,
44029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                uplinkSpeed, downlinkLoad, uplinkLoad, lmd);
44129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(data);
44229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
44329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseHS20Element(Constants.ANQPElementType.HSWANMetrics, buffer));
44429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
44529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
44629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
44729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected HSConnectionCapabilityElement will be returned when parsing a
44829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * buffer that contained a Hotspot 2.0 Connection Capability ANQP element.
44929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
45029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
45129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
45229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
45329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseHSConnectionCapabilityElement() throws Exception {
45429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int protocol = 12;
45529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int port = 23;
45629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        int status = ProtocolPortTuple.PROTO_STATUS_OPEN;
45729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
45829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        List<ProtocolPortTuple> statusList = new ArrayList<>();
45929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        statusList.add(new ProtocolPortTuple(protocol, port, status));
46029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        HSConnectionCapabilityElement expected = new HSConnectionCapabilityElement(statusList);
46129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
46229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(
46329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                getHSConnectionCapabilityPayload(protocol, port, status));
46429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
46529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseHS20Element(Constants.ANQPElementType.HSConnCapability, buffer));
46629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
46729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
46829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    /**
46929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * Verify that an expected RawByteElement will be returned when parsing a buffer that
47029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * contained a Hotspot 2.0 OSU Providers element.
47129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     *
47229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     * @throws Exception
47329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu     */
47429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    @Test
47529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    public void parseHSOUSProvidersElement() throws Exception {
47629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        byte[] data = new byte[10];
47729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
47829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        RawByteElement expected =
47929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                new RawByteElement(Constants.ANQPElementType.HSOSUProviders, data);
48029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu
48129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        ByteBuffer buffer = ByteBuffer.wrap(data);
48229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu        assertEquals(expected,
48329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu                ANQPParser.parseHS20Element(Constants.ANQPElementType.HSOSUProviders, buffer));
48429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu    }
48529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu}
486