Chromium Code Reviews| 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 |