root/content/renderer/device_orientation/device_orientation_event_pump_unittest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. didChangeDeviceOrientation
  2. ResetDidChangeOrientation
  3. OnDidStart
  4. SendStartMessage
  5. SendStopMessage
  6. FireEvent
  7. SetUp
  8. InitBuffer
  9. InitBufferNoData
  10. TEST_F
  11. TEST_F
  12. TEST_F

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "device_orientation_event_pump.h"

#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "content/common/device_orientation/device_orientation_hardware_buffer.h"
#include "content/public/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/platform/WebDeviceOrientationListener.h"

namespace content {

class MockDeviceOrientationListener
    : public blink::WebDeviceOrientationListener {
 public:
  MockDeviceOrientationListener();
  virtual ~MockDeviceOrientationListener() { }
  virtual void didChangeDeviceOrientation(
      const blink::WebDeviceOrientationData&) OVERRIDE;
  void ResetDidChangeOrientation();
  bool did_change_device_orientation_;
  blink::WebDeviceOrientationData data_;
};

MockDeviceOrientationListener::MockDeviceOrientationListener()
    : did_change_device_orientation_(false) {
  memset(&data_, 0, sizeof(data_));
}

void MockDeviceOrientationListener::didChangeDeviceOrientation(
    const blink::WebDeviceOrientationData& data) {
  memcpy(&data_, &data, sizeof(data));
  did_change_device_orientation_ = true;
}

void MockDeviceOrientationListener::ResetDidChangeOrientation() {
  did_change_device_orientation_ = false;
}

class DeviceOrientationEventPumpForTesting : public DeviceOrientationEventPump {
 public:
  DeviceOrientationEventPumpForTesting() { }
  virtual ~DeviceOrientationEventPumpForTesting() { }

  void OnDidStart(base::SharedMemoryHandle renderer_handle) {
    DeviceOrientationEventPump::OnDidStart(renderer_handle);
  }
  virtual bool SendStartMessage() OVERRIDE { return true; }
  virtual bool SendStopMessage() OVERRIDE { return true; }
  virtual void FireEvent() OVERRIDE {
    DeviceOrientationEventPump::FireEvent();
    Stop();
    base::MessageLoop::current()->QuitWhenIdle();
  }
};

class DeviceOrientationEventPumpTest : public testing::Test {
 public:
  DeviceOrientationEventPumpTest() {
      EXPECT_TRUE(shared_memory_.CreateAndMapAnonymous(
          sizeof(DeviceOrientationHardwareBuffer)));
  }

 protected:
  virtual void SetUp() OVERRIDE {
    listener_.reset(new MockDeviceOrientationListener);
    orientation_pump_.reset(new DeviceOrientationEventPumpForTesting);
    buffer_ = static_cast<DeviceOrientationHardwareBuffer*>(
        shared_memory_.memory());
    memset(buffer_, 0, sizeof(DeviceOrientationHardwareBuffer));
    shared_memory_.ShareToProcess(base::kNullProcessHandle, &handle_);
  }

  void InitBuffer() {
    blink::WebDeviceOrientationData& data = buffer_->data;
    data.alpha = 1;
    data.hasAlpha = true;
    data.beta = 2;
    data.hasBeta = true;
    data.gamma = 3;
    data.hasGamma = true;
    data.allAvailableSensorsAreActive = true;
  }

  void InitBufferNoData() {
    blink::WebDeviceOrientationData& data = buffer_->data;
    data.allAvailableSensorsAreActive = true;
  }

  scoped_ptr<MockDeviceOrientationListener> listener_;
  scoped_ptr<DeviceOrientationEventPumpForTesting> orientation_pump_;
  base::SharedMemoryHandle handle_;
  base::SharedMemory shared_memory_;
  DeviceOrientationHardwareBuffer* buffer_;
};

// Always failing in the win try bot. See http://crbug.com/256782.
#if defined(OS_WIN)
#define MAYBE_DidStartPolling DISABLED_DidStartPolling
#else
#define MAYBE_DidStartPolling DidStartPolling
#endif
TEST_F(DeviceOrientationEventPumpTest, MAYBE_DidStartPolling) {
  base::MessageLoop loop;

  InitBuffer();
  orientation_pump_->SetListener(listener_.get());
  orientation_pump_->OnDidStart(handle_);

  base::MessageLoop::current()->Run();

  blink::WebDeviceOrientationData& received_data = listener_->data_;
  EXPECT_TRUE(listener_->did_change_device_orientation_);
  EXPECT_TRUE(received_data.allAvailableSensorsAreActive);
  EXPECT_EQ(1, (double)received_data.alpha);
  EXPECT_TRUE(received_data.hasAlpha);
  EXPECT_EQ(2, (double)received_data.beta);
  EXPECT_TRUE(received_data.hasBeta);
  EXPECT_EQ(3, (double)received_data.gamma);
  EXPECT_TRUE(received_data.hasGamma);
}

// Always failing in the win try bot. See http://crbug.com/256782.
#if defined(OS_WIN)
#define MAYBE_FireAllNullEvent DISABLED_FireAllNullEvent
#else
#define MAYBE_FireAllNullEvent FireAllNullEvent
#endif
TEST_F(DeviceOrientationEventPumpTest, MAYBE_FireAllNullEvent) {
  base::MessageLoop loop;

  InitBufferNoData();
  orientation_pump_->SetListener(listener_.get());
  orientation_pump_->OnDidStart(handle_);

  base::MessageLoop::current()->Run();

  blink::WebDeviceOrientationData& received_data = listener_->data_;
  EXPECT_TRUE(listener_->did_change_device_orientation_);
  EXPECT_TRUE(received_data.allAvailableSensorsAreActive);
  EXPECT_FALSE(received_data.hasAlpha);
  EXPECT_FALSE(received_data.hasBeta);
  EXPECT_FALSE(received_data.hasGamma);
}

// Always failing in the win try bot. See http://crbug.com/256782.
#if defined(OS_WIN)
#define MAYBE_UpdateRespectsOrientationThreshold \
    DISABLED_UpdateRespectsOrientationThreshold
#else
#define MAYBE_UpdateRespectsOrientationThreshold \
    UpdateRespectsOrientationThreshold
#endif
TEST_F(DeviceOrientationEventPumpTest,
    MAYBE_UpdateRespectsOrientationThreshold) {
  base::MessageLoop loop;

  InitBuffer();
  orientation_pump_->SetListener(listener_.get());
  orientation_pump_->OnDidStart(handle_);

  base::MessageLoop::current()->Run();

  blink::WebDeviceOrientationData& received_data = listener_->data_;
  EXPECT_TRUE(listener_->did_change_device_orientation_);
  EXPECT_TRUE(received_data.allAvailableSensorsAreActive);
  EXPECT_EQ(1, (double)received_data.alpha);
  EXPECT_TRUE(received_data.hasAlpha);
  EXPECT_EQ(2, (double)received_data.beta);
  EXPECT_TRUE(received_data.hasBeta);
  EXPECT_EQ(3, (double)received_data.gamma);
  EXPECT_TRUE(received_data.hasGamma);

  buffer_->data.alpha =
      1 + DeviceOrientationEventPump::kOrientationThreshold / 2.0;
  listener_->ResetDidChangeOrientation();

  base::MessageLoop::current()->PostTask(FROM_HERE,
      base::Bind(&DeviceOrientationEventPumpForTesting::FireEvent,
                 base::Unretained(orientation_pump_.get())));
  base::MessageLoop::current()->Run();

  EXPECT_FALSE(listener_->did_change_device_orientation_);
  EXPECT_TRUE(received_data.allAvailableSensorsAreActive);
  EXPECT_EQ(1, (double)received_data.alpha);
  EXPECT_TRUE(received_data.hasAlpha);
  EXPECT_EQ(2, (double)received_data.beta);
  EXPECT_TRUE(received_data.hasBeta);
  EXPECT_EQ(3, (double)received_data.gamma);
  EXPECT_TRUE(received_data.hasGamma);

  buffer_->data.alpha =
      1 + DeviceOrientationEventPump::kOrientationThreshold;
  listener_->ResetDidChangeOrientation();

  base::MessageLoop::current()->PostTask(FROM_HERE,
      base::Bind(&DeviceOrientationEventPumpForTesting::FireEvent,
                 base::Unretained(orientation_pump_.get())));
  base::MessageLoop::current()->Run();

  EXPECT_TRUE(listener_->did_change_device_orientation_);
  EXPECT_EQ(1 + DeviceOrientationEventPump::kOrientationThreshold,
      (double)received_data.alpha);
}

}  // namespace content

/* [<][>][^][v][top][bottom][index][help] */