platform_sensor_provider_chromeos_unittest.cc 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/device/generic_sensor/platform_sensor_provider_chromeos.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/run_loop.h"
  8. #include "base/strings/string_number_conversions.h"
  9. #include "base/test/bind.h"
  10. #include "base/test/task_environment.h"
  11. #include "build/chromeos_buildflags.h"
  12. #include "chromeos/components/sensors/fake_sensor_device.h"
  13. #include "chromeos/components/sensors/fake_sensor_hal_server.h"
  14. #include "services/device/generic_sensor/sensor_impl.h"
  15. #include "services/device/public/cpp/generic_sensor/sensor_traits.h"
  16. #include "testing/gtest/include/gtest/gtest.h"
  17. #include "third_party/abseil-cpp/absl/types/optional.h"
  18. #if BUILDFLAG(IS_CHROMEOS_ASH)
  19. #include "chromeos/components/sensors/ash/sensor_hal_dispatcher.h"
  20. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  21. namespace device {
  22. namespace {
  23. constexpr int kFakeDeviceId = 1;
  24. constexpr double kScaleValue = 10.0;
  25. constexpr char kWrongScale[] = "10..0";
  26. constexpr char kWrongLocation[] = "basee";
  27. constexpr int64_t kFakeSampleData = 1;
  28. constexpr int64_t kFakeTimestampData = 163176689212344ll;
  29. // The number of axes for which there are accelerometer and gyroscope readings.
  30. constexpr uint32_t kNumberOfAxes = 3u;
  31. constexpr char kAccelerometerChannels[][10] = {"accel_x", "accel_y", "accel_z"};
  32. constexpr char kGyroscopeChannels[][10] = {"anglvel_x", "anglvel_y",
  33. "anglvel_z"};
  34. class FakeClient : public PlatformSensor::Client {
  35. public:
  36. explicit FakeClient(PlatformSensor* platform_sensor)
  37. : platform_sensor_(platform_sensor) {}
  38. ~FakeClient() override {}
  39. void OnSensorReadingChanged(mojom::SensorType type) override {}
  40. void OnSensorError() override { platform_sensor_->RemoveClient(this); }
  41. bool IsSuspended() override { return false; }
  42. private:
  43. PlatformSensor* platform_sensor_;
  44. };
  45. } // namespace
  46. class PlatformSensorProviderChromeOSTest : public ::testing::Test {
  47. protected:
  48. void SetUp() override {
  49. #if BUILDFLAG(IS_CHROMEOS_ASH)
  50. chromeos::sensors::SensorHalDispatcher::Initialize();
  51. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  52. sensor_hal_server_ =
  53. std::make_unique<chromeos::sensors::FakeSensorHalServer>();
  54. provider_ = std::make_unique<PlatformSensorProviderChromeOS>();
  55. }
  56. void TearDown() override {
  57. #if BUILDFLAG(IS_CHROMEOS_ASH)
  58. chromeos::sensors::SensorHalDispatcher::Shutdown();
  59. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  60. }
  61. void AddDevice(int32_t iio_device_id,
  62. chromeos::sensors::mojom::DeviceType type,
  63. const absl::optional<std::string>& scale,
  64. const absl::optional<std::string>& location,
  65. std::vector<chromeos::sensors::FakeSensorDevice::ChannelData>
  66. channels_data = {}) {
  67. AddDevice(iio_device_id,
  68. std::set<chromeos::sensors::mojom::DeviceType>{type},
  69. std::move(scale), std::move(location), std::move(channels_data));
  70. }
  71. void AddDevice(int32_t iio_device_id,
  72. std::set<chromeos::sensors::mojom::DeviceType> types,
  73. const absl::optional<std::string>& scale,
  74. const absl::optional<std::string>& location,
  75. std::vector<chromeos::sensors::FakeSensorDevice::ChannelData>
  76. channels_data = {}) {
  77. auto sensor_device = std::make_unique<chromeos::sensors::FakeSensorDevice>(
  78. std::move(channels_data));
  79. if (scale.has_value()) {
  80. sensor_device->SetAttribute(chromeos::sensors::mojom::kScale,
  81. scale.value());
  82. }
  83. if (location.has_value()) {
  84. sensor_device->SetAttribute(chromeos::sensors::mojom::kLocation,
  85. location.value());
  86. }
  87. sensor_devices_.push_back(sensor_device.get());
  88. sensor_hal_server_->GetSensorService()->SetDevice(
  89. iio_device_id, std::move(types), std::move(sensor_device));
  90. }
  91. std::vector<chromeos::sensors::FakeSensorDevice::ChannelData>
  92. GetChannelsWithAxes(const char channels[][10]) {
  93. std::vector<chromeos::sensors::FakeSensorDevice::ChannelData> channels_data(
  94. kNumberOfAxes + 1);
  95. for (uint32_t i = 0; i < kNumberOfAxes; ++i) {
  96. channels_data[i].id = channels[i];
  97. channels_data[i].sample_data = kFakeSampleData;
  98. }
  99. channels_data.back().id = chromeos::sensors::mojom::kTimestampChannel;
  100. channels_data.back().sample_data = kFakeTimestampData;
  101. return channels_data;
  102. }
  103. // Sensor creation is asynchronous, therefore inner loop is used to wait for
  104. // PlatformSensorProvider::CreateSensorCallback completion.
  105. scoped_refptr<PlatformSensor> CreateSensor(mojom::SensorType type) {
  106. scoped_refptr<PlatformSensor> sensor;
  107. base::RunLoop run_loop;
  108. provider_->CreateSensor(type,
  109. base::BindLambdaForTesting(
  110. [&](scoped_refptr<PlatformSensor> new_sensor) {
  111. if (new_sensor)
  112. EXPECT_EQ(type, new_sensor->GetType());
  113. sensor = std::move(new_sensor);
  114. run_loop.Quit();
  115. }));
  116. run_loop.Run();
  117. return sensor;
  118. }
  119. void RegisterSensorHalServer() {
  120. #if BUILDFLAG(IS_CHROMEOS_ASH)
  121. // MojoConnectionServiceProvider::BootstrapMojoConnectionForIioService is
  122. // responsible for calling this outside unit tests.
  123. // This will eventually call PlatformSensorProviderChromeOS::SetUpChannel().
  124. chromeos::sensors::SensorHalDispatcher::GetInstance()->RegisterServer(
  125. sensor_hal_server_->PassRemote());
  126. #else
  127. // As SensorHalDispatcher is only defined in ash, manually setting up Mojo
  128. // connection between |fake_sensor_hal_server_| and |provider_|.
  129. // This code is duplicating what SensorHalDispatcher::EstablishMojoChannel()
  130. // does.
  131. mojo::PendingRemote<chromeos::sensors::mojom::SensorService> pending_remote;
  132. sensor_hal_server_->CreateChannel(
  133. pending_remote.InitWithNewPipeAndPassReceiver());
  134. provider_->SetUpChannel(std::move(pending_remote));
  135. #endif // BUILDFLAG(IS_CHROMEOS_ASH)
  136. }
  137. std::unique_ptr<chromeos::sensors::FakeSensorHalServer> sensor_hal_server_;
  138. std::vector<chromeos::sensors::FakeSensorDevice*> sensor_devices_;
  139. std::unique_ptr<PlatformSensorProviderChromeOS> provider_;
  140. base::test::SingleThreadTaskEnvironment task_environment_;
  141. };
  142. TEST_F(PlatformSensorProviderChromeOSTest, CheckUnsupportedTypes) {
  143. int fake_id = 1;
  144. // Containing at least one supported device type.
  145. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  146. base::NumberToString(kScaleValue),
  147. chromeos::sensors::mojom::kLocationBase);
  148. AddDevice(fake_id++,
  149. std::set<chromeos::sensors::mojom::DeviceType>{
  150. chromeos::sensors::mojom::DeviceType::ANGLVEL,
  151. chromeos::sensors::mojom::DeviceType::COUNT},
  152. base::NumberToString(kScaleValue),
  153. chromeos::sensors::mojom::kLocationBase);
  154. // All device types are unsupported.
  155. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::COUNT,
  156. base::NumberToString(kScaleValue),
  157. chromeos::sensors::mojom::kLocationBase);
  158. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGL,
  159. base::NumberToString(kScaleValue),
  160. chromeos::sensors::mojom::kLocationBase);
  161. AddDevice(fake_id++,
  162. std::set<chromeos::sensors::mojom::DeviceType>{
  163. chromeos::sensors::mojom::DeviceType::ANGL,
  164. chromeos::sensors::mojom::DeviceType::BARO},
  165. base::NumberToString(kScaleValue),
  166. chromeos::sensors::mojom::kLocationBase);
  167. RegisterSensorHalServer();
  168. EXPECT_TRUE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  169. EXPECT_FALSE(provider_->sensors_[1].ignored);
  170. EXPECT_FALSE(provider_->sensors_[2].ignored);
  171. EXPECT_TRUE(provider_->sensors_[3].ignored);
  172. EXPECT_TRUE(provider_->sensors_[4].ignored);
  173. EXPECT_TRUE(provider_->sensors_[5].ignored);
  174. }
  175. TEST_F(PlatformSensorProviderChromeOSTest, MissingScale) {
  176. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  177. /*scale=*/absl::nullopt, chromeos::sensors::mojom::kLocationBase);
  178. RegisterSensorHalServer();
  179. EXPECT_FALSE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  180. }
  181. TEST_F(PlatformSensorProviderChromeOSTest, MissingLocation) {
  182. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  183. base::NumberToString(kScaleValue),
  184. /*location=*/absl::nullopt);
  185. RegisterSensorHalServer();
  186. EXPECT_FALSE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  187. }
  188. TEST_F(PlatformSensorProviderChromeOSTest, WrongScale) {
  189. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  190. kWrongScale, chromeos::sensors::mojom::kLocationBase);
  191. RegisterSensorHalServer();
  192. EXPECT_FALSE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  193. }
  194. TEST_F(PlatformSensorProviderChromeOSTest, WrongLocation) {
  195. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  196. base::NumberToString(kScaleValue), kWrongLocation);
  197. RegisterSensorHalServer();
  198. EXPECT_FALSE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  199. }
  200. TEST_F(PlatformSensorProviderChromeOSTest, CheckMainLocationBase) {
  201. int fake_id = 1;
  202. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  203. base::NumberToString(kScaleValue),
  204. chromeos::sensors::mojom::kLocationBase);
  205. // Will not be used.
  206. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  207. base::NumberToString(kScaleValue),
  208. chromeos::sensors::mojom::kLocationLid);
  209. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  210. base::NumberToString(kScaleValue),
  211. chromeos::sensors::mojom::kLocationBase);
  212. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::MAGN,
  213. base::NumberToString(kScaleValue),
  214. chromeos::sensors::mojom::kLocationBase);
  215. RegisterSensorHalServer();
  216. EXPECT_TRUE(CreateSensor(mojom::SensorType::GYROSCOPE));
  217. // Wait until the disconnect of the gyroscope arrives at FakeSensorDevice.
  218. base::RunLoop().RunUntilIdle();
  219. // Remote stored in |provider_|.
  220. EXPECT_TRUE(sensor_devices_[0]->HasReceivers());
  221. EXPECT_TRUE(sensor_devices_[3]->HasReceivers());
  222. // Removed in |provider_| as it'll never be used.
  223. EXPECT_FALSE(sensor_devices_[1]->HasReceivers());
  224. }
  225. TEST_F(PlatformSensorProviderChromeOSTest, CheckMainLocationLid) {
  226. int fake_id = 1;
  227. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  228. base::NumberToString(kScaleValue),
  229. chromeos::sensors::mojom::kLocationBase);
  230. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  231. base::NumberToString(kScaleValue),
  232. chromeos::sensors::mojom::kLocationLid);
  233. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  234. base::NumberToString(kScaleValue),
  235. chromeos::sensors::mojom::kLocationBase);
  236. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  237. base::NumberToString(kScaleValue),
  238. chromeos::sensors::mojom::kLocationLid);
  239. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::MAGN,
  240. base::NumberToString(kScaleValue),
  241. chromeos::sensors::mojom::kLocationCamera);
  242. RegisterSensorHalServer();
  243. // Wait until the disconnect of the first gyroscope arrives at
  244. // FakeSensorDevice.
  245. base::RunLoop().RunUntilIdle();
  246. // Removed in |provider_| as they'll never be used.
  247. EXPECT_FALSE(sensor_devices_[0]->HasReceivers());
  248. EXPECT_FALSE(sensor_devices_[2]->HasReceivers());
  249. EXPECT_FALSE(sensor_devices_[4]->HasReceivers());
  250. // Remote stored in |provider_|.
  251. EXPECT_TRUE(sensor_devices_[1]->HasReceivers());
  252. EXPECT_TRUE(sensor_devices_[3]->HasReceivers());
  253. }
  254. TEST_F(PlatformSensorProviderChromeOSTest,
  255. CheckMainLocationLidWithMultitypeSensor) {
  256. int fake_id = 1;
  257. AddDevice(fake_id++,
  258. std::set<chromeos::sensors::mojom::DeviceType>{
  259. chromeos::sensors::mojom::DeviceType::ACCEL,
  260. chromeos::sensors::mojom::DeviceType::ANGLVEL},
  261. base::NumberToString(kScaleValue),
  262. chromeos::sensors::mojom::kLocationLid);
  263. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  264. base::NumberToString(kScaleValue),
  265. chromeos::sensors::mojom::kLocationBase);
  266. RegisterSensorHalServer();
  267. // Wait until the disconnect of the gyroscope arrives at FakeSensorDevice.
  268. base::RunLoop().RunUntilIdle();
  269. // Remote stored in |provider_|.
  270. EXPECT_TRUE(sensor_devices_[0]->HasReceivers());
  271. // Removed in |provider_| as it'll never be used.
  272. EXPECT_FALSE(sensor_devices_[1]->HasReceivers());
  273. EXPECT_TRUE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  274. EXPECT_TRUE(CreateSensor(mojom::SensorType::GYROSCOPE));
  275. }
  276. TEST_F(PlatformSensorProviderChromeOSTest, CheckAmbientLightSensorLocationLid) {
  277. int fake_id = 1;
  278. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::LIGHT,
  279. base::NumberToString(kScaleValue),
  280. chromeos::sensors::mojom::kLocationBase);
  281. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::LIGHT,
  282. base::NumberToString(kScaleValue),
  283. chromeos::sensors::mojom::kLocationLid);
  284. RegisterSensorHalServer();
  285. // Wait until the disconnect of the first ambient light sensor arrives at
  286. // FakeSensorDevice.
  287. base::RunLoop().RunUntilIdle();
  288. // Removed in |provider_| as it'll never be used.
  289. EXPECT_FALSE(sensor_devices_[0]->HasReceivers());
  290. // Remote stored in |provider_|.
  291. EXPECT_TRUE(sensor_devices_[1]->HasReceivers());
  292. }
  293. TEST_F(PlatformSensorProviderChromeOSTest,
  294. CheckAmbientLightSensorLocationBase) {
  295. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::LIGHT,
  296. base::NumberToString(kScaleValue),
  297. chromeos::sensors::mojom::kLocationBase);
  298. RegisterSensorHalServer();
  299. EXPECT_TRUE(CreateSensor(mojom::SensorType::AMBIENT_LIGHT));
  300. }
  301. TEST_F(PlatformSensorProviderChromeOSTest, SensorDeviceDisconnect) {
  302. int fake_id = 1;
  303. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  304. base::NumberToString(kScaleValue),
  305. chromeos::sensors::mojom::kLocationLid,
  306. GetChannelsWithAxes(kAccelerometerChannels));
  307. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  308. base::NumberToString(kScaleValue),
  309. chromeos::sensors::mojom::kLocationLid);
  310. RegisterSensorHalServer();
  311. auto accel_lid = CreateSensor(mojom::SensorType::ACCELEROMETER);
  312. EXPECT_TRUE(accel_lid);
  313. // Wait until all tasks are done and no failures occur in |provider_| or
  314. // |accel_lid|.
  315. base::RunLoop().RunUntilIdle();
  316. EXPECT_TRUE(sensor_devices_.front()->HasReceivers());
  317. // Simulate a disconnection of an existing SensorDevice in |provider_|, which
  318. // triggers PlatformSensorProviderChromeOS::OnSensorDeviceDisconnect(). The
  319. // default reason is IIOSERVICE_CRASHED.
  320. sensor_devices_.back()->ClearReceivers();
  321. // Wait until the disconnection is done.
  322. base::RunLoop().RunUntilIdle();
  323. // PlatformSensorProviderChromeOS::OnSensorDeviceDisconnect() resets the
  324. // SensorService Mojo channel.
  325. EXPECT_FALSE(sensor_hal_server_->GetSensorService()->HasReceivers());
  326. // The existing PlatformSensors will also be reset.
  327. EXPECT_FALSE(sensor_devices_.front()->HasReceivers());
  328. }
  329. TEST_F(PlatformSensorProviderChromeOSTest, SensorDeviceDisconnectWithReason) {
  330. int fake_id = 1;
  331. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  332. base::NumberToString(kScaleValue),
  333. chromeos::sensors::mojom::kLocationLid,
  334. GetChannelsWithAxes(kAccelerometerChannels));
  335. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  336. base::NumberToString(kScaleValue),
  337. chromeos::sensors::mojom::kLocationLid,
  338. GetChannelsWithAxes(kGyroscopeChannels));
  339. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  340. base::NumberToString(kScaleValue),
  341. chromeos::sensors::mojom::kLocationBase,
  342. GetChannelsWithAxes(kAccelerometerChannels));
  343. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  344. base::NumberToString(kScaleValue),
  345. chromeos::sensors::mojom::kLocationBase);
  346. RegisterSensorHalServer();
  347. auto accel_lid = CreateSensor(mojom::SensorType::ACCELEROMETER);
  348. EXPECT_TRUE(accel_lid);
  349. base::RunLoop().RunUntilIdle();
  350. // The accelerometer created is on the lid.
  351. EXPECT_TRUE(sensor_devices_[0]->HasReceivers());
  352. EXPECT_FALSE(sensor_devices_[2]->HasReceivers());
  353. auto gyro_lid = CreateSensor(mojom::SensorType::GYROSCOPE);
  354. EXPECT_TRUE(gyro_lid);
  355. FakeClient client(gyro_lid.get());
  356. gyro_lid->AddClient(&client);
  357. PlatformSensorConfiguration config;
  358. config.set_frequency(100);
  359. gyro_lid->StartListening(&client, config);
  360. // Wait until all tasks are done and |gyro_lid| is reading samples.
  361. base::RunLoop().RunUntilIdle();
  362. // Simulate a disconnection of the gyro_lid in |provider_|, which triggers
  363. // PlatformSensorProviderChromeOS::OnSensorDeviceDisconnect(). As the mojo
  364. // pipe is reset with reason: DEVICE_REMOVED, |provider_| will only remove the
  365. // SensorDevice instead of the entire SensorService and the corresponding mojo
  366. // pipes.
  367. EXPECT_TRUE(sensor_devices_[1]->HasReceivers());
  368. EXPECT_FALSE(sensor_devices_[3]->HasReceivers());
  369. sensor_devices_[1]->ClearReceiversWithReason(
  370. chromeos::sensors::mojom::SensorDeviceDisconnectReason::DEVICE_REMOVED,
  371. "Device was removed");
  372. // Wait until the disconnection is done.
  373. base::RunLoop().RunUntilIdle();
  374. // PlatformSensorProviderChromeOS::OnSensorDeviceDisconnect() doesn't reset
  375. // the SensorService Mojo channel with the reason: DEVICE_REMOVED.
  376. EXPECT_TRUE(sensor_hal_server_->GetSensorService()->HasReceivers());
  377. auto accel_base = CreateSensor(mojom::SensorType::ACCELEROMETER);
  378. base::RunLoop().RunUntilIdle();
  379. // The new accelerometer created is on the base, as there are more motion
  380. // sensors on the base now.
  381. EXPECT_FALSE(sensor_devices_[0]->HasReceivers());
  382. EXPECT_TRUE(sensor_devices_[2]->HasReceivers());
  383. EXPECT_FALSE(base::Contains(provider_->sensors_, 2 /* gyro_lid's id */));
  384. EXPECT_EQ(provider_->sensor_id_by_type_[mojom::SensorType::ACCELEROMETER],
  385. 3 /* accel_base's id */);
  386. EXPECT_EQ(provider_->sensor_id_by_type_[mojom::SensorType::GYROSCOPE],
  387. 4 /* accel_base's id */);
  388. }
  389. TEST_F(PlatformSensorProviderChromeOSTest, ReconnectClient) {
  390. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  391. base::NumberToString(kScaleValue),
  392. chromeos::sensors::mojom::kLocationLid);
  393. RegisterSensorHalServer();
  394. EXPECT_TRUE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  395. // Simulate a disconnection between |provider_| and SensorHalDispatcher.
  396. provider_->OnSensorHalClientFailure(base::TimeDelta());
  397. #if BUILDFLAG(IS_CHROMEOS_LACROS)
  398. // Need to manually re-connect the Mojo as SensorHalDispatcher doesn't exist
  399. // in Lacros-Chrome.
  400. RegisterSensorHalServer();
  401. #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
  402. EXPECT_TRUE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  403. }
  404. TEST_F(PlatformSensorProviderChromeOSTest, ReconnectServer) {
  405. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  406. base::NumberToString(kScaleValue),
  407. chromeos::sensors::mojom::kLocationLid);
  408. RegisterSensorHalServer();
  409. EXPECT_TRUE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  410. sensor_hal_server_->OnServerDisconnect();
  411. sensor_hal_server_->GetSensorService()->ClearReceivers();
  412. base::RunLoop().RunUntilIdle();
  413. // Finished simulating a disconnection with IIO Service.
  414. EXPECT_FALSE(provider_->GetSensor(mojom::SensorType::ACCELEROMETER));
  415. RegisterSensorHalServer();
  416. EXPECT_TRUE(CreateSensor(mojom::SensorType::ACCELEROMETER));
  417. }
  418. TEST_F(PlatformSensorProviderChromeOSTest,
  419. CheckLinearAccelerationSensorNotCreatedIfNoAccelerometer) {
  420. RegisterSensorHalServer();
  421. EXPECT_FALSE(CreateSensor(mojom::SensorType::LINEAR_ACCELERATION));
  422. }
  423. TEST_F(PlatformSensorProviderChromeOSTest, CheckLinearAcceleration) {
  424. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  425. base::NumberToString(kScaleValue),
  426. chromeos::sensors::mojom::kLocationBase);
  427. RegisterSensorHalServer();
  428. EXPECT_TRUE(CreateSensor(mojom::SensorType::LINEAR_ACCELERATION));
  429. }
  430. TEST_F(
  431. PlatformSensorProviderChromeOSTest,
  432. CheckAbsoluteOrientationSensorNotCreatedIfNoAccelerometerAndNoMagnetometer) {
  433. RegisterSensorHalServer();
  434. EXPECT_FALSE(
  435. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES));
  436. EXPECT_FALSE(
  437. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION));
  438. }
  439. TEST_F(PlatformSensorProviderChromeOSTest,
  440. CheckAbsoluteOrientationSensorNotCreatedIfNoAccelerometer) {
  441. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::MAGN,
  442. base::NumberToString(kScaleValue),
  443. chromeos::sensors::mojom::kLocationBase);
  444. RegisterSensorHalServer();
  445. EXPECT_FALSE(
  446. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES));
  447. EXPECT_FALSE(
  448. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION));
  449. }
  450. TEST_F(PlatformSensorProviderChromeOSTest,
  451. CheckAbsoluteOrientationSensorNotCreatedIfNoMagnetometer) {
  452. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  453. base::NumberToString(kScaleValue),
  454. chromeos::sensors::mojom::kLocationBase);
  455. RegisterSensorHalServer();
  456. EXPECT_FALSE(
  457. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES));
  458. EXPECT_FALSE(
  459. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION));
  460. }
  461. TEST_F(PlatformSensorProviderChromeOSTest, CheckAbsoluteOrientationSensors) {
  462. int fake_id = 1;
  463. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  464. base::NumberToString(kScaleValue),
  465. chromeos::sensors::mojom::kLocationBase);
  466. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::MAGN,
  467. base::NumberToString(kScaleValue),
  468. chromeos::sensors::mojom::kLocationBase);
  469. RegisterSensorHalServer();
  470. EXPECT_TRUE(
  471. CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES));
  472. EXPECT_TRUE(CreateSensor(mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION));
  473. }
  474. TEST_F(
  475. PlatformSensorProviderChromeOSTest,
  476. CheckRelativeOrientationSensorNotCreatedIfNoAccelerometerAndNoGyroscope) {
  477. RegisterSensorHalServer();
  478. EXPECT_FALSE(
  479. CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_EULER_ANGLES));
  480. EXPECT_FALSE(
  481. CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_QUATERNION));
  482. }
  483. TEST_F(PlatformSensorProviderChromeOSTest,
  484. CheckRelativeOrientationSensorNotCreatedIfNoAccelerometer) {
  485. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  486. base::NumberToString(kScaleValue),
  487. chromeos::sensors::mojom::kLocationBase);
  488. RegisterSensorHalServer();
  489. EXPECT_FALSE(
  490. CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_EULER_ANGLES));
  491. EXPECT_FALSE(
  492. CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_QUATERNION));
  493. }
  494. TEST_F(PlatformSensorProviderChromeOSTest,
  495. CheckRelativeOrientationSensorUsingAccelerometer) {
  496. AddDevice(kFakeDeviceId, chromeos::sensors::mojom::DeviceType::ACCEL,
  497. base::NumberToString(kScaleValue),
  498. chromeos::sensors::mojom::kLocationBase);
  499. RegisterSensorHalServer();
  500. EXPECT_TRUE(
  501. CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_EULER_ANGLES));
  502. EXPECT_TRUE(CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_QUATERNION));
  503. }
  504. TEST_F(PlatformSensorProviderChromeOSTest,
  505. CheckRelativeOrientationSensorUsingAccelerometerAndGyroscope) {
  506. int fake_id = 1;
  507. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  508. base::NumberToString(kScaleValue),
  509. chromeos::sensors::mojom::kLocationBase);
  510. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  511. base::NumberToString(kScaleValue),
  512. chromeos::sensors::mojom::kLocationBase);
  513. RegisterSensorHalServer();
  514. EXPECT_TRUE(
  515. CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_EULER_ANGLES));
  516. EXPECT_TRUE(CreateSensor(mojom::SensorType::RELATIVE_ORIENTATION_QUATERNION));
  517. }
  518. TEST_F(PlatformSensorProviderChromeOSTest, LatePresentMotionSensors) {
  519. int fake_id = 1;
  520. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  521. base::NumberToString(kScaleValue),
  522. chromeos::sensors::mojom::kLocationBase,
  523. GetChannelsWithAxes(kAccelerometerChannels));
  524. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ACCEL,
  525. base::NumberToString(kScaleValue),
  526. chromeos::sensors::mojom::kLocationLid,
  527. GetChannelsWithAxes(kAccelerometerChannels));
  528. RegisterSensorHalServer();
  529. // Wait until the disconnect of the accelerometer_base arrives at
  530. // FakeSensorDevice.
  531. base::RunLoop().RunUntilIdle();
  532. // Removed in |provider_| as it'll never be used.
  533. EXPECT_FALSE(sensor_devices_[0]->HasReceivers());
  534. // Remote stored in |provider_|.
  535. EXPECT_TRUE(sensor_devices_[1]->HasReceivers());
  536. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  537. base::NumberToString(kScaleValue),
  538. chromeos::sensors::mojom::kLocationBase,
  539. GetChannelsWithAxes(kGyroscopeChannels));
  540. // Wait until |provider_| is notifies that the device is present.
  541. base::RunLoop().RunUntilIdle();
  542. auto accel_base = CreateSensor(mojom::SensorType::ACCELEROMETER);
  543. EXPECT_TRUE(accel_base);
  544. // Wait until all tasks are done and no failures occur in |provider_| or
  545. // |accel_base|.
  546. base::RunLoop().RunUntilIdle();
  547. // Motion sensors on base are used. Accelerometer on lid is reset.
  548. EXPECT_TRUE(sensor_devices_[0]->HasReceivers());
  549. EXPECT_FALSE(sensor_devices_[1]->HasReceivers());
  550. EXPECT_TRUE(sensor_devices_[2]->HasReceivers());
  551. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::ANGLVEL,
  552. base::NumberToString(kScaleValue),
  553. chromeos::sensors::mojom::kLocationLid,
  554. GetChannelsWithAxes(kGyroscopeChannels));
  555. // Wait until |provider_| is notifies that the device is present.
  556. base::RunLoop().RunUntilIdle();
  557. auto accel_lid = CreateSensor(mojom::SensorType::ACCELEROMETER);
  558. EXPECT_TRUE(accel_lid);
  559. // Wait until all tasks are done and no failures occur in |provider_| or
  560. // |accel_lid|.
  561. base::RunLoop().RunUntilIdle();
  562. // Motion sensors on lid are used. Gyroscope on base is reset.
  563. EXPECT_FALSE(sensor_devices_[0]->HasReceivers());
  564. EXPECT_TRUE(sensor_devices_[1]->HasReceivers());
  565. EXPECT_FALSE(sensor_devices_[2]->HasReceivers());
  566. EXPECT_TRUE(sensor_devices_[3]->HasReceivers());
  567. accel_base.reset();
  568. // Wait until all tasks are done and no failures occur.
  569. base::RunLoop().RunUntilIdle();
  570. }
  571. TEST_F(PlatformSensorProviderChromeOSTest, LatePresentLightSensors) {
  572. int fake_id = 1;
  573. std::vector<chromeos::sensors::FakeSensorDevice::ChannelData> channels_data(
  574. 2);
  575. channels_data.front().id = chromeos::sensors::mojom::kLightChannel;
  576. channels_data.front().sample_data = kFakeSampleData;
  577. channels_data.back().id = chromeos::sensors::mojom::kTimestampChannel;
  578. channels_data.back().sample_data = kFakeTimestampData;
  579. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::LIGHT,
  580. base::NumberToString(kScaleValue),
  581. chromeos::sensors::mojom::kLocationBase, channels_data);
  582. RegisterSensorHalServer();
  583. auto light_base = CreateSensor(mojom::SensorType::AMBIENT_LIGHT);
  584. EXPECT_TRUE(light_base);
  585. EXPECT_TRUE(sensor_devices_[0]->HasReceivers());
  586. AddDevice(fake_id++, chromeos::sensors::mojom::DeviceType::LIGHT,
  587. base::NumberToString(kScaleValue),
  588. chromeos::sensors::mojom::kLocationLid, channels_data);
  589. // Wait until |provider_| finishes processing the new device.
  590. base::RunLoop().RunUntilIdle();
  591. // Test PlatformSensorProviderBase::NotifySensorCreated on different sensors
  592. // of the same type.
  593. auto light_lid = CreateSensor(mojom::SensorType::AMBIENT_LIGHT);
  594. EXPECT_TRUE(light_lid);
  595. // Wait until all tasks are done and no failures occur in |provider_| or
  596. // |light_lid|.
  597. base::RunLoop().RunUntilIdle();
  598. // The light sensor on lid is used in |light_lid|.
  599. EXPECT_TRUE(sensor_devices_[1]->HasReceivers());
  600. // The light sensor on base is not used after being overridden in
  601. // |light_base|.
  602. EXPECT_FALSE(sensor_devices_[0]->HasReceivers());
  603. // Test the usage of |light_base->reading_buffer_|.
  604. SensorReading result;
  605. EXPECT_FALSE(light_base->GetLatestReading(&result));
  606. // Test PlatformSensorProviderBase::RemoveSensor on different sensors of the
  607. // same type.
  608. light_base.reset();
  609. // Wait until all tasks are done and no failures occur.
  610. base::RunLoop().RunUntilIdle();
  611. }
  612. } // namespace device