• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2014 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  
17  package android.hardware.cts;
18  
19  import android.content.Context;
20  import android.hardware.Sensor;
21  import android.hardware.SensorManager;
22  import android.hardware.cts.helpers.SensorCtsHelper;
23  import android.hardware.cts.helpers.SensorStats;
24  import android.hardware.cts.helpers.TestSensorEnvironment;
25  import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
26  import android.content.pm.PackageManager;
27  
28  import java.util.HashMap;
29  import java.util.Map;
30  import java.util.Map.Entry;
31  import java.util.concurrent.TimeUnit;
32  
33  /**
34   * Set of tests to verify that sensors operate correctly when operating alone.
35   * <p>
36   * To execute these test cases, the following command can be used:
37   * </p><pre>
38   * adb shell am instrument -e class android.hardware.cts.SingleSensorTests \
39   *     -w com.android.cts.hardware/android.test.AndroidJUnitRunner
40   * </pre><p>
41   * For each sensor that reports continuously, it takes a set of samples. The test suite verifies
42   * that the event ordering, frequency, and jitter pass for the collected sensor events. It
43   * additionally tests that the mean, standard deviation, and magnitude are correct for the sensor
44   * event values, where applicable for a device in a static environment.
45   * </p><p>
46   * The event ordering test verifies the ordering of the sampled data reported by the Sensor under
47   * test. This test is used to guarantee that sensor data is reported in the order it occurs, and
48   * that events are always reported in order. It verifies that each event's timestamp is in the
49   * future compared with the previous event. At the end of the validation, the full set of events is
50   * verified to be ordered by timestamp as they are generated. The test can be susceptible to errors
51   * if the sensor sampled data is not timestamped at the hardware level. Or events sampled at high
52   * rates are added to the FIFO without controlling the appropriate ordering of the events.
53   * </p><p>
54   * The frequency test verifies that the sensor under test can sample and report data at the maximum
55   * frequency (sampling rate) it advertises. The frequency between events is calculated by looking at
56   * the delta between the timestamps associated with each event to get the period. The test is
57   * susceptible to errors if the sensor is not capable to sample data at the maximum rate it
58   * supports, or the sensor events are not timestamped at the hardware level.
59   * </p><p>
60   * The jitter test verifies that the event jittering associated with the sampled data reported by
61   * the sensor under test aligns with the requirements imposed in the CDD. This test characterizes
62   * how the sensor behaves while sampling data at a specific rate. It compares the 95th percentile of
63   * the jittering with a certain percentage of the minimum period. The test is susceptible to errors
64   * if the sensor events are not timestamped at the hardware level.
65   * </p><p>
66   * The mean test verifies that the mean of a set of sampled data from a particular sensor falls into
67   * the expectations defined in the CDD. The verification applies to each axis of the sampled data
68   * reported by the sensor under test. This test is used to validate the requirement imposed by the
69   * CDD to Sensors in Android and characterizes how the Sensor behaves while static. The test is
70   * susceptible to errors if the device is moving while the test is running, or if the sensor's
71   * sampled data indeed varies from the expected mean.
72   * </p><p>
73   * The magnitude test verifies that the magnitude of the sensor data is close to the expected
74   * reference value. The units of the reference value are dependent on the type of sensor.
75   * This test is used to verify that the data reported by the sensor is close to the expected
76   * range and scale. The test calculates the Euclidean norm of the vector represented by the sampled
77   * data and compares it against the test expectations. The test is susceptible to errors when the
78   * sensor under test is uncalibrated, or the units between the data and expectations are different.
79   * </p><p>
80   * The standard deviation test verifies that the standard deviation of a set of sampled data from a
81   * particular sensor falls into the expectations defined in the CDD. The verification applies to
82   * each axis of the sampled data reported by the sensor under test. This test is used to validate
83   * the requirement imposed by the CDD to Sensors in Android and characterizes how the Sensor behaves
84   * while static. The test is susceptible to errors if the device is moving while the test is
85   * running, or if the sensor's sampled data indeed falls into a large standard deviation.
86   * </p>
87   */
88  public class SingleSensorTests extends SensorTestCase {
89      private static final String TAG = "SingleSensorTests";
90  
91      private static final int RATE_200HZ = 5000;
92      private static final int RATE_100HZ = 10000;
93      private static final int RATE_50HZ = 20000;
94      private static final int RATE_25HZ = 40000;
95      private static final int RATE_15HZ = 66667;
96      private static final int RATE_10HZ = 100000;
97      private static final int RATE_5HZ = 200000;
98      private static final int RATE_1HZ = 1000000;
99  
100      /**
101       * This test verifies that the sensor's properties complies with the required properties set in
102       * the CDD.
103       * <p>
104       * It checks that the sampling rate advertised by the sensor under test matches that which is
105       * required by the CDD.
106       * </p>
107       */
testSensorProperties()108      public void testSensorProperties() {
109          // sensor type: [getMinDelay()]
110          Map<Integer, Object[]> expectedProperties = new HashMap<>(3);
111          if(getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
112                  expectedProperties.put(Sensor.TYPE_ACCELEROMETER, new Object[]{20000});
113                  expectedProperties.put(Sensor.TYPE_GYROSCOPE, new Object[]{20000});
114          }else {
115                  expectedProperties.put(Sensor.TYPE_ACCELEROMETER, new Object[]{10000});
116                  expectedProperties.put(Sensor.TYPE_GYROSCOPE, new Object[]{10000});
117          }
118          expectedProperties.put(Sensor.TYPE_MAGNETIC_FIELD, new Object[]{100000});
119  
120          SensorManager sensorManager =
121                  (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
122          assertNotNull("SensorManager not present in the system.", sensorManager);
123          for (Entry<Integer, Object[]> entry : expectedProperties.entrySet()) {
124              Sensor sensor = sensorManager.getDefaultSensor(entry.getKey());
125              if (sensor != null) {
126                  if (entry.getValue()[0] != null) {
127                      int expected = (Integer) entry.getValue()[0];
128                      String msg = String.format(
129                              "%s: min delay %dus expected to be less than or equal to %dus",
130                              sensor.getName(),
131                              sensor.getMinDelay(),
132                              expected);
133                      assertTrue(msg, sensor.getMinDelay() <= expected);
134                  }
135              }
136          }
137      }
138  
139      // TODO: Figure out if a better way to enumerate test cases programmatically exists that works
140      // with CTS framework.
testAccelerometer_fastest()141      public void testAccelerometer_fastest() throws Throwable {
142          runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST);
143      }
144  
testAccelerometer_100hz()145      public void testAccelerometer_100hz() throws Throwable {
146          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_100HZ);
147      }
148  
testAccelerometer_200hz()149      public void testAccelerometer_200hz() throws Throwable {
150          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_200HZ);
151      }
152  
testAccelerometer_50hz()153      public void testAccelerometer_50hz() throws Throwable {
154          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ);
155      }
156  
testAccelerometer_25hz()157      public void testAccelerometer_25hz() throws Throwable {
158          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_25HZ);
159      }
160  
testAccelerometer_15hz()161      public void testAccelerometer_15hz() throws Throwable {
162          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_15HZ);
163      }
164  
testAccelerometer_10hz()165      public void testAccelerometer_10hz() throws Throwable {
166          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_10HZ);
167      }
168  
testAccelerometer_5hz()169      public void testAccelerometer_5hz() throws Throwable {
170          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_5HZ);
171      }
172  
testAccelerometer_1hz()173      public void testAccelerometer_1hz() throws Throwable {
174          runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_1HZ);
175      }
176  
testMagneticField_fastest()177      public void testMagneticField_fastest() throws Throwable {
178          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST);
179      }
180  
testMagneticField_200hz()181      public void testMagneticField_200hz() throws Throwable {
182          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_200HZ);
183      }
184  
testMagneticField_100hz()185      public void testMagneticField_100hz() throws Throwable {
186          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_100HZ);
187      }
188  
testMagneticField_50hz()189      public void testMagneticField_50hz() throws Throwable {
190          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ);
191      }
192  
testMagneticField_25hz()193      public void testMagneticField_25hz() throws Throwable {
194          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_25HZ);
195      }
196  
testMagneticField_15hz()197      public void testMagneticField_15hz() throws Throwable {
198          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_15HZ);
199      }
200  
testMagneticField_10hz()201      public void testMagneticField_10hz() throws Throwable {
202          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_10HZ);
203      }
204  
testMagneticField_5hz()205      public void testMagneticField_5hz() throws Throwable {
206          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_5HZ);
207      }
208  
testMagneticField_1hz()209      public void testMagneticField_1hz() throws Throwable {
210          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_1HZ);
211      }
212  
213      @SuppressWarnings("deprecation")
testOrientation_fastest()214      public void testOrientation_fastest() throws Throwable {
215          runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST);
216      }
217  
218      @SuppressWarnings("deprecation")
testOrientation_200hz()219      public void testOrientation_200hz() throws Throwable {
220          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_200HZ);
221      }
222      @SuppressWarnings("deprecation")
testOrientation_100hz()223      public void testOrientation_100hz() throws Throwable {
224          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_100HZ);
225      }
226  
227      @SuppressWarnings("deprecation")
testOrientation_50hz()228      public void testOrientation_50hz() throws Throwable {
229          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ);
230      }
231  
232      @SuppressWarnings("deprecation")
testOrientation_25hz()233      public void testOrientation_25hz() throws Throwable {
234          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_25HZ);
235      }
236  
237      @SuppressWarnings("deprecation")
testOrientation_15hz()238      public void testOrientation_15hz() throws Throwable {
239          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_15HZ);
240      }
241  
242      @SuppressWarnings("deprecation")
testOrientation_10hz()243      public void testOrientation_10hz() throws Throwable {
244          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_10HZ);
245      }
246  
247      @SuppressWarnings("deprecation")
testOrientation_5hz()248      public void testOrientation_5hz() throws Throwable {
249          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_5HZ);
250      }
251  
252      @SuppressWarnings("deprecation")
testOrientation_1hz()253      public void testOrientation_1hz() throws Throwable {
254          runSensorTest(Sensor.TYPE_ORIENTATION, RATE_1HZ);
255      }
256  
testGyroscope_fastest()257      public void testGyroscope_fastest() throws Throwable {
258          runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST);
259      }
260  
testGyroscope_200hz()261      public void testGyroscope_200hz() throws Throwable {
262          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_200HZ);
263      }
264  
testGyroscope_100hz()265      public void testGyroscope_100hz() throws Throwable {
266          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_100HZ);
267      }
268  
testGyroscope_50hz()269      public void testGyroscope_50hz() throws Throwable {
270          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ);
271      }
272  
testGyroscope_25hz()273      public void testGyroscope_25hz() throws Throwable {
274          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_25HZ);
275      }
276  
testGyroscope_15hz()277      public void testGyroscope_15hz() throws Throwable {
278          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_15HZ);
279      }
280  
testGyroscope_10hz()281      public void testGyroscope_10hz() throws Throwable {
282          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_10HZ);
283      }
284  
testGyroscope_5hz()285      public void testGyroscope_5hz() throws Throwable {
286          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_5HZ);
287      }
288  
testGyroscope_1hz()289      public void testGyroscope_1hz() throws Throwable {
290          runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_1HZ);
291      }
292  
testPressure_fastest()293      public void testPressure_fastest() throws Throwable {
294          runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST);
295      }
296  
testPressure_200hz()297      public void testPressure_200hz() throws Throwable {
298          runSensorTest(Sensor.TYPE_PRESSURE, RATE_200HZ);
299      }
300  
testPressure_100hz()301      public void testPressure_100hz() throws Throwable {
302          runSensorTest(Sensor.TYPE_PRESSURE, RATE_100HZ);
303      }
304  
testPressure_50hz()305      public void testPressure_50hz() throws Throwable {
306          runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ);
307      }
308  
testPressure_25hz()309      public void testPressure_25hz() throws Throwable {
310          runSensorTest(Sensor.TYPE_PRESSURE, RATE_25HZ);
311      }
312  
testPressure_15hz()313      public void testPressure_15hz() throws Throwable {
314          runSensorTest(Sensor.TYPE_PRESSURE, RATE_15HZ);
315      }
316  
testPressure_10hz()317      public void testPressure_10hz() throws Throwable {
318          runSensorTest(Sensor.TYPE_PRESSURE, RATE_10HZ);
319      }
320  
testPressure_5hz()321      public void testPressure_5hz() throws Throwable {
322          runSensorTest(Sensor.TYPE_PRESSURE, RATE_5HZ);
323      }
324  
testPressure_1hz()325      public void testPressure_1hz() throws Throwable {
326          runSensorTest(Sensor.TYPE_PRESSURE, RATE_1HZ);
327      }
328  
testGravity_fastest()329      public void testGravity_fastest() throws Throwable {
330          runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST);
331      }
332  
testGravity_200hz()333      public void testGravity_200hz() throws Throwable {
334          runSensorTest(Sensor.TYPE_GRAVITY, RATE_200HZ);
335      }
336  
testGravity_100hz()337      public void testGravity_100hz() throws Throwable {
338          runSensorTest(Sensor.TYPE_GRAVITY, RATE_100HZ);
339      }
340  
testGravity_50hz()341      public void testGravity_50hz() throws Throwable {
342          runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ);
343      }
344  
testGravity_25hz()345      public void testGravity_25hz() throws Throwable {
346          runSensorTest(Sensor.TYPE_GRAVITY, RATE_25HZ);
347      }
348  
testGravity_15hz()349      public void testGravity_15hz() throws Throwable {
350          runSensorTest(Sensor.TYPE_GRAVITY, RATE_15HZ);
351      }
352  
testGravity_10hz()353      public void testGravity_10hz() throws Throwable {
354          runSensorTest(Sensor.TYPE_GRAVITY, RATE_10HZ);
355      }
356  
testGravity_5hz()357      public void testGravity_5hz() throws Throwable {
358          runSensorTest(Sensor.TYPE_GRAVITY, RATE_5HZ);
359      }
360  
testGravity_1hz()361      public void testGravity_1hz() throws Throwable {
362          runSensorTest(Sensor.TYPE_GRAVITY, RATE_1HZ);
363      }
364  
testRotationVector_fastest()365      public void testRotationVector_fastest() throws Throwable {
366          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
367      }
368  
testRotationVector_200hz()369      public void testRotationVector_200hz() throws Throwable {
370          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_200HZ);
371      }
372  
testRotationVector_100hz()373      public void testRotationVector_100hz() throws Throwable {
374          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_100HZ);
375      }
376  
testRotationVector_50hz()377      public void testRotationVector_50hz() throws Throwable {
378          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ);
379      }
380  
testRotationVector_25hz()381      public void testRotationVector_25hz() throws Throwable {
382          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_25HZ);
383      }
384  
testRotationVector_15hz()385      public void testRotationVector_15hz() throws Throwable {
386          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_15HZ);
387      }
388  
testRotationVector_10hz()389      public void testRotationVector_10hz() throws Throwable {
390          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_10HZ);
391      }
392  
testRotationVector_5hz()393      public void testRotationVector_5hz() throws Throwable {
394          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_5HZ);
395      }
396  
testRotationVector_1hz()397      public void testRotationVector_1hz() throws Throwable {
398          runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_1HZ);
399      }
400  
testMagneticFieldUncalibrated_fastest()401      public void testMagneticFieldUncalibrated_fastest() throws Throwable {
402          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST);
403      }
404  
testMagneticFieldUncalibrated_200hz()405      public void testMagneticFieldUncalibrated_200hz() throws Throwable {
406          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_200HZ);
407      }
408  
testMagneticFieldUncalibrated_100hz()409      public void testMagneticFieldUncalibrated_100hz() throws Throwable {
410          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_100HZ);
411      }
412  
testMagneticFieldUncalibrated_50hz()413      public void testMagneticFieldUncalibrated_50hz() throws Throwable {
414          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ);
415      }
416  
testMagneticFieldUncalibrated_25hz()417      public void testMagneticFieldUncalibrated_25hz() throws Throwable {
418          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_25HZ);
419      }
420  
testMagneticFieldUncalibrated_15hz()421      public void testMagneticFieldUncalibrated_15hz() throws Throwable {
422          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_15HZ);
423      }
424  
testMagneticFieldUncalibrated_10hz()425      public void testMagneticFieldUncalibrated_10hz() throws Throwable {
426          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_10HZ);
427      }
428  
testMagneticFieldUncalibrated_5hz()429      public void testMagneticFieldUncalibrated_5hz() throws Throwable {
430          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_5HZ);
431      }
432  
testMagneticFieldUncalibrated_1hz()433      public void testMagneticFieldUncalibrated_1hz() throws Throwable {
434          runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_1HZ);
435      }
436  
testGameRotationVector_fastest()437      public void testGameRotationVector_fastest() throws Throwable {
438          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
439      }
440  
testGameRotationVector_200hz()441      public void testGameRotationVector_200hz() throws Throwable {
442          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_200HZ);
443      }
444  
testGameRotationVector_100hz()445      public void testGameRotationVector_100hz() throws Throwable {
446          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_100HZ);
447      }
448  
testGameRotationVector_50hz()449      public void testGameRotationVector_50hz() throws Throwable {
450          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ);
451      }
452  
testGameRotationVector_25hz()453      public void testGameRotationVector_25hz() throws Throwable {
454          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_25HZ);
455      }
456  
testGameRotationVector_15hz()457      public void testGameRotationVector_15hz() throws Throwable {
458          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_15HZ);
459      }
460  
testGameRotationVector_10hz()461      public void testGameRotationVector_10hz() throws Throwable {
462          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_10HZ);
463      }
464  
testGameRotationVector_5hz()465      public void testGameRotationVector_5hz() throws Throwable {
466          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_5HZ);
467      }
468  
testGameRotationVector_1hz()469      public void testGameRotationVector_1hz() throws Throwable {
470          runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_1HZ);
471      }
472  
testGyroscopeUncalibrated_fastest()473      public void testGyroscopeUncalibrated_fastest() throws Throwable {
474          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST);
475      }
476  
testGyroscopeUncalibrated_200hz()477      public void testGyroscopeUncalibrated_200hz() throws Throwable {
478          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_200HZ);
479      }
480  
testGyroscopeUncalibrated_100hz()481      public void testGyroscopeUncalibrated_100hz() throws Throwable {
482          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_100HZ);
483      }
484  
testGyroscopeUncalibrated_50hz()485      public void testGyroscopeUncalibrated_50hz() throws Throwable {
486          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ);
487      }
488  
testGyroscopeUncalibrated_25hz()489      public void testGyroscopeUncalibrated_25hz() throws Throwable {
490          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_25HZ);
491      }
492  
testGyroscopeUncalibrated_15hz()493      public void testGyroscopeUncalibrated_15hz() throws Throwable {
494          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_15HZ);
495      }
496  
testGyroscopeUncalibrated_10hz()497      public void testGyroscopeUncalibrated_10hz() throws Throwable {
498          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_10HZ);
499      }
500  
testGyroscopeUncalibrated_5hz()501      public void testGyroscopeUncalibrated_5hz() throws Throwable {
502          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_5HZ);
503      }
504  
testGyroscopeUncalibrated_1hz()505      public void testGyroscopeUncalibrated_1hz() throws Throwable {
506          runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_1HZ);
507      }
508  
testGeomagneticRotationVector_fastest()509      public void  testGeomagneticRotationVector_fastest() throws Throwable {
510          runSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
511      }
512  
testLinearAcceleration_200hz()513      public void  testLinearAcceleration_200hz() throws Throwable {
514          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_200HZ);
515      }
516  
testLinearAcceleration_100hz()517      public void  testLinearAcceleration_100hz() throws Throwable {
518          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_100HZ);
519      }
520  
testLinearAcceleration_50hz()521      public void testLinearAcceleration_50hz() throws Throwable {
522          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ);
523      }
524  
testLinearAcceleration_25hz()525      public void testLinearAcceleration_25hz() throws Throwable {
526          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_25HZ);
527      }
528  
testLinearAcceleration_15hz()529      public void testLinearAcceleration_15hz() throws Throwable {
530          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_15HZ);
531      }
532  
testLinearAcceleration_10hz()533      public void testLinearAcceleration_10hz() throws Throwable {
534          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_10HZ);
535      }
536  
testLinearAcceleration_5hz()537      public void testLinearAcceleration_5hz() throws Throwable {
538          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_5HZ);
539      }
540  
testLinearAcceleration_1hz()541      public void testLinearAcceleration_1hz() throws Throwable {
542          runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_1HZ);
543      }
544  
runSensorTest(int sensorType, int rateUs)545      private void runSensorTest(int sensorType, int rateUs) throws Throwable {
546          SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
547          TestSensorEnvironment environment = new TestSensorEnvironment(
548                  getContext(),
549                  sensorType,
550                  shouldEmulateSensorUnderLoad(),
551                  rateUs);
552          TestSensorOperation op =
553                  TestSensorOperation.createOperation(environment, 5, TimeUnit.SECONDS);
554          op.addDefaultVerifications();
555  
556          try {
557              op.execute(getCurrentTestNode());
558          } finally {
559              SensorStats stats = op.getStats();
560              stats.log(TAG);
561  
562              String fileName = String.format(
563                      "single_%s_%s.txt",
564                      SensorStats.getSanitizedSensorName(environment.getSensor()),
565                      environment.getFrequencyString());
566              stats.logToFile(fileName);
567          }
568      }
569  }
570