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..12db96054e7474fe415ce32e2fd1edc1ce41b477 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,31 @@ |
| #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/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 +46,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 +58,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 +71,53 @@ 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 { |
| + sensors_.push_back(base::MakeUnique<SensorEntry>(this)); |
| + sensors_.push_back(base::MakeUnique<SensorEntry>(this)); |
| + sensors_.push_back(base::MakeUnique<SensorEntry>(this)); |
| + |
| + sensors_[0]->type = device::mojom::SensorType::ACCELEROMETER; |
| + sensors_[1]->type = device::mojom::SensorType::LINEAR_ACCELERATION; |
| + sensors_[2]->type = device::mojom::SensorType::GYROSCOPE; |
|
Reilly Grant (use Gerrit)
2017/05/22 20:29:46
Add a |type| parameter to the SensorEntry construc
juncai
2017/05/23 02:30:24
Done.
|
| + |
| + sensors_[0]->mode = device::mojom::ReportingMode::CONTINUOUS; |
| + sensors_[1]->mode = device::mojom::ReportingMode::ON_CHANGE; |
| + sensors_[2]->mode = device::mojom::ReportingMode::CONTINUOUS; |
| + |
| + shared_memory_ = mojo::SharedBufferHandle::Create(kSharedBufferSizeInBytes); |
| + |
| + buffers_.resize(sensors_.size()); |
| + |
| + for (size_t i = 0; i < sensors_.size(); ++i) { |
| + sensors_[i]->shared_buffer = shared_memory_->MapAtOffset( |
| + kReadingBufferSize, |
| + device::SensorReadingSharedBuffer::GetOffset(sensors_[i]->type)); |
| + buffers_[i] = static_cast<device::SensorReadingSharedBuffer*>( |
| + sensors_[i]->shared_buffer.get()); |
| + } |
| + } |
| + |
| + void StartFireEvent() { DeviceMotionEventPump::DidStart(); } |
| + |
| + void SetSensorData(int index, bool active, double d0, double d1, double d2) { |
| + sensors_[index]->active = active; |
| + if (active) { |
| + buffers_[index]->reading.timestamp = |
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
| + buffers_[index]->reading.values[0].value() = d0; |
| + buffers_[index]->reading.values[1].value() = d1; |
| + buffers_[index]->reading.values[2].value() = d2; |
| + } |
| + } |
| + |
| + void set_num_available_sensors(int num_available_sensors) { |
| + num_available_sensors_ = num_available_sensors; |
| + } |
| + |
| void set_stop_on_fire_event(bool stop_on_fire_event) { |
| stop_on_fire_event_ = stop_on_fire_event; |
| } |
| @@ -67,11 +126,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 +138,8 @@ class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump { |
| private: |
| bool stop_on_fire_event_; |
| + mojo::ScopedSharedBufferHandle shared_memory_; |
| + std::vector<device::SensorReadingSharedBuffer*> buffers_; |
| DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpForTesting); |
| }; |
| @@ -93,90 +151,130 @@ 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()->set_num_available_sensors(3); |
| + motion_pump()->SetSensorData(0, true /* active */, 1, 2, 3); |
| + motion_pump()->SetSensorData(1, true /* active */, 4, 5, 6); |
| + motion_pump()->SetSensorData(2, 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_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, AllAvailableSensorsAreActive) { |
| + motion_pump()->Start(listener()); |
| + motion_pump()->set_num_available_sensors(2); |
| + motion_pump()->SetSensorData(0, true /* active */, 1, 2, 3); |
| + motion_pump()->SetSensorData(2, true /* active */, 7, 8, 9); |
| + motion_pump()->StartFireEvent(); |
| + |
| + base::RunLoop().Run(); |
| + |
| + 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, NotAllAvailableSensorsAreActive) { |
| + motion_pump()->Start(listener()); |
| + motion_pump()->set_num_available_sensors(3); |
| + motion_pump()->SetSensorData(0, true /* active */, 1, 2, 3); |
| + motion_pump()->SetSensorData(2, true /* active */, 7, 8, 9); |
| + motion_pump()->StartFireEvent(); |
| + |
| + base::RunLoop().Run(); |
| + |
| + blink::WebDeviceMotionData received_data = listener()->data(); |
| + // No change in device motion because not all available sensors are active. |
| + EXPECT_FALSE(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); |
| } |
| -TEST_F(DeviceMotionEventPumpTest, DidStartPollingNotAllSensorsActive) { |
| - InitBuffer(false); |
| - |
| +TEST_F(DeviceMotionEventPumpTest, NoAvailableSensors) { |
| motion_pump()->Start(listener()); |
| - motion_pump()->DidStart(handle()); |
| + 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. |
| + blink::WebDeviceMotionData received_data = listener()->data(); |
| + // No change in device motion because no sensor data was updated. |
| EXPECT_FALSE(listener()->did_change_device_motion()); |
| - EXPECT_FALSE(received_data.has_acceleration_x); |
| + |
| 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 +287,12 @@ TEST_F(DeviceMotionEventPumpTest, PumpThrottlesEventRate) { |
| EXPECT_GE(60, base::Time::kMicrosecondsPerSecond / |
| motion_pump()->pump_delay_microseconds()); |
| - InitBuffer(true); |
| + motion_pump()->Start(listener()); |
| + motion_pump()->set_num_available_sensors(1); |
| + motion_pump()->SetSensorData(1, 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(), |