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.
5 #include "content/browser/device_sensors/data_fetcher_shared_memory_base.h"
7 #include "base/logging.h"
8 #include "base/process/process_handle.h"
9 #include "base/synchronization/waitable_event.h"
10 #include "base/threading/thread.h"
11 #include "content/common/device_sensors/device_light_hardware_buffer.h"
12 #include "content/common/device_sensors/device_motion_hardware_buffer.h"
13 #include "content/common/device_sensors/device_orientation_hardware_buffer.h"
14 #include "testing/gtest/include/gtest/gtest.h"
20 class FakeDataFetcher : public DataFetcherSharedMemoryBase {
23 : start_light_(false, false),
24 start_motion_(false, false),
25 start_orientation_(false, false),
26 stop_light_(false, false),
27 stop_motion_(false, false),
28 stop_orientation_(false, false),
29 updated_light_(false, false),
30 updated_motion_(false, false),
31 updated_orientation_(false, false),
34 orientation_buffer_(NULL) {}
35 virtual ~FakeDataFetcher() { }
37 bool Init(ConsumerType consumer_type, void* buffer) {
40 switch (consumer_type) {
41 case CONSUMER_TYPE_MOTION:
42 motion_buffer_ = static_cast<DeviceMotionHardwareBuffer*>(buffer);
44 case CONSUMER_TYPE_ORIENTATION:
46 static_cast<DeviceOrientationHardwareBuffer*>(buffer);
48 case CONSUMER_TYPE_LIGHT:
49 light_buffer_ = static_cast<DeviceLightHardwareBuffer*>(buffer);
58 DeviceLightHardwareBuffer* buffer = GetLightBuffer();
60 buffer->seqlock.WriteBegin();
61 buffer->data.value = 100;
62 buffer->seqlock.WriteEnd();
63 updated_light_.Signal();
67 DeviceMotionHardwareBuffer* buffer = GetMotionBuffer();
69 buffer->seqlock.WriteBegin();
70 buffer->data.interval = kInertialSensorIntervalMillis;
71 buffer->seqlock.WriteEnd();
72 updated_motion_.Signal();
75 void UpdateOrientation() {
76 DeviceOrientationHardwareBuffer* buffer = GetOrientationBuffer();
78 buffer->seqlock.WriteBegin();
79 buffer->data.alpha = 1;
80 buffer->seqlock.WriteEnd();
81 updated_orientation_.Signal();
84 DeviceLightHardwareBuffer* GetLightBuffer() const { return light_buffer_; }
86 DeviceMotionHardwareBuffer* GetMotionBuffer() const {
87 return motion_buffer_;
90 DeviceOrientationHardwareBuffer* GetOrientationBuffer() const {
91 return orientation_buffer_;
94 void WaitForStart(ConsumerType consumer_type) {
95 switch (consumer_type) {
96 case CONSUMER_TYPE_MOTION:
99 case CONSUMER_TYPE_ORIENTATION:
100 start_orientation_.Wait();
102 case CONSUMER_TYPE_LIGHT:
108 void WaitForStop(ConsumerType consumer_type) {
109 switch (consumer_type) {
110 case CONSUMER_TYPE_MOTION:
113 case CONSUMER_TYPE_ORIENTATION:
114 stop_orientation_.Wait();
116 case CONSUMER_TYPE_LIGHT:
122 void WaitForUpdate(ConsumerType consumer_type) {
123 switch (consumer_type) {
124 case CONSUMER_TYPE_MOTION:
125 updated_motion_.Wait();
127 case CONSUMER_TYPE_ORIENTATION:
128 updated_orientation_.Wait();
130 case CONSUMER_TYPE_LIGHT:
131 updated_light_.Wait();
137 base::WaitableEvent start_light_;
138 base::WaitableEvent start_motion_;
139 base::WaitableEvent start_orientation_;
140 base::WaitableEvent stop_light_;
141 base::WaitableEvent stop_motion_;
142 base::WaitableEvent stop_orientation_;
143 base::WaitableEvent updated_light_;
144 base::WaitableEvent updated_motion_;
145 base::WaitableEvent updated_orientation_;
148 DeviceLightHardwareBuffer* light_buffer_;
149 DeviceMotionHardwareBuffer* motion_buffer_;
150 DeviceOrientationHardwareBuffer* orientation_buffer_;
152 DISALLOW_COPY_AND_ASSIGN(FakeDataFetcher);
155 class FakeNonPollingDataFetcher : public FakeDataFetcher {
157 FakeNonPollingDataFetcher() { }
158 virtual ~FakeNonPollingDataFetcher() { }
160 virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
161 Init(consumer_type, buffer);
162 switch (consumer_type) {
163 case CONSUMER_TYPE_MOTION:
165 start_motion_.Signal();
167 case CONSUMER_TYPE_ORIENTATION:
169 start_orientation_.Signal();
171 case CONSUMER_TYPE_LIGHT:
173 start_light_.Signal();
181 virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
182 switch (consumer_type) {
183 case CONSUMER_TYPE_MOTION:
184 stop_motion_.Signal();
186 case CONSUMER_TYPE_ORIENTATION:
187 stop_orientation_.Signal();
189 case CONSUMER_TYPE_LIGHT:
190 stop_light_.Signal();
198 virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
199 FAIL() << "fetch should not be called, "
200 << "because this is a non-polling fetcher";
203 virtual FetcherType GetType() const OVERRIDE {
204 return FakeDataFetcher::GetType();
208 DISALLOW_COPY_AND_ASSIGN(FakeNonPollingDataFetcher);
211 class FakePollingDataFetcher : public FakeDataFetcher {
213 FakePollingDataFetcher() { }
214 virtual ~FakePollingDataFetcher() { }
216 virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
217 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
219 Init(consumer_type, buffer);
220 switch (consumer_type) {
221 case CONSUMER_TYPE_MOTION:
222 start_motion_.Signal();
224 case CONSUMER_TYPE_ORIENTATION:
225 start_orientation_.Signal();
227 case CONSUMER_TYPE_LIGHT:
228 start_light_.Signal();
236 virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
237 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
239 switch (consumer_type) {
240 case CONSUMER_TYPE_MOTION:
241 stop_motion_.Signal();
243 case CONSUMER_TYPE_ORIENTATION:
244 stop_orientation_.Signal();
246 case CONSUMER_TYPE_LIGHT:
247 stop_light_.Signal();
255 virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
256 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
257 EXPECT_TRUE(consumer_bitmask & CONSUMER_TYPE_ORIENTATION ||
258 consumer_bitmask & CONSUMER_TYPE_MOTION ||
259 consumer_bitmask & CONSUMER_TYPE_LIGHT);
261 if (consumer_bitmask & CONSUMER_TYPE_ORIENTATION)
263 if (consumer_bitmask & CONSUMER_TYPE_MOTION)
265 if (consumer_bitmask & CONSUMER_TYPE_LIGHT)
269 virtual FetcherType GetType() const OVERRIDE {
270 return FETCHER_TYPE_POLLING_CALLBACK;
274 DISALLOW_COPY_AND_ASSIGN(FakePollingDataFetcher);
277 class FakeZeroDelayPollingDataFetcher : public FakeDataFetcher {
279 FakeZeroDelayPollingDataFetcher() { }
280 virtual ~FakeZeroDelayPollingDataFetcher() { }
282 virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
283 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
285 Init(consumer_type, buffer);
286 switch (consumer_type) {
287 case CONSUMER_TYPE_MOTION:
288 start_motion_.Signal();
290 case CONSUMER_TYPE_ORIENTATION:
291 start_orientation_.Signal();
293 case CONSUMER_TYPE_LIGHT:
294 start_light_.Signal();
302 virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
303 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
305 switch (consumer_type) {
306 case CONSUMER_TYPE_MOTION:
307 stop_motion_.Signal();
309 case CONSUMER_TYPE_ORIENTATION:
310 stop_orientation_.Signal();
312 case CONSUMER_TYPE_LIGHT:
313 stop_light_.Signal();
321 virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
322 FAIL() << "fetch should not be called";
325 virtual FetcherType GetType() const OVERRIDE {
326 return FETCHER_TYPE_SEPARATE_THREAD;
329 bool IsPollingTimerRunningForTesting() const {
330 return FakeDataFetcher::IsPollingTimerRunningForTesting();
334 DISALLOW_COPY_AND_ASSIGN(FakeZeroDelayPollingDataFetcher);
338 TEST(DataFetcherSharedMemoryBaseTest, DoesStartMotion) {
339 FakeNonPollingDataFetcher fake_data_fetcher;
340 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_DEFAULT,
341 fake_data_fetcher.GetType());
343 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(CONSUMER_TYPE_MOTION));
344 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_MOTION);
346 EXPECT_EQ(kInertialSensorIntervalMillis,
347 fake_data_fetcher.GetMotionBuffer()->data.interval);
349 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_MOTION);
350 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_MOTION);
353 TEST(DataFetcherSharedMemoryBaseTest, DoesStartOrientation) {
354 FakeNonPollingDataFetcher fake_data_fetcher;
355 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_DEFAULT,
356 fake_data_fetcher.GetType());
358 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
359 CONSUMER_TYPE_ORIENTATION));
360 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
362 EXPECT_EQ(1, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
364 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
365 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
368 TEST(DataFetcherSharedMemoryBaseTest, DoesStartLight) {
369 FakeNonPollingDataFetcher fake_data_fetcher;
370 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_DEFAULT,
371 fake_data_fetcher.GetType());
373 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(CONSUMER_TYPE_LIGHT));
374 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_LIGHT);
376 EXPECT_EQ(100, fake_data_fetcher.GetLightBuffer()->data.value);
378 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_LIGHT);
379 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_LIGHT);
382 TEST(DataFetcherSharedMemoryBaseTest, DoesPollMotion) {
383 FakePollingDataFetcher fake_data_fetcher;
384 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
385 fake_data_fetcher.GetType());
387 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(CONSUMER_TYPE_MOTION));
388 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_MOTION);
389 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_MOTION);
391 EXPECT_EQ(kInertialSensorIntervalMillis,
392 fake_data_fetcher.GetMotionBuffer()->data.interval);
394 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_MOTION);
395 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_MOTION);
398 TEST(DataFetcherSharedMemoryBaseTest, DoesPollOrientation) {
399 FakePollingDataFetcher fake_data_fetcher;
400 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
401 fake_data_fetcher.GetType());
403 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
404 CONSUMER_TYPE_ORIENTATION));
405 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
406 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_ORIENTATION);
408 EXPECT_EQ(1, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
410 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
411 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
414 TEST(DataFetcherSharedMemoryBaseTest, DoesPollLight) {
415 FakePollingDataFetcher fake_data_fetcher;
416 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
417 fake_data_fetcher.GetType());
419 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(CONSUMER_TYPE_LIGHT));
420 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_LIGHT);
421 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_LIGHT);
423 EXPECT_EQ(100, fake_data_fetcher.GetLightBuffer()->data.value);
425 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_LIGHT);
426 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_LIGHT);
429 TEST(DataFetcherSharedMemoryBaseTest, DoesPollMotionAndOrientation) {
430 FakePollingDataFetcher fake_data_fetcher;
431 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
432 fake_data_fetcher.GetType());
434 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
435 CONSUMER_TYPE_ORIENTATION));
436 base::SharedMemoryHandle handle_orientation =
437 fake_data_fetcher.GetSharedMemoryHandleForProcess(
438 CONSUMER_TYPE_ORIENTATION, base::GetCurrentProcessHandle());
439 EXPECT_TRUE(base::SharedMemory::IsHandleValid(handle_orientation));
441 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
442 CONSUMER_TYPE_MOTION));
443 base::SharedMemoryHandle handle_motion =
444 fake_data_fetcher.GetSharedMemoryHandleForProcess(
445 CONSUMER_TYPE_MOTION, base::GetCurrentProcessHandle());
446 EXPECT_TRUE(base::SharedMemory::IsHandleValid(handle_motion));
448 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
449 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_MOTION);
451 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_ORIENTATION);
452 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_MOTION);
454 EXPECT_EQ(1, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
455 EXPECT_EQ(kInertialSensorIntervalMillis,
456 fake_data_fetcher.GetMotionBuffer()->data.interval);
458 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
459 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_MOTION);
460 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
461 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_MOTION);
464 TEST(DataFetcherSharedMemoryBaseTest, DoesNotPollZeroDelay) {
465 FakeZeroDelayPollingDataFetcher fake_data_fetcher;
466 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_SEPARATE_THREAD,
467 fake_data_fetcher.GetType());
469 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
470 CONSUMER_TYPE_ORIENTATION));
471 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
473 EXPECT_FALSE(fake_data_fetcher.IsPollingTimerRunningForTesting());
474 EXPECT_EQ(0, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
476 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
477 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
483 } // namespace content