blob: 309ce893b0dad0e89a1d124d9ce0c76ef52b9c66 [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()
34 : SensorTestBase(
Enrico Granata10e19de2019-05-21 14:17:36 -070035 "cros-ec-accel", "iio:device1", SensorKind::ACCELEROMETER) {
36 mock_delegate_->AddGroup("chronos", kChronosGroupId);
37 }
Enrico Granata7a622342019-05-21 11:10:59 -070038};
39
40TEST_F(AccelerometerTest, MissingVpd) {
Enrico Granata064a25c2019-07-15 15:48:03 -070041 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -070042 ConfigureVpd({{"in_accel_x_base_calibbias", "100"}});
43
44 EXPECT_TRUE(GetConfiguration()->Configure());
45
46 EXPECT_TRUE(
47 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").has_value());
48 EXPECT_EQ(
49 100,
50 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").value_or(0));
51 EXPECT_FALSE(
52 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").has_value());
53 EXPECT_FALSE(
54 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").has_value());
55}
56
57TEST_F(AccelerometerTest, NotNumericVpd) {
Enrico Granata064a25c2019-07-15 15:48:03 -070058 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -070059 ConfigureVpd({{"in_accel_x_base_calibbias", "blah"},
60 {"in_accel_y_base_calibbias", "104"}});
61
62 EXPECT_TRUE(GetConfiguration()->Configure());
63
64 EXPECT_FALSE(
65 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").has_value());
66 EXPECT_TRUE(
67 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").has_value());
68 EXPECT_EQ(104,
69 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").value());
70 EXPECT_FALSE(
71 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").has_value());
72}
73
74TEST_F(AccelerometerTest, VpdOutOfRange) {
Enrico Granata064a25c2019-07-15 15:48:03 -070075 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -070076 ConfigureVpd({{"in_accel_x_base_calibbias", "123456789"},
77 {"in_accel_y_base_calibbias", "104"},
78 {"in_accel_z_base_calibbias", "85"}});
79
80 EXPECT_TRUE(GetConfiguration()->Configure());
81
82 EXPECT_FALSE(
83 mock_device_->ReadNumberAttribute("in_accel_x_calibbias").has_value());
84 EXPECT_TRUE(
85 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").has_value());
86 EXPECT_TRUE(
87 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").has_value());
88
89 EXPECT_EQ(104,
90 mock_device_->ReadNumberAttribute("in_accel_y_calibbias").value());
91 EXPECT_EQ(85,
92 mock_device_->ReadNumberAttribute("in_accel_z_calibbias").value());
93}
94
Enrico Granatafc7227d2019-07-26 13:51:19 -070095TEST_F(AccelerometerTest, CalibscaleData) {
96 SetSingleSensor(kBaseSensorLocation);
97 ConfigureVpd({{"in_accel_x_base_calibscale", "5"},
98 {"in_accel_y_base_calibscale", "6"},
99 {"in_accel_z_base_calibscale", "7"}});
100
101 EXPECT_TRUE(GetConfiguration()->Configure());
102
103 EXPECT_TRUE(
104 mock_device_->ReadNumberAttribute("in_accel_x_calibscale").has_value());
105 EXPECT_TRUE(
106 mock_device_->ReadNumberAttribute("in_accel_y_calibscale").has_value());
107 EXPECT_TRUE(
108 mock_device_->ReadNumberAttribute("in_accel_z_calibscale").has_value());
109
110 EXPECT_EQ(
111 5,
112 mock_device_->ReadNumberAttribute("in_accel_x_calibscale").value_or(0));
113 EXPECT_EQ(
114 6,
115 mock_device_->ReadNumberAttribute("in_accel_y_calibscale").value_or(0));
116 EXPECT_EQ(
117 7,
118 mock_device_->ReadNumberAttribute("in_accel_z_calibscale").value_or(0));
119}
120
Enrico Granata7a622342019-05-21 11:10:59 -0700121TEST_F(AccelerometerTest, NotLoadingTriggerModule) {
Enrico Granata064a25c2019-07-15 15:48:03 -0700122 SetSingleSensor(kBaseSensorLocation);
Enrico Granata7a622342019-05-21 11:10:59 -0700123 ConfigureVpd({{"in_accel_x_base_calibbias", "50"},
124 {"in_accel_y_base_calibbias", "104"},
125 {"in_accel_z_base_calibbias", "85"}});
126
127 EXPECT_TRUE(GetConfiguration()->Configure());
128
129 EXPECT_EQ(0, mock_delegate_->GetNumModulesProbed());
130}
131
132TEST_F(AccelerometerTest, MultipleSensorDevice) {
Enrico Granata064a25c2019-07-15 15:48:03 -0700133 SetSharedSensor();
Enrico Granata7a622342019-05-21 11:10:59 -0700134 ConfigureVpd({{"in_accel_x_base_calibbias", "50"},
135 {"in_accel_y_base_calibbias", "104"},
136 {"in_accel_z_base_calibbias", "85"},
137 {"in_accel_y_lid_calibbias", "27"}});
138
139 EXPECT_TRUE(GetConfiguration()->Configure());
140
141 EXPECT_EQ(
142 50,
143 mock_device_->ReadNumberAttribute("in_accel_x_base_calibbias").value());
144 EXPECT_EQ(
145 104,
146 mock_device_->ReadNumberAttribute("in_accel_y_base_calibbias").value());
147 EXPECT_EQ(
148 85,
149 mock_device_->ReadNumberAttribute("in_accel_z_base_calibbias").value());
150
151 EXPECT_FALSE(mock_device_->ReadNumberAttribute("in_accel_x_lid_calibbias")
152 .has_value());
153 EXPECT_EQ(
154 27,
155 mock_device_->ReadNumberAttribute("in_accel_y_lid_calibbias").value());
156 EXPECT_FALSE(mock_device_->ReadNumberAttribute("in_accel_z_lid_calibbias")
157 .has_value());
158}
159
Enrico Granata10e19de2019-05-21 14:17:36 -0700160TEST_F(AccelerometerTest, TriggerPermissions) {
Enrico Granata064a25c2019-07-15 15:48:03 -0700161 SetSingleSensor(kLidSensorLocation);
Enrico Granata10e19de2019-05-21 14:17:36 -0700162 EXPECT_TRUE(GetConfiguration()->Configure());
163
164 base::FilePath trigger_now = mock_trigger0_->GetPath().Append("trigger_now");
165 EXPECT_NE(0, mock_delegate_->GetPermissions(trigger_now) &
166 base::FILE_PERMISSION_WRITE_BY_GROUP);
167 gid_t gid = 0;
168 mock_delegate_->GetOwnership(trigger_now, nullptr, &gid);
169 EXPECT_EQ(kChronosGroupId, gid);
170}
171
Enrico Granata064a25c2019-07-15 15:48:03 -0700172TEST_F(AccelerometerTest, SingleSensorEnableChannels) {
173 SetSingleSensor(kLidSensorLocation);
174 EXPECT_TRUE(GetConfiguration()->Configure());
175
176 for (const auto& channel : channels_) {
177 EXPECT_EQ(channel->IsEnabled(), 0 != strcmp(channel->GetId(), "timestamp"));
178 }
179}
180
181TEST_F(AccelerometerTest, MultipleSensorEnableChannels) {
182 SetSharedSensor();
183 EXPECT_TRUE(GetConfiguration()->Configure());
184
185 for (const auto& channel : channels_) {
186 EXPECT_EQ(channel->IsEnabled(), 0 != strcmp(channel->GetId(), "timestamp"));
187 }
188}
189
190TEST_F(AccelerometerTest, BufferEnabled) {
Enrico Granatafc2e3472019-07-16 11:23:25 -0700191 SetSingleSensor(kLidSensorLocation);
Enrico Granata064a25c2019-07-15 15:48:03 -0700192 EXPECT_FALSE(mock_device_->IsBufferEnabled());
193
194 EXPECT_TRUE(GetConfiguration()->Configure());
195
196 size_t accel_buffer_len = 0;
197 EXPECT_TRUE(mock_device_->IsBufferEnabled(&accel_buffer_len));
198 EXPECT_EQ(1, accel_buffer_len);
199}
200
Enrico Granatafc2e3472019-07-16 11:23:25 -0700201TEST_F(AccelerometerTest, SingleSensorKbWakeAnglePermissions) {
202 base::FilePath kb_path("/sys/class/chromeos/cros_ec/kb_wake_angle");
203
204 SetSingleSensor(kLidSensorLocation);
205 mock_delegate_->CreateFile(kb_path);
206 mock_delegate_->AddGroup("power", kPowerGroupId);
207 EXPECT_TRUE(GetConfiguration()->Configure());
208
209 EXPECT_NE(0, mock_delegate_->GetPermissions(kb_path) &
210 base::FILE_PERMISSION_WRITE_BY_GROUP);
211 gid_t gid = 0;
212 mock_delegate_->GetOwnership(kb_path, nullptr, &gid);
213 EXPECT_EQ(kPowerGroupId, gid);
214}
215
216TEST_F(AccelerometerTest, SharedSensorKbWakeAnglePermissions) {
217 base::FilePath kb_path = mock_device_->GetPath().Append("in_angl_offset");
218
219 SetSharedSensor();
220 mock_delegate_->CreateFile(kb_path);
221 mock_delegate_->AddGroup("power", kPowerGroupId);
222 EXPECT_TRUE(GetConfiguration()->Configure());
223
224 EXPECT_NE(0, mock_delegate_->GetPermissions(kb_path) &
225 base::FILE_PERMISSION_WRITE_BY_GROUP);
226 gid_t gid = 0;
227 mock_delegate_->GetOwnership(kb_path, nullptr, &gid);
228 EXPECT_EQ(kPowerGroupId, gid);
229}
230
Enrico Granata5da6b1d2019-07-16 11:25:55 -0700231TEST_F(AccelerometerTest, OkWithTrigger0Defined) {
232 SetSingleSensor(kLidSensorLocation);
233
234 mock_context_->AddDevice(mock_trigger0_.get());
235
236 EXPECT_TRUE(GetConfiguration()->Configure());
237}
238
Enrico Granata7a622342019-05-21 11:10:59 -0700239} // namespace
240
241} // namespace mems_setup