accelerometer_samples_observer_unittest.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 "ash/accelerometer/accelerometer_samples_observer.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "ash/accelerometer/accelerometer_constants.h"
  8. #include "base/bind.h"
  9. #include "base/run_loop.h"
  10. #include "base/test/task_environment.h"
  11. #include "chromeos/components/sensors/fake_sensor_device.h"
  12. #include "mojo/public/cpp/bindings/remote.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. namespace ash {
  15. namespace {
  16. constexpr int kFakeAccelerometerId = 1;
  17. constexpr int64_t kFakeSampleData[] = {1, 2, 3};
  18. constexpr double kFakeScaleValue = 10.0;
  19. class AccelerometerSamplesObserverTest : public ::testing::Test {
  20. protected:
  21. void SetChannels(uint32_t num_of_axes) {
  22. CHECK_LE(num_of_axes, kNumberOfAxes);
  23. std::vector<chromeos::sensors::FakeSensorDevice::ChannelData> channels_data(
  24. num_of_axes);
  25. for (uint32_t i = 0; i < num_of_axes; ++i) {
  26. channels_data[i].id = kAccelerometerChannels[i];
  27. channels_data[i].sample_data = kFakeSampleData[i];
  28. }
  29. sensor_device_ = std::make_unique<chromeos::sensors::FakeSensorDevice>(
  30. std::move(channels_data));
  31. }
  32. void SetObserver(
  33. mojo::Remote<chromeos::sensors::mojom::SensorDevice> accelerometer) {
  34. observer_ = std::make_unique<AccelerometerSamplesObserver>(
  35. kFakeAccelerometerId, std::move(accelerometer), kFakeScaleValue,
  36. base::BindRepeating(
  37. &AccelerometerSamplesObserverTest::OnSampleUpdatedCallback,
  38. base::Unretained(this)));
  39. }
  40. void OnSampleUpdatedCallback(int iio_device_id, std::vector<float> sample) {
  41. EXPECT_EQ(iio_device_id, kFakeAccelerometerId);
  42. EXPECT_EQ(sample.size(), kNumberOfAxes);
  43. for (uint32_t i = 0; i < kNumberOfAxes; ++i)
  44. EXPECT_EQ(sample[i], kFakeSampleData[i] * kFakeScaleValue);
  45. ++num_samples_;
  46. }
  47. void DisableFirstChannel(mojo::ReceiverId id) {
  48. sensor_device_->SetChannelsEnabledWithId(id, {0}, false);
  49. }
  50. std::unique_ptr<chromeos::sensors::FakeSensorDevice> sensor_device_;
  51. std::unique_ptr<AccelerometerSamplesObserver> observer_;
  52. int num_samples_ = 0;
  53. base::test::SingleThreadTaskEnvironment task_environment;
  54. };
  55. TEST_F(AccelerometerSamplesObserverTest, MissingChannels) {
  56. SetChannels(kNumberOfAxes - 1);
  57. mojo::Remote<chromeos::sensors::mojom::SensorDevice> accelerometer;
  58. sensor_device_->AddReceiver(accelerometer.BindNewPipeAndPassReceiver());
  59. SetObserver(std::move(accelerometer));
  60. // Wait until the mojo connection is reset.
  61. base::RunLoop().RunUntilIdle();
  62. EXPECT_FALSE(sensor_device_->HasReceivers());
  63. }
  64. TEST_F(AccelerometerSamplesObserverTest, StartReadingTwiceError) {
  65. SetChannels(kNumberOfAxes);
  66. mojo::Remote<chromeos::sensors::mojom::SensorDevice> accelerometer;
  67. sensor_device_->AddReceiver(accelerometer.BindNewPipeAndPassReceiver());
  68. mojo::PendingRemote<chromeos::sensors::mojom::SensorDeviceSamplesObserver>
  69. pending_remote;
  70. auto null_receiver = pending_remote.InitWithNewPipeAndPassReceiver();
  71. accelerometer->StartReadingSamples(std::move(pending_remote));
  72. SetObserver(std::move(accelerometer));
  73. // Wait until the mojo connection is reset.
  74. base::RunLoop().RunUntilIdle();
  75. EXPECT_FALSE(sensor_device_->HasReceivers());
  76. }
  77. TEST_F(AccelerometerSamplesObserverTest, GetSamples) {
  78. SetChannels(kNumberOfAxes);
  79. mojo::Remote<chromeos::sensors::mojom::SensorDevice> accelerometer;
  80. auto id =
  81. sensor_device_->AddReceiver(accelerometer.BindNewPipeAndPassReceiver());
  82. SetObserver(std::move(accelerometer));
  83. observer_->SetEnabled(true);
  84. // Wait until a sample is received.
  85. base::RunLoop().RunUntilIdle();
  86. EXPECT_TRUE(sensor_device_->HasReceivers());
  87. EXPECT_EQ(num_samples_, 1);
  88. DisableFirstChannel(id);
  89. // Wait until a sample is received.
  90. base::RunLoop().RunUntilIdle();
  91. EXPECT_TRUE(sensor_device_->HasReceivers());
  92. // The updated sample is not sent to |OnSampleUpdatedCallback|.
  93. EXPECT_EQ(num_samples_, 1);
  94. // Simulate a disconnection of the observer's mojo channel in IIO Service.
  95. sensor_device_->ResetObserverRemote(id);
  96. // Wait until the disconnection is done.
  97. base::RunLoop().RunUntilIdle();
  98. // OnObserverDisconnect shouldn't reset SensorDevice's mojo endpoint so that
  99. // AccelerometerProviderMojo can get the disconnection.
  100. EXPECT_TRUE(sensor_device_->HasReceivers());
  101. }
  102. } // namespace
  103. } // namespace ash