Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Unified Diff: device/generic_sensor/platform_sensor_and_provider_unittest_win.cc

Issue 2476363003: [sensors][win] Implementation of motion sensors for Win platform (Closed)
Patch Set: Fix for clang build Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
diff --git a/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc b/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
index f0f44bd71c442f3767c5adfb4b824638f4af2bf5..12ddf4229d7079d71dccbb76df91ec5d9c5e86b6 100644
--- a/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
+++ b/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
@@ -20,8 +20,10 @@ using ::testing::IsNull;
using ::testing::NiceMock;
using ::testing::NotNull;
using ::testing::Return;
+using ::testing::WithArgs;
namespace device {
+
using mojom::SensorType;
template <class Interface>
@@ -296,9 +298,18 @@ class PlatformSensorAndProviderTestWin : public ::testing::Test {
sensor_events_->OnStateChanged(sensor_.get(), state);
}
+ struct PropertyKeyCompare {
+ bool operator()(REFPROPERTYKEY a, REFPROPERTYKEY b) const {
+ if (a.fmtid == b.fmtid)
+ return a.pid < b.pid;
+ return false;
+ }
+ };
+ using SensorData = std::map<PROPERTYKEY, double, PropertyKeyCompare>;
+
// Generates OnDataUpdated event and creates ISensorDataReport with fake
// |value| for property with |key|.
- void GenerateDataUpdatedEvent(REFPROPERTYKEY key, double value) {
+ void GenerateDataUpdatedEvent(const SensorData& values) {
if (!sensor_events_)
return;
@@ -317,12 +328,17 @@ class PlatformSensorAndProviderTestWin : public ::testing::Test {
return S_OK;
}));
- EXPECT_CALL(*mock_report, GetSensorValue(key, _))
- .WillOnce(Invoke([value](REFPROPERTYKEY, PROPVARIANT* variant) {
- variant->vt = VT_R8;
- variant->dblVal = value;
- return S_OK;
- }));
+ EXPECT_CALL(*mock_report, GetSensorValue(_, _))
+ .WillRepeatedly(WithArgs<0, 1>(
+ Invoke([&values](REFPROPERTYKEY key, PROPVARIANT* variant) {
+ auto it = values.find(key);
+ if (it == values.end())
+ return E_FAIL;
+
+ variant->vt = VT_R8;
+ variant->dblVal = (*it).second;
Mikhail 2016/11/09 10:42:58 nit: it->second
shalamov 2016/11/10 13:38:09 Done.
+ return S_OK;
+ })));
sensor_events_->OnDataUpdated(sensor_.get(), data_report.get());
}
@@ -367,10 +383,9 @@ class MockPlatformSensorClient : public PlatformSensor::Client {
// Tests that PlatformSensorManager returns null sensor when sensor
// is not implemented.
TEST_F(PlatformSensorAndProviderTestWin, SensorIsNotImplemented) {
- EXPECT_CALL(*sensor_manager_,
- GetSensorsByType(SENSOR_TYPE_ACCELEROMETER_3D, _))
+ EXPECT_CALL(*sensor_manager_, GetSensorsByType(SENSOR_TYPE_PRESSURE, _))
.Times(0);
- EXPECT_FALSE(CreateSensor(SensorType::ACCELEROMETER));
+ EXPECT_FALSE(CreateSensor(SensorType::PRESSURE));
}
// Tests that PlatformSensorManager returns null sensor when sensor
@@ -436,7 +451,7 @@ TEST_F(PlatformSensorAndProviderTestWin, SensorStarted) {
EXPECT_TRUE(sensor->StartListening(client.get(), configuration));
EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1);
- GenerateDataUpdatedEvent(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, 3.14);
+ GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, 3.14}});
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(sensor->StopListening(client.get(), configuration));
}
@@ -486,4 +501,112 @@ TEST_F(PlatformSensorAndProviderTestWin, SensorStateChangedToReady) {
base::RunLoop().RunUntilIdle();
}
+// Tests that Accelerometer readings are correctly converted.
+TEST_F(PlatformSensorAndProviderTestWin, CheckAccelerometerReadingConversion) {
+ mojo::ScopedSharedBufferHandle handle =
+ PlatformSensorProviderWin::GetInstance()->CloneSharedBufferHandle();
+ mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset(
+ sizeof(SensorReadingSharedBuffer),
+ SensorReadingSharedBuffer::GetOffset(SensorType::ACCELEROMETER));
+
+ SetSupportedSensor(SENSOR_TYPE_ACCELEROMETER_3D);
+ auto sensor = CreateSensor(SensorType::ACCELEROMETER);
+ EXPECT_TRUE(sensor);
+
+ auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor);
+ PlatformSensorConfiguration configuration(10);
+ EXPECT_TRUE(sensor->StartListening(client.get(), configuration));
+
+ // Should not be called for sensors with CONTINUOUS reporting mode.
+ EXPECT_CALL(*client, OnSensorReadingChanged()).Times(0);
+
+ double gravity = 9.80665;
+ double x_accel = 0.25;
+ double y_accel = -0.25;
+ double z_accel = -0.5;
+ GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_ACCELERATION_X_G, x_accel},
+ {SENSOR_DATA_TYPE_ACCELERATION_Y_G, y_accel},
+ {SENSOR_DATA_TYPE_ACCELERATION_Z_G, z_accel}});
+
+ SensorReadingSharedBuffer* buffer =
+ static_cast<SensorReadingSharedBuffer*>(mapping.get());
+ EXPECT_THAT(buffer->reading.values[0], -x_accel * gravity);
+ EXPECT_THAT(buffer->reading.values[1], -y_accel * gravity);
+ EXPECT_THAT(buffer->reading.values[2], -z_accel * gravity);
+ EXPECT_TRUE(sensor->StopListening(client.get(), configuration));
+}
+
+// Tests that Gyroscope readings are correctly converted.
+TEST_F(PlatformSensorAndProviderTestWin, CheckGyroscopeReadingConversion) {
+ mojo::ScopedSharedBufferHandle handle =
+ PlatformSensorProviderWin::GetInstance()->CloneSharedBufferHandle();
+ mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset(
+ sizeof(SensorReadingSharedBuffer),
+ SensorReadingSharedBuffer::GetOffset(SensorType::GYROSCOPE));
+
+ SetSupportedSensor(SENSOR_TYPE_GYROMETER_3D);
+ auto sensor = CreateSensor(SensorType::GYROSCOPE);
+ EXPECT_TRUE(sensor);
+
+ auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor);
+ PlatformSensorConfiguration configuration(10);
+ EXPECT_TRUE(sensor->StartListening(client.get(), configuration));
+ EXPECT_CALL(*client, OnSensorReadingChanged()).Times(0);
+
+ double rad_in_deg = 0.0174533;
+ double x_ang_accel = 0.0;
+ double y_ang_accel = -1.8;
+ double z_ang_accel = -98.7;
+
+ GenerateDataUpdatedEvent(
+ {{SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_X_DEGREES_PER_SECOND_SQUARED,
+ x_ang_accel},
+ {SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_Y_DEGREES_PER_SECOND_SQUARED,
+ y_ang_accel},
+ {SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_Z_DEGREES_PER_SECOND_SQUARED,
+ z_ang_accel}});
+
+ SensorReadingSharedBuffer* buffer =
+ static_cast<SensorReadingSharedBuffer*>(mapping.get());
+ EXPECT_THAT(buffer->reading.values[0], -x_ang_accel * rad_in_deg);
+ EXPECT_THAT(buffer->reading.values[1], -y_ang_accel * rad_in_deg);
+ EXPECT_THAT(buffer->reading.values[2], -z_ang_accel * rad_in_deg);
+ EXPECT_TRUE(sensor->StopListening(client.get(), configuration));
+}
+
+// Tests that Magnetometer readings are correctly converted.
+TEST_F(PlatformSensorAndProviderTestWin, CheckMagnetometerReadingConversion) {
+ mojo::ScopedSharedBufferHandle handle =
+ PlatformSensorProviderWin::GetInstance()->CloneSharedBufferHandle();
+ mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset(
+ sizeof(SensorReadingSharedBuffer),
+ SensorReadingSharedBuffer::GetOffset(SensorType::MAGNETOMETER));
+
+ SetSupportedSensor(SENSOR_TYPE_COMPASS_3D);
+ auto sensor = CreateSensor(SensorType::MAGNETOMETER);
+ EXPECT_TRUE(sensor);
+
+ auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor);
+ PlatformSensorConfiguration configuration(10);
+ EXPECT_TRUE(sensor->StartListening(client.get(), configuration));
+ EXPECT_CALL(*client, OnSensorReadingChanged()).Times(0);
+
+ double utesla_in_mgauss = 0.1;
+ double x_magn_field = 112.0;
+ double y_magn_field = -162.0;
+ double z_magn_field = 457.0;
+
+ GenerateDataUpdatedEvent(
+ {{SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_X_MILLIGAUSS, x_magn_field},
+ {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Y_MILLIGAUSS, y_magn_field},
+ {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Z_MILLIGAUSS, z_magn_field}});
+
+ SensorReadingSharedBuffer* buffer =
+ static_cast<SensorReadingSharedBuffer*>(mapping.get());
+ EXPECT_THAT(buffer->reading.values[0], -x_magn_field * utesla_in_mgauss);
+ EXPECT_THAT(buffer->reading.values[1], -y_magn_field * utesla_in_mgauss);
+ EXPECT_THAT(buffer->reading.values[2], -z_magn_field * utesla_in_mgauss);
+ EXPECT_TRUE(sensor->StopListening(client.get(), configuration));
+}
+
} // namespace device

Powered by Google App Engine
This is Rietveld 408576698