| Index: content/renderer/device_sensors/device_motion_event_pump_unittest.cc
|
| diff --git a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
|
| index a87462441ecdef0eecbc89a3a7b9ab71195322e1..6a4b833e81d3f1f40d0af10054c9e31b095ea621 100644
|
| --- a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
|
| +++ b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
|
| @@ -11,16 +11,32 @@
|
| #include "base/location.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| +#include "base/time/time.h"
|
| #include "content/public/test/test_utils.h"
|
| -#include "device/sensors/public/cpp/device_motion_hardware_buffer.h"
|
| +#include "device/generic_sensor/public/cpp/sensor_reading.h"
|
| +#include "device/generic_sensor/public/interfaces/sensor.mojom.h"
|
| +#include "device/generic_sensor/public/interfaces/sensor_provider.mojom.h"
|
| +#include "device/sensors/public/cpp/motion_data.h"
|
| +#include "mojo/public/cpp/bindings/interface_request.h"
|
| #include "mojo/public/cpp/system/buffer.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/WebKit/public/platform/modules/device_orientation/WebDeviceMotionListener.h"
|
|
|
| +namespace {
|
| +
|
| +constexpr uint64_t kReadingBufferSize =
|
| + sizeof(device::SensorReadingSharedBuffer);
|
| +
|
| +constexpr uint64_t kSharedBufferSizeInBytes =
|
| + kReadingBufferSize * static_cast<uint64_t>(device::mojom::SensorType::LAST);
|
| +
|
| +} // namespace
|
| +
|
| namespace content {
|
|
|
| class MockDeviceMotionListener : public blink::WebDeviceMotionListener {
|
| @@ -56,9 +72,84 @@ class MockDeviceMotionListener : public blink::WebDeviceMotionListener {
|
| class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump {
|
| public:
|
| DeviceMotionEventPumpForTesting()
|
| - : DeviceMotionEventPump(0), stop_on_fire_event_(true) {}
|
| + : DeviceMotionEventPump(nullptr), stop_on_fire_event_(true) {}
|
| ~DeviceMotionEventPumpForTesting() override {}
|
|
|
| + // DeviceMotionEventPump:
|
| + void SendStartMessage() override {
|
| + accelerometer_.mode = device::mojom::ReportingMode::CONTINUOUS;
|
| + linear_acceleration_sensor_.mode = device::mojom::ReportingMode::ON_CHANGE;
|
| + gyroscope_.mode = device::mojom::ReportingMode::CONTINUOUS;
|
| +
|
| + shared_memory_ = mojo::SharedBufferHandle::Create(kSharedBufferSizeInBytes);
|
| +
|
| + accelerometer_.shared_buffer = shared_memory_->MapAtOffset(
|
| + kReadingBufferSize,
|
| + device::SensorReadingSharedBuffer::GetOffset(accelerometer_.type));
|
| + accelerometer_buffer_ = static_cast<device::SensorReadingSharedBuffer*>(
|
| + accelerometer_.shared_buffer.get());
|
| +
|
| + linear_acceleration_sensor_.shared_buffer = shared_memory_->MapAtOffset(
|
| + kReadingBufferSize, device::SensorReadingSharedBuffer::GetOffset(
|
| + linear_acceleration_sensor_.type));
|
| + linear_acceleration_sensor_buffer_ =
|
| + static_cast<device::SensorReadingSharedBuffer*>(
|
| + linear_acceleration_sensor_.shared_buffer.get());
|
| +
|
| + gyroscope_.shared_buffer = shared_memory_->MapAtOffset(
|
| + kReadingBufferSize,
|
| + device::SensorReadingSharedBuffer::GetOffset(gyroscope_.type));
|
| + gyroscope_buffer_ = static_cast<device::SensorReadingSharedBuffer*>(
|
| + gyroscope_.shared_buffer.get());
|
| + }
|
| +
|
| + void StartFireEvent() { DeviceMotionEventPump::DidStart(); }
|
| +
|
| + void SetAccelerometerSensorData(bool active,
|
| + double d0,
|
| + double d1,
|
| + double d2) {
|
| + if (active) {
|
| + mojo::MakeRequest(&accelerometer_.sensor);
|
| + accelerometer_buffer_->reading.timestamp =
|
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
|
| + accelerometer_buffer_->reading.values[0].value() = d0;
|
| + accelerometer_buffer_->reading.values[1].value() = d1;
|
| + accelerometer_buffer_->reading.values[2].value() = d2;
|
| + } else {
|
| + accelerometer_.sensor.reset();
|
| + }
|
| + }
|
| +
|
| + void SetLinearAccelerationSensorData(bool active,
|
| + double d0,
|
| + double d1,
|
| + double d2) {
|
| + if (active) {
|
| + mojo::MakeRequest(&linear_acceleration_sensor_.sensor);
|
| + linear_acceleration_sensor_buffer_->reading.timestamp =
|
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
|
| + linear_acceleration_sensor_buffer_->reading.values[0].value() = d0;
|
| + linear_acceleration_sensor_buffer_->reading.values[1].value() = d1;
|
| + linear_acceleration_sensor_buffer_->reading.values[2].value() = d2;
|
| + } else {
|
| + linear_acceleration_sensor_.sensor.reset();
|
| + }
|
| + }
|
| +
|
| + void SetGyroscopeSensorData(bool active, double d0, double d1, double d2) {
|
| + if (active) {
|
| + mojo::MakeRequest(&gyroscope_.sensor);
|
| + gyroscope_buffer_->reading.timestamp =
|
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
|
| + gyroscope_buffer_->reading.values[0].value() = d0;
|
| + gyroscope_buffer_->reading.values[1].value() = d1;
|
| + gyroscope_buffer_->reading.values[2].value() = d2;
|
| + } else {
|
| + gyroscope_.sensor.reset();
|
| + }
|
| + }
|
| +
|
| void set_stop_on_fire_event(bool stop_on_fire_event) {
|
| stop_on_fire_event_ = stop_on_fire_event;
|
| }
|
| @@ -67,11 +158,8 @@ class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump {
|
|
|
| int pump_delay_microseconds() const { return pump_delay_microseconds_; }
|
|
|
| - void DidStart(mojo::ScopedSharedBufferHandle renderer_handle) {
|
| - DeviceMotionEventPump::DidStart(std::move(renderer_handle));
|
| - }
|
| - void SendStartMessage() override {}
|
| - void SendStopMessage() override {}
|
| + protected:
|
| + // DeviceMotionEventPump:
|
| void FireEvent() override {
|
| DeviceMotionEventPump::FireEvent();
|
| if (stop_on_fire_event_) {
|
| @@ -82,6 +170,10 @@ class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump {
|
|
|
| private:
|
| bool stop_on_fire_event_;
|
| + mojo::ScopedSharedBufferHandle shared_memory_;
|
| + device::SensorReadingSharedBuffer* accelerometer_buffer_;
|
| + device::SensorReadingSharedBuffer* linear_acceleration_sensor_buffer_;
|
| + device::SensorReadingSharedBuffer* gyroscope_buffer_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpForTesting);
|
| };
|
| @@ -93,90 +185,102 @@ class DeviceMotionEventPumpTest : public testing::Test {
|
| protected:
|
| void SetUp() override {
|
| listener_.reset(new MockDeviceMotionListener);
|
| - motion_pump_.reset(new DeviceMotionEventPumpForTesting);
|
| - shared_memory_ = mojo::SharedBufferHandle::Create(
|
| - sizeof(device::DeviceMotionHardwareBuffer));
|
| - mapping_ = shared_memory_->Map(sizeof(device::DeviceMotionHardwareBuffer));
|
| - ASSERT_TRUE(mapping_);
|
| - memset(buffer(), 0, sizeof(device::DeviceMotionHardwareBuffer));
|
| - }
|
| -
|
| - void InitBuffer(bool allAvailableSensorsActive) {
|
| - device::MotionData& data = buffer()->data;
|
| - data.acceleration_x = 1;
|
| - data.has_acceleration_x = true;
|
| - data.acceleration_y = 2;
|
| - data.has_acceleration_y = true;
|
| - data.acceleration_z = 3;
|
| - data.has_acceleration_z = true;
|
| - data.all_available_sensors_are_active = allAvailableSensorsActive;
|
| + motion_pump_.reset(new DeviceMotionEventPumpForTesting());
|
| }
|
|
|
| MockDeviceMotionListener* listener() { return listener_.get(); }
|
| DeviceMotionEventPumpForTesting* motion_pump() { return motion_pump_.get(); }
|
| - mojo::ScopedSharedBufferHandle handle() {
|
| - return shared_memory_->Clone(
|
| - mojo::SharedBufferHandle::AccessMode::READ_ONLY);
|
| - }
|
| - device::DeviceMotionHardwareBuffer* buffer() {
|
| - return reinterpret_cast<device::DeviceMotionHardwareBuffer*>(
|
| - mapping_.get());
|
| - }
|
|
|
| private:
|
| base::MessageLoop loop_;
|
| std::unique_ptr<MockDeviceMotionListener> listener_;
|
| std::unique_ptr<DeviceMotionEventPumpForTesting> motion_pump_;
|
| - mojo::ScopedSharedBufferHandle shared_memory_;
|
| - mojo::ScopedSharedBufferMapping mapping_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpTest);
|
| };
|
|
|
| -TEST_F(DeviceMotionEventPumpTest, DidStartPolling) {
|
| - InitBuffer(true);
|
| -
|
| +TEST_F(DeviceMotionEventPumpTest, AllSensorsAreActive) {
|
| motion_pump()->Start(listener());
|
| - motion_pump()->DidStart(handle());
|
| + motion_pump()->SetAccelerometerSensorData(true /* active */, 1, 2, 3);
|
| + motion_pump()->SetLinearAccelerationSensorData(true /* active */, 4, 5, 6);
|
| + motion_pump()->SetGyroscopeSensorData(true /* active */, 7, 8, 9);
|
| + motion_pump()->StartFireEvent();
|
|
|
| base::RunLoop().Run();
|
|
|
| - const device::MotionData& received_data = listener()->data();
|
| + device::MotionData received_data = listener()->data();
|
| EXPECT_TRUE(listener()->did_change_device_motion());
|
| +
|
| + EXPECT_TRUE(received_data.has_acceleration_including_gravity_x);
|
| + EXPECT_EQ(1, received_data.acceleration_including_gravity_x);
|
| + EXPECT_TRUE(received_data.has_acceleration_including_gravity_y);
|
| + EXPECT_EQ(2, received_data.acceleration_including_gravity_y);
|
| + EXPECT_TRUE(received_data.has_acceleration_including_gravity_z);
|
| + EXPECT_EQ(3, received_data.acceleration_including_gravity_z);
|
| +
|
| EXPECT_TRUE(received_data.has_acceleration_x);
|
| - EXPECT_EQ(1, static_cast<double>(received_data.acceleration_x));
|
| - EXPECT_TRUE(received_data.has_acceleration_x);
|
| - EXPECT_EQ(2, static_cast<double>(received_data.acceleration_y));
|
| + EXPECT_EQ(4, received_data.acceleration_x);
|
| EXPECT_TRUE(received_data.has_acceleration_y);
|
| - EXPECT_EQ(3, static_cast<double>(received_data.acceleration_z));
|
| + EXPECT_EQ(5, received_data.acceleration_y);
|
| EXPECT_TRUE(received_data.has_acceleration_z);
|
| - EXPECT_FALSE(received_data.has_acceleration_including_gravity_x);
|
| - EXPECT_FALSE(received_data.has_acceleration_including_gravity_y);
|
| - EXPECT_FALSE(received_data.has_acceleration_including_gravity_z);
|
| - EXPECT_FALSE(received_data.has_rotation_rate_alpha);
|
| - EXPECT_FALSE(received_data.has_rotation_rate_beta);
|
| - EXPECT_FALSE(received_data.has_rotation_rate_gamma);
|
| + EXPECT_EQ(6, received_data.acceleration_z);
|
| +
|
| + EXPECT_TRUE(received_data.has_rotation_rate_alpha);
|
| + EXPECT_EQ(7, received_data.rotation_rate_alpha);
|
| + EXPECT_TRUE(received_data.has_rotation_rate_beta);
|
| + EXPECT_EQ(8, received_data.rotation_rate_beta);
|
| + EXPECT_TRUE(received_data.has_rotation_rate_gamma);
|
| + EXPECT_EQ(9, received_data.rotation_rate_gamma);
|
| }
|
|
|
| -TEST_F(DeviceMotionEventPumpTest, DidStartPollingNotAllSensorsActive) {
|
| - InitBuffer(false);
|
| -
|
| +TEST_F(DeviceMotionEventPumpTest, TwoSensorsAreActive) {
|
| motion_pump()->Start(listener());
|
| - motion_pump()->DidStart(handle());
|
| + motion_pump()->SetAccelerometerSensorData(true /* active */, 1, 2, 3);
|
| + motion_pump()->SetLinearAccelerationSensorData(false /* active */, 4, 5, 6);
|
| + motion_pump()->SetGyroscopeSensorData(true /* active */, 7, 8, 9);
|
| + motion_pump()->StartFireEvent();
|
|
|
| base::RunLoop().Run();
|
|
|
| - const device::MotionData& received_data = listener()->data();
|
| - // No change in device motion because all_available_sensors_are_active is
|
| - // false.
|
| - EXPECT_FALSE(listener()->did_change_device_motion());
|
| + device::MotionData received_data = listener()->data();
|
| + EXPECT_TRUE(listener()->did_change_device_motion());
|
| +
|
| + EXPECT_TRUE(received_data.has_acceleration_including_gravity_x);
|
| + EXPECT_EQ(1, received_data.acceleration_including_gravity_x);
|
| + EXPECT_TRUE(received_data.has_acceleration_including_gravity_y);
|
| + EXPECT_EQ(2, received_data.acceleration_including_gravity_y);
|
| + EXPECT_TRUE(received_data.has_acceleration_including_gravity_z);
|
| + EXPECT_EQ(3, received_data.acceleration_including_gravity_z);
|
| +
|
| EXPECT_FALSE(received_data.has_acceleration_x);
|
| + EXPECT_FALSE(received_data.has_acceleration_y);
|
| + EXPECT_FALSE(received_data.has_acceleration_z);
|
| +
|
| + EXPECT_TRUE(received_data.has_rotation_rate_alpha);
|
| + EXPECT_EQ(7, received_data.rotation_rate_alpha);
|
| + EXPECT_TRUE(received_data.has_rotation_rate_beta);
|
| + EXPECT_EQ(8, received_data.rotation_rate_beta);
|
| + EXPECT_TRUE(received_data.has_rotation_rate_gamma);
|
| + EXPECT_EQ(9, received_data.rotation_rate_gamma);
|
| +}
|
| +
|
| +TEST_F(DeviceMotionEventPumpTest, NoActiveSensors) {
|
| + motion_pump()->Start(listener());
|
| + motion_pump()->StartFireEvent();
|
| +
|
| + base::RunLoop().Run();
|
| +
|
| + device::MotionData received_data = listener()->data();
|
| + EXPECT_TRUE(listener()->did_change_device_motion());
|
| +
|
| EXPECT_FALSE(received_data.has_acceleration_x);
|
| EXPECT_FALSE(received_data.has_acceleration_y);
|
| EXPECT_FALSE(received_data.has_acceleration_z);
|
| +
|
| EXPECT_FALSE(received_data.has_acceleration_including_gravity_x);
|
| EXPECT_FALSE(received_data.has_acceleration_including_gravity_y);
|
| EXPECT_FALSE(received_data.has_acceleration_including_gravity_z);
|
| +
|
| EXPECT_FALSE(received_data.has_rotation_rate_alpha);
|
| EXPECT_FALSE(received_data.has_rotation_rate_beta);
|
| EXPECT_FALSE(received_data.has_rotation_rate_gamma);
|
| @@ -189,11 +293,11 @@ TEST_F(DeviceMotionEventPumpTest, PumpThrottlesEventRate) {
|
| EXPECT_GE(60, base::Time::kMicrosecondsPerSecond /
|
| motion_pump()->pump_delay_microseconds());
|
|
|
| - InitBuffer(true);
|
| + motion_pump()->Start(listener());
|
| + motion_pump()->SetLinearAccelerationSensorData(true /* active */, 4, 5, 6);
|
|
|
| motion_pump()->set_stop_on_fire_event(false);
|
| - motion_pump()->Start(listener());
|
| - motion_pump()->DidStart(handle());
|
| + motion_pump()->StartFireEvent();
|
|
|
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
|
|
|