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 5b88d66f8b8f58ffd4452a6e7d65d91091c92bc1..7a1864d8cf28cf5e8e2bc695a40a9e6118512ca1 100644 |
--- a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc |
+++ b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc |
@@ -9,6 +9,7 @@ |
#include "base/message_loop/message_loop.h" |
#include "content/common/device_sensors/device_motion_hardware_buffer.h" |
#include "content/public/test/test_utils.h" |
+#include "content/renderer/device_sensors/device_sensor_event_pump.h" |
timvolodine
2015/02/04 13:30:18
is this needed?
jonross
2015/02/04 14:52:55
Nope, forgot to remove that after testing
|
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/WebKit/public/platform/WebDeviceMotionListener.h" |
@@ -16,7 +17,8 @@ namespace content { |
class MockDeviceMotionListener : public blink::WebDeviceMotionListener { |
public: |
- MockDeviceMotionListener() : did_change_device_motion_(false) { |
+ MockDeviceMotionListener() |
+ : did_change_device_motion_(false), number_of_events_(0) { |
memset(&data_, 0, sizeof(data_)); |
} |
virtual ~MockDeviceMotionListener() { } |
@@ -25,17 +27,22 @@ class MockDeviceMotionListener : public blink::WebDeviceMotionListener { |
const blink::WebDeviceMotionData& data) override { |
memcpy(&data_, &data, sizeof(data)); |
did_change_device_motion_ = true; |
+ ++number_of_events_; |
} |
bool did_change_device_motion() const { |
return did_change_device_motion_; |
} |
+ |
+ int number_of_events() const { return number_of_events_; } |
+ |
const blink::WebDeviceMotionData& data() const { |
return data_; |
} |
private: |
bool did_change_device_motion_; |
+ int number_of_events_; |
blink::WebDeviceMotionData data_; |
DISALLOW_COPY_AND_ASSIGN(MockDeviceMotionListener); |
@@ -44,9 +51,17 @@ class MockDeviceMotionListener : public blink::WebDeviceMotionListener { |
class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump { |
public: |
DeviceMotionEventPumpForTesting() |
- : DeviceMotionEventPump(0) { } |
+ : DeviceMotionEventPump(0), stop_on_fire_event_(true) {} |
~DeviceMotionEventPumpForTesting() override {} |
+ void set_stop_on_fire_event(bool stop_on_fire_event) { |
+ stop_on_fire_event_ = stop_on_fire_event; |
+ } |
+ |
+ bool stop_on_fire_event() { return stop_on_fire_event_; } |
+ |
+ int pump_delay_microseconds() const { return pump_delay_microseconds_; } |
+ |
void OnDidStart(base::SharedMemoryHandle renderer_handle) { |
DeviceMotionEventPump::OnDidStart(renderer_handle); |
} |
@@ -54,11 +69,15 @@ class DeviceMotionEventPumpForTesting : public DeviceMotionEventPump { |
void SendStopMessage() override {} |
void FireEvent() override { |
DeviceMotionEventPump::FireEvent(); |
- Stop(); |
- base::MessageLoop::current()->QuitWhenIdle(); |
+ if (stop_on_fire_event_) { |
+ Stop(); |
+ base::MessageLoop::current()->QuitWhenIdle(); |
+ } |
} |
private: |
+ bool stop_on_fire_event_; |
+ |
DISALLOW_COPY_AND_ASSIGN(DeviceMotionEventPumpForTesting); |
}; |
@@ -158,4 +177,30 @@ TEST_F(DeviceMotionEventPumpTest, DidStartPollingNotAllSensorsActive) { |
EXPECT_FALSE(received_data.hasRotationRateGamma); |
} |
+// Tests that the pump is not firing events at a rate faster than 60Hz. |
+TEST_F(DeviceMotionEventPumpTest, PumpThrottlesEventRate) { |
+ // Confirm that the delay for pumping events is 60 Hz. |
+ EXPECT_EQ(60, base::Time::kMicrosecondsPerSecond / |
timvolodine
2015/02/04 13:30:18
should this better be EXPECT_GE?
jonross
2015/02/04 14:52:55
Done.
|
+ motion_pump()->pump_delay_microseconds()); |
timvolodine
2015/02/04 13:30:17
indentation
jonross
2015/02/04 14:52:55
Done.
|
+ |
+ base::MessageLoopForUI loop; |
+ |
+ InitBuffer(true); |
+ |
+ motion_pump()->set_stop_on_fire_event(false); |
+ motion_pump()->Start(listener()); |
+ motion_pump()->OnDidStart(handle()); |
+ |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, base::MessageLoop::QuitClosure(), |
+ base::TimeDelta::FromMilliseconds(100)); |
+ base::MessageLoop::current()->Run(); |
+ motion_pump()->Stop(); |
+ |
+ // Check that the blink::WebDeviceMotionListener does not receive excess |
+ // events. |
+ EXPECT_TRUE(listener()->did_change_device_motion()); |
+ EXPECT_GE(6, listener()->number_of_events()); |
+} |
+ |
} // namespace content |