diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index 574e9e9..c865140 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -16,21 +16,36 @@
 
 package android.hardware.cts;
 
+import java.lang.IllegalArgumentException;
+import java.lang.Override;
 import java.util.List;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
+import android.hardware.TriggerEvent;
+import android.hardware.TriggerEventListener;
 import android.test.AndroidTestCase;
 
 public class SensorTest extends AndroidTestCase {
+    private SensorManager mSensorManager;
+    private TriggerListener mTriggerListener;
+    private SensorListener mSensorListener;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+        mTriggerListener = new TriggerListener();
+        mSensorListener = new SensorListener();
+    }
 
     public void testSensorOperations() {
         // Because we can't know every sensors unit details, so we can't assert
         // get values with specified values.
-        final SensorManager mSensorManager =
-            (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
         List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
         assertNotNull(sensors);
         Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
@@ -70,7 +85,48 @@
         }
     }
 
-    private void assertSensorValues(Sensor sensor) {
+    public void testRequestTriggerWithNonTriggerSensor() {
+        Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+        boolean result;
+        if (sensor != null) {
+            result = mSensorManager.requestTriggerSensor(mTriggerListener, sensor);
+            assertFalse(result);
+        }
+    }
+
+    public void testCancelTriggerWithNonTriggerSensor() {
+        Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+        boolean result;
+        if (sensor != null) {
+            result = mSensorManager.cancelTriggerSensor(mTriggerListener, sensor);
+            assertFalse(result);
+        }
+    }
+
+    public void testRegisterWithTriggerSensor() {
+        Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
+        boolean result;
+        if (sensor != null) {
+            result = mSensorManager.registerListener(mSensorListener, sensor,
+                    SensorManager.SENSOR_DELAY_NORMAL);
+            assertFalse(result);
+        }
+    }
+
+    public void testRegisterTwiceWithSameSensor() {
+        Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+        boolean result;
+        if (sensor != null) {
+            result = mSensorManager.registerListener(mSensorListener, sensor,
+                    SensorManager.SENSOR_DELAY_NORMAL);
+            assertTrue(result);
+            result = mSensorManager.registerListener(mSensorListener, sensor,
+                    SensorManager.SENSOR_DELAY_NORMAL);
+            assertFalse(result);
+        }
+    }
+
+        private void assertSensorValues(Sensor sensor) {
         assertTrue(sensor.getMaximumRange() >= 0);
         assertTrue(sensor.getPower() >= 0);
         assertTrue(sensor.getResolution() >= 0);
@@ -96,4 +152,20 @@
         }
         assertEquals(sensors, mSensorManager.getSensors());
     }
+
+    class TriggerListener extends TriggerEventListener {
+        @Override
+        public void onTrigger(TriggerEvent event) {
+        }
+    }
+
+    class SensorListener implements SensorEventListener {
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int accuracy) {
+        }
+    }
 }
