Index: content/browser/device_sensors/sensor_manager_chromeos_unittest.cc |
diff --git a/content/browser/device_sensors/sensor_manager_chromeos_unittest.cc b/content/browser/device_sensors/sensor_manager_chromeos_unittest.cc |
index 3e718392951a6a224b780b07867e809086d0f273..cd6e9971a8b4875432a89a4f4e9f0e58e983481a 100644 |
--- a/content/browser/device_sensors/sensor_manager_chromeos_unittest.cc |
+++ b/content/browser/device_sensors/sensor_manager_chromeos_unittest.cc |
@@ -6,13 +6,17 @@ |
#include "base/memory/scoped_ptr.h" |
#include "chromeos/accelerometer/accelerometer_types.h" |
+#include "content/common/device_sensors/device_motion_hardware_buffer.h" |
#include "content/common/device_sensors/device_orientation_hardware_buffer.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/gfx/geometry/vector3d_f.h" |
namespace { |
const double kMeanGravity = 9.80665; |
+const double kGravityFilterRatio = 0.8; |
+ |
// Isolated content::SensorManagerChromeOS from the active |
// chromeos::AccelerometerReader. This allows for direct control over which |
// accelerometer events are provided to the sensor manager. |
@@ -36,6 +40,7 @@ namespace content { |
class SensorManagerChromeOSTest : public testing::Test { |
public: |
SensorManagerChromeOSTest() { |
+ motion_buffer_.reset(new DeviceMotionHardwareBuffer); |
orientation_buffer_.reset(new DeviceOrientationHardwareBuffer); |
} |
@@ -47,6 +52,8 @@ class SensorManagerChromeOSTest : public testing::Test { |
sensor_manager_->OnAccelerometerUpdated(update); |
} |
+ DeviceMotionHardwareBuffer* motion_buffer() { return motion_buffer_.get(); } |
+ |
DeviceOrientationHardwareBuffer* orientation_buffer() { |
return orientation_buffer_.get(); |
} |
@@ -57,11 +64,13 @@ class SensorManagerChromeOSTest : public testing::Test { |
void SetUp() override { |
testing::Test::SetUp(); |
sensor_manager_.reset(new TestSensorManagerChromeOS); |
+ sensor_manager_->StartFetchingDeviceMotionData(motion_buffer_.get()); |
sensor_manager_->StartFetchingDeviceOrientationData( |
orientation_buffer_.get()); |
} |
void TearDown() override { |
+ sensor_manager_->StopFetchingDeviceMotionData(); |
sensor_manager_->StopFetchingDeviceOrientationData(); |
testing::Test::TearDown(); |
} |
@@ -69,11 +78,43 @@ class SensorManagerChromeOSTest : public testing::Test { |
private: |
scoped_ptr<TestSensorManagerChromeOS> sensor_manager_; |
+ scoped_ptr<DeviceMotionHardwareBuffer> motion_buffer_; |
+ |
flackr
2015/02/18 22:34:09
nit: No need to separate these.
jonross
2015/02/25 00:09:57
Done.
|
scoped_ptr<DeviceOrientationHardwareBuffer> orientation_buffer_; |
DISALLOW_COPY_AND_ASSIGN(SensorManagerChromeOSTest); |
}; |
+// Tests that starting to process motion data will update the associated buffer. |
+TEST_F(SensorManagerChromeOSTest, MotionBuffer) { |
+ DeviceMotionHardwareBuffer* buffer = motion_buffer(); |
+ EXPECT_FLOAT_EQ(16.0f, buffer->data.interval); |
+ EXPECT_FALSE(buffer->data.hasAccelerationIncludingGravityX); |
+ EXPECT_FALSE(buffer->data.hasAccelerationIncludingGravityY); |
+ EXPECT_FALSE(buffer->data.hasAccelerationIncludingGravityZ); |
+ EXPECT_FALSE(buffer->data.hasAccelerationX); |
+ EXPECT_FALSE(buffer->data.hasAccelerationY); |
+ EXPECT_FALSE(buffer->data.hasAccelerationZ); |
+ EXPECT_FALSE(buffer->data.hasRotationRateAlpha); |
+ EXPECT_FALSE(buffer->data.hasRotationRateBeta); |
+ EXPECT_FALSE(buffer->data.hasRotationRateGamma); |
+ |
+ OnAccelerationIncludingGravity(0.0f, 0.0f, 1.0f); |
+ EXPECT_TRUE(buffer->data.hasAccelerationIncludingGravityX); |
+ EXPECT_TRUE(buffer->data.hasAccelerationIncludingGravityY); |
+ EXPECT_TRUE(buffer->data.hasAccelerationIncludingGravityZ); |
+ EXPECT_TRUE(buffer->data.hasAccelerationX); |
+ EXPECT_TRUE(buffer->data.hasAccelerationY); |
+ EXPECT_TRUE(buffer->data.hasAccelerationZ); |
+ EXPECT_FALSE(buffer->data.hasRotationRateAlpha); |
+ EXPECT_FALSE(buffer->data.hasRotationRateBeta); |
+ EXPECT_FALSE(buffer->data.hasRotationRateGamma); |
+ EXPECT_TRUE(buffer->data.allAvailableSensorsAreActive); |
+ |
+ sensor_manager()->StopFetchingDeviceMotionData(); |
+ EXPECT_FALSE(buffer->data.allAvailableSensorsAreActive); |
+} |
+ |
// Tests that starting to process orientation data will update the associated |
// buffer. |
TEST_F(SensorManagerChromeOSTest, OrientationBuffer) { |
@@ -98,44 +139,102 @@ TEST_F(SensorManagerChromeOSTest, OrientationBuffer) { |
// Tests a device resting flat. |
TEST_F(SensorManagerChromeOSTest, NeutralOrientation) { |
OnAccelerationIncludingGravity(0.0f, 0.0f, -kMeanGravity); |
- DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.beta); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.gamma); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); |
+ EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.accelerationIncludingGravityZ); |
+ |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationY); |
+ EXPECT_FLOAT_EQ(-kMeanGravity * kGravityFilterRatio, |
+ motion->data.accelerationZ); |
+ |
+ DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.gamma); |
} |
// Tests an upside-down device, such that the W3C boundary [-180,180) causes the |
// beta value to become negative. |
TEST_F(SensorManagerChromeOSTest, UpsideDown) { |
OnAccelerationIncludingGravity(0.0f, 0.0f, kMeanGravity); |
- DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); |
- EXPECT_FLOAT_EQ(-180.0f, buffer->data.beta); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.gamma); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); |
+ EXPECT_FLOAT_EQ(kMeanGravity, motion->data.accelerationIncludingGravityZ); |
+ |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationY); |
+ EXPECT_FLOAT_EQ(kMeanGravity * kGravityFilterRatio, |
+ motion->data.accelerationZ); |
+ |
+ DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); |
+ EXPECT_FLOAT_EQ(-180.0f, orientation->data.beta); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.gamma); |
} |
// Tests for positive beta value before the device is completely upside-down |
TEST_F(SensorManagerChromeOSTest, BeforeUpsideDownBoundary) { |
OnAccelerationIncludingGravity(0.0f, -kMeanGravity / 2.0f, |
kMeanGravity / 2.0f); |
- DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); |
- EXPECT_FLOAT_EQ(135.0f, buffer->data.beta); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.gamma); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityX); |
+ EXPECT_FLOAT_EQ(-kMeanGravity / 2.0f, |
+ motion->data.accelerationIncludingGravityY); |
+ EXPECT_FLOAT_EQ(kMeanGravity / 2.0f, |
+ motion->data.accelerationIncludingGravityZ); |
+ |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationX); |
+ EXPECT_FLOAT_EQ(-kMeanGravity / 2.0f * kGravityFilterRatio, |
+ motion->data.accelerationY); |
+ EXPECT_FLOAT_EQ(kMeanGravity / 2.0f * kGravityFilterRatio, |
+ motion->data.accelerationZ); |
+ |
+ DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); |
+ EXPECT_FLOAT_EQ(135.0f, orientation->data.beta); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.gamma); |
} |
// Tests a device lying on its left-edge. |
TEST_F(SensorManagerChromeOSTest, LeftEdge) { |
OnAccelerationIncludingGravity(-kMeanGravity, 0.0f, 0.0f); |
- DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.beta); |
- EXPECT_FLOAT_EQ(-90.0f, buffer->data.gamma); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.accelerationIncludingGravityX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityZ); |
+ |
+ EXPECT_FLOAT_EQ(-kMeanGravity * kGravityFilterRatio, |
+ motion->data.accelerationX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationY); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationZ); |
+ |
+ DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); |
+ EXPECT_FLOAT_EQ(-90.0f, orientation->data.gamma); |
} |
// Tests a device lying on its right-edge, such that the W3C boundary [-90,90) |
// causes the gamma value to become negative. |
TEST_F(SensorManagerChromeOSTest, RightEdge) { |
OnAccelerationIncludingGravity(kMeanGravity, 0.0f, 0.0f); |
- DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.beta); |
- EXPECT_FLOAT_EQ(-90.0f, buffer->data.gamma); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(kMeanGravity, motion->data.accelerationIncludingGravityX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityZ); |
+ |
+ EXPECT_FLOAT_EQ(kMeanGravity * kGravityFilterRatio, |
+ motion->data.accelerationX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationY); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationZ); |
+ |
+ DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); |
+ EXPECT_FLOAT_EQ(-90.0f, orientation->data.gamma); |
} |
// Tests for positive gamma value before the device is completely on its right |
@@ -143,9 +242,75 @@ TEST_F(SensorManagerChromeOSTest, RightEdge) { |
TEST_F(SensorManagerChromeOSTest, BeforeRightEdgeBoundary) { |
OnAccelerationIncludingGravity(kMeanGravity / 2.0f, 0.0f, |
-kMeanGravity / 2.0f); |
- DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); |
- EXPECT_FLOAT_EQ(0.0f, buffer->data.beta); |
- EXPECT_FLOAT_EQ(45.0f, buffer->data.gamma); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(kMeanGravity / 2.0f, |
+ motion->data.accelerationIncludingGravityX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); |
+ EXPECT_FLOAT_EQ(-kMeanGravity / 2.0f, |
+ motion->data.accelerationIncludingGravityZ); |
+ |
+ EXPECT_FLOAT_EQ(kMeanGravity / 2.0f * kGravityFilterRatio, |
+ motion->data.accelerationX); |
+ EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationY); |
+ EXPECT_FLOAT_EQ(-kMeanGravity / 2.0f * kGravityFilterRatio, |
+ motion->data.accelerationZ); |
+ |
+ DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); |
+ EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); |
+ EXPECT_FLOAT_EQ(45.0f, orientation->data.gamma); |
+} |
+ |
+// Tests that the gravity component of gravity is increasingly filtered out of |
+// the acceleration data as the device remains stationary. |
+TEST_F(SensorManagerChromeOSTest, GravityFilterComletesForStationaryDevice) { |
+ OnAccelerationIncludingGravity(0.0f, 0.0f, -kMeanGravity); |
+ |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.accelerationIncludingGravityZ); |
+ EXPECT_FLOAT_EQ(-kMeanGravity * kGravityFilterRatio, |
+ motion->data.accelerationZ); |
+ |
+ double previous_acceleration = motion->data.accelerationZ; |
+ double acceleration; |
+ // A third of a second, the filter will have removed enough gravity to have |
+ // approached the asymptote of 0. |
+ for (int i = 0; i < 20; ++i) { |
+ OnAccelerationIncludingGravity(0.0f, 0.0f, -kMeanGravity); |
+ acceleration = motion->data.accelerationZ; |
+ EXPECT_LT(previous_acceleration, acceleration); |
+ previous_acceleration = acceleration; |
+ } |
+} |
+ |
+// Tests that after gravity has been filtered out, that other acceleration |
+// sources as reported. |
+TEST_F(SensorManagerChromeOSTest, NonGravityAcceleration) { |
+ for (int i = 0; i < 20; ++i) |
+ OnAccelerationIncludingGravity(0.0f, 0.0f, -kMeanGravity); |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ gfx::Vector3dF stable(motion->data.accelerationX, motion->data.accelerationY, |
+ motion->data.accelerationZ); |
+ |
+ OnAccelerationIncludingGravity(10.0f, 0.0f, -kMeanGravity); |
+ EXPECT_FLOAT_EQ(8.0f, motion->data.accelerationX); |
+ gfx::Vector3dF accelerating(motion->data.accelerationX, |
+ motion->data.accelerationY, |
+ motion->data.accelerationZ); |
+ EXPECT_GT(accelerating.Length(), stable.Length()); |
+} |
+ |
+// Tests that after gravity has been filtered out, that acceleration opposing |
+// gravity is reported, even though the instantaneous acceleration with gravity |
+// is 0. |
+TEST_F(SensorManagerChromeOSTest, AccelerationAgainstGravity) { |
+ for (int i = 0; i < 20; ++i) |
+ OnAccelerationIncludingGravity(0.0f, 0.0f, -kMeanGravity); |
+ DeviceMotionHardwareBuffer* motion = motion_buffer(); |
+ double stable_gravity = motion->data.accelerationZ; |
+ |
+ OnAccelerationIncludingGravity(0.0f, 0.0f, 0.0f); |
+ EXPECT_LT(stable_gravity, motion->data.accelerationZ); |
} |
} // namespace content |