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 |
deleted file mode 100644 |
index fbe917fe68b439ac74b5a8aab3f7751f6668909b..0000000000000000000000000000000000000000 |
--- a/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc |
+++ /dev/null |
@@ -1,723 +0,0 @@ |
-// Copyright 2016 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 <SensorsApi.h> |
-#include <objbase.h> |
-#include <propvarutil.h> |
-#include <sensors.h> |
- |
-#include "base/bind.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/win/iunknown_impl.h" |
-#include "base/win/scoped_propvariant.h" |
-#include "device/generic_sensor/generic_sensor_consts.h" |
-#include "device/generic_sensor/platform_sensor_provider_win.h" |
-#include "device/generic_sensor/public/interfaces/sensor_provider.mojom.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using ::testing::_; |
-using ::testing::Invoke; |
-using ::testing::IsNull; |
-using ::testing::NiceMock; |
-using ::testing::NotNull; |
-using ::testing::Return; |
-using ::testing::WithArgs; |
- |
-namespace device { |
- |
-using mojom::SensorType; |
- |
-template <class Interface> |
-class MockCOMInterface : public Interface, public base::win::IUnknownImpl { |
- public: |
- // IUnknown interface |
- ULONG STDMETHODCALLTYPE AddRef() override { return IUnknownImpl::AddRef(); } |
- ULONG STDMETHODCALLTYPE Release() override { return IUnknownImpl::Release(); } |
- |
- STDMETHODIMP QueryInterface(REFIID riid, void** ppv) override { |
- if (riid == __uuidof(Interface)) { |
- *ppv = static_cast<Interface*>(this); |
- AddRef(); |
- return S_OK; |
- } |
- return IUnknownImpl::QueryInterface(riid, ppv); |
- } |
- |
- protected: |
- ~MockCOMInterface() override = default; |
-}; |
- |
-// Mock class for ISensorManager COM interface. |
-class MockISensorManager : public MockCOMInterface<ISensorManager> { |
- public: |
- // ISensorManager interface |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetSensorsByCategory, |
- HRESULT(REFSENSOR_CATEGORY_ID category, |
- ISensorCollection** sensors_found)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetSensorsByType, |
- HRESULT(REFSENSOR_TYPE_ID sensor_id, |
- ISensorCollection** sensors_found)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetSensorByID, |
- HRESULT(REFSENSOR_ID sensor_id, ISensor** sensor)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- SetEventSink, |
- HRESULT(ISensorManagerEvents* event_sink)); |
- MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- RequestPermissions, |
- HRESULT(HWND parent, |
- ISensorCollection* sensors, |
- BOOL is_modal)); |
- |
- protected: |
- ~MockISensorManager() override = default; |
-}; |
- |
-// Mock class for ISensorCollection COM interface. |
-class MockISensorCollection : public MockCOMInterface<ISensorCollection> { |
- public: |
- // ISensorCollection interface |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetAt, |
- HRESULT(ULONG index, ISensor** sensor)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetCount, |
- HRESULT(ULONG* count)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Add, HRESULT(ISensor* sensor)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- Remove, |
- HRESULT(ISensor* sensor)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- RemoveByID, |
- HRESULT(REFSENSOR_ID sensor_id)); |
- MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Clear, HRESULT()); |
- |
- protected: |
- ~MockISensorCollection() override = default; |
-}; |
- |
-// Mock class for ISensor COM interface. |
-class MockISensor : public MockCOMInterface<ISensor> { |
- public: |
- // ISensor interface |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetID, HRESULT(SENSOR_ID* id)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetCategory, |
- HRESULT(SENSOR_CATEGORY_ID* category)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetType, |
- HRESULT(SENSOR_TYPE_ID* type)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetFriendlyName, |
- HRESULT(BSTR* name)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetProperty, |
- HRESULT(REFPROPERTYKEY key, |
- PROPVARIANT* property)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetProperties, |
- HRESULT(IPortableDeviceKeyCollection* keys, |
- IPortableDeviceValues** properties)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetSupportedDataFields, |
- HRESULT(IPortableDeviceKeyCollection** data)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- SetProperties, |
- HRESULT(IPortableDeviceValues* properties, |
- IPortableDeviceValues** results)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- SupportsDataField, |
- HRESULT(REFPROPERTYKEY key, |
- VARIANT_BOOL* is_supported)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetState, |
- HRESULT(SensorState* state)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetData, |
- HRESULT(ISensorDataReport** data_report)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- SupportsEvent, |
- HRESULT(REFGUID event_guid, |
- VARIANT_BOOL* is_supported)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetEventInterest, |
- HRESULT(GUID** values, ULONG* count)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- SetEventInterest, |
- HRESULT(GUID* values, ULONG count)); |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- SetEventSink, |
- HRESULT(ISensorEvents* pEvents)); |
- |
- protected: |
- ~MockISensor() override = default; |
-}; |
- |
-// Mock class for ISensorDataReport COM interface. |
-class MockISensorDataReport : public MockCOMInterface<ISensorDataReport> { |
- public: |
- // ISensorDataReport interface |
- MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetTimestamp, |
- HRESULT(SYSTEMTIME* timestamp)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetSensorValue, |
- HRESULT(REFPROPERTYKEY key, PROPVARIANT* value)); |
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, |
- GetSensorValues, |
- HRESULT(IPortableDeviceKeyCollection* keys, |
- IPortableDeviceValues** values)); |
- |
- protected: |
- ~MockISensorDataReport() override = default; |
-}; |
- |
-// Class that provides test harness support for generic sensor adaptation for |
-// Windows platform. Testing is mainly done by mocking main COM interfaces that |
-// are used to communicate with Sensors API. |
-// MockISensorManager - mocks ISensorManager and responsible for fetching |
-// list of supported sensors. |
-// MockISensorCollection - mocks collection of ISensor objects. |
-// MockISensor - mocks ISensor intrface. |
-// MockISensorDataReport - mocks IDataReport interface that is used to deliver |
-// data in OnDataUpdated event. |
-class PlatformSensorAndProviderTestWin : public ::testing::Test { |
- public: |
- void SetUp() override { |
- sensor_ = new NiceMock<MockISensor>(); |
- sensor_collection_ = new NiceMock<MockISensorCollection>(); |
- sensor_manager_ = new NiceMock<MockISensorManager>(); |
- base::win::ScopedComPtr<ISensorManager> manager; |
- sensor_manager_->QueryInterface(IID_PPV_ARGS(&manager)); |
- |
- // Overrides default ISensorManager with mocked interface. |
- PlatformSensorProviderWin::GetInstance()->SetSensorManagerForTesting( |
- manager); |
- } |
- |
- void TearDown() override { |
- base::win::ScopedComPtr<ISensorManager> null_manager; |
- PlatformSensorProviderWin::GetInstance()->SetSensorManagerForTesting( |
- null_manager); |
- } |
- |
- protected: |
- void SensorCreated(scoped_refptr<PlatformSensor> sensor) { |
- platform_sensor_ = sensor; |
- run_loop_->Quit(); |
- } |
- |
- // Sensor creation is asynchronous, therefore inner loop is used to wait for |
- // PlatformSensorProvider::CreateSensorCallback completion. |
- scoped_refptr<PlatformSensor> CreateSensor(mojom::SensorType type) { |
- run_loop_ = base::MakeUnique<base::RunLoop>(); |
- PlatformSensorProviderWin::GetInstance()->CreateSensor( |
- type, base::Bind(&PlatformSensorAndProviderTestWin::SensorCreated, |
- base::Unretained(this))); |
- run_loop_->Run(); |
- scoped_refptr<PlatformSensor> sensor; |
- sensor.swap(platform_sensor_); |
- run_loop_ = nullptr; |
- return sensor; |
- } |
- |
- // Listening the sensor is asynchronous, therefore inner loop is used to wait |
- // for SetEventSink to be called. |
- bool StartListening(scoped_refptr<PlatformSensor> sensor, |
- PlatformSensor::Client* client, |
- const PlatformSensorConfiguration& config) { |
- run_loop_ = base::MakeUnique<base::RunLoop>(); |
- bool ret = sensor->StartListening(client, config); |
- run_loop_->Run(); |
- run_loop_ = nullptr; |
- return ret; |
- } |
- |
- void QuitInnerLoop() { run_loop_->Quit(); } |
- |
- // Sets sensor with REFSENSOR_TYPE_ID |sensor| to be supported by mocked |
- // ISensorMager and it will be present in ISensorCollection. |
- void SetSupportedSensor(REFSENSOR_TYPE_ID sensor) { |
- // Returns mock ISensorCollection. |
- EXPECT_CALL(*sensor_manager_, GetSensorsByType(sensor, _)) |
- .WillOnce(Invoke( |
- [this](REFSENSOR_TYPE_ID type, ISensorCollection** collection) { |
- sensor_collection_->QueryInterface( |
- __uuidof(ISensorCollection), |
- reinterpret_cast<void**>(collection)); |
- return S_OK; |
- })); |
- |
- // Returns number of ISensor objects in ISensorCollection, at the moment |
- // only one ISensor interface instance is suported. |
- EXPECT_CALL(*sensor_collection_, GetCount(_)) |
- .WillOnce(Invoke([](ULONG* count) { |
- *count = 1; |
- return S_OK; |
- })); |
- |
- // Returns ISensor interface instance at index 0. |
- EXPECT_CALL(*sensor_collection_, GetAt(0, _)) |
- .WillOnce(Invoke([this](ULONG index, ISensor** sensor) { |
- sensor_->QueryInterface(__uuidof(ISensor), |
- reinterpret_cast<void**>(sensor)); |
- return S_OK; |
- })); |
- |
- // Handles |SetEventSink| call that is used to subscribe to sensor events |
- // through ISensorEvents interface. ISensorEvents is stored and attached to |
- // |sensor_events_| that is used later to generate fake error, state and |
- // data change events. |
- ON_CALL(*sensor_, SetEventSink(NotNull())) |
- .WillByDefault(Invoke([this](ISensorEvents* events) { |
- events->AddRef(); |
- sensor_events_.Attach(events); |
- if (this->run_loop_) { |
- message_loop_.task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&PlatformSensorAndProviderTestWin::QuitInnerLoop, |
- base::Unretained(this))); |
- } |
- return S_OK; |
- })); |
- |
- // When |SetEventSink| is called with nullptr, it means that client is no |
- // longer interested in sensor events and ISensorEvents can be released. |
- ON_CALL(*sensor_, SetEventSink(IsNull())) |
- .WillByDefault(Invoke([this](ISensorEvents* events) { |
- sensor_events_.Reset(); |
- if (this->run_loop_) { |
- message_loop_.task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&PlatformSensorAndProviderTestWin::QuitInnerLoop, |
- base::Unretained(this))); |
- } |
- return S_OK; |
- })); |
- } |
- |
- // Sets minimal reporting frequency for the mock sensor. |
- void SetSupportedReportingFrequency(double frequency) { |
- ON_CALL(*sensor_, GetProperty(SENSOR_PROPERTY_MIN_REPORT_INTERVAL, _)) |
- .WillByDefault( |
- Invoke([frequency](REFPROPERTYKEY key, PROPVARIANT* pProperty) { |
- pProperty->vt = VT_UI4; |
- pProperty->ulVal = |
- (1 / frequency) * base::Time::kMillisecondsPerSecond; |
- return S_OK; |
- })); |
- } |
- |
- // Generates OnLeave event, e.g. when sensor is disconnected. |
- void GenerateLeaveEvent() { |
- if (!sensor_events_) |
- return; |
- sensor_events_->OnLeave(SENSOR_ID()); |
- } |
- |
- // Generates OnStateChangedLeave event. |
- void GenerateStateChangeEvent(SensorState state) { |
- if (!sensor_events_) |
- return; |
- 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, const PROPVARIANT*, PropertyKeyCompare>; |
- |
- // Generates OnDataUpdated event and creates ISensorDataReport with fake |
- // |value| for property with |key|. |
- void GenerateDataUpdatedEvent(const SensorData& values) { |
- if (!sensor_events_) |
- return; |
- |
- // MockISensorDataReport implements IUnknown that provides ref counting. |
- // IUnknown::QueryInterface increases refcount if an object implements |
- // requested interface. ScopedComPtr wraps received interface and destructs |
- // it when there are not more references. |
- auto* mock_report = new NiceMock<MockISensorDataReport>(); |
- base::win::ScopedComPtr<ISensorDataReport> data_report; |
- mock_report->QueryInterface(IID_PPV_ARGS(&data_report)); |
- |
- EXPECT_CALL(*mock_report, GetTimestamp(_)) |
- .WillOnce(Invoke([](SYSTEMTIME* timestamp) { |
- GetSystemTime(timestamp); |
- 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; |
- |
- PropVariantCopy(variant, it->second); |
- return S_OK; |
- }))); |
- |
- sensor_events_->OnDataUpdated(sensor_.get(), data_report.Get()); |
- } |
- |
- scoped_refptr<MockISensorManager> sensor_manager_; |
- scoped_refptr<MockISensorCollection> sensor_collection_; |
- scoped_refptr<MockISensor> sensor_; |
- base::win::ScopedComPtr<ISensorEvents> sensor_events_; |
- base::MessageLoop message_loop_; |
- scoped_refptr<PlatformSensor> platform_sensor_; |
- // Inner run loop used to wait for async sensor creation callback. |
- std::unique_ptr<base::RunLoop> run_loop_; |
-}; |
- |
-// Mock for PlatformSensor's client interface that is used to deliver |
-// error and data changes notifications. |
-class MockPlatformSensorClient : public PlatformSensor::Client { |
- public: |
- MockPlatformSensorClient() = default; |
- explicit MockPlatformSensorClient(scoped_refptr<PlatformSensor> sensor) |
- : sensor_(sensor) { |
- if (sensor_) |
- sensor_->AddClient(this); |
- |
- ON_CALL(*this, IsNotificationSuspended()).WillByDefault(Return(false)); |
- } |
- |
- ~MockPlatformSensorClient() override { |
- if (sensor_) |
- sensor_->RemoveClient(this); |
- } |
- |
- // PlatformSensor::Client interface. |
- MOCK_METHOD0(OnSensorReadingChanged, void()); |
- MOCK_METHOD0(OnSensorError, void()); |
- MOCK_METHOD0(IsNotificationSuspended, bool()); |
- |
- private: |
- scoped_refptr<PlatformSensor> sensor_; |
-}; |
- |
-// Tests that PlatformSensorManager returns null sensor when sensor |
-// is not implemented. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorIsNotImplemented) { |
- EXPECT_CALL(*sensor_manager_, GetSensorsByType(SENSOR_TYPE_PRESSURE, _)) |
- .Times(0); |
- EXPECT_FALSE(CreateSensor(SensorType::PRESSURE)); |
-} |
- |
-// Tests that PlatformSensorManager returns null sensor when sensor |
-// is implemented, but not supported by the hardware. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorIsNotSupported) { |
- EXPECT_CALL(*sensor_manager_, GetSensorsByType(SENSOR_TYPE_AMBIENT_LIGHT, _)) |
- .WillOnce(Invoke([](REFSENSOR_TYPE_ID, ISensorCollection** result) { |
- *result = nullptr; |
- return E_FAIL; |
- })); |
- |
- EXPECT_FALSE(CreateSensor(SensorType::AMBIENT_LIGHT)); |
-} |
- |
-// Tests that PlatformSensorManager returns correct sensor when sensor |
-// is supported by the hardware. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorIsSupported) { |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- EXPECT_EQ(SensorType::AMBIENT_LIGHT, sensor->GetType()); |
-} |
- |
-// Tests that PlatformSensor::StartListening fails when provided reporting |
-// frequency is above hardware capabilities. |
-TEST_F(PlatformSensorAndProviderTestWin, StartFails) { |
- SetSupportedReportingFrequency(1); |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- |
- auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); |
- PlatformSensorConfiguration configuration(10); |
- EXPECT_FALSE(sensor->StartListening(client.get(), configuration)); |
-} |
- |
-// Tests that PlatformSensor::StartListening succeeds and notification about |
-// modified sensor reading is sent to the PlatformSensor::Client interface. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorStarted) { |
- SetSupportedReportingFrequency(10); |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- |
- EXPECT_CALL(*sensor_, SetEventSink(NotNull())).Times(1); |
- EXPECT_CALL(*sensor_, SetEventSink(IsNull())).Times(1); |
- EXPECT_CALL(*sensor_, SetProperties(NotNull(), _)) |
- .WillRepeatedly(Invoke( |
- [](IPortableDeviceValues* props, IPortableDeviceValues** result) { |
- ULONG value = 0; |
- HRESULT hr = props->GetUnsignedIntegerValue( |
- SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, &value); |
- EXPECT_TRUE(SUCCEEDED(hr)); |
- // 10Hz is 100msec |
- EXPECT_THAT(value, 100); |
- return hr; |
- })); |
- |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- |
- auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); |
- PlatformSensorConfiguration configuration(10); |
- EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); |
- |
- EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); |
- base::win::ScopedPropVariant pvLux; |
- InitPropVariantFromDouble(3.14, pvLux.Receive()); |
- GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, pvLux.ptr()}}); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); |
-} |
- |
-// Tests that OnSensorError is called when sensor is disconnected. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorRemoved) { |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- |
- auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); |
- PlatformSensorConfiguration configuration(10); |
- EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorError()).Times(1); |
- |
- GenerateLeaveEvent(); |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-// Tests that OnSensorError is called when sensor is in an error state. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorStateChangedToError) { |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- |
- auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); |
- PlatformSensorConfiguration configuration(10); |
- EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorError()).Times(1); |
- |
- GenerateStateChangeEvent(SENSOR_STATE_ERROR); |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-// Tests that OnSensorError is not called when sensor is in a ready state. |
-TEST_F(PlatformSensorAndProviderTestWin, SensorStateChangedToReady) { |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- |
- auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); |
- PlatformSensorConfiguration configuration(10); |
- EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorError()).Times(0); |
- |
- GenerateStateChangeEvent(SENSOR_STATE_READY); |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-// Tests that GetMaximumSupportedFrequency provides correct value. |
-TEST_F(PlatformSensorAndProviderTestWin, GetMaximumSupportedFrequency) { |
- SetSupportedReportingFrequency(20); |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- EXPECT_THAT(sensor->GetMaximumSupportedFrequency(), 20); |
-} |
- |
-// Tests that GetMaximumSupportedFrequency returns fallback value. |
-TEST_F(PlatformSensorAndProviderTestWin, GetMaximumSupportedFrequencyFallback) { |
- SetSupportedReportingFrequency(0); |
- SetSupportedSensor(SENSOR_TYPE_AMBIENT_LIGHT); |
- auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT); |
- EXPECT_TRUE(sensor); |
- EXPECT_THAT(sensor->GetMaximumSupportedFrequency(), 5); |
-} |
- |
-// 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(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); |
- |
- double x_accel = 0.25; |
- double y_accel = -0.25; |
- double z_accel = -0.5; |
- |
- base::win::ScopedPropVariant pvX, pvY, pvZ; |
- InitPropVariantFromDouble(x_accel, pvX.Receive()); |
- InitPropVariantFromDouble(y_accel, pvY.Receive()); |
- InitPropVariantFromDouble(z_accel, pvZ.Receive()); |
- |
- GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_ACCELERATION_X_G, pvX.ptr()}, |
- {SENSOR_DATA_TYPE_ACCELERATION_Y_G, pvY.ptr()}, |
- {SENSOR_DATA_TYPE_ACCELERATION_Z_G, pvZ.ptr()}}); |
- |
- base::RunLoop().RunUntilIdle(); |
- SensorReadingSharedBuffer* buffer = |
- static_cast<SensorReadingSharedBuffer*>(mapping.get()); |
- EXPECT_THAT(buffer->reading.values[0], -x_accel * kMeanGravity); |
- EXPECT_THAT(buffer->reading.values[1], -y_accel * kMeanGravity); |
- EXPECT_THAT(buffer->reading.values[2], -z_accel * kMeanGravity); |
- 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(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); |
- |
- double x_ang_accel = 0.0; |
- double y_ang_accel = -1.8; |
- double z_ang_accel = -98.7; |
- |
- base::win::ScopedPropVariant pvX, pvY, pvZ; |
- InitPropVariantFromDouble(x_ang_accel, pvX.Receive()); |
- InitPropVariantFromDouble(y_ang_accel, pvY.Receive()); |
- InitPropVariantFromDouble(z_ang_accel, pvZ.Receive()); |
- |
- GenerateDataUpdatedEvent( |
- {{SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGREES_PER_SECOND, pvX.ptr()}, |
- {SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGREES_PER_SECOND, pvY.ptr()}, |
- {SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGREES_PER_SECOND, pvZ.ptr()}}); |
- |
- base::RunLoop().RunUntilIdle(); |
- SensorReadingSharedBuffer* buffer = |
- static_cast<SensorReadingSharedBuffer*>(mapping.get()); |
- EXPECT_THAT(buffer->reading.values[0], -x_ang_accel * kRadiansInDegrees); |
- EXPECT_THAT(buffer->reading.values[1], -y_ang_accel * kRadiansInDegrees); |
- EXPECT_THAT(buffer->reading.values[2], -z_ang_accel * kRadiansInDegrees); |
- 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(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); |
- |
- double x_magn_field = 112.0; |
- double y_magn_field = -162.0; |
- double z_magn_field = 457.0; |
- |
- base::win::ScopedPropVariant pvX, pvY, pvZ; |
- InitPropVariantFromDouble(x_magn_field, pvX.Receive()); |
- InitPropVariantFromDouble(y_magn_field, pvY.Receive()); |
- InitPropVariantFromDouble(z_magn_field, pvZ.Receive()); |
- |
- GenerateDataUpdatedEvent( |
- {{SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_X_MILLIGAUSS, pvX.ptr()}, |
- {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Y_MILLIGAUSS, pvY.ptr()}, |
- {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Z_MILLIGAUSS, pvZ.ptr()}}); |
- |
- base::RunLoop().RunUntilIdle(); |
- SensorReadingSharedBuffer* buffer = |
- static_cast<SensorReadingSharedBuffer*>(mapping.get()); |
- EXPECT_THAT(buffer->reading.values[0], |
- -x_magn_field * kMicroteslaInMilligauss); |
- EXPECT_THAT(buffer->reading.values[1], |
- -y_magn_field * kMicroteslaInMilligauss); |
- EXPECT_THAT(buffer->reading.values[2], |
- -z_magn_field * kMicroteslaInMilligauss); |
- EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); |
-} |
- |
-// Tests that AbsoluteOrientation sensor readings are correctly converted. |
-TEST_F(PlatformSensorAndProviderTestWin, |
- CheckDeviceOrientationReadingConversion) { |
- mojo::ScopedSharedBufferHandle handle = |
- PlatformSensorProviderWin::GetInstance()->CloneSharedBufferHandle(); |
- mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset( |
- sizeof(SensorReadingSharedBuffer), |
- SensorReadingSharedBuffer::GetOffset(SensorType::ABSOLUTE_ORIENTATION)); |
- |
- SetSupportedSensor(SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION); |
- auto sensor = CreateSensor(SensorType::ABSOLUTE_ORIENTATION); |
- EXPECT_TRUE(sensor); |
- |
- auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); |
- PlatformSensorConfiguration configuration(10); |
- EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); |
- EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); |
- |
- double x = -0.5; |
- double y = -0.5; |
- double z = 0.5; |
- double w = 0.5; |
- float quat_elements[4] = {x, y, z, w}; |
- |
- base::win::ScopedPropVariant pvQuat; |
- |
- // The SENSOR_DATA_TYPE_QUATERNION property has [VT_VECTOR | VT_UI1] type. |
- // https://msdn.microsoft.com/en-us/library/windows/hardware/dn265187(v=vs.85).aspx |
- // Helper functions e.g., InitVariantFromDoubleArray cannot be used for its |
- // intialization and the only way to initialize it, is to use |
- // InitPropVariantFromGUIDAsBuffer with quaternion format GUID. |
- InitPropVariantFromGUIDAsBuffer(SENSOR_DATA_TYPE_QUATERNION.fmtid, |
- pvQuat.Receive()); |
- memcpy(pvQuat.get().caub.pElems, &quat_elements, sizeof(quat_elements)); |
- GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_QUATERNION, pvQuat.ptr()}}); |
- |
- base::RunLoop().RunUntilIdle(); |
- SensorReadingSharedBuffer* buffer = |
- static_cast<SensorReadingSharedBuffer*>(mapping.get()); |
- |
- EXPECT_THAT(buffer->reading.values[0], -x); |
- EXPECT_THAT(buffer->reading.values[1], -y); |
- EXPECT_THAT(buffer->reading.values[2], -z); |
- EXPECT_THAT(buffer->reading.values[3], w); |
- EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); |
-} |
- |
-} // namespace device |