Home | History | Annotate | Download | only in device_sensors
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "device_light_event_pump.h"
      6 
      7 #include "base/message_loop/message_loop.h"
      8 #include "content/common/device_sensors/device_light_hardware_buffer.h"
      9 #include "content/public/test/test_utils.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 #include "third_party/WebKit/public/platform/WebDeviceLightListener.h"
     12 
     13 namespace content {
     14 
     15 class MockDeviceLightListener : public blink::WebDeviceLightListener {
     16  public:
     17   MockDeviceLightListener() : did_change_device_light_(false) {}
     18   virtual ~MockDeviceLightListener() {}
     19 
     20   virtual void didChangeDeviceLight(double value) OVERRIDE {
     21     data_.value = value;
     22     did_change_device_light_ = true;
     23   }
     24 
     25   bool did_change_device_light() const { return did_change_device_light_; }
     26 
     27   void set_did_change_device_light(bool value) {
     28     did_change_device_light_ = value;
     29   }
     30 
     31   const DeviceLightData& data() const { return data_; }
     32 
     33  private:
     34   bool did_change_device_light_;
     35   DeviceLightData data_;
     36 
     37   DISALLOW_COPY_AND_ASSIGN(MockDeviceLightListener);
     38 };
     39 
     40 class DeviceLightEventPumpForTesting : public DeviceLightEventPump {
     41  public:
     42   DeviceLightEventPumpForTesting()
     43       : DeviceLightEventPump(0) {}
     44   virtual ~DeviceLightEventPumpForTesting() {}
     45 
     46   void OnDidStart(base::SharedMemoryHandle renderer_handle) {
     47     DeviceLightEventPump::OnDidStart(renderer_handle);
     48   }
     49   virtual void SendStartMessage() OVERRIDE { }
     50   virtual void SendStopMessage() OVERRIDE { }
     51   virtual void FireEvent() OVERRIDE {
     52     DeviceLightEventPump::FireEvent();
     53     Stop();
     54     base::MessageLoop::current()->QuitWhenIdle();
     55   }
     56 
     57  private:
     58   DISALLOW_COPY_AND_ASSIGN(DeviceLightEventPumpForTesting);
     59 };
     60 
     61 class DeviceLightEventPumpTest : public testing::Test {
     62  public:
     63   DeviceLightEventPumpTest() {
     64     EXPECT_TRUE(shared_memory_.CreateAndMapAnonymous(
     65         sizeof(DeviceLightHardwareBuffer)));
     66   }
     67 
     68  protected:
     69   virtual void SetUp() OVERRIDE {
     70     const DeviceLightHardwareBuffer* null_buffer = NULL;
     71     listener_.reset(new MockDeviceLightListener);
     72     light_pump_.reset(new DeviceLightEventPumpForTesting);
     73     buffer_ = static_cast<DeviceLightHardwareBuffer*>(shared_memory_.memory());
     74     ASSERT_NE(null_buffer, buffer_);
     75     ASSERT_TRUE(shared_memory_.ShareToProcess(base::GetCurrentProcessHandle(),
     76                                               &handle_));
     77   }
     78 
     79   void InitBuffer() {
     80     DeviceLightData& data = buffer_->data;
     81     data.value = 1.0;
     82   }
     83 
     84   MockDeviceLightListener* listener() { return listener_.get(); }
     85   DeviceLightEventPumpForTesting* light_pump() { return light_pump_.get(); }
     86   base::SharedMemoryHandle handle() { return handle_; }
     87   DeviceLightHardwareBuffer* buffer() { return buffer_; }
     88 
     89  private:
     90   scoped_ptr<MockDeviceLightListener> listener_;
     91   scoped_ptr<DeviceLightEventPumpForTesting> light_pump_;
     92   base::SharedMemoryHandle handle_;
     93   base::SharedMemory shared_memory_;
     94   DeviceLightHardwareBuffer* buffer_;
     95 
     96   DISALLOW_COPY_AND_ASSIGN(DeviceLightEventPumpTest);
     97 };
     98 
     99 TEST_F(DeviceLightEventPumpTest, DidStartPolling) {
    100   base::MessageLoopForUI loop;
    101 
    102   InitBuffer();
    103 
    104   light_pump()->Start(listener());
    105   light_pump()->OnDidStart(handle());
    106 
    107   base::MessageLoop::current()->Run();
    108 
    109   const DeviceLightData& received_data = listener()->data();
    110   EXPECT_TRUE(listener()->did_change_device_light());
    111   EXPECT_EQ(1, static_cast<double>(received_data.value));
    112 }
    113 
    114 TEST_F(DeviceLightEventPumpTest, FireAllNullEvent) {
    115   base::MessageLoopForUI loop;
    116 
    117   light_pump()->Start(listener());
    118   light_pump()->OnDidStart(handle());
    119 
    120   base::MessageLoop::current()->Run();
    121 
    122   const DeviceLightData& received_data = listener()->data();
    123   EXPECT_TRUE(listener()->did_change_device_light());
    124   EXPECT_FALSE(received_data.value);
    125 }
    126 
    127 TEST_F(DeviceLightEventPumpTest, DidStartPollingValuesEqual) {
    128   base::MessageLoopForUI loop;
    129 
    130   InitBuffer();
    131 
    132   light_pump()->Start(listener());
    133   light_pump()->OnDidStart(handle());
    134 
    135   base::MessageLoop::current()->Run();
    136 
    137   const DeviceLightData& received_data = listener()->data();
    138   EXPECT_TRUE(listener()->did_change_device_light());
    139   EXPECT_EQ(1, static_cast<double>(received_data.value));
    140 
    141   double last_seen_data = received_data.value;
    142   // Set next value to be same as previous value.
    143   buffer()->data.value = 1.0;
    144   listener()->set_did_change_device_light(false);
    145 
    146   // Reset the pump's listener.
    147   light_pump()->Start(listener());
    148 
    149   base::MessageLoop::current()->PostTask(
    150       FROM_HERE,
    151       base::Bind(&DeviceLightEventPumpForTesting::FireEvent,
    152                  base::Unretained(light_pump())));
    153   base::MessageLoop::current()->Run();
    154 
    155   // No change in device light as present value is same as previous value.
    156   EXPECT_FALSE(listener()->did_change_device_light());
    157   EXPECT_EQ(last_seen_data, static_cast<double>(received_data.value));
    158 }
    159 
    160 }  // namespace content
    161