• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 <general_test/basic_gnss_test.h>
18 
19 #include <shared/macros.h>
20 #include <shared/send_message.h>
21 
22 #include "chre_api/chre.h"
23 
24 using nanoapp_testing::sendFailureToHost;
25 
26 /*
27  * Test to check expected functionality of the CHRE GNSS APIs.
28  */
29 namespace general_test {
30 
31 namespace {
32 
testLocationSessionAsync()33 void testLocationSessionAsync() {
34   if (!chreGnssLocationSessionStartAsync(1000 /* minIntervalMs */,
35                                          0 /* minTimeToNextFixMs */,
36                                          nullptr /* cookie */)) {
37     EXPECT_FAIL_RETURN("Failed to start a location session");
38   }
39 }
40 
testMeasurementSessionAsync()41 void testMeasurementSessionAsync() {
42   if (!chreGnssMeasurementSessionStartAsync(1000 /* minIntervalMs */,
43                                             nullptr /* cookie */)) {
44     EXPECT_FAIL_RETURN("Failed to start a measurement session");
45   }
46 }
47 
testPassiveListener()48 bool testPassiveListener() {
49   bool success = false;
50   if (!chreGnssConfigurePassiveLocationListener(true /* enable */)) {
51     sendFailureToHost("Failed to enable passive location listener");
52   } else if (!chreGnssConfigurePassiveLocationListener(false /* enable */)) {
53     sendFailureToHost("Failed to disable passive location listener");
54   } else {
55     success = true;
56   }
57 
58   return success;
59 }
60 
61 }  // anonymous namespace
62 
BasicGnssTest()63 BasicGnssTest::BasicGnssTest() : Test(CHRE_API_VERSION_1_1) {}
64 
setUp(uint32_t messageSize,const void *)65 void BasicGnssTest::setUp(uint32_t messageSize, const void * /* message */) {
66   if (messageSize != 0) {
67     EXPECT_FAIL_RETURN("Expected 0 byte message, got more bytes:",
68                        &messageSize);
69   } else {
70     if (isCapabilitySet(CHRE_GNSS_CAPABILITIES_LOCATION)) {
71       testLocationSessionAsync();
72     } else {
73       mTestSuccessMarker.markStageAndSuccessOnFinish(
74           BASIC_GNSS_TEST_STAGE_LOCATION);
75     }
76 
77     if (isCapabilitySet(CHRE_GNSS_CAPABILITIES_MEASUREMENTS)) {
78       testMeasurementSessionAsync();
79     } else {
80       mTestSuccessMarker.markStageAndSuccessOnFinish(
81           BASIC_GNSS_TEST_STAGE_MEASUREMENT);
82     }
83 
84     if ((mApiVersion < CHRE_API_VERSION_1_5) ||
85         !isCapabilitySet(
86             CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER) ||
87         !isCapabilitySet(CHRE_GNSS_CAPABILITIES_LOCATION) ||
88         testPassiveListener()) {
89       mTestSuccessMarker.markStageAndSuccessOnFinish(
90           BASIC_GNSS_TEST_STAGE_LISTENER);
91     }
92   }
93 }
94 
handleGnssAsyncResult(const chreAsyncResult * result)95 void BasicGnssTest::handleGnssAsyncResult(const chreAsyncResult *result) {
96   if (!result->success) {
97     EXPECT_FAIL_RETURN("Received unsuccessful GNSS async result");
98   }
99 
100   switch (result->requestType) {
101     case CHRE_GNSS_REQUEST_TYPE_LOCATION_SESSION_START: {
102       if (!chreGnssLocationSessionStopAsync(nullptr /* cookie */)) {
103         EXPECT_FAIL_RETURN("Failed to stop a location session");
104       }
105       break;
106     }
107     case CHRE_GNSS_REQUEST_TYPE_LOCATION_SESSION_STOP: {
108       mTestSuccessMarker.markStageAndSuccessOnFinish(
109           BASIC_GNSS_TEST_STAGE_LOCATION);
110       break;
111     }
112     case CHRE_GNSS_REQUEST_TYPE_MEASUREMENT_SESSION_START: {
113       if (!chreGnssMeasurementSessionStopAsync(nullptr /* cookie */)) {
114         EXPECT_FAIL_RETURN("Failed to stop a measurement session");
115       }
116       break;
117     }
118     case CHRE_GNSS_REQUEST_TYPE_MEASUREMENT_SESSION_STOP: {
119       mTestSuccessMarker.markStageAndSuccessOnFinish(
120           BASIC_GNSS_TEST_STAGE_MEASUREMENT);
121       break;
122     }
123     default:
124       EXPECT_FAIL_RETURN("Unexpected request type");
125       break;
126   }
127 }
128 
handleEvent(uint32_t,uint16_t eventType,const void * eventData)129 void BasicGnssTest::handleEvent(uint32_t /* senderInstanceId */,
130                                 uint16_t eventType, const void *eventData) {
131   switch (eventType) {
132     case CHRE_EVENT_GNSS_ASYNC_RESULT:
133       handleGnssAsyncResult(static_cast<const chreAsyncResult *>(eventData));
134       break;
135     case CHRE_EVENT_GNSS_LOCATION:
136     case CHRE_EVENT_GNSS_DATA:
137       // Do nothing
138       break;
139     default:
140       unexpectedEvent(eventType);
141       break;
142   }
143 }
144 
145 }  // namespace general_test
146