blob: 2c3c6f408b8eb9e115d7a461caf22c0c3b6e955d [file] [log] [blame]
Phil Dubach15f91be2009-05-19 16:41:52 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.hardware.cts;
18
destradaaa0b3bbc2014-09-03 14:08:00 -070019import com.android.cts.util.TimeoutReq;
Phil Dubach15f91be2009-05-19 16:41:52 -070020
destradaa4458c692014-10-15 12:42:29 -070021import junit.framework.Assert;
22
Phil Dubach15f91be2009-05-19 16:41:52 -070023import android.content.Context;
Dylan Reid91e52442011-03-17 15:45:10 -070024import android.content.pm.PackageManager;
Phil Dubach15f91be2009-05-19 16:41:52 -070025import android.hardware.Sensor;
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -080026import android.hardware.SensorEvent;
27import android.hardware.SensorEventListener;
Aravind Akella220386d2013-10-09 12:03:32 -070028import android.hardware.SensorEventListener2;
Phil Dubach15f91be2009-05-19 16:41:52 -070029import android.hardware.SensorManager;
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -080030import android.hardware.TriggerEvent;
31import android.hardware.TriggerEventListener;
Aravind Akella946ee6b2015-07-31 13:40:08 -070032import android.hardware.cts.helpers.SensorCtsHelper;
destradaa4458c692014-10-15 12:42:29 -070033import android.hardware.cts.helpers.SensorNotSupportedException;
34import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
35import android.hardware.cts.helpers.TestSensorEnvironment;
36import android.hardware.cts.helpers.TestSensorEventListener;
37import android.hardware.cts.helpers.TestSensorManager;
38import android.hardware.cts.helpers.sensoroperations.ParallelSensorOperation;
39import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
40import android.hardware.cts.helpers.sensorverification.EventGapVerification;
41import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
42import android.hardware.cts.helpers.sensorverification.EventTimestampSynchronizationVerification;
Aravind Akellabbc90db2013-10-23 18:20:02 -070043import android.os.Handler;
44import android.os.HandlerThread;
Aravind Akella5e685142014-06-06 11:58:12 -070045import android.os.PowerManager;
Aravind Akella32af5582014-07-31 15:50:47 -070046import android.os.SystemClock;
Aravind Akellacfea6df2014-05-29 18:28:44 -070047import android.util.Log;
Phil Dubach15f91be2009-05-19 16:41:52 -070048
destradaa4458c692014-10-15 12:42:29 -070049import java.util.ArrayList;
destradaaa0b3bbc2014-09-03 14:08:00 -070050import java.util.List;
Peng Xu7a6fb7b2015-05-20 14:24:12 -070051import java.util.Random;
Aravind Akella490e9b82015-01-29 17:41:07 -080052import java.util.concurrent.CountDownLatch;
destradaaa0b3bbc2014-09-03 14:08:00 -070053import java.util.concurrent.TimeUnit;
Aravind Akella8b91fd42014-08-26 16:57:31 -070054
destradaaa0b3bbc2014-09-03 14:08:00 -070055public class SensorTest extends SensorTestCase {
Aravind Akellacfea6df2014-05-29 18:28:44 -070056 private static final String TAG = "SensorTest";
destradaa4458c692014-10-15 12:42:29 -070057
Aravind Akellacfea6df2014-05-29 18:28:44 -070058 // Test only SDK defined sensors. Any sensors with type > 100 are ignored.
Aravind Akella8b91fd42014-08-26 16:57:31 -070059 private static final int MAX_OFFICIAL_ANDROID_SENSOR_TYPE = 100;
destradaa4458c692014-10-15 12:42:29 -070060
Aravind Akella5e685142014-06-06 11:58:12 -070061 private PowerManager.WakeLock mWakeLock;
destradaa4458c692014-10-15 12:42:29 -070062 private SensorManager mSensorManager;
Han, He82643092015-02-10 10:33:02 +080063 private TestSensorManager mTestSensorManager;
destradaa4458c692014-10-15 12:42:29 -070064 private NullTriggerEventListener mNullTriggerEventListener;
65 private NullSensorEventListener mNullSensorEventListener;
Han, He82643092015-02-10 10:33:02 +080066 private Sensor mTriggerSensor;
destradaa4458c692014-10-15 12:42:29 -070067 private List<Sensor> mSensorList;
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -080068
69 @Override
70 protected void setUp() throws Exception {
destradaa4458c692014-10-15 12:42:29 -070071 Context context = getContext();
72 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
Aravind Akella5e685142014-06-06 11:58:12 -070073 mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
destradaa4458c692014-10-15 12:42:29 -070074
75 mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
76 mNullTriggerEventListener = new NullTriggerEventListener();
77 mNullSensorEventListener = new NullSensorEventListener();
78
79 mSensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
80 assertNotNull("SensorList was null.", mSensorList);
81 if (mSensorList.isEmpty()) {
82 // several devices will not have sensors, so we need to skip the tests in those cases
83 throw new SensorTestStateNotSupportedException(
84 "Sensors are not available in the system.");
85 }
86
87 mWakeLock.acquire();
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -080088 }
Phil Dubach15f91be2009-05-19 16:41:52 -070089
destradaa4458c692014-10-15 12:42:29 -070090 @Override
91 protected void tearDown(){
Han, He82643092015-02-10 10:33:02 +080092 if (mSensorManager != null) {
93 // SensorManager will check listener and status, so just unregister listener
94 mSensorManager.unregisterListener(mNullSensorEventListener);
95 if (mTriggerSensor != null) {
96 mSensorManager.cancelTriggerSensor(mNullTriggerEventListener, mTriggerSensor);
97 mTriggerSensor = null;
98 }
99 }
100
101 if (mTestSensorManager != null) {
102 mTestSensorManager.unregisterListener();
103 mTestSensorManager = null;
104 }
105
destradaa4458c692014-10-15 12:42:29 -0700106 if (mWakeLock != null && mWakeLock.isHeld()) {
107 mWakeLock.release();
108 }
109 }
110
111 @SuppressWarnings("deprecation")
Phil Dubach15f91be2009-05-19 16:41:52 -0700112 public void testSensorOperations() {
113 // Because we can't know every sensors unit details, so we can't assert
114 // get values with specified values.
Phil Dubach15f91be2009-05-19 16:41:52 -0700115 Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Dylan Reid91e52442011-03-17 15:45:10 -0700116 boolean hasAccelerometer = getContext().getPackageManager().hasSystemFeature(
117 PackageManager.FEATURE_SENSOR_ACCELEROMETER);
118 // accelerometer sensor is optional
119 if (hasAccelerometer) {
120 assertEquals(Sensor.TYPE_ACCELEROMETER, sensor.getType());
121 assertSensorValues(sensor);
122 } else {
123 assertNull(sensor);
124 }
Phil Dubach15f91be2009-05-19 16:41:52 -0700125
Aravind Akella8d20ef62013-10-12 18:30:24 -0700126 sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
127 boolean hasStepCounter = getContext().getPackageManager().hasSystemFeature(
Aravind Akellacfea6df2014-05-29 18:28:44 -0700128 PackageManager.FEATURE_SENSOR_STEP_COUNTER);
Aravind Akella8d20ef62013-10-12 18:30:24 -0700129 // stepcounter sensor is optional
130 if (hasStepCounter) {
131 assertEquals(Sensor.TYPE_STEP_COUNTER, sensor.getType());
132 assertSensorValues(sensor);
133 } else {
134 assertNull(sensor);
135 }
136
137 sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
138 boolean hasStepDetector = getContext().getPackageManager().hasSystemFeature(
Aravind Akellacfea6df2014-05-29 18:28:44 -0700139 PackageManager.FEATURE_SENSOR_STEP_DETECTOR);
Aravind Akella8d20ef62013-10-12 18:30:24 -0700140 // stepdetector sensor is optional
141 if (hasStepDetector) {
142 assertEquals(Sensor.TYPE_STEP_DETECTOR, sensor.getType());
143 assertSensorValues(sensor);
144 } else {
145 assertNull(sensor);
146 }
147
Vinod Krishnan20d67252014-04-30 11:12:01 -0700148 sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
149 boolean hasHeartRate = getContext().getPackageManager().hasSystemFeature(
150 PackageManager.FEATURE_SENSOR_HEART_RATE);
151 // heartrate sensor is optional
152 if (hasHeartRate) {
153 assertEquals(Sensor.TYPE_HEART_RATE, sensor.getType());
154 assertSensorValues(sensor);
155 } else {
156 assertNull(sensor);
157 }
158
Phil Dubach15f91be2009-05-19 16:41:52 -0700159 sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Dylan Reid91e52442011-03-17 15:45:10 -0700160 boolean hasCompass = getContext().getPackageManager().hasSystemFeature(
161 PackageManager.FEATURE_SENSOR_COMPASS);
162 // compass sensor is optional
163 if (hasCompass) {
164 assertEquals(Sensor.TYPE_MAGNETIC_FIELD, sensor.getType());
165 assertSensorValues(sensor);
166 } else {
167 assertNull(sensor);
168 }
Phil Dubach15f91be2009-05-19 16:41:52 -0700169
170 sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
Dylan Reid91e52442011-03-17 15:45:10 -0700171 // orientation sensor is required if the device can physically implement it
172 if (hasCompass && hasAccelerometer) {
173 assertEquals(Sensor.TYPE_ORIENTATION, sensor.getType());
174 assertSensorValues(sensor);
175 }
Phil Dubach15f91be2009-05-19 16:41:52 -0700176
177 sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
Brett Chabotbc192a62009-09-17 19:25:33 -0700178 // temperature sensor is optional
179 if (sensor != null) {
180 assertEquals(Sensor.TYPE_TEMPERATURE, sensor.getType());
181 assertSensorValues(sensor);
182 }
Phil Dubach15f91be2009-05-19 16:41:52 -0700183 }
184
Aravind Akella1717afa2013-09-26 17:15:02 -0700185 public void testValuesForAllSensors() {
Aravind Akella8b91fd42014-08-26 16:57:31 -0700186 for (Sensor sensor : mSensorList) {
187 assertSensorValues(sensor);
188 }
189 }
190
191 private void hasOnlyOneWakeUpSensorOrEmpty(List<Sensor> sensors) {
192 if (sensors == null || sensors.isEmpty()) return;
193 if (sensors.size() > 1) {
194 fail("More than one " + sensors.get(0).getName() + " defined.");
195 return;
196 }
197 assertTrue(sensors.get(0).getName() + " defined as non-wake-up sensor",
198 sensors.get(0).isWakeUpSensor());
Aravind Akella8b91fd42014-08-26 16:57:31 -0700199 }
200
201 // Some sensors like proximity, significant motion etc. are defined as wake-up sensors by
202 // default. Check if the wake-up flag is set correctly.
203 public void testWakeUpFlags() {
204 final int TYPE_WAKE_GESTURE = 23;
205 final int TYPE_GLANCE_GESTURE = 24;
206 final int TYPE_PICK_UP_GESTURE = 25;
207
208 hasOnlyOneWakeUpSensorOrEmpty(mSensorManager.getSensorList(Sensor.TYPE_SIGNIFICANT_MOTION));
209 hasOnlyOneWakeUpSensorOrEmpty(mSensorManager.getSensorList(TYPE_WAKE_GESTURE));
210 hasOnlyOneWakeUpSensorOrEmpty(mSensorManager.getSensorList(TYPE_GLANCE_GESTURE));
211 hasOnlyOneWakeUpSensorOrEmpty(mSensorManager.getSensorList(TYPE_PICK_UP_GESTURE));
212
213 List<Sensor> proximity_sensors = mSensorManager.getSensorList(Sensor.TYPE_PROXIMITY);
214 if (proximity_sensors.isEmpty()) return;
215 boolean hasWakeUpProximitySensor = false;
216 for (Sensor sensor : proximity_sensors) {
217 if (sensor.isWakeUpSensor()) {
218 hasWakeUpProximitySensor = true;
219 break;
220 }
221 }
222 assertTrue("No wake-up proximity sensors implemented", hasWakeUpProximitySensor);
223 }
224
225 public void testGetDefaultSensorWithWakeUpFlag() {
226 // With wake-up flags set to false, the sensor returned should be a non wake-up sensor.
227 for (Sensor sensor : mSensorList) {
228 Sensor curr_sensor = mSensorManager.getDefaultSensor(sensor.getType(), false);
229 if (curr_sensor != null) {
230 assertFalse("getDefaultSensor wakeup=false returns a wake-up sensor" +
231 curr_sensor.getName(),
232 curr_sensor.isWakeUpSensor());
233 }
234
235 curr_sensor = mSensorManager.getDefaultSensor(sensor.getType(), true);
236 if (curr_sensor != null) {
237 assertTrue("getDefaultSensor wake-up returns non wake sensor" +
238 curr_sensor.getName(),
239 curr_sensor.isWakeUpSensor());
240 }
241 }
242 }
243
244 public void testSensorStringTypes() {
245 for (Sensor sensor : mSensorList) {
246 if (sensor.getType() < MAX_OFFICIAL_ANDROID_SENSOR_TYPE &&
247 !sensor.getStringType().startsWith("android.sensor.")) {
248 fail("StringType not set correctly for android defined sensor " +
249 sensor.getName() + " " + sensor.getStringType());
Aravind Akella1717afa2013-09-26 17:15:02 -0700250 }
251 }
252 }
253
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800254 public void testRequestTriggerWithNonTriggerSensor() {
Han, He82643092015-02-10 10:33:02 +0800255 mTriggerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
256 if (mTriggerSensor == null) {
destradaa4458c692014-10-15 12:42:29 -0700257 throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800258 }
Han, He82643092015-02-10 10:33:02 +0800259 boolean result = mSensorManager.requestTriggerSensor(mNullTriggerEventListener, mTriggerSensor);
destradaa4458c692014-10-15 12:42:29 -0700260 assertFalse(result);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800261 }
262
263 public void testCancelTriggerWithNonTriggerSensor() {
Han, He82643092015-02-10 10:33:02 +0800264 mTriggerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
265 if (mTriggerSensor == null) {
destradaa4458c692014-10-15 12:42:29 -0700266 throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800267 }
Han, He82643092015-02-10 10:33:02 +0800268 boolean result = mSensorManager.cancelTriggerSensor(mNullTriggerEventListener, mTriggerSensor);
destradaa4458c692014-10-15 12:42:29 -0700269 assertFalse(result);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800270 }
271
272 public void testRegisterWithTriggerSensor() {
273 Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
destradaa4458c692014-10-15 12:42:29 -0700274 if (sensor == null) {
275 throw new SensorNotSupportedException(Sensor.TYPE_SIGNIFICANT_MOTION);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800276 }
destradaa4458c692014-10-15 12:42:29 -0700277 boolean result = mSensorManager.registerListener(
278 mNullSensorEventListener,
279 sensor,
280 SensorManager.SENSOR_DELAY_NORMAL);
281 assertFalse(result);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800282 }
283
284 public void testRegisterTwiceWithSameSensor() {
285 Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
destradaa4458c692014-10-15 12:42:29 -0700286 if (sensor == null) {
287 throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800288 }
destradaa4458c692014-10-15 12:42:29 -0700289
290 boolean result = mSensorManager.registerListener(mNullSensorEventListener, sensor,
291 SensorManager.SENSOR_DELAY_NORMAL);
292 assertTrue(result);
293
294 result = mSensorManager.registerListener(mNullSensorEventListener, sensor,
295 SensorManager.SENSOR_DELAY_NORMAL);
296 assertFalse(result);
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800297 }
298
destradaa4458c692014-10-15 12:42:29 -0700299 // TODO: remove when parametized tests are supported and EventTimestampSynchronization
300 // verification is added to default verifications
Aravind Akella8b91fd42014-08-26 16:57:31 -0700301 @TimeoutReq(minutes=60)
Aravind Akella32af5582014-07-31 15:50:47 -0700302 public void testSensorTimeStamps() throws Exception {
destradaa4458c692014-10-15 12:42:29 -0700303 ArrayList<Throwable> errorsFound = new ArrayList<>();
304 for (Sensor sensor : mSensorList) {
305 // test both continuous and batching mode sensors
306 verifyLongActivation(sensor, 0 /* maxReportLatencyUs */, errorsFound);
307 verifyLongActivation(sensor, (int) TimeUnit.SECONDS.toMicros(10), errorsFound);
Aravind Akella32af5582014-07-31 15:50:47 -0700308 }
destradaa4458c692014-10-15 12:42:29 -0700309 assertOnErrors(errorsFound);
Aravind Akella32af5582014-07-31 15:50:47 -0700310 }
311
destradaa4458c692014-10-15 12:42:29 -0700312 // TODO: remove when parameterized tests are supported (see SensorBatchingTests.java)
Aravind Akellaa8884ea2014-09-26 21:07:02 -0700313 @TimeoutReq(minutes=20)
Aravind Akella1717afa2013-09-26 17:15:02 -0700314 public void testBatchAndFlush() throws Exception {
Aravind Akella946ee6b2015-07-31 13:40:08 -0700315 SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
destradaa4458c692014-10-15 12:42:29 -0700316 ArrayList<Throwable> errorsFound = new ArrayList<>();
317 for (Sensor sensor : mSensorList) {
318 verifyRegisterListenerCallFlush(sensor, null /* handler */, errorsFound);
Aravind Akella1717afa2013-09-26 17:15:02 -0700319 }
destradaa4458c692014-10-15 12:42:29 -0700320 assertOnErrors(errorsFound);
Aravind Akella1717afa2013-09-26 17:15:02 -0700321 }
322
destradaa4458c692014-10-15 12:42:29 -0700323 /**
324 * Verifies that sensor events arrive in the given message queue (Handler).
325 */
Aravind Akella8b91fd42014-08-26 16:57:31 -0700326 @TimeoutReq(minutes=10)
Aravind Akellabbc90db2013-10-23 18:20:02 -0700327 public void testBatchAndFlushWithHandler() throws Exception {
Aravind Akella946ee6b2015-07-31 13:40:08 -0700328 SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
destradaa4458c692014-10-15 12:42:29 -0700329 Sensor sensor = null;
330 for (Sensor s : mSensorList) {
331 if (s.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
332 sensor = s;
333 break;
Aravind Akellacfea6df2014-05-29 18:28:44 -0700334 }
Aravind Akellabbc90db2013-10-23 18:20:02 -0700335 }
destradaa4458c692014-10-15 12:42:29 -0700336 if (sensor == null) {
337 throw new SensorTestStateNotSupportedException(
338 "There are no Continuous sensors in the device.");
339 }
340
341 TestSensorEnvironment environment = new TestSensorEnvironment(
342 getContext(),
343 sensor,
344 SensorManager.SENSOR_DELAY_FASTEST,
345 (int) TimeUnit.SECONDS.toMicros(5));
Han, He82643092015-02-10 10:33:02 +0800346 mTestSensorManager = new TestSensorManager(environment);
destradaa4458c692014-10-15 12:42:29 -0700347
348 HandlerThread handlerThread = new HandlerThread("sensorThread");
349 handlerThread.start();
350 Handler handler = new Handler(handlerThread.getLooper());
destradaacbb8c002014-12-12 17:31:16 -0800351 TestSensorEventListener listener = new TestSensorEventListener(environment, handler);
destradaa4458c692014-10-15 12:42:29 -0700352
Han, He82643092015-02-10 10:33:02 +0800353 CountDownLatch eventLatch = mTestSensorManager.registerListener(listener, 1);
Aravind Akelladbc95c52015-06-09 10:22:16 -0700354 listener.waitForEvents(eventLatch, 1, true);
Han, He82643092015-02-10 10:33:02 +0800355 CountDownLatch flushLatch = mTestSensorManager.requestFlush();
Aravind Akelladbc95c52015-06-09 10:22:16 -0700356 listener.waitForFlushComplete(flushLatch, true);
destradaa4458c692014-10-15 12:42:29 -0700357 listener.assertEventsReceivedInHandler();
Aravind Akellabbc90db2013-10-23 18:20:02 -0700358 }
359
Peng Xu7a6fb7b2015-05-20 14:24:12 -0700360 /**
361 * Explicit testing the SensorManager.registerListener(SensorEventListener, Sensor, int, int).
362 */
363 @TimeoutReq(minutes=10)
364 public void testBatchAndFlushUseDefaultHandler() throws Exception {
Aravind Akella946ee6b2015-07-31 13:40:08 -0700365 SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
Peng Xu7a6fb7b2015-05-20 14:24:12 -0700366 Sensor sensor = null;
367 for (Sensor s : mSensorList) {
368 if (s.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
369 sensor = s;
370 break;
371 }
372 }
373 if (sensor == null) {
374 throw new SensorTestStateNotSupportedException(
375 "There are no Continuous sensors in the device.");
376 }
377
378 TestSensorEnvironment environment = new TestSensorEnvironment(
379 getContext(),
380 sensor,
381 SensorManager.SENSOR_DELAY_FASTEST,
382 (int) TimeUnit.SECONDS.toMicros(5));
383 mTestSensorManager = new TestSensorManager(environment);
384
385 TestSensorEventListener listener = new TestSensorEventListener(environment, null);
386
387 // specifyHandler <= false, use the SensorManager API without Handler parameter
388 CountDownLatch eventLatch = mTestSensorManager.registerListener(listener, 1, false);
Aravind Akelladbc95c52015-06-09 10:22:16 -0700389 listener.waitForEvents(eventLatch, 1, true);
Peng Xu7a6fb7b2015-05-20 14:24:12 -0700390 CountDownLatch flushLatch = mTestSensorManager.requestFlush();
Aravind Akelladbc95c52015-06-09 10:22:16 -0700391 listener.waitForFlushComplete(flushLatch, true);
Peng Xu7a6fb7b2015-05-20 14:24:12 -0700392 listener.assertEventsReceivedInHandler();
393 }
394
destradaa4458c692014-10-15 12:42:29 -0700395 // TODO: after L release move to SensorBatchingTests and run in all sensors with default
396 // verifications enabled
Peng Xu0c8aadf2015-06-03 20:23:36 -0700397 public void testBatchAndFlushWithMultipleSensors() throws Exception {
Aravind Akella946ee6b2015-07-31 13:40:08 -0700398 SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
destradaa4458c692014-10-15 12:42:29 -0700399 final int maxSensors = 3;
400 final int maxReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(10);
Aravind Akella828afa92014-11-14 17:52:15 -0800401 List<Sensor> sensorsToTest = new ArrayList<Sensor>();
402 for (Sensor sensor : mSensorList) {
403 if (sensor.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
404 sensorsToTest.add(sensor);
Aravind Akellacae9e022015-01-28 13:51:02 -0800405 if (sensorsToTest.size() == maxSensors) break;
Aravind Akella828afa92014-11-14 17:52:15 -0800406 }
407 }
Aravind Akella828afa92014-11-14 17:52:15 -0800408 final int numSensorsToTest = sensorsToTest.size();
409 if (numSensorsToTest == 0) {
Aravind Akellabbc90db2013-10-23 18:20:02 -0700410 return;
411 }
destradaa4458c692014-10-15 12:42:29 -0700412
413 StringBuilder builder = new StringBuilder();
414 ParallelSensorOperation parallelSensorOperation = new ParallelSensorOperation();
Aravind Akellacae9e022015-01-28 13:51:02 -0800415 for (Sensor sensor : sensorsToTest) {
416 TestSensorEnvironment environment = new TestSensorEnvironment(
417 getContext(),
418 sensor,
419 shouldEmulateSensorUnderLoad(),
420 SensorManager.SENSOR_DELAY_FASTEST,
421 maxReportLatencyUs);
422 FlushExecutor executor = new FlushExecutor(environment, 500 /* eventCount */);
423 parallelSensorOperation.add(new TestSensorOperation(environment, executor));
424 builder.append(sensor.getName()).append(", ");
Aravind Akellabbc90db2013-10-23 18:20:02 -0700425 }
Aravind Akellabbc90db2013-10-23 18:20:02 -0700426
destradaa4458c692014-10-15 12:42:29 -0700427 Log.i(TAG, "Testing batch/flush for sensors: " + builder);
destradaa24289b52014-10-20 11:41:00 -0700428 parallelSensorOperation.execute(getCurrentTestNode());
Aravind Akellabbc90db2013-10-23 18:20:02 -0700429 }
430
Aravind Akella1717afa2013-09-26 17:15:02 -0700431 private void assertSensorValues(Sensor sensor) {
Aravind Akellaa8884ea2014-09-26 21:07:02 -0700432 assertTrue("Max range must be positive. Range=" + sensor.getMaximumRange()
433 + " " + sensor.getName(), sensor.getMaximumRange() >= 0);
434 assertTrue("Max power must be positive. Power=" + sensor.getPower() + " " +
435 sensor.getName(), sensor.getPower() >= 0);
436 assertTrue("Max resolution must be positive. Resolution=" + sensor.getResolution() +
437 " " + sensor.getName(), sensor.getResolution() >= 0);
438 assertNotNull("Vendor name must not be null " + sensor.getName(), sensor.getVendor());
destradaa4458c692014-10-15 12:42:29 -0700439 assertTrue("Version must be positive version=" + sensor.getVersion() + " " +
440 sensor.getName(), sensor.getVersion() > 0);
destradaa774c0152014-09-15 17:00:37 -0700441 int fifoMaxEventCount = sensor.getFifoMaxEventCount();
442 int fifoReservedEventCount = sensor.getFifoReservedEventCount();
443 assertTrue(fifoMaxEventCount >= 0);
444 assertTrue(fifoReservedEventCount >= 0);
445 assertTrue(fifoReservedEventCount <= fifoMaxEventCount);
Aravind Akella8b91fd42014-08-26 16:57:31 -0700446 if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
Aravind Akellaa8884ea2014-09-26 21:07:02 -0700447 assertTrue("One shot sensors should have zero FIFO Size " + sensor.getName(),
Aravind Akella8b91fd42014-08-26 16:57:31 -0700448 sensor.getFifoMaxEventCount() == 0);
Aravind Akellaa8884ea2014-09-26 21:07:02 -0700449 assertTrue("One shot sensors should have zero FIFO Size " + sensor.getName(),
Aravind Akella8b91fd42014-08-26 16:57:31 -0700450 sensor.getFifoReservedEventCount() == 0);
451 }
Phil Dubach15f91be2009-05-19 16:41:52 -0700452 }
Jeff Brownf3815632012-04-16 17:51:02 -0700453
454 @SuppressWarnings("deprecation")
455 public void testLegacySensorOperations() {
456 final SensorManager mSensorManager =
457 (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
458
459 // We expect the set of sensors reported by the new and legacy APIs to be consistent.
460 int sensors = 0;
461 if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
462 sensors |= SensorManager.SENSOR_ACCELEROMETER;
463 }
464 if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) {
465 sensors |= SensorManager.SENSOR_MAGNETIC_FIELD;
466 }
467 if (mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION) != null) {
468 sensors |= SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ORIENTATION_RAW;
469 }
470 assertEquals(sensors, mSensorManager.getSensors());
471 }
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800472
destradaa4458c692014-10-15 12:42:29 -0700473 /**
474 * Verifies that a continuous sensor produces events that have timestamps synchronized with
475 * {@link SystemClock#elapsedRealtimeNanos()}.
476 */
477 private void verifyLongActivation(
478 Sensor sensor,
479 int maxReportLatencyUs,
480 ArrayList<Throwable> errorsFound) throws InterruptedException {
481 if (sensor.getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
482 return;
483 }
484
485 try {
486 TestSensorEnvironment environment = new TestSensorEnvironment(
487 getContext(),
488 sensor,
489 shouldEmulateSensorUnderLoad(),
490 SensorManager.SENSOR_DELAY_FASTEST,
491 maxReportLatencyUs);
492 TestSensorOperation operation =
493 TestSensorOperation.createOperation(environment, 20, TimeUnit.SECONDS);
494 operation.addVerification(EventGapVerification.getDefault(environment));
495 operation.addVerification(EventOrderingVerification.getDefault(environment));
496 operation.addVerification(
497 EventTimestampSynchronizationVerification.getDefault(environment));
498
499 Log.i(TAG, "Running timestamp test on: " + sensor.getName());
destradaa24289b52014-10-20 11:41:00 -0700500 operation.execute(getCurrentTestNode());
destradaa4458c692014-10-15 12:42:29 -0700501 } catch (InterruptedException e) {
502 // propagate so the test can stop
503 throw e;
504 } catch (Throwable e) {
505 errorsFound.add(e);
506 Log.e(TAG, e.getMessage());
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800507 }
508 }
509
destradaa4458c692014-10-15 12:42:29 -0700510 /**
511 * Verifies that a client can listen for events, and that
512 * {@link SensorManager#flush(SensorEventListener)} will trigger the appropriate notification
513 * for {@link SensorEventListener2#onFlushCompleted(Sensor)}.
514 */
515 private void verifyRegisterListenerCallFlush(
516 Sensor sensor,
517 Handler handler,
518 ArrayList<Throwable> errorsFound)
519 throws InterruptedException {
520 if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
521 return;
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800522 }
523
destradaa4458c692014-10-15 12:42:29 -0700524 try {
525 TestSensorEnvironment environment = new TestSensorEnvironment(
526 getContext(),
527 sensor,
528 shouldEmulateSensorUnderLoad(),
529 SensorManager.SENSOR_DELAY_FASTEST,
530 (int) TimeUnit.SECONDS.toMicros(10));
531 FlushExecutor executor = new FlushExecutor(environment, 500 /* eventCount */);
532 TestSensorOperation operation = new TestSensorOperation(environment, executor, handler);
533
534 Log.i(TAG, "Running flush test on: " + sensor.getName());
destradaa24289b52014-10-20 11:41:00 -0700535 operation.execute(getCurrentTestNode());
destradaa4458c692014-10-15 12:42:29 -0700536 } catch (InterruptedException e) {
537 // propagate so the test can stop
538 throw e;
539 } catch (Throwable e) {
540 errorsFound.add(e);
541 Log.e(TAG, e.getMessage());
Jaikumar Ganeshfde5af62013-03-01 13:34:10 -0800542 }
543 }
destradaa4458c692014-10-15 12:42:29 -0700544
545 private void assertOnErrors(List<Throwable> errorsFound) {
546 if (!errorsFound.isEmpty()) {
547 StringBuilder builder = new StringBuilder();
548 for (Throwable error : errorsFound) {
549 builder.append(error.getMessage()).append("\n");
550 }
551 Assert.fail(builder.toString());
552 }
553 }
554
555 /**
556 * A delegate that drives the execution of Batch/Flush tests.
557 * It performs several operations in order:
558 * - registration
559 * - for continuous sensors it first ensures that the FIFO is filled
560 * - if events do not arrive on time, an assert will be triggered
561 * - requests flush of sensor data
562 * - waits for {@link SensorEventListener2#onFlushCompleted(Sensor)}
563 * - if the event does not arrive, an assert will be triggered
564 */
565 private class FlushExecutor implements TestSensorOperation.Executor {
566 private final TestSensorEnvironment mEnvironment;
567 private final int mEventCount;
568
569 public FlushExecutor(TestSensorEnvironment environment, int eventCount) {
570 mEnvironment = environment;
571 mEventCount = eventCount;
572 }
573
574 /**
575 * Consider only continuous mode sensors for testing register listener.
576 *
577 * For on-change sensors, we only use
578 * {@link TestSensorManager#registerListener(TestSensorEventListener)} to associate the
579 * listener with the sensor. So that {@link TestSensorManager#requestFlush()} can be
580 * invoked on it.
581 */
582 @Override
583 public void execute(TestSensorManager sensorManager, TestSensorEventListener listener)
584 throws InterruptedException {
585 int sensorReportingMode = mEnvironment.getSensor().getReportingMode();
586 try {
Aravind Akella490e9b82015-01-29 17:41:07 -0800587 CountDownLatch eventLatch = sensorManager.registerListener(listener, mEventCount);
destradaa4458c692014-10-15 12:42:29 -0700588 if (sensorReportingMode == Sensor.REPORTING_MODE_CONTINUOUS) {
Aravind Akelladbc95c52015-06-09 10:22:16 -0700589 listener.waitForEvents(eventLatch, mEventCount, true);
destradaa4458c692014-10-15 12:42:29 -0700590 }
Aravind Akella490e9b82015-01-29 17:41:07 -0800591 CountDownLatch flushLatch = sensorManager.requestFlush();
Aravind Akelladbc95c52015-06-09 10:22:16 -0700592 listener.waitForFlushComplete(flushLatch, true);
destradaa4458c692014-10-15 12:42:29 -0700593 } finally {
594 sensorManager.unregisterListener();
595 }
596 }
597 }
598
599 private class NullTriggerEventListener extends TriggerEventListener {
600 @Override
601 public void onTrigger(TriggerEvent event) {}
602 }
603
604 private class NullSensorEventListener implements SensorEventListener {
605 @Override
606 public void onSensorChanged(SensorEvent event) {}
607
608 @Override
609 public void onAccuracyChanged(Sensor sensor, int accuracy) {}
610 }
Peng Xu7a6fb7b2015-05-20 14:24:12 -0700611
Phil Dubach15f91be2009-05-19 16:41:52 -0700612}