1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "gtest/gtest.h"
18
19#include "chre/core/sensor_request.h"
20
21using chre::Nanoseconds;
22using chre::SensorMode;
23using chre::SensorRequest;
24using chre::SensorType;
25using chre::kMaxIntervalLatencyNs;
26
27TEST(SensorType, LosslessSensorHandleToSensorTypeAndBack) {
28  // Verify that converting a sensor to a handle and from a handle back to a
29  // sensor is a lossless conversion. The specific value of the handle is
30  // unimportant, as long as it can be consistently converted back and forth.
31  SensorType sensorType = SensorType::Pressure;
32  uint32_t sensorHandle = getSensorHandleFromSensorType(sensorType);
33  sensorType = chre::getSensorTypeFromSensorHandle(sensorHandle);
34  EXPECT_EQ(sensorType, SensorType::Pressure);
35
36  sensorType = SensorType::Proximity;
37  sensorHandle = getSensorHandleFromSensorType(sensorType);
38  sensorType = chre::getSensorTypeFromSensorHandle(sensorHandle);
39  EXPECT_EQ(sensorType, SensorType::Proximity);
40}
41
42TEST(SensorType, SensorHandleToSensorTypeUnknownHandles) {
43  EXPECT_EQ(chre::getSensorTypeFromSensorHandle(0), SensorType::Unknown);
44  EXPECT_EQ(chre::getSensorTypeFromSensorHandle(10000), SensorType::Unknown);
45}
46
47TEST(SensorRequest, DefaultMinimalPriority) {
48  SensorRequest request;
49  EXPECT_EQ(request.getInterval(), Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT));
50  EXPECT_EQ(request.getLatency(), Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
51  EXPECT_EQ(request.getMode(), SensorMode::Off);
52}
53
54TEST(SensorRequest, ActiveContinuousIsHigherPriorityThanActiveOneShot) {
55  SensorRequest activeContinuous(SensorMode::ActiveContinuous,
56                                 Nanoseconds(0), Nanoseconds(0));
57  SensorRequest activeOneShot(SensorMode::ActiveOneShot,
58                              Nanoseconds(0), Nanoseconds(0));
59  SensorRequest mergedRequest;
60  EXPECT_TRUE(mergedRequest.mergeWith(activeContinuous));
61  EXPECT_FALSE(mergedRequest.mergeWith(activeOneShot));
62  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
63  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
64  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
65}
66
67TEST(SensorRequest, ActiveOneShotIsHigherPriorityThanPassiveContinuous) {
68  SensorRequest activeOneShot(SensorMode::ActiveOneShot,
69                              Nanoseconds(0), Nanoseconds(0));
70  SensorRequest passiveContinuous(SensorMode::PassiveContinuous,
71                                  Nanoseconds(0), Nanoseconds(0));
72  SensorRequest mergedRequest;
73  EXPECT_TRUE(mergedRequest.mergeWith(activeOneShot));
74  EXPECT_FALSE(mergedRequest.mergeWith(passiveContinuous));
75  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
76  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
77  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveOneShot);
78
79}
80
81TEST(SensorRequest, PassiveContinuousIsHigherPriorityThanPassiveOneShot) {
82  SensorRequest passiveContinuous(SensorMode::PassiveContinuous,
83                                  Nanoseconds(0), Nanoseconds(0));
84  SensorRequest passiveOneShot(SensorMode::PassiveOneShot,
85                               Nanoseconds(0), Nanoseconds(0));
86  SensorRequest mergedRequest;
87  EXPECT_TRUE(mergedRequest.mergeWith(passiveContinuous));
88  EXPECT_FALSE(mergedRequest.mergeWith(passiveOneShot));
89  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
90  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
91  EXPECT_EQ(mergedRequest.getMode(), SensorMode::PassiveContinuous);
92}
93
94TEST(SensorRequest, PassiveOneShotIsHigherPriorityThanOff) {
95  SensorRequest passiveOneShot(SensorMode::PassiveOneShot,
96                               Nanoseconds(0), Nanoseconds(0));
97  SensorRequest off(SensorMode::Off, Nanoseconds(0), Nanoseconds(0));
98  SensorRequest mergedRequest;
99  EXPECT_TRUE(mergedRequest.mergeWith(passiveOneShot));
100  EXPECT_FALSE(mergedRequest.mergeWith(off));
101  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
102  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
103  EXPECT_EQ(mergedRequest.getMode(), SensorMode::PassiveOneShot);
104}
105
106TEST(SensorRequest, LowerLatencyIsHigherPriorityThanHigherLatency) {
107  SensorRequest lowLatencyRequest(SensorMode::ActiveContinuous,
108                                  Nanoseconds(10), Nanoseconds(10));
109  SensorRequest highLatencyRequest(SensorMode::ActiveOneShot,
110                                   Nanoseconds(10), Nanoseconds(100));
111  SensorRequest mergedRequest;
112  EXPECT_TRUE(mergedRequest.mergeWith(lowLatencyRequest));
113  EXPECT_FALSE(mergedRequest.mergeWith(highLatencyRequest));
114  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
115  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(10));
116  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
117}
118
119TEST(SensorRequest, HigherFrequencyIsHigherPriorityThanLowerFrequency) {
120  SensorRequest lowFreqRequest(SensorMode::ActiveOneShot,
121                               Nanoseconds(100), Nanoseconds(10));
122  SensorRequest highFreqRequest(SensorMode::ActiveContinuous,
123                                Nanoseconds(10), Nanoseconds(10));
124  SensorRequest mergedRequest;
125  EXPECT_TRUE(mergedRequest.mergeWith(lowFreqRequest));
126  EXPECT_TRUE(mergedRequest.mergeWith(highFreqRequest));
127  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
128  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(10));
129  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
130}
131
132TEST(SensorRequest, OnlyDefaultFrequency) {
133  SensorRequest defaultFreqRequest(SensorMode::ActiveContinuous,
134                                   Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT),
135                                   Nanoseconds(0));
136  SensorRequest mergedRequest;
137  EXPECT_TRUE(mergedRequest.mergeWith(defaultFreqRequest));
138  EXPECT_EQ(mergedRequest.getInterval(),
139            Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT));
140  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
141  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
142}
143
144TEST(SensorRequest, NonDefaultAndDefaultFrequency) {
145  SensorRequest defaultFreqRequest(SensorMode::ActiveContinuous,
146                                   Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT),
147                                   Nanoseconds(0));
148  SensorRequest nonDefaultFreqRequest(SensorMode::ActiveContinuous,
149                                      Nanoseconds(20000000), Nanoseconds(0));
150  SensorRequest mergedRequest;
151  EXPECT_TRUE(mergedRequest.mergeWith(defaultFreqRequest));
152  EXPECT_TRUE(mergedRequest.mergeWith(nonDefaultFreqRequest));
153  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(20000000));
154  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
155  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
156}
157
158TEST(SensorRequest, OnlyAsapLatency) {
159  SensorRequest asapLatencyRequest(SensorMode::ActiveContinuous,
160                                   Nanoseconds(10),
161                                   Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
162  SensorRequest mergedRequest;
163  EXPECT_TRUE(mergedRequest.mergeWith(asapLatencyRequest));
164  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
165  EXPECT_EQ(mergedRequest.getLatency(),
166            Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
167  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
168}
169
170TEST(SensorRequest, NonAsapAndAsapLatency) {
171  SensorRequest asapLatencyRequest(SensorMode::ActiveContinuous,
172                                   Nanoseconds(10),
173                                   Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
174  SensorRequest nonAsapLatencyRequest(SensorMode::ActiveContinuous,
175                                      Nanoseconds(10),
176                                      Nanoseconds(2000));
177  SensorRequest mergedRequest;
178  EXPECT_TRUE(mergedRequest.mergeWith(asapLatencyRequest));
179  EXPECT_FALSE(mergedRequest.mergeWith(nonAsapLatencyRequest));
180  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
181  EXPECT_EQ(mergedRequest.getLatency(),
182            Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
183  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
184}
185
186TEST(SensorRequest, OnlyDefaultLatency) {
187  SensorRequest defaultLatencyRequest(SensorMode::ActiveContinuous,
188                                      Nanoseconds(10),
189                                      Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
190  SensorRequest mergedRequest;
191  EXPECT_TRUE(mergedRequest.mergeWith(defaultLatencyRequest));
192  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
193  EXPECT_EQ(mergedRequest.getLatency(),
194            Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
195  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
196}
197
198TEST(SensorRequest, NonDefaultAndDefaultLatency) {
199  SensorRequest defaultLatencyRequest(SensorMode::ActiveContinuous,
200                                      Nanoseconds(10),
201                                      Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
202  SensorRequest nonDefaultLatencyRequest(SensorMode::ActiveContinuous,
203                                         Nanoseconds(10),
204                                         Nanoseconds(2000));
205  SensorRequest mergedRequest;
206  EXPECT_TRUE(mergedRequest.mergeWith(defaultLatencyRequest));
207  EXPECT_TRUE(mergedRequest.mergeWith(nonDefaultLatencyRequest));
208  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
209  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(2000));
210  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
211}
212
213TEST(SensorRequest, MergeWithOff) {
214  SensorRequest request(SensorMode::ActiveContinuous,
215                        Nanoseconds(10),
216                        Nanoseconds(100));
217  SensorRequest otherRequest(SensorMode::Off,
218                             Nanoseconds(1),
219                             Nanoseconds(1));
220  EXPECT_FALSE(request.mergeWith(otherRequest));
221  EXPECT_EQ(request.getMode(), SensorMode::ActiveContinuous);
222  EXPECT_EQ(request.getInterval(), Nanoseconds(10));
223  EXPECT_EQ(request.getLatency(), Nanoseconds(100));
224}
225
226TEST(SensorRequest, MaxNonDefaultIntervalAndLatency) {
227  SensorRequest request(SensorMode::ActiveContinuous,
228                        Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT - 1),
229                        Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT - 1));
230  EXPECT_EQ(request.getMode(), SensorMode::ActiveContinuous);
231  EXPECT_EQ(request.getInterval(), Nanoseconds(kMaxIntervalLatencyNs));
232  EXPECT_EQ(request.getLatency(), Nanoseconds(kMaxIntervalLatencyNs));
233}
234
235TEST(SensorRequest, HighRateLowLatencyAndLowRateHighLatency) {
236  SensorRequest Request0(SensorMode::ActiveContinuous,
237                         Nanoseconds(100), Nanoseconds(0));
238  SensorRequest Request1(SensorMode::ActiveContinuous,
239                         Nanoseconds(10), Nanoseconds(2000));
240  SensorRequest mergedRequest;
241  EXPECT_TRUE(mergedRequest.mergeWith(Request0));
242  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(100));
243  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
244  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
245
246  EXPECT_TRUE(mergedRequest.mergeWith(Request1));
247  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
248  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(90));
249  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
250}
251
252TEST(SensorRequest, LowRateHighLatencyAndHighRateLowLatency) {
253  SensorRequest Request0(SensorMode::ActiveContinuous,
254                         Nanoseconds(100), Nanoseconds(0));
255  SensorRequest Request1(SensorMode::ActiveContinuous,
256                         Nanoseconds(10), Nanoseconds(2000));
257  SensorRequest mergedRequest;
258  EXPECT_TRUE(mergedRequest.mergeWith(Request1));
259  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
260  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(2000));
261  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
262
263  EXPECT_TRUE(mergedRequest.mergeWith(Request0));
264  EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
265  EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(90));
266  EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
267}
268