blob: 0b9de5424828e33946ac1f9c98207a4e3c8c6c4b [file] [log] [blame]
/**
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package android.content.pm.cts;
import android.content.pm.FeatureGroupInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.test.AndroidTestCase;
import java.util.Arrays;
import java.util.Comparator;
public class FeatureGroupInfoTest extends AndroidTestCase {
private PackageManager mPackageManager;
@Override
protected void setUp() throws Exception {
super.setUp();
mPackageManager = getContext().getPackageManager();
}
public void testFeatureGroupsAreCorrect() throws Exception {
FeatureInfo[] expectedFeatures = new FeatureInfo[] {
createFeatureInfo("android.hardware.camera", true),
createFeatureInfo(0x00020000, true)
};
FeatureGroupInfo[] expectedGroups = new FeatureGroupInfo[] {
createFeatureGroup(new FeatureInfo[] {
}),
createFeatureGroup(new FeatureInfo[] {
createFeatureInfo("android.hardware.location", true),
createFeatureInfo(0x00030000, true)
}),
createFeatureGroup(new FeatureInfo[] {
createFeatureInfo("android.hardware.camera", true),
createFeatureInfo(0x00010001, true)
})
};
PackageInfo pi = mPackageManager.getPackageInfo(getContext().getPackageName(),
PackageManager.GET_CONFIGURATIONS);
assertNotNull(pi);
assertNotNull(pi.reqFeatures);
assertNotNull(pi.featureGroups);
assertFeatureInfosMatch(pi.reqFeatures, expectedFeatures);
assertFeatureGroupsMatch(pi.featureGroups, expectedGroups);
}
private static void assertFeatureInfosMatch(FeatureInfo[] actualFeatures,
FeatureInfo[] expectedFeatures) {
// We're going to do linear comparisons, so sort everything first.
Arrays.sort(actualFeatures, sFeatureInfoComparator);
Arrays.sort(expectedFeatures, sFeatureInfoComparator);
assertEquals(0, compareFeatureInfoArrays(actualFeatures, expectedFeatures));
}
private static void assertFeatureGroupsMatch(FeatureGroupInfo[] actualGroups,
FeatureGroupInfo[] expectedGroups) {
// We're going to do linear comparisons, so sort everything first.
sortFeatureInfos(actualGroups);
sortFeatureInfos(expectedGroups);
Arrays.sort(actualGroups, sFeatureGroupComparator);
Arrays.sort(expectedGroups, sFeatureGroupComparator);
assertEquals(expectedGroups.length, actualGroups.length);
final int N = expectedGroups.length;
for (int i = 0; i < N; i++) {
assertEquals(0, sFeatureGroupComparator.compare(expectedGroups[i], actualGroups[i]));
}
}
/**
* Helper method to create FeatureInfo objects.
*/
private static FeatureInfo createFeatureInfo(String name, boolean required) {
FeatureInfo fi = new FeatureInfo();
fi.name = name;
if (required) {
fi.flags |= FeatureInfo.FLAG_REQUIRED;
}
return fi;
}
/**
* Helper method to create OpenGL FeatureInfo objects.
*/
private static FeatureInfo createFeatureInfo(int glEsVersion, boolean required) {
FeatureInfo fi = new FeatureInfo();
fi.reqGlEsVersion = glEsVersion;
if (required) {
fi.flags |= FeatureInfo.FLAG_REQUIRED;
}
return fi;
}
private static FeatureGroupInfo createFeatureGroup(FeatureInfo[] featureInfos) {
FeatureGroupInfo group = new FeatureGroupInfo();
group.features = featureInfos;
return group;
}
private static void sortFeatureInfos(FeatureGroupInfo[] group) {
for (FeatureGroupInfo g : group) {
if (g.features != null) {
Arrays.sort(g.features, sFeatureInfoComparator);
}
}
}
private static int compareFeatureInfoArrays(FeatureInfo[] a, FeatureInfo[] b) {
final int aCount = a != null ? a.length : 0;
final int bCount = b != null ? b.length : 0;
final int N = Math.min(aCount, bCount);
for (int i = 0; i < N; i++) {
int diff = sFeatureInfoComparator.compare(a[i], b[i]);
if (diff != 0) {
return diff;
}
}
return Integer.compare(aCount, bCount);
}
/**
* A Comparator for FeatureGroups that assumes that the FeatureInfo array is
* already sorted.
*/
private static final Comparator<FeatureGroupInfo> sFeatureGroupComparator =
new Comparator<FeatureGroupInfo>() {
@Override
public int compare(FeatureGroupInfo o1, FeatureGroupInfo o2) {
return compareFeatureInfoArrays(o1.features, o2.features);
}
};
private static final Comparator<FeatureInfo> sFeatureInfoComparator =
new Comparator<FeatureInfo>() {
@Override
public int compare(FeatureInfo o1, FeatureInfo o2) {
final int diff;
if (o1.name == null && o2.name != null) {
diff = -1;
} else if (o1.name != null && o2.name == null) {
diff = 1;
} else if (o1.name == null && o2.name == null) {
diff = Integer.compare(o1.reqGlEsVersion, o2.reqGlEsVersion);
} else {
diff = o1.name.compareTo(o2.name);
}
if (diff == 0) {
return Integer.compare(o1.flags, o2.flags);
}
return diff;
}
};
}