Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: device/generic_sensor/android/junit/src/org/chromium/device/sensors/PlatformSensorProviderTest.java

Issue 2284613002: [sensors] Android platform adaptation for Generic Sensor API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes for Ted.C review comments + unit tests. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.device.sensors;
6
7 import static org.junit.Assert.assertEquals;
8 import static org.junit.Assert.assertNotNull;
9 import static org.junit.Assert.assertNull;
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.ArgumentMatchers.anyInt;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.never;
16 import static org.mockito.Mockito.times;
17 import static org.mockito.Mockito.verify;
18
19 import android.content.Context;
20 import android.hardware.Sensor;
21 import android.hardware.SensorEvent;
22 import android.hardware.SensorEventListener;
23 import android.hardware.SensorManager;
24 import android.os.Handler;
25
26 import org.chromium.base.test.util.Feature;
27 import org.chromium.mojom.device.mojom.ReportingMode;
28 import org.chromium.mojom.device.mojom.SensorReadBuffer;
29 import org.chromium.mojom.device.mojom.SensorType;
30 import org.chromium.testing.local.LocalRobolectricTestRunner;
31
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.junit.runner.RunWith;
35 import org.mockito.Mock;
36 import org.mockito.MockitoAnnotations;
37 import org.robolectric.annotation.Config;
38
39 import java.lang.reflect.Field;
40 import java.lang.reflect.Modifier;
41 import java.nio.ByteBuffer;
42 import java.nio.ByteOrder;
43 import java.util.ArrayList;
44 import java.util.List;
45
46 /**
47 * Unit tests for PlatformSensorProvider
48 */
49 @RunWith(LocalRobolectricTestRunner.class)
50 @Config(manifest = Config.NONE)
51 public class PlatformSensorProviderTest {
52 @Mock
53 private Context mContext;
54 @Mock
55 private SensorManager mSensorManager;
56 @Mock
57 private PlatformSensorProvider mPlatformSensorProvider;
58 private ByteBuffer mSharedBuffer;
59 private final List<Sensor> mMockSensors = new ArrayList<Sensor>();
60 private static final long PLATFORM_SENSOR_ANDROID = 123456789L;
61 private static final long PLATFORM_SENSOR_TIMESTAMP = 314159265358979L;
62 private static final double MILLISECONDS_IN_NANOSECOND = 0.000001d;
63
64 @Before
65 public void setUp() {
66 MockitoAnnotations.initMocks(this);
67 doReturn(mSensorManager).when(mContext).getSystemService(Context.SENSOR_ SERVICE);
68 doReturn(mMockSensors).when(mSensorManager).getSensorList(anyInt());
69 doReturn(mSensorManager).when(mPlatformSensorProvider).getSensorManager( );
70 doReturn(new Handler()).when(mPlatformSensorProvider).getHandler();
71 // By default, allow successful registration of SensorEventListeners.
72 doReturn(true)
73 .when(mSensorManager)
74 .registerListener(any(SensorEventListener.class), any(Sensor.cla ss), anyInt(),
75 any(Handler.class));
76 doNothing().when(mPlatformSensorProvider).sensorStarted(any(PlatformSens or.class));
77 doNothing().when(mPlatformSensorProvider).sensorStopped(any(PlatformSens or.class));
78 }
79
80 @Test
81 @Feature({"PlatformSensorProvider"})
82 public void testNullSensorManager() {
83 doReturn(null).when(mContext).getSystemService(Context.SENSOR_SERVICE);
84 PlatformSensorProvider provider = PlatformSensorProvider.create(mContext );
85 PlatformSensor sensor = provider.createSensor(SensorType.AMBIENT_LIGHT);
86 assertNull(sensor);
87 }
88
89 @Test
90 @Feature({"PlatformSensorProvider"})
91 public void testSensorNotSupported() {
92 PlatformSensorProvider provider = PlatformSensorProvider.create(mContext );
93 PlatformSensor sensor = provider.createSensor(SensorType.AMBIENT_LIGHT);
94 assertNull(sensor);
95 }
96
97 @Test
98 @Feature({"PlatformSensorProvider"})
99 public void testSensorTypeMappings() {
100 PlatformSensorProvider provider = PlatformSensorProvider.create(mContext );
101 provider.createSensor(SensorType.AMBIENT_LIGHT);
102 verify(mSensorManager).getSensorList(Sensor.TYPE_LIGHT);
103 provider.createSensor(SensorType.ACCELEROMETER);
104 verify(mSensorManager).getSensorList(Sensor.TYPE_ACCELEROMETER);
105 provider.createSensor(SensorType.LINEAR_ACCELERATION);
106 verify(mSensorManager).getSensorList(Sensor.TYPE_LINEAR_ACCELERATION);
107 provider.createSensor(SensorType.GYROSCOPE);
108 verify(mSensorManager).getSensorList(Sensor.TYPE_GYROSCOPE);
109 provider.createSensor(SensorType.MAGNETOMETER);
110 verify(mSensorManager).getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
111 }
112
113 @Test
114 @Feature({"PlatformSensorProvider"})
115 public void testSensorSupported() {
116 PlatformSensor sensor = createPlatformSensor(50000, Sensor.TYPE_LIGHT,
117 SensorType.AMBIENT_LIGHT, Sensor.REPORTING_MODE_ON_CHANGE);
118 assertNotNull(sensor);
119 }
120
121 @Test
122 @Feature({"PlatformSensor"})
123 public void testSensorStartStop() {
timvolodine 2016/09/06 17:44:37 - can we have a test with multiple sensors? - e.g.
shalamov 2016/09/07 13:53:42 Done.
124 addMockSensor(50000, Sensor.TYPE_ACCELEROMETER, Sensor.REPORTING_MODE_CO NTINUOUS);
125 PlatformSensor sensor =
126 PlatformSensor.create(Sensor.TYPE_ACCELEROMETER, 3, mPlatformSen sorProvider);
127 assertNotNull(sensor);
128
129 sensor.startSensor(5);
130 sensor.stopSensor();
131
132 // Multiple start invocations.
133 sensor.startSensor(1);
134 sensor.startSensor(2);
135 sensor.startSensor(3);
136 // Same frequency, should not restart sensor
137 sensor.startSensor(3);
138
139 // Started polling with 5, 1, 2 and 3 Hz frequency.
140 verify(mPlatformSensorProvider, times(4)).getHandler();
141 verify(mPlatformSensorProvider, times(4)).sensorStarted(sensor);
142 verify(mSensorManager, times(4))
143 .registerListener(any(SensorEventListener.class), any(Sensor.cla ss), anyInt(),
timvolodine 2016/09/06 17:44:37 is it also possible to test that unregisterListene
shalamov 2016/09/07 13:53:42 Done.
144 any(Handler.class));
145
146 sensor.stopSensor();
147 sensor.stopSensor();
148 verify(mPlatformSensorProvider, times(3)).sensorStopped(sensor);
149 }
150
151 @Test
152 @Feature({"PlatformSensor"})
153 public void testSensorStartFails() {
154 addMockSensor(50000, Sensor.TYPE_ACCELEROMETER, Sensor.REPORTING_MODE_CO NTINUOUS);
155 PlatformSensor sensor =
156 PlatformSensor.create(Sensor.TYPE_ACCELEROMETER, 3, mPlatformSen sorProvider);
157 assertNotNull(sensor);
158
159 doReturn(false)
160 .when(mSensorManager)
161 .registerListener(any(SensorEventListener.class), any(Sensor.cla ss), anyInt(),
162 any(Handler.class));
163
164 sensor.startSensor(5);
165 verify(mPlatformSensorProvider, times(1)).sensorStarted(sensor);
166 verify(mPlatformSensorProvider, times(1)).sensorStopped(sensor);
167 verify(mPlatformSensorProvider, times(1)).getHandler();
168 }
169
170 @Test
171 @Feature({"PlatformSensor"})
172 public void testSensorConfiguration() {
173 // 5Hz min delay
174 PlatformSensor sensor = createPlatformSensor(200000, Sensor.TYPE_ACCELER OMETER,
175 SensorType.ACCELEROMETER, Sensor.REPORTING_MODE_CONTINUOUS);
176 assertEquals(true, sensor.checkSensorConfiguration(5));
177 assertEquals(false, sensor.checkSensorConfiguration(6));
178 }
179
180 @Test
181 @Feature({"PlatformSensor"})
182 public void testSensorOnChangeReportingMode() {
183 PlatformSensor sensor = createPlatformSensor(50000, Sensor.TYPE_LIGHT,
184 SensorType.AMBIENT_LIGHT, Sensor.REPORTING_MODE_ON_CHANGE);
185 assertEquals(ReportingMode.ON_CHANGE, sensor.getReportingMode());
186 }
187
188 @Test
189 @Feature({"PlatformSensor"})
190 public void testSensorNotifierIsNotCalled()
191 throws NoSuchFieldException, IllegalAccessException {
192 PlatformSensor sensor = createPlatformSensor(50000, Sensor.TYPE_ACCELERO METER,
193 SensorType.ACCELEROMETER, Sensor.REPORTING_MODE_CONTINUOUS);
194 PlatformSensorNotifier mockNotifier = mock(PlatformSensorNotifier.class) ;
195 initPlatformSensor(sensor, SensorReadBuffer.READ_BUFFER_SIZE, mockNotifi er);
196 SensorEvent event = createFakeEvent(3);
197 sensor.onSensorChanged(event);
198 verify(mockNotifier, never()).sensorReadingChanged();
199 }
200
201 @Test
202 @Feature({"PlatformSensor"})
203 public void testSensorBufferFromEvent() throws NoSuchFieldException, Illegal AccessException {
timvolodine 2016/09/06 17:44:37 what does this test? maybe add a comment?
shalamov 2016/09/07 13:53:42 Added comments.
204 PlatformSensor sensor = createPlatformSensor(50000, Sensor.TYPE_LIGHT,
205 SensorType.AMBIENT_LIGHT, Sensor.REPORTING_MODE_ON_CHANGE);
206 PlatformSensorNotifier mockNotifier = mock(PlatformSensorNotifier.class) ;
207 initPlatformSensor(sensor, SensorReadBuffer.READ_BUFFER_SIZE, mockNotifi er);
208 SensorEvent event = createFakeEvent(1);
209 sensor.onSensorChanged(event);
210 // System.out.format("Event values[0] %f", event.values[0]);
timvolodine 2016/09/06 17:44:37 should this be here?
shalamov 2016/09/07 13:53:42 Done.
211 verify(mockNotifier, times(1)).sensorReadingChanged();
212 // verify timestamp
213 assertEquals(MILLISECONDS_IN_NANOSECOND * PLATFORM_SENSOR_TIMESTAMP,
214 mSharedBuffer.getDouble(), MILLISECONDS_IN_NANOSECOND);
215 // verify illuminance
216 assertEquals(1.0d + MILLISECONDS_IN_NANOSECOND, mSharedBuffer.getDouble( ),
217 MILLISECONDS_IN_NANOSECOND);
218 }
219
220 @Test
221 @Feature({"PlatformSensor"})
222 public void testSensorInvalidReadingSize() throws NoSuchFieldException, Ille galAccessException {
223 PlatformSensor sensor = createPlatformSensor(50000, Sensor.TYPE_ACCELERO METER,
224 SensorType.ACCELEROMETER, Sensor.REPORTING_MODE_CONTINUOUS);
225 PlatformSensorNotifier mockNotifier = mock(PlatformSensorNotifier.class) ;
226 initPlatformSensor(sensor, SensorReadBuffer.READ_BUFFER_SIZE, mockNotifi er);
227 // Accelerometer requires 3 reading values x,y and z, create fake event with 1 reading
228 // value.
229 SensorEvent event = createFakeEvent(1);
230 sensor.onSensorChanged(event);
231 verify(mockNotifier, times(1)).sensorError();
232 }
233
234 @Test
235 @Feature({"PlatformSensor"})
236 public void testSensorInvalidBufferSize() throws NoSuchFieldException, Illeg alAccessException {
237 PlatformSensor sensor = createPlatformSensor(50000, Sensor.TYPE_ACCELERO METER,
238 SensorType.ACCELEROMETER, Sensor.REPORTING_MODE_CONTINUOUS);
239 PlatformSensorNotifier mockNotifier = mock(PlatformSensorNotifier.class) ;
240 // Create buffer that doesn't have enough capacity to hold sensor readin g values.
241 initPlatformSensor(sensor, 2, mockNotifier);
242 SensorEvent event = createFakeEvent(3);
243 sensor.onSensorChanged(event);
244 verify(mockNotifier, times(1)).sensorError();
245 }
246
247 private SensorEvent createFakeEvent(int readingValuesNum)
248 throws NoSuchFieldException, IllegalAccessException {
249 SensorEvent mockEvent = mock(SensorEvent.class);
250 mockEvent.timestamp = PLATFORM_SENSOR_TIMESTAMP;
251 float values[] = new float[readingValuesNum];
252 for (int i = 0; i < readingValuesNum; ++i) {
253 values[i] = (float) (i + 1.0f + MILLISECONDS_IN_NANOSECOND);
254 }
255
256 Field valuesField = SensorEvent.class.getDeclaredField("values");
257 valuesField.setAccessible(true);
258 Field modifiersField = Field.class.getDeclaredField("modifiers");
259 modifiersField.setAccessible(true);
260 modifiersField.setInt(valuesField, valuesField.getModifiers() & ~Modifie r.FINAL);
261 valuesField.set(mockEvent, values);
262 return mockEvent;
263 }
264
265 private void initPlatformSensor(
266 PlatformSensor sensor, long readingSize, PlatformSensorNotifier noti fier) {
267 mSharedBuffer = ByteBuffer.allocate((int) readingSize);
268 mSharedBuffer.order(ByteOrder.nativeOrder());
269 sensor.initPlatformSensorAndroid(notifier, PLATFORM_SENSOR_ANDROID, mSha redBuffer);
270 }
271
272 private void addMockSensor(long minDelayUsec, int sensorType, int reportingM ode) {
273 mMockSensors.clear();
274 Sensor mockSensor = mock(Sensor.class);
275 doReturn((int) minDelayUsec).when(mockSensor).getMinDelay();
276 doReturn(reportingMode).when(mockSensor).getReportingMode();
277 doReturn(sensorType).when(mockSensor).getType();
278 doReturn(mMockSensors).when(mSensorManager).getSensorList(sensorType);
279 mMockSensors.add(mockSensor);
280 }
281
282 private PlatformSensor createPlatformSensor(
283 long minDelayUsec, int androidSensorType, int mojoSensorType, int re portingMode) {
284 addMockSensor(minDelayUsec, androidSensorType, reportingMode);
285 PlatformSensorProvider provider = PlatformSensorProvider.create(mContext );
286 return provider.createSensor(mojoSensorType);
287 }
288 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698