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 "content/browser/device_sensors/sensor_manager_android.h"
6
7#include "base/android/jni_android.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/memory/weak_ptr.h"
10#include "content/browser/device_sensors/inertial_sensor_consts.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace content {
14
15namespace {
16
17class FakeSensorManagerAndroid : public SensorManagerAndroid {
18 public:
19  FakeSensorManagerAndroid() { }
20  virtual ~FakeSensorManagerAndroid() { }
21
22  virtual int GetNumberActiveDeviceMotionSensors() OVERRIDE {
23    return number_active_sensors_;
24  }
25
26  void SetNumberActiveDeviceMotionSensors(int number_active_sensors) {
27    number_active_sensors_ = number_active_sensors;
28  }
29
30 protected:
31  virtual bool Start(EventType event_type) OVERRIDE {
32    return true;
33  }
34
35  virtual void Stop(EventType event_type) OVERRIDE {
36  }
37
38 private:
39  int number_active_sensors_;
40};
41
42class AndroidSensorManagerTest : public testing::Test {
43 protected:
44  AndroidSensorManagerTest() {
45    light_buffer_.reset(new DeviceLightHardwareBuffer);
46    motion_buffer_.reset(new DeviceMotionHardwareBuffer);
47    orientation_buffer_.reset(new DeviceOrientationHardwareBuffer);
48  }
49
50  scoped_ptr<DeviceLightHardwareBuffer> light_buffer_;
51  scoped_ptr<DeviceMotionHardwareBuffer> motion_buffer_;
52  scoped_ptr<DeviceOrientationHardwareBuffer> orientation_buffer_;
53};
54
55TEST_F(AndroidSensorManagerTest, ThreeDeviceMotionSensorsActive) {
56  FakeSensorManagerAndroid::Register(base::android::AttachCurrentThread());
57  FakeSensorManagerAndroid sensorManager;
58  sensorManager.SetNumberActiveDeviceMotionSensors(3);
59
60  sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get());
61  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
62
63  sensorManager.GotAcceleration(0, 0, 1, 2, 3);
64  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
65  ASSERT_EQ(1, motion_buffer_->data.accelerationX);
66  ASSERT_TRUE(motion_buffer_->data.hasAccelerationX);
67  ASSERT_EQ(2, motion_buffer_->data.accelerationY);
68  ASSERT_TRUE(motion_buffer_->data.hasAccelerationY);
69  ASSERT_EQ(3, motion_buffer_->data.accelerationZ);
70  ASSERT_TRUE(motion_buffer_->data.hasAccelerationZ);
71
72  sensorManager.GotAccelerationIncludingGravity(0, 0, 4, 5, 6);
73  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
74  ASSERT_EQ(4, motion_buffer_->data.accelerationIncludingGravityX);
75  ASSERT_TRUE(motion_buffer_->data.hasAccelerationIncludingGravityX);
76  ASSERT_EQ(5, motion_buffer_->data.accelerationIncludingGravityY);
77  ASSERT_TRUE(motion_buffer_->data.hasAccelerationIncludingGravityY);
78  ASSERT_EQ(6, motion_buffer_->data.accelerationIncludingGravityZ);
79  ASSERT_TRUE(motion_buffer_->data.hasAccelerationIncludingGravityZ);
80
81  sensorManager.GotRotationRate(0, 0, 7, 8, 9);
82  ASSERT_TRUE(motion_buffer_->data.allAvailableSensorsAreActive);
83  ASSERT_EQ(7, motion_buffer_->data.rotationRateAlpha);
84  ASSERT_TRUE(motion_buffer_->data.hasRotationRateAlpha);
85  ASSERT_EQ(8, motion_buffer_->data.rotationRateBeta);
86  ASSERT_TRUE(motion_buffer_->data.hasRotationRateBeta);
87  ASSERT_EQ(9, motion_buffer_->data.rotationRateGamma);
88  ASSERT_TRUE(motion_buffer_->data.hasRotationRateGamma);
89  ASSERT_EQ(kInertialSensorIntervalMillis, motion_buffer_->data.interval);
90
91  sensorManager.StopFetchingDeviceMotionData();
92  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
93}
94
95TEST_F(AndroidSensorManagerTest, TwoDeviceMotionSensorsActive) {
96  FakeSensorManagerAndroid::Register(base::android::AttachCurrentThread());
97  FakeSensorManagerAndroid sensorManager;
98  sensorManager.SetNumberActiveDeviceMotionSensors(2);
99
100  sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get());
101  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
102
103  sensorManager.GotAcceleration(0, 0, 1, 2, 3);
104  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
105
106  sensorManager.GotAccelerationIncludingGravity(0, 0, 1, 2, 3);
107  ASSERT_TRUE(motion_buffer_->data.allAvailableSensorsAreActive);
108  ASSERT_EQ(kInertialSensorIntervalMillis, motion_buffer_->data.interval);
109
110  sensorManager.StopFetchingDeviceMotionData();
111  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
112}
113
114TEST_F(AndroidSensorManagerTest, ZeroDeviceMotionSensorsActive) {
115  FakeSensorManagerAndroid::Register(base::android::AttachCurrentThread());
116  FakeSensorManagerAndroid sensorManager;
117  sensorManager.SetNumberActiveDeviceMotionSensors(0);
118
119  sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get());
120  ASSERT_TRUE(motion_buffer_->data.allAvailableSensorsAreActive);
121  ASSERT_EQ(kInertialSensorIntervalMillis, motion_buffer_->data.interval);
122
123  sensorManager.StopFetchingDeviceMotionData();
124  ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive);
125}
126
127TEST_F(AndroidSensorManagerTest, DeviceOrientationSensorsActive) {
128  FakeSensorManagerAndroid::Register(base::android::AttachCurrentThread());
129  FakeSensorManagerAndroid sensorManager;
130
131  sensorManager.StartFetchingDeviceOrientationData(orientation_buffer_.get());
132  ASSERT_FALSE(orientation_buffer_->data.allAvailableSensorsAreActive);
133
134  sensorManager.GotOrientation(0, 0, 1, 2, 3);
135  ASSERT_TRUE(orientation_buffer_->data.allAvailableSensorsAreActive);
136  ASSERT_EQ(1, orientation_buffer_->data.alpha);
137  ASSERT_TRUE(orientation_buffer_->data.hasAlpha);
138  ASSERT_EQ(2, orientation_buffer_->data.beta);
139  ASSERT_TRUE(orientation_buffer_->data.hasBeta);
140  ASSERT_EQ(3, orientation_buffer_->data.gamma);
141  ASSERT_TRUE(orientation_buffer_->data.hasGamma);
142
143  sensorManager.StopFetchingDeviceOrientationData();
144  ASSERT_FALSE(orientation_buffer_->data.allAvailableSensorsAreActive);
145}
146
147// DeviceLight
148TEST_F(AndroidSensorManagerTest, DeviceLightSensorsActive) {
149  FakeSensorManagerAndroid::Register(base::android::AttachCurrentThread());
150  FakeSensorManagerAndroid sensorManager;
151
152  sensorManager.StartFetchingDeviceLightData(light_buffer_.get());
153
154  sensorManager.GotLight(0, 0, 100);
155  ASSERT_EQ(100, light_buffer_->data.value);
156
157  sensorManager.StopFetchingDeviceLightData();
158  ASSERT_EQ(-1, light_buffer_->data.value);
159}
160
161}  // namespace
162
163}  // namespace content
164