am dc92005f: Merge "Test Sensor Feature Reporting" into froyo

Merge commit 'dc92005f7fca6ee665d76bef2cf56d1e12cb5993' into gingerbread

* commit 'dc92005f7fca6ee665d76bef2cf56d1e12cb5993':
  Test Sensor Feature Reporting
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorManagerTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorManagerTest.java
index 87ed308..73c32af 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorManagerTest.java
@@ -15,9 +15,15 @@
  */
 package android.hardware.cts;
 
-import java.util.List;
+import dalvik.annotation.BrokenTest;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
@@ -26,12 +32,13 @@
 import android.test.AndroidTestCase;
 import android.util.Log;
 
-import dalvik.annotation.BrokenTest;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 @SuppressWarnings("deprecation")
 @TestTargetClass(SensorManager.class)
@@ -304,4 +311,75 @@
             assertTrue(Math.abs(orientation[2]) <= TWO_PI);
         }
     }
+
+    /**
+     * Check that the sensor features reported by the PackageManager correspond to the sensors
+     * returned by {@link SensorManager#getSensorList(int)}.
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getSensorList",
+        args = {int.class}
+    )
+    public void testGetSensorList() throws Exception {
+        Set<String> featuresLeft = getAllSensorFeatures();
+
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_ACCELEROMETER,
+                Sensor.TYPE_ACCELEROMETER);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_COMPASS,
+                Sensor.TYPE_MAGNETIC_FIELD);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_LIGHT,
+                Sensor.TYPE_LIGHT);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_PROXIMITY,
+                Sensor.TYPE_PROXIMITY);
+
+        assertTrue("Assertions need to be added to this test for " + featuresLeft,
+                featuresLeft.isEmpty());
+    }
+
+    /** Get a list of all the sensor features to make sure the test checks them all. */
+    private static Set<String> getAllSensorFeatures()
+            throws IllegalArgumentException, IllegalAccessException {
+        Set<String> sensorFeatures = new HashSet<String>();
+        Field[] fields = PackageManager.class.getFields();
+        for (Field field : fields) {
+            if (field.getName().startsWith("FEATURE_SENSOR_")) {
+                String feature = (String) field.get(null);
+                sensorFeatures.add(feature);
+            }
+        }
+        return sensorFeatures;
+    }
+
+    /**
+     * Check that if the PackageManager declares a sensor feature that the device has at least
+     * one sensor that matches that feature. Also check that if a PackageManager does not declare
+     * a sensor that the device also does not have such a sensor.
+     *
+     * @param featuresLeft to check in order to make sure the test covers all sensor features
+     * @param expectedFeature that the PackageManager may report
+     * @param expectedSensorType that that {@link SensorManager#getSensorList(int)} may have
+     */
+    private void assertFeatureForSensor(Set<String> featuresLeft, String expectedFeature,
+            int expectedSensorType) {
+        assertTrue("Features left " + featuresLeft + " to check did not include "
+                + expectedFeature, featuresLeft.remove(expectedFeature));
+
+        PackageManager packageManager = mContext.getPackageManager();
+        boolean hasSensorFeature = packageManager.hasSystemFeature(expectedFeature);
+
+        List<Sensor> sensors = mSensorManager.getSensorList(expectedSensorType);
+        List<String> sensorNames = new ArrayList<String>(sensors.size());
+        for (Sensor sensor : sensors) {
+            sensorNames.add(sensor.getName());
+        }
+        boolean hasSensorType = !sensors.isEmpty();
+
+        String message = "PackageManager#hasSystemFeature(" + expectedFeature + ") returns "
+                + hasSensorFeature
+                + " but SensorManager#getSensorList(" + expectedSensorType + ") shows sensors "
+                + sensorNames;
+
+        assertEquals(message, hasSensorFeature, hasSensorType);
+    }
 }