1 // Copyright 2013 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_orientation/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_orientation/device_motion_hardware_buffer.h"
12 #include "content/common/device_orientation/device_orientation_hardware_buffer.h"
13 #include "testing/gtest/include/gtest/gtest.h"
19 class FakeDataFetcher : public DataFetcherSharedMemoryBase {
22 : start_motion_(false, false),
23 start_orientation_(false, false),
24 stop_motion_(false, false),
25 stop_orientation_(false, false),
26 updated_motion_(false, false),
27 updated_orientation_(false, false),
29 orientation_buffer_(NULL) {
31 virtual ~FakeDataFetcher() { }
33 bool Init(ConsumerType consumer_type, void* buffer) {
36 switch (consumer_type) {
37 case CONSUMER_TYPE_MOTION:
38 motion_buffer_ = static_cast<DeviceMotionHardwareBuffer*>(buffer);
40 case CONSUMER_TYPE_ORIENTATION:
42 static_cast<DeviceOrientationHardwareBuffer*>(buffer);
51 DeviceMotionHardwareBuffer* buffer = GetMotionBuffer();
53 buffer->seqlock.WriteBegin();
54 buffer->data.interval = kInertialSensorIntervalMillis;
55 buffer->seqlock.WriteEnd();
56 updated_motion_.Signal();
59 void UpdateOrientation() {
60 DeviceOrientationHardwareBuffer* buffer = GetOrientationBuffer();
62 buffer->seqlock.WriteBegin();
63 buffer->data.alpha = 1;
64 buffer->seqlock.WriteEnd();
65 updated_orientation_.Signal();
68 DeviceMotionHardwareBuffer* GetMotionBuffer() const {
69 return motion_buffer_;
72 DeviceOrientationHardwareBuffer* GetOrientationBuffer() const {
73 return orientation_buffer_;
76 void WaitForStart(ConsumerType consumer_type) {
77 switch (consumer_type) {
78 case CONSUMER_TYPE_MOTION:
81 case CONSUMER_TYPE_ORIENTATION:
82 start_orientation_.Wait();
87 void WaitForStop(ConsumerType consumer_type) {
88 switch (consumer_type) {
89 case CONSUMER_TYPE_MOTION:
92 case CONSUMER_TYPE_ORIENTATION:
93 stop_orientation_.Wait();
98 void WaitForUpdate(ConsumerType consumer_type) {
99 switch (consumer_type) {
100 case CONSUMER_TYPE_MOTION:
101 updated_motion_.Wait();
103 case CONSUMER_TYPE_ORIENTATION:
104 updated_orientation_.Wait();
110 base::WaitableEvent start_motion_;
111 base::WaitableEvent start_orientation_;
112 base::WaitableEvent stop_motion_;
113 base::WaitableEvent stop_orientation_;
114 base::WaitableEvent updated_motion_;
115 base::WaitableEvent updated_orientation_;
118 DeviceMotionHardwareBuffer* motion_buffer_;
119 DeviceOrientationHardwareBuffer* orientation_buffer_;
121 DISALLOW_COPY_AND_ASSIGN(FakeDataFetcher);
124 class FakeNonPollingDataFetcher : public FakeDataFetcher {
126 FakeNonPollingDataFetcher() { }
127 virtual ~FakeNonPollingDataFetcher() { }
129 virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
130 Init(consumer_type, buffer);
131 switch (consumer_type) {
132 case CONSUMER_TYPE_MOTION:
134 start_motion_.Signal();
136 case CONSUMER_TYPE_ORIENTATION:
138 start_orientation_.Signal();
146 virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
147 switch (consumer_type) {
148 case CONSUMER_TYPE_MOTION:
149 stop_motion_.Signal();
151 case CONSUMER_TYPE_ORIENTATION:
152 stop_orientation_.Signal();
160 virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
161 FAIL() << "fetch should not be called, "
162 << "because this is a non-polling fetcher";
165 virtual FetcherType GetType() const OVERRIDE {
166 return FakeDataFetcher::GetType();
171 DISALLOW_COPY_AND_ASSIGN(FakeNonPollingDataFetcher);
174 class FakePollingDataFetcher : public FakeDataFetcher {
176 FakePollingDataFetcher() { }
177 virtual ~FakePollingDataFetcher() { }
179 virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
180 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
182 Init(consumer_type, buffer);
183 switch (consumer_type) {
184 case CONSUMER_TYPE_MOTION:
185 start_motion_.Signal();
187 case CONSUMER_TYPE_ORIENTATION:
188 start_orientation_.Signal();
196 virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
197 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
199 switch (consumer_type) {
200 case CONSUMER_TYPE_MOTION:
201 stop_motion_.Signal();
203 case CONSUMER_TYPE_ORIENTATION:
204 stop_orientation_.Signal();
212 virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
213 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
214 EXPECT_TRUE(consumer_bitmask & CONSUMER_TYPE_ORIENTATION ||
215 consumer_bitmask & CONSUMER_TYPE_MOTION);
217 if (consumer_bitmask & CONSUMER_TYPE_ORIENTATION)
219 if (consumer_bitmask & CONSUMER_TYPE_MOTION)
223 virtual FetcherType GetType() const OVERRIDE {
224 return FETCHER_TYPE_POLLING_CALLBACK;
229 DISALLOW_COPY_AND_ASSIGN(FakePollingDataFetcher);
232 class FakeZeroDelayPollingDataFetcher : public FakeDataFetcher {
234 FakeZeroDelayPollingDataFetcher() { }
235 virtual ~FakeZeroDelayPollingDataFetcher() { }
237 virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
238 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
240 Init(consumer_type, buffer);
241 switch (consumer_type) {
242 case CONSUMER_TYPE_MOTION:
243 start_motion_.Signal();
245 case CONSUMER_TYPE_ORIENTATION:
246 start_orientation_.Signal();
254 virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
255 EXPECT_TRUE(base::MessageLoop::current() == GetPollingMessageLoop());
257 switch (consumer_type) {
258 case CONSUMER_TYPE_MOTION:
259 stop_motion_.Signal();
261 case CONSUMER_TYPE_ORIENTATION:
262 stop_orientation_.Signal();
270 virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
271 FAIL() << "fetch should not be called";
274 virtual FetcherType GetType() const OVERRIDE {
275 return FETCHER_TYPE_SEPARATE_THREAD;
278 bool IsPollingTimerRunningForTesting() const {
279 return FakeDataFetcher::IsPollingTimerRunningForTesting();
284 DISALLOW_COPY_AND_ASSIGN(FakeZeroDelayPollingDataFetcher);
288 TEST(DataFetcherSharedMemoryBaseTest, DoesStartMotion) {
289 FakeNonPollingDataFetcher fake_data_fetcher;
290 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_DEFAULT,
291 fake_data_fetcher.GetType());
293 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(CONSUMER_TYPE_MOTION));
294 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_MOTION);
296 EXPECT_EQ(kInertialSensorIntervalMillis,
297 fake_data_fetcher.GetMotionBuffer()->data.interval);
299 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_MOTION);
300 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_MOTION);
303 TEST(DataFetcherSharedMemoryBaseTest, DoesStartOrientation) {
304 FakeNonPollingDataFetcher fake_data_fetcher;
305 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_DEFAULT,
306 fake_data_fetcher.GetType());
308 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
309 CONSUMER_TYPE_ORIENTATION));
310 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
312 EXPECT_EQ(1, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
314 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
315 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
318 TEST(DataFetcherSharedMemoryBaseTest, DoesPollMotion) {
319 FakePollingDataFetcher fake_data_fetcher;
320 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
321 fake_data_fetcher.GetType());
323 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(CONSUMER_TYPE_MOTION));
324 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_MOTION);
325 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_MOTION);
327 EXPECT_EQ(kInertialSensorIntervalMillis,
328 fake_data_fetcher.GetMotionBuffer()->data.interval);
330 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_MOTION);
331 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_MOTION);
334 TEST(DataFetcherSharedMemoryBaseTest, DoesPollOrientation) {
335 FakePollingDataFetcher fake_data_fetcher;
336 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
337 fake_data_fetcher.GetType());
339 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
340 CONSUMER_TYPE_ORIENTATION));
341 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
342 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_ORIENTATION);
344 EXPECT_EQ(1, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
346 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
347 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
350 TEST(DataFetcherSharedMemoryBaseTest, DoesPollMotionAndOrientation) {
351 FakePollingDataFetcher fake_data_fetcher;
352 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_POLLING_CALLBACK,
353 fake_data_fetcher.GetType());
355 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
356 CONSUMER_TYPE_ORIENTATION));
357 base::SharedMemoryHandle handle_orientation =
358 fake_data_fetcher.GetSharedMemoryHandleForProcess(
359 CONSUMER_TYPE_ORIENTATION, base::GetCurrentProcessHandle());
360 EXPECT_TRUE(base::SharedMemory::IsHandleValid(handle_orientation));
362 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
363 CONSUMER_TYPE_MOTION));
364 base::SharedMemoryHandle handle_motion =
365 fake_data_fetcher.GetSharedMemoryHandleForProcess(
366 CONSUMER_TYPE_MOTION, base::GetCurrentProcessHandle());
367 EXPECT_TRUE(base::SharedMemory::IsHandleValid(handle_motion));
369 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
370 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_MOTION);
372 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_ORIENTATION);
373 fake_data_fetcher.WaitForUpdate(CONSUMER_TYPE_MOTION);
375 EXPECT_EQ(1, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
376 EXPECT_EQ(kInertialSensorIntervalMillis,
377 fake_data_fetcher.GetMotionBuffer()->data.interval);
379 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
380 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_MOTION);
381 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
382 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_MOTION);
385 TEST(DataFetcherSharedMemoryBaseTest, DoesNotPollZeroDelay) {
386 FakeZeroDelayPollingDataFetcher fake_data_fetcher;
387 EXPECT_EQ(DataFetcherSharedMemoryBase::FETCHER_TYPE_SEPARATE_THREAD,
388 fake_data_fetcher.GetType());
390 EXPECT_TRUE(fake_data_fetcher.StartFetchingDeviceData(
391 CONSUMER_TYPE_ORIENTATION));
392 fake_data_fetcher.WaitForStart(CONSUMER_TYPE_ORIENTATION);
394 EXPECT_FALSE(fake_data_fetcher.IsPollingTimerRunningForTesting());
395 EXPECT_EQ(0, fake_data_fetcher.GetOrientationBuffer()->data.alpha);
397 fake_data_fetcher.StopFetchingDeviceData(CONSUMER_TYPE_ORIENTATION);
398 fake_data_fetcher.WaitForStop(CONSUMER_TYPE_ORIENTATION);
404 } // namespace content