blob: 9807d4c46a23301d93f3a4f66131f8f856f11e3c [file] [log] [blame]
// Copyright 2014 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/sensors/sensor_manager_android.h"
#include <memory>
#include "base/android/jni_android.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
#include "device/sensors/device_sensors_consts.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace device {
namespace {
class FakeSensorManagerAndroid : public SensorManagerAndroid {
public:
FakeSensorManagerAndroid() {}
~FakeSensorManagerAndroid() override {}
OrientationSensorType GetOrientationSensorTypeUsed() override {
return SensorManagerAndroid::ROTATION_VECTOR;
}
int GetNumberActiveDeviceMotionSensors() override {
return number_active_sensors_;
}
void SetNumberActiveDeviceMotionSensors(int number_active_sensors) {
number_active_sensors_ = number_active_sensors;
}
protected:
bool Start(ConsumerType event_type) override { return true; }
void Stop(ConsumerType event_type) override {}
private:
int number_active_sensors_;
};
class AndroidSensorManagerTest : public testing::Test {
protected:
AndroidSensorManagerTest() {
motion_buffer_.reset(new DeviceMotionHardwareBuffer);
orientation_buffer_.reset(new DeviceOrientationHardwareBuffer);
orientation_absolute_buffer_.reset(new DeviceOrientationHardwareBuffer);
}
void VerifyOrientationBufferValues(
const DeviceOrientationHardwareBuffer* buffer,
double alpha,
double beta,
double gamma) {
ASSERT_TRUE(buffer->data.all_available_sensors_are_active);
ASSERT_EQ(alpha, buffer->data.alpha);
ASSERT_TRUE(buffer->data.has_alpha);
ASSERT_EQ(beta, buffer->data.beta);
ASSERT_TRUE(buffer->data.has_beta);
ASSERT_EQ(gamma, buffer->data.gamma);
ASSERT_TRUE(buffer->data.has_gamma);
}
std::unique_ptr<DeviceMotionHardwareBuffer> motion_buffer_;
std::unique_ptr<DeviceOrientationHardwareBuffer> orientation_buffer_;
std::unique_ptr<DeviceOrientationHardwareBuffer> orientation_absolute_buffer_;
base::MessageLoop message_loop_;
};
TEST_F(AndroidSensorManagerTest, ThreeDeviceMotionSensorsActive) {
FakeSensorManagerAndroid sensorManager;
sensorManager.SetNumberActiveDeviceMotionSensors(3);
sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get());
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
sensorManager.GotAcceleration(nullptr, nullptr, 1, 2, 3);
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
ASSERT_EQ(1, motion_buffer_->data.acceleration_x);
ASSERT_TRUE(motion_buffer_->data.has_acceleration_x);
ASSERT_EQ(2, motion_buffer_->data.acceleration_y);
ASSERT_TRUE(motion_buffer_->data.has_acceleration_y);
ASSERT_EQ(3, motion_buffer_->data.acceleration_z);
ASSERT_TRUE(motion_buffer_->data.has_acceleration_z);
sensorManager.GotAccelerationIncludingGravity(nullptr, nullptr, 4, 5, 6);
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
ASSERT_EQ(4, motion_buffer_->data.acceleration_including_gravity_x);
ASSERT_TRUE(motion_buffer_->data.has_acceleration_including_gravity_x);
ASSERT_EQ(5, motion_buffer_->data.acceleration_including_gravity_y);
ASSERT_TRUE(motion_buffer_->data.has_acceleration_including_gravity_y);
ASSERT_EQ(6, motion_buffer_->data.acceleration_including_gravity_z);
ASSERT_TRUE(motion_buffer_->data.has_acceleration_including_gravity_z);
sensorManager.GotRotationRate(nullptr, nullptr, 7, 8, 9);
ASSERT_TRUE(motion_buffer_->data.all_available_sensors_are_active);
ASSERT_EQ(7, motion_buffer_->data.rotation_rate_alpha);
ASSERT_TRUE(motion_buffer_->data.has_rotation_rate_alpha);
ASSERT_EQ(8, motion_buffer_->data.rotation_rate_beta);
ASSERT_TRUE(motion_buffer_->data.has_rotation_rate_beta);
ASSERT_EQ(9, motion_buffer_->data.rotation_rate_gamma);
ASSERT_TRUE(motion_buffer_->data.has_rotation_rate_gamma);
ASSERT_EQ(kDeviceSensorIntervalMicroseconds / 1000.,
motion_buffer_->data.interval);
sensorManager.StopFetchingDeviceMotionData();
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
}
TEST_F(AndroidSensorManagerTest, TwoDeviceMotionSensorsActive) {
FakeSensorManagerAndroid sensorManager;
sensorManager.SetNumberActiveDeviceMotionSensors(2);
sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get());
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
sensorManager.GotAcceleration(nullptr, nullptr, 1, 2, 3);
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
sensorManager.GotAccelerationIncludingGravity(nullptr, nullptr, 1, 2, 3);
ASSERT_TRUE(motion_buffer_->data.all_available_sensors_are_active);
ASSERT_EQ(kDeviceSensorIntervalMicroseconds / 1000.,
motion_buffer_->data.interval);
sensorManager.StopFetchingDeviceMotionData();
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
}
TEST_F(AndroidSensorManagerTest, ZeroDeviceMotionSensorsActive) {
FakeSensorManagerAndroid sensorManager;
sensorManager.SetNumberActiveDeviceMotionSensors(0);
sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get());
ASSERT_TRUE(motion_buffer_->data.all_available_sensors_are_active);
ASSERT_EQ(kDeviceSensorIntervalMicroseconds / 1000.,
motion_buffer_->data.interval);
sensorManager.StopFetchingDeviceMotionData();
ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active);
}
TEST_F(AndroidSensorManagerTest, DeviceOrientationSensorsActive) {
FakeSensorManagerAndroid sensorManager;
sensorManager.StartFetchingDeviceOrientationData(orientation_buffer_.get());
ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active);
sensorManager.GotOrientation(nullptr, nullptr, 1, 2, 3);
VerifyOrientationBufferValues(orientation_buffer_.get(), 1, 2, 3);
sensorManager.StopFetchingDeviceOrientationData();
ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active);
}
TEST_F(AndroidSensorManagerTest, DeviceOrientationAbsoluteSensorsActive) {
FakeSensorManagerAndroid sensorManager;
sensorManager.StartFetchingDeviceOrientationAbsoluteData(
orientation_absolute_buffer_.get());
ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active);
sensorManager.GotOrientationAbsolute(nullptr, nullptr, 4, 5, 6);
VerifyOrientationBufferValues(orientation_absolute_buffer_.get(), 4, 5, 6);
sensorManager.StopFetchingDeviceOrientationData();
ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active);
}
} // namespace
} // namespace device