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