Chromium Code Reviews| 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..4ee17726850d854e5af48ff2c8f628333969d9d7 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 "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/WebDeviceMotionData.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 { |
| @@ -31,7 +47,7 @@ class MockDeviceMotionListener : public blink::WebDeviceMotionListener { |
| } |
| ~MockDeviceMotionListener() override {} |
| - void DidChangeDeviceMotion(const device::MotionData& data) override { |
| + void DidChangeDeviceMotion(const blink::WebDeviceMotionData& data) override { |
| memcpy(&data_, &data, sizeof(data)); |
| did_change_device_motion_ = true; |
| ++number_of_events_; |
| @@ -43,12 +59,12 @@ class MockDeviceMotionListener : public blink::WebDeviceMotionListener { |
| int number_of_events() const { return number_of_events_; } |
| - const device::MotionData& data() const { return data_; } |
| + const blink::WebDeviceMotionData& data() const { return data_; } |
| private: |
| bool did_change_device_motion_; |
| int number_of_events_; |
| - device::MotionData data_; |
| + blink::WebDeviceMotionData data_; |
| DISALLOW_COPY_AND_ASSIGN(MockDeviceMotionListener); |
| }; |
| @@ -56,9 +72,85 @@ 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_sensor_.mode = device::mojom::ReportingMode::CONTINUOUS; |
| + linear_acceleration_sensor_.mode = device::mojom::ReportingMode::ON_CHANGE; |
| + gyroscope_sensor_.mode = device::mojom::ReportingMode::CONTINUOUS; |
| + |
| + shared_memory_ = mojo::SharedBufferHandle::Create(kSharedBufferSizeInBytes); |
| + |
| + accelerometer_sensor_.shared_buffer = shared_memory_->MapAtOffset( |
| + kReadingBufferSize, device::SensorReadingSharedBuffer::GetOffset( |
| + accelerometer_sensor_.type)); |
| + accelerometer_sensor_buffer_ = |
| + static_cast<device::SensorReadingSharedBuffer*>( |
| + accelerometer_sensor_.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_sensor_.shared_buffer = shared_memory_->MapAtOffset( |
| + kReadingBufferSize, |
| + device::SensorReadingSharedBuffer::GetOffset(gyroscope_sensor_.type)); |
| + gyroscope_sensor_buffer_ = static_cast<device::SensorReadingSharedBuffer*>( |
| + gyroscope_sensor_.shared_buffer.get()); |
| + } |
| + |
| + void StartFireEvent() { DeviceMotionEventPump::DidStart(); } |
| + |
| + void SetAccelerometerSensorData(bool active, |
| + double d0, |
| + double d1, |
| + double d2) { |
| + if (active) { |
| + mojo::MakeRequest(&accelerometer_sensor_.sensor); |
| + accelerometer_sensor_buffer_->reading.timestamp = |
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
| + accelerometer_sensor_buffer_->reading.values[0].value() = d0; |
| + accelerometer_sensor_buffer_->reading.values[1].value() = d1; |
| + accelerometer_sensor_buffer_->reading.values[2].value() = d2; |
| + } else { |
| + accelerometer_sensor_.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_.sensor); |
| + gyroscope_sensor_buffer_->reading.timestamp = |
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
| + gyroscope_sensor_buffer_->reading.values[0].value() = d0; |
| + gyroscope_sensor_buffer_->reading.values[1].value() = d1; |
| + gyroscope_sensor_buffer_->reading.values[2].value() = d2; |
| + } else { |
| + gyroscope_sensor_.sensor.reset(); |
| + } |
| + } |
| + |
| void set_stop_on_fire_event(bool stop_on_fire_event) { |
| stop_on_fire_event_ = stop_on_fire_event; |
| } |
| @@ -67,11 +159,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 +171,10 @@ class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump { |
| private: |
| bool stop_on_fire_event_; |
| + mojo::ScopedSharedBufferHandle shared_memory_; |
| + device::SensorReadingSharedBuffer* accelerometer_sensor_buffer_; |
|
Reilly Grant (use Gerrit)
2017/05/27 03:17:51
accelerometer_buffer_
juncai
2017/05/30 22:26:57
Done.
|
| + device::SensorReadingSharedBuffer* linear_acceleration_sensor_buffer_; |
| + device::SensorReadingSharedBuffer* gyroscope_sensor_buffer_; |
|
Reilly Grant (use Gerrit)
2017/05/27 03:17:51
gyroscope_buffer_
juncai
2017/05/30 22:26:57
Done.
|
| DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpForTesting); |
| }; |
| @@ -93,90 +186,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(); |
| + blink::WebDeviceMotionData 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()); |
| + blink::WebDeviceMotionData 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(); |
| + |
| + blink::WebDeviceMotionData 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 +294,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(), |