• 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.hardware.Sensor;
20  import android.hardware.SensorManager;
21  import android.hardware.cts.helpers.SensorCtsHelper;
22  import android.hardware.cts.helpers.SensorStats;
23  import android.hardware.cts.helpers.TestSensorEnvironment;
24  import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
25  import android.hardware.cts.helpers.sensorverification.ISensorVerification;
26  
27  import java.util.concurrent.TimeUnit;
28  
29  /**
30   * Set of tests to verify that sensors operate correctly when operating in batching mode.
31   * This class defines tests for continuous sensors when the device is awake.
32   * On-change and special sensors are tested separately inside CtsVerifier, and they are defined in:
33   * {@link com.android.cts.verifier.sensors.BatchingTestActivity}.
34   *
35   * Each test is expected to pass even if batching is not supported for a particular sensor. This is
36   * usually achieved by ensuring that {@link ISensorVerification}s fallback accordingly.
37   *
38   * <p>To execute these test cases, the following command can be used:</p>
39   * <pre>
40   * adb shell am instrument -e class android.hardware.cts.SensorBatchingTests \
41   *     -w com.android.cts.hardware/android.test.AndroidJUnitRunner
42   * </pre>
43   */
44  public class SensorBatchingTests extends SensorTestCase {
45      private static final String TAG = "SensorBatchingTests";
46  
47      private static final int BATCHING_10S = 10;
48      private static final int RATE_50HZ = 20000;
49      private static final int RATE_FASTEST = SensorManager.SENSOR_DELAY_FASTEST;
50  
51      /**
52       * An arbitrary 'padding' time slot to wait for events after batching latency expires.
53       * This allows for the test to wait for event arrivals after batching was expected.
54       */
55      private static final int BATCHING_PADDING_TIME_S = 2;
56  
testAccelerometer_fastest_batching()57      public void testAccelerometer_fastest_batching() throws Throwable {
58          runBatchingSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_FASTEST, BATCHING_10S);
59      }
60  
testAccelerometer_50hz_batching()61      public void testAccelerometer_50hz_batching() throws Throwable {
62          runBatchingSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_10S);
63      }
64  
testAccelerometer_fastest_flush()65      public void testAccelerometer_fastest_flush() throws Throwable {
66          runFlushSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_FASTEST, BATCHING_10S);
67      }
68  
testAccelerometer_50hz_flush()69      public void testAccelerometer_50hz_flush() throws Throwable {
70          runFlushSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_10S);
71      }
72  
testMagneticField_fastest_batching()73      public void testMagneticField_fastest_batching() throws Throwable {
74          runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_FASTEST, BATCHING_10S);
75      }
76  
testMagneticField_50hz_batching()77      public void testMagneticField_50hz_batching() throws Throwable {
78          runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_10S);
79      }
80  
testMagneticField_fastest_flush()81      public void testMagneticField_fastest_flush() throws Throwable {
82          runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_FASTEST, BATCHING_10S);
83      }
84  
testMagneticField_50hz_flush()85      public void testMagneticField_50hz_flush() throws Throwable {
86          runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_10S);
87      }
88  
89      @SuppressWarnings("deprecation")
testOrientation_fastest_batching()90      public void testOrientation_fastest_batching() throws Throwable {
91          runBatchingSensorTest(Sensor.TYPE_ORIENTATION, RATE_FASTEST, BATCHING_10S);
92      }
93  
94      @SuppressWarnings("deprecation")
testOrientation_50hz_batching()95      public void testOrientation_50hz_batching() throws Throwable {
96          runBatchingSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_10S);
97      }
98  
99      @SuppressWarnings("deprecation")
testOrientation_fastest_flush()100      public void testOrientation_fastest_flush() throws Throwable {
101          runFlushSensorTest(Sensor.TYPE_ORIENTATION, RATE_FASTEST, BATCHING_10S);
102      }
103  
104      @SuppressWarnings("deprecation")
testOrientation_50hz_flush()105      public void testOrientation_50hz_flush() throws Throwable {
106          runFlushSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_10S);
107      }
108  
testGyroscope_fastest_batching()109      public void testGyroscope_fastest_batching() throws Throwable {
110          runBatchingSensorTest(Sensor.TYPE_GYROSCOPE, RATE_FASTEST, BATCHING_10S);
111      }
112  
testGyroscope_50hz_batching()113      public void testGyroscope_50hz_batching() throws Throwable {
114          runBatchingSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_10S);
115      }
116  
testGyroscope_fastest_flush()117      public void testGyroscope_fastest_flush() throws Throwable {
118          runFlushSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
119      }
120  
testGyroscope_50hz_flush()121      public void testGyroscope_50hz_flush() throws Throwable {
122          runFlushSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_10S);
123      }
124  
testPressure_fastest_batching()125      public void testPressure_fastest_batching() throws Throwable {
126          runBatchingSensorTest(Sensor.TYPE_PRESSURE, RATE_FASTEST, BATCHING_10S);
127      }
128  
testPressure_50hz_batching()129      public void testPressure_50hz_batching() throws Throwable {
130          runBatchingSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_10S);
131      }
132  
testPressure_fastest_flush()133      public void testPressure_fastest_flush() throws Throwable {
134          runFlushSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
135      }
136  
testPressure_50hz_flush()137      public void testPressure_50hz_flush() throws Throwable {
138          runFlushSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_10S);
139      }
140  
testGravity_fastest_batching()141      public void testGravity_fastest_batching() throws Throwable {
142          runBatchingSensorTest(Sensor.TYPE_GRAVITY, RATE_FASTEST, BATCHING_10S);
143      }
144  
testGravity_50hz_batching()145      public void testGravity_50hz_batching() throws Throwable {
146          runBatchingSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_10S);
147      }
148  
testGravity_fastest_flush()149      public void testGravity_fastest_flush() throws Throwable {
150          runFlushSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
151      }
152  
testGravity_50hz_flush()153      public void testGravity_50hz_flush() throws Throwable {
154          runFlushSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_10S);
155      }
156  
testRotationVector_fastest_batching()157      public void testRotationVector_fastest_batching() throws Throwable {
158          runBatchingSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
159      }
160  
testRotationVector_50hz_batching()161      public void testRotationVector_50hz_batching() throws Throwable {
162          runBatchingSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
163      }
164  
testRotationVector_fastest_flush()165      public void testRotationVector_fastest_flush() throws Throwable {
166          runFlushSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
167      }
168  
testRotationVector_50hz_flush()169      public void testRotationVector_50hz_flush() throws Throwable {
170          runFlushSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
171      }
172  
testMagneticFieldUncalibrated_fastest_batching()173      public void testMagneticFieldUncalibrated_fastest_batching() throws Throwable {
174          runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
175      }
176  
testMagneticFieldUncalibrated_50hz_batching()177      public void testMagneticFieldUncalibrated_50hz_batching() throws Throwable {
178          runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
179      }
180  
testMagneticFieldUncalibrated_fastest_flush()181      public void testMagneticFieldUncalibrated_fastest_flush() throws Throwable {
182          runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
183      }
184  
testMagneticFieldUncalibrated_50hz_flush()185      public void testMagneticFieldUncalibrated_50hz_flush() throws Throwable {
186          runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
187      }
188  
testGameRotationVector_fastest_batching()189      public void testGameRotationVector_fastest_batching() throws Throwable {
190          runBatchingSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
191      }
192  
testGameRotationVector_50hz_batching()193      public void testGameRotationVector_50hz_batching() throws Throwable {
194          runBatchingSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
195      }
196  
testGameRotationVector_fastest_flush()197      public void testGameRotationVector_fastest_flush() throws Throwable {
198          runFlushSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
199      }
200  
testGameRotationVector_50hz_flush()201      public void testGameRotationVector_50hz_flush() throws Throwable {
202          runFlushSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
203      }
204  
testGyroscopeUncalibrated_fastest_batching()205      public void testGyroscopeUncalibrated_fastest_batching() throws Throwable {
206          runBatchingSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
207      }
208  
testGyroscopeUncalibrated_50hz_batching()209      public void testGyroscopeUncalibrated_50hz_batching() throws Throwable {
210          runBatchingSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
211      }
212  
testGyroscopeUncalibrated_fastest_flush()213      public void testGyroscopeUncalibrated_fastest_flush() throws Throwable {
214          runFlushSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
215      }
216  
testGyroscopeUncalibrated_50hz_flush()217      public void testGyroscopeUncalibrated_50hz_flush() throws Throwable {
218          runFlushSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
219      }
220  
testLinearAcceleration_fastest_batching()221      public void testLinearAcceleration_fastest_batching() throws Throwable {
222          runBatchingSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_FASTEST, BATCHING_10S);
223      }
224  
testLinearAcceleration_50hz_batching()225      public void testLinearAcceleration_50hz_batching() throws Throwable {
226          runBatchingSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_10S);
227      }
228  
testLinearAcceleration_fastest_flush()229      public void testLinearAcceleration_fastest_flush() throws Throwable {
230          runFlushSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_FASTEST, BATCHING_10S);
231      }
232  
testLinearAcceleration_50hz_flush()233      public void testLinearAcceleration_50hz_flush() throws Throwable {
234          runFlushSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_10S);
235      }
236  
testGeomagneticRotationVector_fastest_batching()237      public void testGeomagneticRotationVector_fastest_batching() throws Throwable {
238          runBatchingSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
239      }
240  
testGeomagneticRotationVector_50hz_batching()241      public void testGeomagneticRotationVector_50hz_batching() throws Throwable {
242          runBatchingSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
243      }
244  
testGeomagneticRotationVector_fastest_flush()245      public void testGeomagneticRotationVector_fastest_flush() throws Throwable {
246          runFlushSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
247      }
248  
testGeomagneticRotationVector_50hz_flush()249      public void testGeomagneticRotationVector_50hz_flush() throws Throwable {
250          runFlushSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
251      }
252  
runBatchingSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)253      private void runBatchingSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)
254              throws Throwable {
255          int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
256          int testDurationSec = maxBatchReportLatencySec + BATCHING_PADDING_TIME_S;
257  
258          TestSensorEnvironment environment = new TestSensorEnvironment(
259                  getContext(),
260                  sensorType,
261                  shouldEmulateSensorUnderLoad(),
262                  rateUs,
263                  maxBatchReportLatencyUs);
264          TestSensorOperation operation =
265                  TestSensorOperation.createOperation(environment, testDurationSec, TimeUnit.SECONDS);
266  
267          executeTest(environment, operation, false /* flushExpected */);
268      }
269  
runFlushSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)270      private void runFlushSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)
271              throws Throwable {
272          int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
273          int flushDurationSec = maxBatchReportLatencySec / 2;
274  
275          TestSensorEnvironment environment = new TestSensorEnvironment(
276                  getContext(),
277                  sensorType,
278                  shouldEmulateSensorUnderLoad(),
279                  rateUs,
280                  maxBatchReportLatencyUs);
281          TestSensorOperation operation = TestSensorOperation
282                  .createFlushOperation(environment, flushDurationSec, TimeUnit.SECONDS);
283  
284          executeTest(environment, operation, true /* flushExpected */);
285      }
286  
executeTest( TestSensorEnvironment environment, TestSensorOperation operation, boolean flushExpected)287      private void executeTest(
288              TestSensorEnvironment environment,
289              TestSensorOperation operation,
290              boolean flushExpected) throws Throwable {
291          SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
292          operation.addDefaultVerifications();
293  
294          try {
295              operation.execute(getCurrentTestNode());
296          } finally {
297              SensorStats stats = operation.getStats();
298              stats.log(TAG);
299  
300              String sensorRate;
301              if (environment.getRequestedSamplingPeriodUs() == SensorManager.SENSOR_DELAY_FASTEST) {
302                  sensorRate = "fastest";
303              } else {
304                  sensorRate = String.format("%.0fhz", environment.getFrequencyHz());
305              }
306              String batching = environment.getMaxReportLatencyUs() > 0 ? "_batching" : "";
307              String flush = flushExpected ? "_flush" : "";
308              String fileName = String.format(
309                      "batching_%s_%s%s%s.txt",
310                      SensorStats.getSanitizedSensorName(environment.getSensor()),
311                      sensorRate,
312                      batching,
313                      flush);
314              stats.logToFile(fileName);
315          }
316      }
317  }
318