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 
21 using chre::kMaxIntervalLatencyNs;
22 using chre::Nanoseconds;
23 using chre::SensorMode;
24 using chre::SensorRequest;
25 
TEST(SensorRequest,DefaultMinimalPriority)26 TEST(SensorRequest, DefaultMinimalPriority) {
27   SensorRequest request;
28   EXPECT_EQ(request.getInterval(), Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT));
29   EXPECT_EQ(request.getLatency(), Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
30   EXPECT_EQ(request.getMode(), SensorMode::Off);
31 }
32 
TEST(SensorRequest,ActiveContinuousIsHigherPriorityThanActiveOneShot)33 TEST(SensorRequest, ActiveContinuousIsHigherPriorityThanActiveOneShot) {
34   SensorRequest activeContinuous(SensorMode::ActiveContinuous, Nanoseconds(0),
35                                  Nanoseconds(0));
36   SensorRequest activeOneShot(SensorMode::ActiveOneShot, Nanoseconds(0),
37                               Nanoseconds(0));
38   SensorRequest mergedRequest;
39   EXPECT_TRUE(mergedRequest.mergeWith(activeContinuous));
40   EXPECT_FALSE(mergedRequest.mergeWith(activeOneShot));
41   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
42   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
43   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
44 }
45 
TEST(SensorRequest,ActiveOneShotIsHigherPriorityThanPassiveContinuous)46 TEST(SensorRequest, ActiveOneShotIsHigherPriorityThanPassiveContinuous) {
47   SensorRequest activeOneShot(SensorMode::ActiveOneShot, Nanoseconds(0),
48                               Nanoseconds(0));
49   SensorRequest passiveContinuous(SensorMode::PassiveContinuous, Nanoseconds(0),
50                                   Nanoseconds(0));
51   SensorRequest mergedRequest;
52   EXPECT_TRUE(mergedRequest.mergeWith(activeOneShot));
53   EXPECT_FALSE(mergedRequest.mergeWith(passiveContinuous));
54   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
55   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
56   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveOneShot);
57 }
58 
TEST(SensorRequest,PassiveContinuousIsHigherPriorityThanPassiveOneShot)59 TEST(SensorRequest, PassiveContinuousIsHigherPriorityThanPassiveOneShot) {
60   SensorRequest passiveContinuous(SensorMode::PassiveContinuous, Nanoseconds(0),
61                                   Nanoseconds(0));
62   SensorRequest passiveOneShot(SensorMode::PassiveOneShot, Nanoseconds(0),
63                                Nanoseconds(0));
64   SensorRequest mergedRequest;
65   EXPECT_TRUE(mergedRequest.mergeWith(passiveContinuous));
66   EXPECT_FALSE(mergedRequest.mergeWith(passiveOneShot));
67   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
68   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
69   EXPECT_EQ(mergedRequest.getMode(), SensorMode::PassiveContinuous);
70 }
71 
TEST(SensorRequest,PassiveOneShotIsHigherPriorityThanOff)72 TEST(SensorRequest, PassiveOneShotIsHigherPriorityThanOff) {
73   SensorRequest passiveOneShot(SensorMode::PassiveOneShot, Nanoseconds(0),
74                                Nanoseconds(0));
75   SensorRequest off(SensorMode::Off, Nanoseconds(0), Nanoseconds(0));
76   SensorRequest mergedRequest;
77   EXPECT_TRUE(mergedRequest.mergeWith(passiveOneShot));
78   EXPECT_FALSE(mergedRequest.mergeWith(off));
79   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(0));
80   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
81   EXPECT_EQ(mergedRequest.getMode(), SensorMode::PassiveOneShot);
82 }
83 
TEST(SensorRequest,LowerLatencyIsHigherPriorityThanHigherLatency)84 TEST(SensorRequest, LowerLatencyIsHigherPriorityThanHigherLatency) {
85   SensorRequest lowLatencyRequest(SensorMode::ActiveContinuous, Nanoseconds(10),
86                                   Nanoseconds(10));
87   SensorRequest highLatencyRequest(SensorMode::ActiveOneShot, Nanoseconds(10),
88                                    Nanoseconds(100));
89   SensorRequest mergedRequest;
90   EXPECT_TRUE(mergedRequest.mergeWith(lowLatencyRequest));
91   EXPECT_FALSE(mergedRequest.mergeWith(highLatencyRequest));
92   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
93   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(10));
94   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
95 }
96 
TEST(SensorRequest,HigherFrequencyIsHigherPriorityThanLowerFrequency)97 TEST(SensorRequest, HigherFrequencyIsHigherPriorityThanLowerFrequency) {
98   SensorRequest lowFreqRequest(SensorMode::ActiveOneShot, Nanoseconds(100),
99                                Nanoseconds(10));
100   SensorRequest highFreqRequest(SensorMode::ActiveContinuous, Nanoseconds(10),
101                                 Nanoseconds(10));
102   SensorRequest mergedRequest;
103   EXPECT_TRUE(mergedRequest.mergeWith(lowFreqRequest));
104   EXPECT_TRUE(mergedRequest.mergeWith(highFreqRequest));
105   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
106   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(10));
107   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
108 }
109 
TEST(SensorRequest,OnlyDefaultFrequency)110 TEST(SensorRequest, OnlyDefaultFrequency) {
111   SensorRequest defaultFreqRequest(SensorMode::ActiveContinuous,
112                                    Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT),
113                                    Nanoseconds(0));
114   SensorRequest mergedRequest;
115   EXPECT_TRUE(mergedRequest.mergeWith(defaultFreqRequest));
116   EXPECT_EQ(mergedRequest.getInterval(),
117             Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT));
118   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
119   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
120 }
121 
TEST(SensorRequest,NonDefaultAndDefaultFrequency)122 TEST(SensorRequest, NonDefaultAndDefaultFrequency) {
123   SensorRequest defaultFreqRequest(SensorMode::ActiveContinuous,
124                                    Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT),
125                                    Nanoseconds(0));
126   SensorRequest nonDefaultFreqRequest(SensorMode::ActiveContinuous,
127                                       Nanoseconds(20000000), Nanoseconds(0));
128   SensorRequest mergedRequest;
129   EXPECT_TRUE(mergedRequest.mergeWith(defaultFreqRequest));
130   EXPECT_TRUE(mergedRequest.mergeWith(nonDefaultFreqRequest));
131   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(20000000));
132   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
133   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
134 }
135 
TEST(SensorRequest,OnlyAsapLatency)136 TEST(SensorRequest, OnlyAsapLatency) {
137   SensorRequest asapLatencyRequest(SensorMode::ActiveContinuous,
138                                    Nanoseconds(10),
139                                    Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
140   SensorRequest mergedRequest;
141   EXPECT_TRUE(mergedRequest.mergeWith(asapLatencyRequest));
142   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
143   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
144   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
145 }
146 
TEST(SensorRequest,NonAsapAndAsapLatency)147 TEST(SensorRequest, NonAsapAndAsapLatency) {
148   SensorRequest asapLatencyRequest(SensorMode::ActiveContinuous,
149                                    Nanoseconds(10),
150                                    Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
151   SensorRequest nonAsapLatencyRequest(SensorMode::ActiveContinuous,
152                                       Nanoseconds(10), Nanoseconds(2000));
153   SensorRequest mergedRequest;
154   EXPECT_TRUE(mergedRequest.mergeWith(asapLatencyRequest));
155   EXPECT_FALSE(mergedRequest.mergeWith(nonAsapLatencyRequest));
156   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
157   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(CHRE_SENSOR_LATENCY_ASAP));
158   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
159 }
160 
TEST(SensorRequest,OnlyDefaultLatency)161 TEST(SensorRequest, OnlyDefaultLatency) {
162   SensorRequest defaultLatencyRequest(SensorMode::ActiveContinuous,
163                                       Nanoseconds(10),
164                                       Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
165   SensorRequest mergedRequest;
166   EXPECT_TRUE(mergedRequest.mergeWith(defaultLatencyRequest));
167   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
168   EXPECT_EQ(mergedRequest.getLatency(),
169             Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
170   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
171 }
172 
TEST(SensorRequest,NonDefaultAndDefaultLatency)173 TEST(SensorRequest, NonDefaultAndDefaultLatency) {
174   SensorRequest defaultLatencyRequest(SensorMode::ActiveContinuous,
175                                       Nanoseconds(10),
176                                       Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT));
177   SensorRequest nonDefaultLatencyRequest(SensorMode::ActiveContinuous,
178                                          Nanoseconds(10), Nanoseconds(2000));
179   SensorRequest mergedRequest;
180   EXPECT_TRUE(mergedRequest.mergeWith(defaultLatencyRequest));
181   EXPECT_TRUE(mergedRequest.mergeWith(nonDefaultLatencyRequest));
182   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
183   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(2000));
184   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
185 }
186 
TEST(SensorRequest,MergeWithOff)187 TEST(SensorRequest, MergeWithOff) {
188   SensorRequest request(SensorMode::ActiveContinuous, Nanoseconds(10),
189                         Nanoseconds(100));
190   SensorRequest otherRequest(SensorMode::Off, Nanoseconds(1), Nanoseconds(1));
191   EXPECT_FALSE(request.mergeWith(otherRequest));
192   EXPECT_EQ(request.getMode(), SensorMode::ActiveContinuous);
193   EXPECT_EQ(request.getInterval(), Nanoseconds(10));
194   EXPECT_EQ(request.getLatency(), Nanoseconds(100));
195 }
196 
TEST(SensorRequest,MaxNonDefaultIntervalAndLatency)197 TEST(SensorRequest, MaxNonDefaultIntervalAndLatency) {
198   SensorRequest request(SensorMode::ActiveContinuous,
199                         Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT - 1),
200                         Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT - 1));
201   EXPECT_EQ(request.getMode(), SensorMode::ActiveContinuous);
202   EXPECT_EQ(request.getInterval(), Nanoseconds(kMaxIntervalLatencyNs));
203   EXPECT_EQ(request.getLatency(), Nanoseconds(kMaxIntervalLatencyNs));
204 }
205 
TEST(SensorRequest,HighRateLowLatencyAndLowRateHighLatency)206 TEST(SensorRequest, HighRateLowLatencyAndLowRateHighLatency) {
207   SensorRequest Request0(SensorMode::ActiveContinuous, Nanoseconds(100),
208                          Nanoseconds(0));
209   SensorRequest Request1(SensorMode::ActiveContinuous, Nanoseconds(10),
210                          Nanoseconds(2000));
211   SensorRequest mergedRequest;
212   EXPECT_TRUE(mergedRequest.mergeWith(Request0));
213   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(100));
214   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(0));
215   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
216 
217   EXPECT_TRUE(mergedRequest.mergeWith(Request1));
218   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
219   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(90));
220   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
221 }
222 
TEST(SensorRequest,LowRateHighLatencyAndHighRateLowLatency)223 TEST(SensorRequest, LowRateHighLatencyAndHighRateLowLatency) {
224   SensorRequest Request0(SensorMode::ActiveContinuous, Nanoseconds(100),
225                          Nanoseconds(0));
226   SensorRequest Request1(SensorMode::ActiveContinuous, Nanoseconds(10),
227                          Nanoseconds(2000));
228   SensorRequest mergedRequest;
229   EXPECT_TRUE(mergedRequest.mergeWith(Request1));
230   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
231   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(2000));
232   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
233 
234   EXPECT_TRUE(mergedRequest.mergeWith(Request0));
235   EXPECT_EQ(mergedRequest.getInterval(), Nanoseconds(10));
236   EXPECT_EQ(mergedRequest.getLatency(), Nanoseconds(90));
237   EXPECT_EQ(mergedRequest.getMode(), SensorMode::ActiveContinuous);
238 }
239 
TEST(SensorRequest,MergeWithOnlyBiasChanges)240 TEST(SensorRequest, MergeWithOnlyBiasChanges) {
241   SensorRequest Request0(SensorMode::ActiveContinuous, Nanoseconds(100),
242                          Nanoseconds(100));
243   SensorRequest Request1(SensorMode::ActiveContinuous, Nanoseconds(100),
244                          Nanoseconds(100));
245   Request1.setBiasUpdatesRequested(true);
246   SensorRequest mergedRequest;
247 
248   EXPECT_TRUE(mergedRequest.mergeWith(Request0));
249   EXPECT_FALSE(mergedRequest.getBiasUpdatesRequested());
250 
251   EXPECT_TRUE(mergedRequest.mergeWith(Request1));
252   EXPECT_TRUE(mergedRequest.getBiasUpdatesRequested());
253 }
254 
TEST(SensorRequest,MergeWithBiasUpdatesUnchanged)255 TEST(SensorRequest, MergeWithBiasUpdatesUnchanged) {
256   SensorRequest Request0(SensorMode::ActiveContinuous, Nanoseconds(100),
257                          Nanoseconds(100));
258   Request0.setBiasUpdatesRequested(true);
259   SensorRequest Request1(SensorMode::ActiveContinuous, Nanoseconds(100),
260                          Nanoseconds(100));
261   Request1.setBiasUpdatesRequested(true);
262 
263   EXPECT_FALSE(Request0.mergeWith(Request1));
264 }
265 
TEST(SensorRequest,MergeWithBiasUpdatesChanged)266 TEST(SensorRequest, MergeWithBiasUpdatesChanged) {
267   SensorRequest Request0(SensorMode::ActiveContinuous, Nanoseconds(100),
268                          Nanoseconds(100));
269   Request0.setBiasUpdatesRequested(true);
270   SensorRequest Request1(SensorMode::ActiveContinuous, Nanoseconds(100),
271                          Nanoseconds(100));
272 
273   EXPECT_FALSE(Request0.mergeWith(Request1));
274 }
275 
TEST(SensorRequest,OnlyBiasRequestUpdated)276 TEST(SensorRequest, OnlyBiasRequestUpdated) {
277   SensorRequest Request0(SensorMode::ActiveContinuous, Nanoseconds(100),
278                          Nanoseconds(100));
279   SensorRequest Request1(SensorMode::ActiveContinuous, Nanoseconds(100),
280                          Nanoseconds(100));
281   Request1.setBiasUpdatesRequested(true);
282 
283   EXPECT_TRUE(Request0.onlyBiasRequestUpdated(Request1));
284 }