blob: aff18a32555cd78bc7e18fc1de43e45c4f96fd57 [file] [log] [blame]
Enrico Granata7a622342019-05-21 11:10:59 -07001// Copyright 2019 The Chromium OS 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
Enrico Granata10e19de2019-05-21 14:17:36 -07005#include <base/files/file_util.h>
6
Enrico Granata7a622342019-05-21 11:10:59 -07007#include <gtest/gtest.h>
8
Enrico Granata51cdb942019-06-18 16:40:17 -07009#include <libmems/iio_context.h>
10#include <libmems/iio_device.h>
Enrico Granata9bb17522019-06-28 17:22:42 -070011#include <libmems/test_fakes.h>
Enrico Granata7a622342019-05-21 11:10:59 -070012#include "mems_setup/configuration.h"
13#include "mems_setup/delegate.h"
Enrico Granata064a25c2019-07-15 15:48:03 -070014#include "mems_setup/sensor_location.h"
Enrico Granata9bb17522019-06-28 17:22:42 -070015#include "mems_setup/test_fakes.h"
Enrico Granata7a622342019-05-21 11:10:59 -070016#include "mems_setup/test_helper.h"
Enrico Granata7a622342019-05-21 11:10:59 -070017
Enrico Granata9bb17522019-06-28 17:22:42 -070018using libmems::fakes::FakeIioChannel;
19using libmems::fakes::FakeIioContext;
20using libmems::fakes::FakeIioDevice;
21using mems_setup::fakes::FakeDelegate;
Enrico Granata7a622342019-05-21 11:10:59 -070022using mems_setup::testing::SensorTestBase;
23
24namespace mems_setup {
25
26namespace {
27
Enrico Granata10e19de2019-05-21 14:17:36 -070028static gid_t kChronosGroupId = 666;
Enrico Granatafc2e3472019-07-16 11:23:25 -070029static gid_t kPowerGroupId = 999;
Enrico Granata10e19de2019-05-21 14:17:36 -070030
Enrico Granata7a622342019-05-21 11:10:59 -070031class AccelerometerTest : public SensorTestBase {
32 public:
33 AccelerometerTest()
Harvey Yang0c0dab52019-11-18 12:04:30 +080034 : SensorTestBase("cros-ec-accel", 1, SensorKind::ACCELEROMETER) {
Enrico Granata10e19de2019-05-21 14:17:36 -070035 mock_delegate_->AddGroup("chronos", kChronosGroupId);
36 }
Enrico Granata7a622342019-05-21 11:10:59 -070037};
38
39TEST_F(AccelerometerTest, MissingVpd) {
Enrico Granata064a25c2019-07-15 15:48:03 -070040 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -070041 ConfigureVpd({{"in_accel_x_base_calibbias", "100"}});
42
43 EXPECT_TRUE(GetConfiguration()->Configure());
44
45 EXPECT_TRUE(
46 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").has_value());
47 EXPECT_EQ(
48 100,
Gwendal Grignouaee37402019-12-18 23:51:43 -080049 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").value());
Enrico Granata7a622342019-05-21 11:10:59 -070050 EXPECT_FALSE(
51 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").has_value());
52 EXPECT_FALSE(
53 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").has_value());
54}
55
56TEST_F(AccelerometerTest, NotNumericVpd) {
Enrico Granata064a25c2019-07-15 15:48:03 -070057 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -070058 ConfigureVpd({{"in_accel_x_base_calibbias", "blah"},
Gwendal Grignou4bf5ae62020-01-06 14:16:47 -080059 {"in_accel_y_base_calibbias", "100"}});
Enrico Granata7a622342019-05-21 11:10:59 -070060
61 EXPECT_TRUE(GetConfiguration()->Configure());
62
63 EXPECT_FALSE(
64 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").has_value());
65 EXPECT_TRUE(
66 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").has_value());
Gwendal Grignou4bf5ae62020-01-06 14:16:47 -080067 EXPECT_EQ(100,
Enrico Granata7a622342019-05-21 11:10:59 -070068 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").value());
69 EXPECT_FALSE(
70 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").has_value());
71}
72
73TEST_F(AccelerometerTest, VpdOutOfRange) {
Enrico Granata064a25c2019-07-15 15:48:03 -070074 SetSingleSensor(kBaseSensorLocation);
Gwendal Grignou4bf5ae62020-01-06 14:16:47 -080075 ConfigureVpd({{"in_accel_x_base_calibbias", "104"}, // just above .100g.
76 {"in_accel_y_base_calibbias", "100"},
Enrico Granata7a622342019-05-21 11:10:59 -070077 {"in_accel_z_base_calibbias", "85"}});
78
79 EXPECT_TRUE(GetConfiguration()->Configure());
80
81 EXPECT_FALSE(
82 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").has_value());
Gwendal Grignou4460a0d2020-01-06 14:07:00 -080083 EXPECT_FALSE(
Enrico Granata7a622342019-05-21 11:10:59 -070084 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").has_value());
Gwendal Grignou4460a0d2020-01-06 14:07:00 -080085 EXPECT_FALSE(
Enrico Granata7a622342019-05-21 11:10:59 -070086 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").has_value());
Enrico Granata7a622342019-05-21 11:10:59 -070087}
88
Enrico Granatafc7227d2019-07-26 13:51:19 -070089TEST_F(AccelerometerTest, CalibscaleData) {
90 SetSingleSensor(kBaseSensorLocation);
91 ConfigureVpd({{"in_accel_x_base_calibscale", "5"},
92 {"in_accel_y_base_calibscale", "6"},
93 {"in_accel_z_base_calibscale", "7"}});
94
95 EXPECT_TRUE(GetConfiguration()->Configure());
96
97 EXPECT_TRUE(
98 mock_device_->ReadNumberAttribute("in_accel_x_calibscale").has_value());
99 EXPECT_TRUE(
100 mock_device_->ReadNumberAttribute("in_accel_y_calibscale").has_value());
101 EXPECT_TRUE(
102 mock_device_->ReadNumberAttribute("in_accel_z_calibscale").has_value());
103
104 EXPECT_EQ(
105 5,
Gwendal Grignouaee37402019-12-18 23:51:43 -0800106 mock_device_->ReadNumberAttribute("in_accel_x_calibscale").value());
Enrico Granatafc7227d2019-07-26 13:51:19 -0700107 EXPECT_EQ(
108 6,
Gwendal Grignouaee37402019-12-18 23:51:43 -0800109 mock_device_->ReadNumberAttribute("in_accel_y_calibscale").value());
Enrico Granatafc7227d2019-07-26 13:51:19 -0700110 EXPECT_EQ(
111 7,
Gwendal Grignouaee37402019-12-18 23:51:43 -0800112 mock_device_->ReadNumberAttribute("in_accel_z_calibscale").value());
113}
114
115TEST_F(AccelerometerTest, CalibscaleZeroData) {
116 SetSingleSensor(kBaseSensorLocation);
117 ConfigureVpd({{"in_accel_x_base_calibscale", "5"},
118 {"in_accel_y_base_calibscale", "6"},
119 {"in_accel_z_base_calibscale", "0"}});
120
121 EXPECT_TRUE(GetConfiguration()->Configure());
122
123 EXPECT_TRUE(
124 mock_device_->ReadNumberAttribute("in_accel_x_calibscale").has_value());
125 EXPECT_TRUE(
126 mock_device_->ReadNumberAttribute("in_accel_y_calibscale").has_value());
127 EXPECT_TRUE(
128 mock_device_->ReadNumberAttribute("in_accel_z_calibscale").has_value());
129
130 EXPECT_EQ(
131 5,
132 mock_device_->ReadNumberAttribute("in_accel_x_calibscale").value());
133 EXPECT_EQ(
134 6,
135 mock_device_->ReadNumberAttribute("in_accel_y_calibscale").value());
136 EXPECT_EQ(
137 0,
138 mock_device_->ReadNumberAttribute("in_accel_z_calibscale").value());
Enrico Granatafc7227d2019-07-26 13:51:19 -0700139}
140
Enrico Granata7a622342019-05-21 11:10:59 -0700141TEST_F(AccelerometerTest, NotLoadingTriggerModule) {
Enrico Granata064a25c2019-07-15 15:48:03 -0700142 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -0700143 ConfigureVpd({{"in_accel_x_base_calibbias", "50"},
Gwendal Grignou4bf5ae62020-01-06 14:16:47 -0800144 {"in_accel_y_base_calibbias", "100"},
Enrico Granata7a622342019-05-21 11:10:59 -0700145 {"in_accel_z_base_calibbias", "85"}});
146
147 EXPECT_TRUE(GetConfiguration()->Configure());
148
149 EXPECT_EQ(0, mock_delegate_->GetNumModulesProbed());
150}
151
152TEST_F(AccelerometerTest, MultipleSensorDevice) {
Enrico Granata064a25c2019-07-15 15:48:03 -0700153 SetSharedSensor();
Enrico Granata7a622342019-05-21 11:10:59 -0700154 ConfigureVpd({{"in_accel_x_base_calibbias", "50"},
Gwendal Grignou4bf5ae62020-01-06 14:16:47 -0800155 {"in_accel_y_base_calibbias", "100"},
Enrico Granata7a622342019-05-21 11:10:59 -0700156 {"in_accel_z_base_calibbias", "85"},
157 {"in_accel_y_lid_calibbias", "27"}});
158
159 EXPECT_TRUE(GetConfiguration()->Configure());
160
161 EXPECT_EQ(
162 50,
163 mock_device_->ReadNumberAttribute("in_accel_x_base_calibbias").value());
164 EXPECT_EQ(
Gwendal Grignou4bf5ae62020-01-06 14:16:47 -0800165 100,
Enrico Granata7a622342019-05-21 11:10:59 -0700166 mock_device_->ReadNumberAttribute("in_accel_y_base_calibbias").value());
167 EXPECT_EQ(
168 85,
169 mock_device_->ReadNumberAttribute("in_accel_z_base_calibbias").value());
170
171 EXPECT_FALSE(mock_device_->ReadNumberAttribute("in_accel_x_lid_calibbias")
172 .has_value());
173 EXPECT_EQ(
174 27,
175 mock_device_->ReadNumberAttribute("in_accel_y_lid_calibbias").value());
176 EXPECT_FALSE(mock_device_->ReadNumberAttribute("in_accel_z_lid_calibbias")
177 .has_value());
178}
179
Enrico Granata10e19de2019-05-21 14:17:36 -0700180TEST_F(AccelerometerTest, TriggerPermissions) {
Enrico Granata064a25c2019-07-15 15:48:03 -0700181 SetSingleSensor(kLidSensorLocation);
Enrico Granata10e19de2019-05-21 14:17:36 -0700182 EXPECT_TRUE(GetConfiguration()->Configure());
183
184 base::FilePath trigger_now = mock_trigger0_->GetPath().Append("trigger_now");
185 EXPECT_NE(0, mock_delegate_->GetPermissions(trigger_now) &
186 base::FILE_PERMISSION_WRITE_BY_GROUP);
187 gid_t gid = 0;
188 mock_delegate_->GetOwnership(trigger_now, nullptr, &gid);
189 EXPECT_EQ(kChronosGroupId, gid);
190}
191
Enrico Granata064a25c2019-07-15 15:48:03 -0700192TEST_F(AccelerometerTest, SingleSensorEnableChannels) {
193 SetSingleSensor(kLidSensorLocation);
194 EXPECT_TRUE(GetConfiguration()->Configure());
195
196 for (const auto& channel : channels_) {
197 EXPECT_EQ(channel->IsEnabled(), 0 != strcmp(channel->GetId(), "timestamp"));
198 }
199}
200
201TEST_F(AccelerometerTest, MultipleSensorEnableChannels) {
202 SetSharedSensor();
203 EXPECT_TRUE(GetConfiguration()->Configure());
204
205 for (const auto& channel : channels_) {
206 EXPECT_EQ(channel->IsEnabled(), 0 != strcmp(channel->GetId(), "timestamp"));
207 }
208}
209
210TEST_F(AccelerometerTest, BufferEnabled) {
Enrico Granatafc2e3472019-07-16 11:23:25 -0700211 SetSingleSensor(kLidSensorLocation);
Enrico Granata064a25c2019-07-15 15:48:03 -0700212 EXPECT_FALSE(mock_device_->IsBufferEnabled());
213
214 EXPECT_TRUE(GetConfiguration()->Configure());
215
216 size_t accel_buffer_len = 0;
217 EXPECT_TRUE(mock_device_->IsBufferEnabled(&accel_buffer_len));
218 EXPECT_EQ(1, accel_buffer_len);
219}
220
Enrico Granatafc2e3472019-07-16 11:23:25 -0700221TEST_F(AccelerometerTest, SingleSensorKbWakeAnglePermissions) {
222 base::FilePath kb_path("/sys/class/chromeos/cros_ec/kb_wake_angle");
223
224 SetSingleSensor(kLidSensorLocation);
225 mock_delegate_->CreateFile(kb_path);
226 mock_delegate_->AddGroup("power", kPowerGroupId);
227 EXPECT_TRUE(GetConfiguration()->Configure());
228
229 EXPECT_NE(0, mock_delegate_->GetPermissions(kb_path) &
230 base::FILE_PERMISSION_WRITE_BY_GROUP);
231 gid_t gid = 0;
232 mock_delegate_->GetOwnership(kb_path, nullptr, &gid);
233 EXPECT_EQ(kPowerGroupId, gid);
234}
235
236TEST_F(AccelerometerTest, SharedSensorKbWakeAnglePermissions) {
237 base::FilePath kb_path = mock_device_->GetPath().Append("in_angl_offset");
238
239 SetSharedSensor();
240 mock_delegate_->CreateFile(kb_path);
241 mock_delegate_->AddGroup("power", kPowerGroupId);
242 EXPECT_TRUE(GetConfiguration()->Configure());
243
244 EXPECT_NE(0, mock_delegate_->GetPermissions(kb_path) &
245 base::FILE_PERMISSION_WRITE_BY_GROUP);
246 gid_t gid = 0;
247 mock_delegate_->GetOwnership(kb_path, nullptr, &gid);
248 EXPECT_EQ(kPowerGroupId, gid);
249}
250
Enrico Granata5da6b1d2019-07-16 11:25:55 -0700251TEST_F(AccelerometerTest, OkWithTrigger0Defined) {
252 SetSingleSensor(kLidSensorLocation);
253
Harvey Yang0c0dab52019-11-18 12:04:30 +0800254 mock_context_->AddTrigger(mock_trigger0_.get());
Enrico Granata5da6b1d2019-07-16 11:25:55 -0700255
256 EXPECT_TRUE(GetConfiguration()->Configure());
257}
258
Enrico Granata7a622342019-05-21 11:10:59 -0700259} // namespace
260
261} // namespace mems_setup