Merge "hotspot2: add support for complete HomeSP subtree"

This commit is contained in:
Treehugger Robot
2017-01-25 02:02:58 +00:00
committed by Gerrit Code Review
5 changed files with 564 additions and 20 deletions

View File

@@ -21,11 +21,14 @@ import android.net.wifi.hotspot2.pps.Credential;
import android.net.wifi.hotspot2.pps.HomeSP;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.xml.sax.SAXException;
@@ -131,6 +134,14 @@ public final class PPSMOParser {
private static final String NODE_FQDN = "FQDN";
private static final String NODE_FRIENDLY_NAME = "FriendlyName";
private static final String NODE_ROAMING_CONSORTIUM_OI = "RoamingConsortiumOI";
private static final String NODE_NETWORK_ID = "NetworkID";
private static final String NODE_SSID = "SSID";
private static final String NODE_HESSID = "HESSID";
private static final String NODE_ICON_URL = "IconURL";
private static final String NODE_HOME_OI_LIST = "HomeOIList";
private static final String NODE_HOME_OI = "HomeOI";
private static final String NODE_HOME_OI_REQUIRED = "HomeOIRequired";
private static final String NODE_OTHER_HOME_PARTNERS = "OtherHomePartners";
/**
* Fields under Credential subtree.
@@ -558,6 +569,20 @@ public final class PPSMOParser {
homeSp.roamingConsortiumOIs =
parseRoamingConsortiumOI(getPpsNodeValue(child));
break;
case NODE_ICON_URL:
homeSp.iconUrl = getPpsNodeValue(child);
break;
case NODE_NETWORK_ID:
homeSp.homeNetworkIds = parseNetworkIds(child);
break;
case NODE_HOME_OI_LIST:
Pair<List<Long>, List<Long>> homeOIs = parseHomeOIList(child);
homeSp.matchAllOIs = convertFromLongList(homeOIs.first);
homeSp.matchAnyOIs = convertFromLongList(homeOIs.second);
break;
case NODE_OTHER_HOME_PARTNERS:
homeSp.otherHomePartners = parseOtherHomePartners(child);
break;
default:
throw new ParsingException("Unknown node under HomeSP: " + child.getName());
}
@@ -586,6 +611,192 @@ public final class PPSMOParser {
return oiArray;
}
/**
* Parse configurations under PerProviderSubscription/HomeSP/NetworkID subtree.
*
* @param node PPSNode representing the root of the PerProviderSubscription/HomeSP/NetworkID
* subtree
* @return HashMap<String, Long> representing list of <SSID, HESSID> pair.
* @throws ParsingException
*/
static private Map<String, Long> parseNetworkIds(PPSNode node)
throws ParsingException {
if (node.isLeaf()) {
throw new ParsingException("Leaf node not expected for NetworkID");
}
Map<String, Long> networkIds = new HashMap<>();
for (PPSNode child : node.getChildren()) {
Pair<String, Long> networkId = parseNetworkIdInstance(child);
networkIds.put(networkId.first, networkId.second);
}
return networkIds;
}
/**
* Parse configurations under PerProviderSubscription/HomeSP/NetworkID/<X+> subtree.
* The instance name (<X+>) is irrelevant and must be unique for each instance, which
* is verified when the PPS tree is constructed {@link #buildPpsNode}.
*
* @param node PPSNode representing the root of the
* PerProviderSubscription/HomeSP/NetworkID/<X+> subtree
* @return Pair<String, Long> representing <SSID, HESSID> pair.
* @throws ParsingException
*/
static private Pair<String, Long> parseNetworkIdInstance(PPSNode node)
throws ParsingException {
if (node.isLeaf()) {
throw new ParsingException("Leaf node not expected for NetworkID instance");
}
String ssid = null;
Long hessid = null;
for (PPSNode child : node.getChildren()) {
switch (child.getName()) {
case NODE_SSID:
ssid = getPpsNodeValue(child);
break;
case NODE_HESSID:
try {
hessid = Long.parseLong(getPpsNodeValue(child), 16);
} catch (NumberFormatException e) {
throw new ParsingException("Invalid HESSID: " + getPpsNodeValue(child));
}
break;
default:
throw new ParsingException("Unknown node under NetworkID instance: " +
child.getName());
}
}
if (ssid == null)
throw new ParsingException("NetworkID instance missing SSID");
return new Pair<String, Long>(ssid, hessid);
}
/**
* Parse configurations under PerProviderSubscription/HomeSP/HomeOIList subtree.
*
* @param node PPSNode representing the root of the PerProviderSubscription/HomeSP/HomeOIList
* subtree
* @return Pair<List<Long>, List<Long>> containing both MatchAllOIs and MatchAnyOIs list.
* @throws ParsingException
*/
private static Pair<List<Long>, List<Long>> parseHomeOIList(PPSNode node)
throws ParsingException {
if (node.isLeaf()) {
throw new ParsingException("Leaf node not expected for HomeOIList");
}
List<Long> matchAllOIs = new ArrayList<Long>();
List<Long> matchAnyOIs = new ArrayList<Long>();
for (PPSNode child : node.getChildren()) {
Pair<Long, Boolean> homeOI = parseHomeOIInstance(child);
if (homeOI.second.booleanValue()) {
matchAllOIs.add(homeOI.first);
} else {
matchAnyOIs.add(homeOI.first);
}
}
return new Pair<List<Long>, List<Long>>(matchAllOIs, matchAnyOIs);
}
/**
* Parse configurations under PerProviderSubscription/HomeSP/HomeOIList/<X+> subtree.
* The instance name (<X+>) is irrelevant and must be unique for each instance, which
* is verified when the PPS tree is constructed {@link #buildPpsNode}.
*
* @param node PPSNode representing the root of the
* PerProviderSubscription/HomeSP/HomeOIList/<X+> subtree
* @return Pair<Long, Boolean> containing a HomeOI and a HomeOIRequired flag
* @throws ParsingException
*/
private static Pair<Long, Boolean> parseHomeOIInstance(PPSNode node) throws ParsingException {
if (node.isLeaf()) {
throw new ParsingException("Leaf node not expected for HomeOI instance");
}
Long oi = null;
Boolean required = null;
for (PPSNode child : node.getChildren()) {
switch (child.getName()) {
case NODE_HOME_OI:
try {
oi = Long.valueOf(getPpsNodeValue(child), 16);
} catch (NumberFormatException e) {
throw new ParsingException("Invalid HomeOI: " + getPpsNodeValue(child));
}
break;
case NODE_HOME_OI_REQUIRED:
required = Boolean.valueOf(getPpsNodeValue(child));
break;
default:
throw new ParsingException("Unknown node under NetworkID instance: " +
child.getName());
}
}
if (oi == null) {
throw new ParsingException("HomeOI instance missing OI field");
}
if (required == null) {
throw new ParsingException("HomeOI instance missing required field");
}
return new Pair<Long, Boolean>(oi, required);
}
/**
* Parse configurations under PerProviderSubscription/HomeSP/OtherHomePartners subtree.
* This contains a list of FQDN (Fully Qualified Domain Name) that are considered
* home partners.
*
* @param node PPSNode representing the root of the
* PerProviderSubscription/HomeSP/OtherHomePartners subtree
* @return String[] list of partner's FQDN
* @throws ParsingException
*/
private static String[] parseOtherHomePartners(PPSNode node) throws ParsingException {
if (node.isLeaf()) {
throw new ParsingException("Leaf node not expected for OtherHomePartners");
}
List<String> otherHomePartners = new ArrayList<String>();
for (PPSNode child : node.getChildren()) {
String fqdn = parseOtherHomePartnerInstance(child);
otherHomePartners.add(fqdn);
}
return otherHomePartners.toArray(new String[otherHomePartners.size()]);
}
/**
* Parse configurations under PerProviderSubscription/HomeSP/OtherHomePartners/<X+> subtree.
* The instance name (<X+>) is irrelevant and must be unique for each instance, which
* is verified when the PPS tree is constructed {@link #buildPpsNode}.
*
* @param node PPSNode representing the root of the
* PerProviderSubscription/HomeSP/OtherHomePartners/<X+> subtree
* @return String FQDN of the partner
* @throws ParsingException
*/
private static String parseOtherHomePartnerInstance(PPSNode node) throws ParsingException {
if (node.isLeaf()) {
throw new ParsingException("Leaf node not expected for OtherHomePartner instance");
}
String fqdn = null;
for (PPSNode child : node.getChildren()) {
switch (child.getName()) {
case NODE_FQDN:
fqdn = getPpsNodeValue(child);
break;
default:
throw new ParsingException(
"Unknown node under OtherHomePartner instance: " + child.getName());
}
}
if (fqdn == null) {
throw new ParsingException("OtherHomePartner instance missing FQDN field");
}
return fqdn;
}
/**
* Parse configurations under PerProviderSubscription/Credential subtree.
*
@@ -783,4 +994,19 @@ public final class PPSMOParser {
throw new ParsingException("Invalid integer value: " + value);
}
}
/**
* Convert a List<Long> to a primitive long array long[].
*
* @param list List to be converted
* @return long[]
*/
private static long[] convertFromLongList(List<Long> list) {
Long[] objectArray = list.toArray(new Long[list.size()]);
long[] primitiveArray = new long[objectArray.length];
for (int i = 0; i < objectArray.length; i++) {
primitiveArray[i] = objectArray[i].longValue();
}
return primitiveArray;
}
}

View File

@@ -21,7 +21,11 @@ import android.os.Parcel;
import android.text.TextUtils;
import android.util.Log;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* Class representing HomeSP subtree in PerProviderSubscription (PPS)
@@ -30,13 +34,21 @@ import java.util.Arrays;
* For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
* Release 2 Technical Specification.
*
* Currently we only support the nodes that are used by Hotspot 2.0 Release 1.
*
* @hide
*/
public final class HomeSP implements Parcelable {
private static final String TAG = "HomeSP";
/**
* Maximum number of bytes allowed for a SSID.
*/
private static final int MAX_SSID_BYTES = 32;
/**
* Integer value used for indicating null value in the Parcel.
*/
private static final int NULL_VALUE = -1;
/**
* FQDN (Fully Qualified Domain Name) of this home service provider.
*/
@@ -47,6 +59,55 @@ public final class HomeSP implements Parcelable {
*/
public String friendlyName = null;
/**
* Icon URL of this home service provider.
*/
public String iconUrl = null;
/**
* <SSID, HESSID> duple of the networks that are consider home networks.
*
* According to the Section 9.1.2 of the Hotspot 2.0 Release 2 Technical Specification,
* all nodes in the PSS MO are encoded using UTF-8 unless stated otherwise. Thus, the SSID
* string is assumed to be encoded using UTF-8.
*/
public Map<String, Long> homeNetworkIds = null;
/**
* Used for determining if this provider is a member of a given Hotspot provider.
* Every Organization Identifiers (OIs) in this list are required to match an OI in the
* the Roaming Consortium advertised by a Hotspot, in order to consider this provider
* as a member of that Hotspot provider (e.g. successful authentication with such Hotspot
* is possible).
*
* Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object
* (MO) tree for more detail.
*/
public long[] matchAllOIs = null;
/**
* Used for determining if this provider is a member of a given Hotspot provider.
* Matching of any Organization Identifiers (OIs) in this list with an OI in the
* Roaming Consortium advertised by a Hotspot, will consider this provider as a member
* of that Hotspot provider (e.g. successful authentication with such Hotspot
* is possible).
*
* {@link #matchAllOIs} will have precedence over this one, meaning this list will
* only be used for matching if {@link #matchAllOIs} is null or empty.
*
* Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object
* (MO) tree for more detail.
*/
public long[] matchAnyOIs = null;
/**
* List of FQDN (Fully Qualified Domain Name) of partner providers.
* These providers should also be regarded as home Hotspot operators.
* This relationship is most likely achieved via a commercial agreement or
* operator merges between the providers.
*/
public String[] otherHomePartners = null;
/**
* List of Organization Identifiers (OIs) identifying a roaming consortium of
* which this provider is a member.
@@ -64,13 +125,28 @@ public final class HomeSP implements Parcelable {
* @param source The source to copy from
*/
public HomeSP(HomeSP source) {
if (source != null) {
fqdn = source.fqdn;
friendlyName = source.friendlyName;
if (source.roamingConsortiumOIs != null) {
roamingConsortiumOIs = Arrays.copyOf(source.roamingConsortiumOIs,
source.roamingConsortiumOIs.length);
}
if (source == null) {
return;
}
fqdn = source.fqdn;
friendlyName = source.friendlyName;
iconUrl = source.iconUrl;
if (source.homeNetworkIds != null) {
homeNetworkIds = Collections.unmodifiableMap(source.homeNetworkIds);
}
if (source.matchAllOIs != null) {
matchAllOIs = Arrays.copyOf(source.matchAllOIs, source.matchAllOIs.length);
}
if (source.matchAnyOIs != null) {
matchAnyOIs = Arrays.copyOf(source.matchAnyOIs, source.matchAnyOIs.length);
}
if (source.otherHomePartners != null) {
otherHomePartners = Arrays.copyOf(source.otherHomePartners,
source.otherHomePartners.length);
}
if (source.roamingConsortiumOIs != null) {
roamingConsortiumOIs = Arrays.copyOf(source.roamingConsortiumOIs,
source.roamingConsortiumOIs.length);
}
}
@@ -83,6 +159,11 @@ public final class HomeSP implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(fqdn);
dest.writeString(friendlyName);
dest.writeString(iconUrl);
writeHomeNetworkIds(dest, homeNetworkIds);
dest.writeLongArray(matchAllOIs);
dest.writeLongArray(matchAnyOIs);
dest.writeStringArray(otherHomePartners);
dest.writeLongArray(roamingConsortiumOIs);
}
@@ -96,9 +177,15 @@ public final class HomeSP implements Parcelable {
}
HomeSP that = (HomeSP) thatObject;
return TextUtils.equals(fqdn, that.fqdn) &&
TextUtils.equals(friendlyName, that.friendlyName) &&
Arrays.equals(roamingConsortiumOIs, that.roamingConsortiumOIs);
return TextUtils.equals(fqdn, that.fqdn)
&& TextUtils.equals(friendlyName, that.friendlyName)
&& TextUtils.equals(iconUrl, that.iconUrl)
&& (homeNetworkIds == null ? that.homeNetworkIds == null
: homeNetworkIds.equals(that.homeNetworkIds))
&& Arrays.equals(matchAllOIs, that.matchAllOIs)
&& Arrays.equals(matchAnyOIs, that.matchAnyOIs)
&& Arrays.equals(otherHomePartners, that.otherHomePartners)
&& Arrays.equals(roamingConsortiumOIs, that.roamingConsortiumOIs);
}
/**
@@ -115,6 +202,16 @@ public final class HomeSP implements Parcelable {
Log.d(TAG, "Missing friendly name");
return false;
}
// Verify SSIDs specified in the NetworkID
if (homeNetworkIds != null) {
for (Map.Entry<String, Long> entry : homeNetworkIds.entrySet()) {
if (entry.getKey() == null ||
entry.getKey().getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) {
Log.d(TAG, "Invalid SSID in HomeNetworkIDs");
return false;
}
}
}
return true;
}
@@ -125,6 +222,11 @@ public final class HomeSP implements Parcelable {
HomeSP homeSp = new HomeSP();
homeSp.fqdn = in.readString();
homeSp.friendlyName = in.readString();
homeSp.iconUrl = in.readString();
homeSp.homeNetworkIds = readHomeNetworkIds(in);
homeSp.matchAllOIs = in.createLongArray();
homeSp.matchAnyOIs = in.createLongArray();
homeSp.otherHomePartners = in.createStringArray();
homeSp.roamingConsortiumOIs = in.createLongArray();
return homeSp;
}
@@ -133,5 +235,51 @@ public final class HomeSP implements Parcelable {
public HomeSP[] newArray(int size) {
return new HomeSP[size];
}
/**
* Helper function for reading a Home Network IDs map from a Parcel.
*
* @param in The Parcel to read from
* @return Map of home network IDs
*/
private Map<String, Long> readHomeNetworkIds(Parcel in) {
int size = in.readInt();
if (size == NULL_VALUE) {
return null;
}
Map<String, Long> networkIds = new HashMap<>(size);
for (int i = 0; i < size; i++) {
String key = in.readString();
Long value = null;
long readValue = in.readLong();
if (readValue != NULL_VALUE) {
value = Long.valueOf(readValue);
}
networkIds.put(key, value);
}
return networkIds;
}
};
/**
* Helper function for writing Home Network IDs map to a Parcel.
*
* @param dest The Parcel to write to
* @param networkIds The map of home network IDs
*/
private static void writeHomeNetworkIds(Parcel dest, Map<String, Long> networkIds) {
if (networkIds == null) {
dest.writeInt(NULL_VALUE);
return;
}
dest.writeInt(networkIds.size());
for (Map.Entry<String, Long> entry : networkIds.entrySet()) {
dest.writeString(entry.getKey());
if (entry.getValue() == null) {
dest.writeLong(NULL_VALUE);
} else {
dest.writeLong(entry.getValue());
}
}
}
}

View File

@@ -23,6 +23,66 @@
<NodeName>RoamingConsortiumOI</NodeName>
<Value>112233,445566</Value>
</Node>
<Node>
<NodeName>IconURL</NodeName>
<Value>icon.test.com</Value>
</Node>
<Node>
<NodeName>NetworkID</NodeName>
<Node>
<NodeName>n001</NodeName>
<Node>
<NodeName>SSID</NodeName>
<Value>TestSSID</Value>
</Node>
<Node>
<NodeName>HESSID</NodeName>
<Value>12345678</Value>
</Node>
</Node>
<Node>
<NodeName>n002</NodeName>
<Node>
<NodeName>SSID</NodeName>
<Value>NullHESSID</Value>
</Node>
</Node>
</Node>
<Node>
<NodeName>HomeOIList</NodeName>
<Node>
<NodeName>h001</NodeName>
<Node>
<NodeName>HomeOI</NodeName>
<Value>11223344</Value>
</Node>
<Node>
<NodeName>HomeOIRequired</NodeName>
<Value>true</Value>
</Node>
</Node>
<Node>
<NodeName>h002</NodeName>
<Node>
<NodeName>HomeOI</NodeName>
<Value>55667788</Value>
</Node>
<Node>
<NodeName>HomeOIRequired</NodeName>
<Value>false</Value>
</Node>
</Node>
</Node>
<Node>
<NodeName>OtherHomePartners</NodeName>
<Node>
<NodeName>o001</NodeName>
<Node>
<NodeName>FQDN</NodeName>
<Value>other.fqdn.com</Value>
</Node>
</Node>
</Node>
</Node>
<Node>
<NodeName>Credential</NodeName>

View File

@@ -32,6 +32,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
/**
* Unit tests for {@link android.net.wifi.hotspot2.omadm.PPSMOParser}.
@@ -85,6 +86,13 @@ public class PPSMOParserTest {
config.homeSp.friendlyName = "Century House";
config.homeSp.fqdn = "mi6.co.uk";
config.homeSp.roamingConsortiumOIs = new long[] {0x112233L, 0x445566L};
config.homeSp.iconUrl = "icon.test.com";
config.homeSp.homeNetworkIds = new HashMap<>();
config.homeSp.homeNetworkIds.put("TestSSID", 0x12345678L);
config.homeSp.homeNetworkIds.put("NullHESSID", null);
config.homeSp.matchAllOIs = new long[] {0x11223344};
config.homeSp.matchAnyOIs = new long[] {0x55667788};
config.homeSp.otherHomePartners = new String[] {"other.fqdn.com"};
// Credential configuration.
config.credential = new Credential();

View File

@@ -24,19 +24,71 @@ import android.test.suitebuilder.annotation.SmallTest;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Unit tests for {@link android.net.wifi.hotspot2.pps.HomeSP}.
*/
@SmallTest
public class HomeSPTest {
private static HomeSP createHomeSp() {
/**
* Helper function for creating a map of home network IDs for testing.
*
* @return Map of home network IDs
*/
private static Map<String, Long> createHomeNetworkIds() {
Map<String, Long> homeNetworkIds = new HashMap<>();
homeNetworkIds.put("ssid", 0x1234L);
homeNetworkIds.put("nullhessid", null);
return homeNetworkIds;
}
/**
* Helper function for creating a HomeSP for testing.
*
* @param homeNetworkIds The map of home network IDs associated with HomeSP
* @return {@link HomeSP}
*/
private static HomeSP createHomeSp(Map<String, Long> homeNetworkIds) {
HomeSP homeSp = new HomeSP();
homeSp.fqdn = "fqdn";
homeSp.friendlyName = "friendly name";
homeSp.iconUrl = "icon.url";
homeSp.homeNetworkIds = homeNetworkIds;
homeSp.matchAllOIs = new long[] {0x11L, 0x22L};
homeSp.matchAnyOIs = new long[] {0x33L, 0x44L};
homeSp.otherHomePartners = new String[] {"partner1", "partner2"};
homeSp.roamingConsortiumOIs = new long[] {0x55, 0x66};
return homeSp;
}
/**
* Helper function for creating a HomeSP with home network IDs for testing.
*
* @return {@link HomeSP}
*/
private static HomeSP createHomeSpWithHomeNetworkIds() {
return createHomeSp(createHomeNetworkIds());
}
/**
* Helper function for creating a HomeSP without home network IDs for testing.
*
* @return {@link HomeSP}
*/
private static HomeSP createHomeSpWithoutHomeNetworkIds() {
return createHomeSp(null);
}
/**
* Helper function for verifying HomeSP after parcel write then read.
* @param writeHomeSp
* @throws Exception
*/
private static void verifyParcel(HomeSP writeHomeSp) throws Exception {
Parcel parcel = Parcel.obtain();
writeHomeSp.writeToParcel(parcel, 0);
@@ -57,13 +109,23 @@ public class HomeSPTest {
}
/**
* Verify parcel read/write for a valid HomeSP.
* Verify parcel read/write for a HomeSP containing Home Network IDs.
*
* @throws Exception
*/
@Test
public void verifyParcelWithValidHomeSP() throws Exception {
verifyParcel(createHomeSp());
public void verifyParcelWithHomeNetworkIds() throws Exception {
verifyParcel(createHomeSpWithHomeNetworkIds());
}
/**
* Verify parcel read/write for a HomeSP without Home Network IDs.
*
* @throws Exception
*/
@Test
public void verifyParcelWithoutHomeNetworkIds() throws Exception {
verifyParcel(createHomeSpWithoutHomeNetworkIds());
}
/**
@@ -119,6 +181,49 @@ public class HomeSPTest {
assertTrue(homeSp.validate());
}
/**
* Verify that a HomeSP is valid when the optional Home Network IDs are
* provided.
*
* @throws Exception
*/
@Test
public void validateHomeSpWithHomeNetworkIds() throws Exception {
HomeSP homeSp = createHomeSpWithHomeNetworkIds();
assertTrue(homeSp.validate());
}
/**
* Verify that a HomeSP is valid when the optional Home Network IDs are
* not provided.
*
* @throws Exception
*/
@Test
public void validateHomeSpWithoutHomeNetworkIds() throws Exception {
HomeSP homeSp = createHomeSpWithoutHomeNetworkIds();
assertTrue(homeSp.validate());
}
/**
* Verify that a HomeSP is invalid when the optional Home Network IDs
* contained an invalid SSID (exceeding maximum number of bytes).
*
* @throws Exception
*/
@Test
public void validateHomeSpWithInvalidHomeNetworkIds() throws Exception {
HomeSP homeSp = new HomeSP();
homeSp.fqdn = "fqdn";
homeSp.friendlyName = "friendly name";
homeSp.homeNetworkIds = new HashMap<>();
byte[] rawSsidBytes = new byte[33];
Arrays.fill(rawSsidBytes, (byte) 'a');
homeSp.homeNetworkIds.put(
StringFactory.newStringFromBytes(rawSsidBytes, StandardCharsets.UTF_8), 0x1234L);
assertFalse(homeSp.validate());
}
/**
* Verify that copy constructor works when pass in a null source.
*
@@ -138,10 +243,7 @@ public class HomeSPTest {
*/
@Test
public void validateCopyConstructorFromValidSource() throws Exception {
HomeSP sourceSp = new HomeSP();
sourceSp.fqdn = "fqdn";
sourceSp.friendlyName = "friendlyName";
sourceSp.roamingConsortiumOIs = new long[] {0x55, 0x66};
HomeSP sourceSp = createHomeSpWithHomeNetworkIds();
HomeSP copySp = new HomeSP(sourceSp);
assertTrue(copySp.equals(sourceSp));
}