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