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

Side by Side Diff: services/device/sensors/device_sensor_service_unittest.cc

Issue 2812223006: Replace device_sensor browsertest by service unittest. (Closed)
Patch Set: eliminate "unreachable code" warning. Created 3 years, 8 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
« no previous file with comments | « services/device/sensors/OWNERS ('k') | services/device/unittest_manifest.json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 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 #include "device/sensors/device_sensor_service.h"
6 #include <limits>
7 #include "base/memory/singleton.h"
8 #include "base/run_loop.h"
9 #include "base/threading/platform_thread.h"
10 #include "build/build_config.h"
11 #include "device/sensors/data_fetcher_shared_memory.h"
12 #include "device/sensors/public/cpp/device_light_data.h"
13 #include "device/sensors/public/cpp/device_light_hardware_buffer.h"
14 #include "device/sensors/public/cpp/device_motion_hardware_buffer.h"
15 #include "device/sensors/public/cpp/device_orientation_hardware_buffer.h"
16 #include "device/sensors/public/cpp/motion_data.h"
17 #include "device/sensors/public/cpp/orientation_data.h"
18 #include "device/sensors/public/cpp/shared_memory_seqlock_reader.h"
19 #include "device/sensors/public/interfaces/light.mojom.h"
20 #include "device/sensors/public/interfaces/motion.mojom.h"
21 #include "device/sensors/public/interfaces/orientation.mojom.h"
22 #include "mojo/public/cpp/system/platform_handle.h"
23 #include "services/device/device_service_test_base.h"
24 #include "services/device/public/interfaces/constants.mojom.h"
25
26 namespace device {
27
28 namespace {
29
30 class FakeDataFetcher : public device::DataFetcherSharedMemory {
31 public:
32 FakeDataFetcher()
33 : main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
34 sensor_data_available_(true) {}
35 ~FakeDataFetcher() override {}
36
37 void SetPollingStoppedCallback(base::Closure polling_stopped_callback) {
38 polling_stopped_callback_ = polling_stopped_callback;
39 }
40
41 bool Start(device::ConsumerType consumer_type, void* buffer) override {
42 EXPECT_TRUE(buffer);
43
44 switch (consumer_type) {
45 case device::CONSUMER_TYPE_MOTION: {
46 device::DeviceMotionHardwareBuffer* motion_buffer =
47 static_cast<device::DeviceMotionHardwareBuffer*>(buffer);
48 if (sensor_data_available_) {
49 is_motion_polling_started_ = true;
50 UpdateMotion(motion_buffer);
51 }
52 SetMotionBufferReady(motion_buffer);
53 return true;
54 }
55 case device::CONSUMER_TYPE_ORIENTATION: {
56 device::DeviceOrientationHardwareBuffer* orientation_buffer =
57 static_cast<device::DeviceOrientationHardwareBuffer*>(buffer);
58 if (sensor_data_available_) {
59 is_orientation_polling_started_ = true;
60 UpdateOrientation(orientation_buffer);
61 }
62 SetOrientationBufferReady(orientation_buffer);
63 return true;
64 }
65 case device::CONSUMER_TYPE_ORIENTATION_ABSOLUTE: {
66 device::DeviceOrientationHardwareBuffer* orientation_buffer =
67 static_cast<device::DeviceOrientationHardwareBuffer*>(buffer);
68 if (sensor_data_available_) {
69 is_orientation_absolute_polling_started_ = true;
70 UpdateOrientationAbsolute(orientation_buffer);
71 }
72 SetOrientationBufferReady(orientation_buffer);
73 return true;
74 }
75 case device::CONSUMER_TYPE_LIGHT: {
76 device::DeviceLightHardwareBuffer* light_buffer =
77 static_cast<device::DeviceLightHardwareBuffer*>(buffer);
78 is_light_polling_started_ = true;
79 UpdateLight(light_buffer,
80 sensor_data_available_
81 ? 100
82 : std::numeric_limits<double>::infinity());
83 return true;
84 }
85 }
86
87 return false;
88 }
89
90 bool Stop(device::ConsumerType consumer_type) override {
91 switch (consumer_type) {
92 case device::CONSUMER_TYPE_MOTION: {
93 is_motion_polling_started_ = false;
94 main_thread_task_runner_->PostTask(FROM_HERE,
95 polling_stopped_callback_);
96 return true;
97 }
98 case device::CONSUMER_TYPE_ORIENTATION: {
99 is_orientation_polling_started_ = false;
100 main_thread_task_runner_->PostTask(FROM_HERE,
101 polling_stopped_callback_);
102 return true;
103 }
104 case device::CONSUMER_TYPE_ORIENTATION_ABSOLUTE: {
105 is_orientation_absolute_polling_started_ = false;
106 main_thread_task_runner_->PostTask(FROM_HERE,
107 polling_stopped_callback_);
108 return true;
109 }
110 case device::CONSUMER_TYPE_LIGHT: {
111 is_light_polling_started_ = false;
112 main_thread_task_runner_->PostTask(FROM_HERE,
113 polling_stopped_callback_);
114 return true;
115 }
116 }
117
118 return false;
119 }
120
121 void Fetch(unsigned consumer_bitmask) override {
122 FAIL() << "fetch should not be called";
123 }
124
125 FetcherType GetType() const override { return FETCHER_TYPE_DEFAULT; }
126
127 void SetSensorDataAvailable(bool available) {
128 sensor_data_available_ = available;
129 }
130
131 bool IsLightPollingStarted() { return is_light_polling_started_; }
132
133 bool IsMotionPollingStarted() { return is_motion_polling_started_; }
134
135 bool IsOrientationAbsolutePollingStarted() {
136 return is_orientation_absolute_polling_started_;
137 }
138
139 bool IsOrientationPollingStarted() { return is_orientation_polling_started_; }
140
141 void SetMotionBufferReady(device::DeviceMotionHardwareBuffer* buffer) {
142 buffer->seqlock.WriteBegin();
143 buffer->data.all_available_sensors_are_active = true;
144 buffer->seqlock.WriteEnd();
145 }
146
147 void SetOrientationBufferReady(
148 device::DeviceOrientationHardwareBuffer* buffer) {
149 buffer->seqlock.WriteBegin();
150 buffer->data.all_available_sensors_are_active = true;
151 buffer->seqlock.WriteEnd();
152 }
153
154 void UpdateMotion(device::DeviceMotionHardwareBuffer* buffer) {
155 buffer->seqlock.WriteBegin();
156 buffer->data.acceleration_x = 1;
157 buffer->data.has_acceleration_x = true;
158 buffer->data.acceleration_y = 2;
159 buffer->data.has_acceleration_y = true;
160 buffer->data.acceleration_z = 3;
161 buffer->data.has_acceleration_z = true;
162
163 buffer->data.acceleration_including_gravity_x = 4;
164 buffer->data.has_acceleration_including_gravity_x = true;
165 buffer->data.acceleration_including_gravity_y = 5;
166 buffer->data.has_acceleration_including_gravity_y = true;
167 buffer->data.acceleration_including_gravity_z = 6;
168 buffer->data.has_acceleration_including_gravity_z = true;
169
170 buffer->data.rotation_rate_alpha = 7;
171 buffer->data.has_rotation_rate_alpha = true;
172 buffer->data.rotation_rate_beta = 8;
173 buffer->data.has_rotation_rate_beta = true;
174 buffer->data.rotation_rate_gamma = 9;
175 buffer->data.has_rotation_rate_gamma = true;
176
177 buffer->data.interval = 100;
178 buffer->data.all_available_sensors_are_active = true;
179 buffer->seqlock.WriteEnd();
180 }
181
182 void UpdateOrientation(device::DeviceOrientationHardwareBuffer* buffer) {
183 buffer->seqlock.WriteBegin();
184 buffer->data.alpha = 1;
185 buffer->data.has_alpha = true;
186 buffer->data.beta = 2;
187 buffer->data.has_beta = true;
188 buffer->data.gamma = 3;
189 buffer->data.has_gamma = true;
190 buffer->data.all_available_sensors_are_active = true;
191 buffer->seqlock.WriteEnd();
192 }
193
194 void UpdateOrientationAbsolute(
195 device::DeviceOrientationHardwareBuffer* buffer) {
196 buffer->seqlock.WriteBegin();
197 buffer->data.alpha = 4;
198 buffer->data.has_alpha = true;
199 buffer->data.beta = 5;
200 buffer->data.has_beta = true;
201 buffer->data.gamma = 6;
202 buffer->data.has_gamma = true;
203 buffer->data.absolute = true;
204 buffer->data.all_available_sensors_are_active = true;
205 buffer->seqlock.WriteEnd();
206 }
207
208 void UpdateLight(device::DeviceLightHardwareBuffer* buffer, double lux) {
209 buffer->seqlock.WriteBegin();
210 buffer->data.value = lux;
211 buffer->seqlock.WriteEnd();
212 }
213
214 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
215
216 // |polling_stopped_callback_| should be run on the main thread.
217 base::Closure polling_stopped_callback_;
218
219 bool sensor_data_available_;
220 bool is_light_polling_started_;
221 bool is_motion_polling_started_;
222 bool is_orientation_absolute_polling_started_;
223 bool is_orientation_polling_started_;
224
225 private:
226 DISALLOW_COPY_AND_ASSIGN(FakeDataFetcher);
227 };
228
229 class DeviceSensorServiceTest : public DeviceServiceTestBase {
230 public:
231 DeviceSensorServiceTest() : fetcher_(nullptr) {}
232
233 void SetUpFetcher() {
234 device::DeviceSensorService::GetInstance()->SetDataFetcherForTesting(
235 fetcher_);
236 }
237
238 void GetLightData(device::DeviceLightData* data,
239 mojo::ScopedSharedBufferHandle buffer_handle) {
240 base::SharedMemoryHandle handle;
241 MojoResult result = mojo::UnwrapSharedMemoryHandle(
242 std::move(buffer_handle), &handle, nullptr, nullptr);
243 DCHECK_EQ(MOJO_RESULT_OK, result);
244
245 if (!light_reader_) {
246 light_reader_ = base::MakeUnique<
247 SharedMemorySeqLockReader<device::DeviceLightData>>();
248 }
249 EXPECT_TRUE(light_reader_->Initialize(handle));
250 EXPECT_TRUE(light_reader_->GetLatestData(data));
251 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
252 runloop_->QuitClosure());
253 }
254
255 void GetMotionData(device::MotionData* data,
256 mojo::ScopedSharedBufferHandle buffer_handle) {
257 base::SharedMemoryHandle handle;
258 MojoResult result = mojo::UnwrapSharedMemoryHandle(
259 std::move(buffer_handle), &handle, nullptr, nullptr);
260 DCHECK_EQ(MOJO_RESULT_OK, result);
261
262 if (!motion_reader_) {
263 motion_reader_ =
264 base::MakeUnique<SharedMemorySeqLockReader<device::MotionData>>();
265 }
266 EXPECT_TRUE(motion_reader_->Initialize(handle));
267 EXPECT_TRUE(motion_reader_->GetLatestData(data));
268 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
269 runloop_->QuitClosure());
270 }
271
272 void GetOrientationData(device::OrientationData* data,
273 mojo::ScopedSharedBufferHandle buffer_handle) {
274 base::SharedMemoryHandle handle;
275 MojoResult result = mojo::UnwrapSharedMemoryHandle(
276 std::move(buffer_handle), &handle, nullptr, nullptr);
277 DCHECK_EQ(MOJO_RESULT_OK, result);
278
279 if (!orientation_reader_) {
280 orientation_reader_ = base::MakeUnique<
281 SharedMemorySeqLockReader<device::OrientationData>>();
282 }
283 EXPECT_TRUE(orientation_reader_->Initialize(handle));
284 EXPECT_TRUE(orientation_reader_->GetLatestData(data));
285 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
286 runloop_->QuitClosure());
287 }
288
289 FakeDataFetcher* fetcher_;
290
291 // NOTE: These can only be initialized once the main thread has been created
292 // and so must be pointers instead of plain objects.
293 std::unique_ptr<base::RunLoop> runloop_;
294 std::unique_ptr<base::RunLoop> polling_stopped_runloop_;
295
296 protected:
297 void SetUp() override {
298 DeviceServiceTestBase::SetUp();
299
300 // Initialize the RunLoops for tests.
301 runloop_.reset(new base::RunLoop());
302 polling_stopped_runloop_.reset(new base::RunLoop());
303
304 fetcher_ = new FakeDataFetcher();
305 fetcher_->SetPollingStoppedCallback(
306 polling_stopped_runloop_->QuitClosure());
307
308 // On non-Android platform, SetUpFetcher() should be called in IO thread,
309 // because the IO thread is actually main thread in service unittest, so
310 // it is ok call it directly. See comments in
311 // DeviceServiceTestBase::CreateService() why the IO thread is simulated by
312 // main thread.
313 SetUpFetcher();
314 }
315
316 mojom::LightSensorPtr light_sensor_;
317 mojom::MotionSensorPtr motion_sensor_;
318 mojom::OrientationAbsoluteSensorPtr orientation_absolute_sensor_;
319 mojom::OrientationSensorPtr orientation_sensor_;
320
321 private:
322 std::unique_ptr<SharedMemorySeqLockReader<device::DeviceLightData>>
323 light_reader_;
324 std::unique_ptr<SharedMemorySeqLockReader<device::MotionData>> motion_reader_;
325 std::unique_ptr<SharedMemorySeqLockReader<device::OrientationData>>
326 orientation_reader_;
327 };
328
329 TEST_F(DeviceSensorServiceTest, OrientationTest) {
330 device::OrientationData data;
331 memset(&data, 0, sizeof(device::OrientationData));
332 connector()->BindInterface(mojom::kServiceName, &orientation_sensor_);
333 orientation_sensor_->StartPolling(
334 base::Bind(&DeviceSensorServiceTest::GetOrientationData,
335 base::Unretained(this), &data));
336 runloop_->Run();
337 EXPECT_TRUE(fetcher_->IsOrientationPollingStarted());
338 EXPECT_EQ(1, data.alpha);
339 EXPECT_TRUE(data.has_alpha);
340 EXPECT_EQ(2, data.beta);
341 EXPECT_TRUE(data.has_beta);
342 EXPECT_EQ(3, data.gamma);
343 EXPECT_TRUE(data.has_gamma);
344 EXPECT_TRUE(data.all_available_sensors_are_active);
345
346 orientation_sensor_->StopPolling();
347 polling_stopped_runloop_->Run();
348 EXPECT_FALSE(fetcher_->IsOrientationPollingStarted());
349 }
350
351 TEST_F(DeviceSensorServiceTest, OrientationAbsoluteTest) {
352 device::OrientationData data;
353 memset(&data, 0, sizeof(device::OrientationData));
354 connector()->BindInterface(mojom::kServiceName,
355 &orientation_absolute_sensor_);
356 orientation_absolute_sensor_->StartPolling(
357 base::Bind(&DeviceSensorServiceTest::GetOrientationData,
358 base::Unretained(this), &data));
359 runloop_->Run();
360
361 EXPECT_TRUE(fetcher_->IsOrientationAbsolutePollingStarted());
362 EXPECT_EQ(4, data.alpha);
363 EXPECT_TRUE(data.has_alpha);
364 EXPECT_EQ(5, data.beta);
365 EXPECT_TRUE(data.has_beta);
366 EXPECT_EQ(6, data.gamma);
367 EXPECT_TRUE(data.has_gamma);
368 EXPECT_TRUE(data.all_available_sensors_are_active);
369
370 orientation_absolute_sensor_->StopPolling();
371 polling_stopped_runloop_->Run();
372 EXPECT_FALSE(fetcher_->IsOrientationAbsolutePollingStarted());
373 }
374
375 TEST_F(DeviceSensorServiceTest, LightTest) {
376 device::DeviceLightData data;
377 memset(&data, 0, sizeof(device::DeviceLightData));
378 connector()->BindInterface(mojom::kServiceName, &light_sensor_);
379 light_sensor_->StartPolling(base::Bind(&DeviceSensorServiceTest::GetLightData,
380 base::Unretained(this), &data));
381 runloop_->Run();
382
383 EXPECT_TRUE(fetcher_->IsLightPollingStarted());
384 EXPECT_EQ(100, data.value);
385
386 light_sensor_->StopPolling();
387 polling_stopped_runloop_->Run();
388 EXPECT_FALSE(fetcher_->IsLightPollingStarted());
389 }
390
391 TEST_F(DeviceSensorServiceTest, MotionTest) {
392 device::MotionData data;
393 memset(&data, 0, sizeof(device::MotionData));
394 connector()->BindInterface(mojom::kServiceName, &motion_sensor_);
395 motion_sensor_->StartPolling(base::Bind(
396 &DeviceSensorServiceTest::GetMotionData, base::Unretained(this), &data));
397 runloop_->Run();
398
399 EXPECT_TRUE(fetcher_->IsMotionPollingStarted());
400 EXPECT_EQ(1, data.acceleration_x);
401 EXPECT_TRUE(data.has_acceleration_x);
402 EXPECT_EQ(2, data.acceleration_y);
403 EXPECT_TRUE(data.has_acceleration_y);
404 EXPECT_EQ(3, data.acceleration_z);
405 EXPECT_TRUE(data.has_acceleration_z);
406 EXPECT_EQ(4, data.acceleration_including_gravity_x);
407 EXPECT_TRUE(data.has_acceleration_including_gravity_x);
408 EXPECT_EQ(5, data.acceleration_including_gravity_y);
409 EXPECT_TRUE(data.has_acceleration_including_gravity_y);
410 EXPECT_EQ(6, data.acceleration_including_gravity_z);
411 EXPECT_TRUE(data.has_acceleration_including_gravity_z);
412 EXPECT_EQ(7, data.rotation_rate_alpha);
413 EXPECT_TRUE(data.has_rotation_rate_alpha);
414 EXPECT_EQ(8, data.rotation_rate_beta);
415 EXPECT_TRUE(data.has_rotation_rate_beta);
416 EXPECT_EQ(9, data.rotation_rate_gamma);
417 EXPECT_TRUE(data.has_rotation_rate_gamma);
418 EXPECT_EQ(100, data.interval);
419 EXPECT_TRUE(data.all_available_sensors_are_active);
420
421 motion_sensor_->StopPolling();
422 polling_stopped_runloop_->Run();
423 EXPECT_FALSE(fetcher_->IsMotionPollingStarted());
424 }
425
426 TEST_F(DeviceSensorServiceTest, LightOneOffInfintyTest) {
427 fetcher_->SetSensorDataAvailable(false);
428 device::DeviceLightData data;
429 memset(&data, 0, sizeof(device::DeviceLightData));
430 connector()->BindInterface(mojom::kServiceName, &light_sensor_);
431 light_sensor_->StartPolling(base::Bind(&DeviceSensorServiceTest::GetLightData,
432 base::Unretained(this), &data));
433 runloop_->Run();
434
435 EXPECT_TRUE(fetcher_->IsLightPollingStarted());
436 EXPECT_EQ(std::numeric_limits<double>::infinity(), data.value);
437
438 light_sensor_->StopPolling();
439 polling_stopped_runloop_->Run();
440 EXPECT_FALSE(fetcher_->IsLightPollingStarted());
441 }
442
443 TEST_F(DeviceSensorServiceTest, OrientationNullTest) {
444 fetcher_->SetSensorDataAvailable(false);
445 device::OrientationData data;
446 memset(&data, 0, sizeof(device::OrientationData));
447 connector()->BindInterface(mojom::kServiceName, &orientation_sensor_);
448 orientation_sensor_->StartPolling(
449 base::Bind(&DeviceSensorServiceTest::GetOrientationData,
450 base::Unretained(this), &data));
451 runloop_->Run();
452
453 EXPECT_FALSE(fetcher_->IsOrientationPollingStarted());
454 EXPECT_EQ(0, data.alpha);
455 EXPECT_FALSE(data.has_alpha);
456 EXPECT_EQ(0, data.beta);
457 EXPECT_FALSE(data.has_beta);
458 EXPECT_EQ(0, data.gamma);
459 EXPECT_FALSE(data.has_gamma);
460 EXPECT_TRUE(data.all_available_sensors_are_active);
461
462 orientation_sensor_->StopPolling();
463 polling_stopped_runloop_->Run();
464 EXPECT_FALSE(fetcher_->IsOrientationPollingStarted());
465 }
466
467 TEST_F(DeviceSensorServiceTest, OrientationAbsoluteNullTest) {
468 fetcher_->SetSensorDataAvailable(false);
469 device::OrientationData data;
470 memset(&data, 0, sizeof(device::OrientationData));
471 connector()->BindInterface(mojom::kServiceName,
472 &orientation_absolute_sensor_);
473 orientation_absolute_sensor_->StartPolling(
474 base::Bind(&DeviceSensorServiceTest::GetOrientationData,
475 base::Unretained(this), &data));
476 runloop_->Run();
477
478 EXPECT_FALSE(fetcher_->IsOrientationAbsolutePollingStarted());
479 EXPECT_EQ(0, data.alpha);
480 EXPECT_FALSE(data.has_alpha);
481 EXPECT_EQ(0, data.beta);
482 EXPECT_FALSE(data.has_beta);
483 EXPECT_EQ(0, data.gamma);
484 EXPECT_FALSE(data.has_gamma);
485 EXPECT_TRUE(data.all_available_sensors_are_active);
486
487 orientation_absolute_sensor_->StopPolling();
488 polling_stopped_runloop_->Run();
489 EXPECT_FALSE(fetcher_->IsOrientationAbsolutePollingStarted());
490 }
491
492 TEST_F(DeviceSensorServiceTest, MotionNullTest) {
493 fetcher_->SetSensorDataAvailable(false);
494 device::MotionData data;
495 memset(&data, 0, sizeof(device::MotionData));
496 connector()->BindInterface(mojom::kServiceName, &motion_sensor_);
497 motion_sensor_->StartPolling(base::Bind(
498 &DeviceSensorServiceTest::GetMotionData, base::Unretained(this), &data));
499 runloop_->Run();
500
501 EXPECT_FALSE(fetcher_->IsMotionPollingStarted());
502 EXPECT_EQ(0, data.acceleration_x);
503 EXPECT_FALSE(data.has_acceleration_x);
504 EXPECT_EQ(0, data.acceleration_y);
505 EXPECT_FALSE(data.has_acceleration_y);
506 EXPECT_EQ(0, data.acceleration_z);
507 EXPECT_FALSE(data.has_acceleration_z);
508 EXPECT_EQ(0, data.acceleration_including_gravity_x);
509 EXPECT_FALSE(data.has_acceleration_including_gravity_x);
510 EXPECT_EQ(0, data.acceleration_including_gravity_y);
511 EXPECT_FALSE(data.has_acceleration_including_gravity_y);
512 EXPECT_EQ(0, data.acceleration_including_gravity_z);
513 EXPECT_FALSE(data.has_acceleration_including_gravity_z);
514 EXPECT_EQ(0, data.rotation_rate_alpha);
515 EXPECT_FALSE(data.has_rotation_rate_alpha);
516 EXPECT_EQ(0, data.rotation_rate_beta);
517 EXPECT_FALSE(data.has_rotation_rate_beta);
518 EXPECT_EQ(0, data.rotation_rate_gamma);
519 EXPECT_FALSE(data.has_rotation_rate_gamma);
520 EXPECT_EQ(0, data.interval);
521 EXPECT_TRUE(data.all_available_sensors_are_active);
522
523 motion_sensor_->StopPolling();
524 polling_stopped_runloop_->Run();
525 EXPECT_FALSE(fetcher_->IsMotionPollingStarted());
526 }
527
528 } // namespace
529
530 } // namespace device
OLDNEW
« no previous file with comments | « services/device/sensors/OWNERS ('k') | services/device/unittest_manifest.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698