xref: /aosp_15_r20/system/chre/chpp/test/app_timeout_test.cpp (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include "app_timeout_test.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*84e33947SAndroid Build Coastguard Worker #include <string.h>
21*84e33947SAndroid Build Coastguard Worker #include <cstdint>
22*84e33947SAndroid Build Coastguard Worker #include <thread>
23*84e33947SAndroid Build Coastguard Worker 
24*84e33947SAndroid Build Coastguard Worker #include "chpp/app.h"
25*84e33947SAndroid Build Coastguard Worker #include "chpp/clients.h"
26*84e33947SAndroid Build Coastguard Worker #include "chpp/clients/gnss.h"
27*84e33947SAndroid Build Coastguard Worker #include "chpp/clients/wifi.h"
28*84e33947SAndroid Build Coastguard Worker #include "chpp/clients/wwan.h"
29*84e33947SAndroid Build Coastguard Worker #include "chpp/macros.h"
30*84e33947SAndroid Build Coastguard Worker #include "chpp/memory.h"
31*84e33947SAndroid Build Coastguard Worker #include "chpp/platform/platform_link.h"
32*84e33947SAndroid Build Coastguard Worker #include "chpp/platform/utils.h"
33*84e33947SAndroid Build Coastguard Worker #include "chpp/services.h"
34*84e33947SAndroid Build Coastguard Worker #include "chpp/time.h"
35*84e33947SAndroid Build Coastguard Worker #include "chpp/transport.h"
36*84e33947SAndroid Build Coastguard Worker #include "chre/pal/wwan.h"
37*84e33947SAndroid Build Coastguard Worker 
38*84e33947SAndroid Build Coastguard Worker namespace chre {
39*84e33947SAndroid Build Coastguard Worker namespace {
40*84e33947SAndroid Build Coastguard Worker 
41*84e33947SAndroid Build Coastguard Worker #define TEST_UUID                                                           \
42*84e33947SAndroid Build Coastguard Worker   {                                                                         \
43*84e33947SAndroid Build Coastguard Worker     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
44*84e33947SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x12                                              \
45*84e33947SAndroid Build Coastguard Worker   }
46*84e33947SAndroid Build Coastguard Worker 
47*84e33947SAndroid Build Coastguard Worker // Number of requests supported by the client and the service.
48*84e33947SAndroid Build Coastguard Worker constexpr uint16_t kNumCommands = 3;
49*84e33947SAndroid Build Coastguard Worker 
50*84e33947SAndroid Build Coastguard Worker struct ClientState {
51*84e33947SAndroid Build Coastguard Worker   struct ChppEndpointState chppClientState;
52*84e33947SAndroid Build Coastguard Worker   struct ChppOutgoingRequestState outReqStates[kNumCommands];
53*84e33947SAndroid Build Coastguard Worker };
54*84e33947SAndroid Build Coastguard Worker 
55*84e33947SAndroid Build Coastguard Worker constexpr struct ChppClient kClient = {
56*84e33947SAndroid Build Coastguard Worker     .descriptor.uuid = TEST_UUID,
57*84e33947SAndroid Build Coastguard Worker     .descriptor.version.major = 1,
58*84e33947SAndroid Build Coastguard Worker     .descriptor.version.minor = 0,
59*84e33947SAndroid Build Coastguard Worker     .descriptor.version.patch = 0,
60*84e33947SAndroid Build Coastguard Worker     .outReqCount = kNumCommands,
61*84e33947SAndroid Build Coastguard Worker     .minLength = sizeof(struct ChppAppHeader),
62*84e33947SAndroid Build Coastguard Worker };
63*84e33947SAndroid Build Coastguard Worker 
64*84e33947SAndroid Build Coastguard Worker struct ServiceState {
65*84e33947SAndroid Build Coastguard Worker   struct ChppEndpointState chppServiceState;
66*84e33947SAndroid Build Coastguard Worker   struct ChppOutgoingRequestState outReqStates[kNumCommands];
67*84e33947SAndroid Build Coastguard Worker };
68*84e33947SAndroid Build Coastguard Worker 
69*84e33947SAndroid Build Coastguard Worker const struct ChppService kService = {
70*84e33947SAndroid Build Coastguard Worker     .descriptor.uuid = TEST_UUID,
71*84e33947SAndroid Build Coastguard Worker     .descriptor.name = "Test",
72*84e33947SAndroid Build Coastguard Worker     .descriptor.version.major = 1,
73*84e33947SAndroid Build Coastguard Worker     .descriptor.version.minor = 0,
74*84e33947SAndroid Build Coastguard Worker     .descriptor.version.patch = 0,
75*84e33947SAndroid Build Coastguard Worker     .outReqCount = kNumCommands,
76*84e33947SAndroid Build Coastguard Worker     .minLength = sizeof(struct ChppAppHeader),
77*84e33947SAndroid Build Coastguard Worker };
78*84e33947SAndroid Build Coastguard Worker 
ValidateClientStateAndReqState(struct ChppEndpointState * clientState,const struct ChppAppHeader * request)79*84e33947SAndroid Build Coastguard Worker void ValidateClientStateAndReqState(struct ChppEndpointState *clientState,
80*84e33947SAndroid Build Coastguard Worker                                     const struct ChppAppHeader *request) {
81*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(clientState, nullptr);
82*84e33947SAndroid Build Coastguard Worker   const uint8_t clientIdx = clientState->index;
83*84e33947SAndroid Build Coastguard Worker 
84*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(clientState->appContext, nullptr);
85*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(clientState->appContext->registeredClients, nullptr);
86*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(clientState->appContext->registeredClients[clientIdx], nullptr);
87*84e33947SAndroid Build Coastguard Worker   ASSERT_LT(request->command,
88*84e33947SAndroid Build Coastguard Worker             clientState->appContext->registeredClients[clientIdx]->outReqCount);
89*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(clientState->appContext->registeredClientStates[clientIdx],
90*84e33947SAndroid Build Coastguard Worker             nullptr);
91*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(
92*84e33947SAndroid Build Coastguard Worker       clientState->appContext->registeredClientStates[clientIdx]->outReqStates,
93*84e33947SAndroid Build Coastguard Worker       nullptr);
94*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(clientState->appContext->registeredClientStates[clientIdx]->context,
95*84e33947SAndroid Build Coastguard Worker             nullptr);
96*84e33947SAndroid Build Coastguard Worker }
97*84e33947SAndroid Build Coastguard Worker 
ValidateServiceStateAndReqState(struct ChppEndpointState * serviceState,const struct ChppAppHeader * request)98*84e33947SAndroid Build Coastguard Worker void ValidateServiceStateAndReqState(struct ChppEndpointState *serviceState,
99*84e33947SAndroid Build Coastguard Worker                                      const struct ChppAppHeader *request) {
100*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(serviceState, nullptr);
101*84e33947SAndroid Build Coastguard Worker   const uint8_t serviceIdx = serviceState->index;
102*84e33947SAndroid Build Coastguard Worker 
103*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(serviceState->appContext, nullptr);
104*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(serviceState->appContext->registeredServices, nullptr);
105*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(serviceState->appContext->registeredServices[serviceIdx], nullptr);
106*84e33947SAndroid Build Coastguard Worker   ASSERT_LT(
107*84e33947SAndroid Build Coastguard Worker       request->command,
108*84e33947SAndroid Build Coastguard Worker       serviceState->appContext->registeredServices[serviceIdx]->outReqCount);
109*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(serviceState->appContext->registeredServiceStates[serviceIdx],
110*84e33947SAndroid Build Coastguard Worker             nullptr);
111*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(serviceState->appContext->registeredServiceStates[serviceIdx]
112*84e33947SAndroid Build Coastguard Worker                 ->outReqStates,
113*84e33947SAndroid Build Coastguard Worker             nullptr);
114*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(
115*84e33947SAndroid Build Coastguard Worker       serviceState->appContext->registeredServiceStates[serviceIdx]->context,
116*84e33947SAndroid Build Coastguard Worker       nullptr);
117*84e33947SAndroid Build Coastguard Worker }
118*84e33947SAndroid Build Coastguard Worker 
validateTimeout(uint64_t timeoutTimeNs,uint64_t expectedTimeNs)119*84e33947SAndroid Build Coastguard Worker void validateTimeout(uint64_t timeoutTimeNs, uint64_t expectedTimeNs) {
120*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kJitterNs = 10 * CHPP_NSEC_PER_MSEC;
121*84e33947SAndroid Build Coastguard Worker 
122*84e33947SAndroid Build Coastguard Worker   if (expectedTimeNs == CHPP_TIME_MAX) {
123*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(timeoutTimeNs, expectedTimeNs);
124*84e33947SAndroid Build Coastguard Worker   } else {
125*84e33947SAndroid Build Coastguard Worker     EXPECT_GE(timeoutTimeNs, expectedTimeNs);
126*84e33947SAndroid Build Coastguard Worker     EXPECT_LE(timeoutTimeNs, expectedTimeNs + kJitterNs);
127*84e33947SAndroid Build Coastguard Worker   }
128*84e33947SAndroid Build Coastguard Worker }
129*84e33947SAndroid Build Coastguard Worker 
validateTimeoutResponse(const struct ChppAppHeader * request,const struct ChppAppHeader * response)130*84e33947SAndroid Build Coastguard Worker void validateTimeoutResponse(const struct ChppAppHeader *request,
131*84e33947SAndroid Build Coastguard Worker                              const struct ChppAppHeader *response) {
132*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request, nullptr);
133*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(response, nullptr);
134*84e33947SAndroid Build Coastguard Worker 
135*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(response->handle, request->handle);
136*84e33947SAndroid Build Coastguard Worker 
137*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(response->type, request->type == CHPP_MESSAGE_TYPE_CLIENT_REQUEST
138*84e33947SAndroid Build Coastguard Worker                                 ? CHPP_MESSAGE_TYPE_SERVICE_RESPONSE
139*84e33947SAndroid Build Coastguard Worker                                 : CHPP_MESSAGE_TYPE_CLIENT_RESPONSE);
140*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(response->transaction, request->transaction);
141*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(response->error, CHPP_APP_ERROR_TIMEOUT);
142*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(response->command, request->command);
143*84e33947SAndroid Build Coastguard Worker }
144*84e33947SAndroid Build Coastguard Worker 
145*84e33947SAndroid Build Coastguard Worker /**
146*84e33947SAndroid Build Coastguard Worker  * Test timeout for client and service side requests.
147*84e33947SAndroid Build Coastguard Worker  *
148*84e33947SAndroid Build Coastguard Worker  * The test parameter is:
149*84e33947SAndroid Build Coastguard Worker  * - CHPP_MESSAGE_TYPE_CLIENT_REQUEST for client side requests
150*84e33947SAndroid Build Coastguard Worker  * - CHPP_MESSAGE_TYPE_SERVICE_REQUEST for service side requests
151*84e33947SAndroid Build Coastguard Worker  */
152*84e33947SAndroid Build Coastguard Worker class TimeoutParamTest : public testing::TestWithParam<ChppMessageType> {
153*84e33947SAndroid Build Coastguard Worker  protected:
SetUp()154*84e33947SAndroid Build Coastguard Worker   void SetUp() override {
155*84e33947SAndroid Build Coastguard Worker     chppClearTotalAllocBytes();
156*84e33947SAndroid Build Coastguard Worker 
157*84e33947SAndroid Build Coastguard Worker     memset(&mClientLinkContext, 0, sizeof(mClientLinkContext));
158*84e33947SAndroid Build Coastguard Worker     memset(&mServiceLinkContext, 0, sizeof(mServiceLinkContext));
159*84e33947SAndroid Build Coastguard Worker 
160*84e33947SAndroid Build Coastguard Worker     mServiceLinkContext.isLinkActive = true;
161*84e33947SAndroid Build Coastguard Worker     mServiceLinkContext.remoteLinkState = &mClientLinkContext;
162*84e33947SAndroid Build Coastguard Worker     mServiceLinkContext.rxInRemoteEndpointWorker = false;
163*84e33947SAndroid Build Coastguard Worker 
164*84e33947SAndroid Build Coastguard Worker     mClientLinkContext.isLinkActive = true;
165*84e33947SAndroid Build Coastguard Worker     mClientLinkContext.remoteLinkState = &mServiceLinkContext;
166*84e33947SAndroid Build Coastguard Worker     mClientLinkContext.rxInRemoteEndpointWorker = false;
167*84e33947SAndroid Build Coastguard Worker 
168*84e33947SAndroid Build Coastguard Worker     // No default clients/services.
169*84e33947SAndroid Build Coastguard Worker     struct ChppClientServiceSet set;
170*84e33947SAndroid Build Coastguard Worker     memset(&set, 0, sizeof(set));
171*84e33947SAndroid Build Coastguard Worker 
172*84e33947SAndroid Build Coastguard Worker     const struct ChppLinkApi *linkApi = getLinuxLinkApi();
173*84e33947SAndroid Build Coastguard Worker 
174*84e33947SAndroid Build Coastguard Worker     // Init client side.
175*84e33947SAndroid Build Coastguard Worker     chppTransportInit(&mClientTransportContext, &mClientAppContext,
176*84e33947SAndroid Build Coastguard Worker                       &mClientLinkContext, linkApi);
177*84e33947SAndroid Build Coastguard Worker     mClientTransportContext.resetState = CHPP_RESET_STATE_NONE;
178*84e33947SAndroid Build Coastguard Worker     chppAppInitWithClientServiceSet(&mClientAppContext,
179*84e33947SAndroid Build Coastguard Worker                                     &mClientTransportContext, set);
180*84e33947SAndroid Build Coastguard Worker 
181*84e33947SAndroid Build Coastguard Worker     // Init service side.
182*84e33947SAndroid Build Coastguard Worker     chppTransportInit(&mServiceTransportContext, &mServiceAppContext,
183*84e33947SAndroid Build Coastguard Worker                       &mServiceLinkContext, linkApi);
184*84e33947SAndroid Build Coastguard Worker     mServiceTransportContext.resetState = CHPP_RESET_STATE_NONE;
185*84e33947SAndroid Build Coastguard Worker     chppAppInitWithClientServiceSet(&mServiceAppContext,
186*84e33947SAndroid Build Coastguard Worker                                     &mServiceTransportContext, set);
187*84e33947SAndroid Build Coastguard Worker 
188*84e33947SAndroid Build Coastguard Worker     // Bring up the client
189*84e33947SAndroid Build Coastguard Worker     memset(&mClientState, 0, sizeof(mClientState));
190*84e33947SAndroid Build Coastguard Worker     chppRegisterClient(&mClientAppContext, &mClientState,
191*84e33947SAndroid Build Coastguard Worker                        &mClientState.chppClientState,
192*84e33947SAndroid Build Coastguard Worker                        &mClientState.outReqStates[0], &kClient);
193*84e33947SAndroid Build Coastguard Worker 
194*84e33947SAndroid Build Coastguard Worker     // Bring up the service
195*84e33947SAndroid Build Coastguard Worker     memset(&mServiceState, 0, sizeof(mServiceState));
196*84e33947SAndroid Build Coastguard Worker     chppRegisterService(&mServiceAppContext, &mServiceState,
197*84e33947SAndroid Build Coastguard Worker                         &mServiceState.chppServiceState,
198*84e33947SAndroid Build Coastguard Worker                         &mServiceState.outReqStates[0], &kService);
199*84e33947SAndroid Build Coastguard Worker 
200*84e33947SAndroid Build Coastguard Worker     mClientLinkContext.linkEstablished = true;
201*84e33947SAndroid Build Coastguard Worker     mServiceLinkContext.linkEstablished = true;
202*84e33947SAndroid Build Coastguard Worker 
203*84e33947SAndroid Build Coastguard Worker     chppClientInit(&mClientState.chppClientState,
204*84e33947SAndroid Build Coastguard Worker                    CHPP_HANDLE_NEGOTIATED_RANGE_START);
205*84e33947SAndroid Build Coastguard Worker   }
206*84e33947SAndroid Build Coastguard Worker 
TearDown()207*84e33947SAndroid Build Coastguard Worker   void TearDown() override {
208*84e33947SAndroid Build Coastguard Worker     chppAppDeinit(&mClientAppContext);
209*84e33947SAndroid Build Coastguard Worker     chppTransportDeinit(&mClientTransportContext);
210*84e33947SAndroid Build Coastguard Worker     chppClientDeinit(&mClientState.chppClientState);
211*84e33947SAndroid Build Coastguard Worker 
212*84e33947SAndroid Build Coastguard Worker     chppAppDeinit(&mServiceAppContext);
213*84e33947SAndroid Build Coastguard Worker     chppTransportDeinit(&mServiceTransportContext);
214*84e33947SAndroid Build Coastguard Worker 
215*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(chppGetTotalAllocBytes(), 0);
216*84e33947SAndroid Build Coastguard Worker   }
217*84e33947SAndroid Build Coastguard Worker 
AllocRequestCommand(uint16_t command)218*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *AllocRequestCommand(uint16_t command) {
219*84e33947SAndroid Build Coastguard Worker     return GetParam() == CHPP_MESSAGE_TYPE_CLIENT_REQUEST
220*84e33947SAndroid Build Coastguard Worker                ? chppAllocClientRequestCommand(&mClientState.chppClientState,
221*84e33947SAndroid Build Coastguard Worker                                                command)
222*84e33947SAndroid Build Coastguard Worker                : chppAllocServiceRequestCommand(&mServiceState.chppServiceState,
223*84e33947SAndroid Build Coastguard Worker                                                 command);
224*84e33947SAndroid Build Coastguard Worker   }
225*84e33947SAndroid Build Coastguard Worker 
TimestampOutgoingRequest(struct ChppAppHeader * request,uint64_t timeoutNs)226*84e33947SAndroid Build Coastguard Worker   void TimestampOutgoingRequest(struct ChppAppHeader *request,
227*84e33947SAndroid Build Coastguard Worker                                 uint64_t timeoutNs) {
228*84e33947SAndroid Build Coastguard Worker     CHPP_NOT_NULL(request);
229*84e33947SAndroid Build Coastguard Worker 
230*84e33947SAndroid Build Coastguard Worker     const uint16_t command = request->command;
231*84e33947SAndroid Build Coastguard Worker 
232*84e33947SAndroid Build Coastguard Worker     if (GetParam() == CHPP_MESSAGE_TYPE_CLIENT_REQUEST) {
233*84e33947SAndroid Build Coastguard Worker       chppTimestampOutgoingRequest(&mClientAppContext,
234*84e33947SAndroid Build Coastguard Worker                                    &mClientState.outReqStates[command], request,
235*84e33947SAndroid Build Coastguard Worker                                    timeoutNs);
236*84e33947SAndroid Build Coastguard Worker     } else {
237*84e33947SAndroid Build Coastguard Worker       chppTimestampOutgoingRequest(&mServiceAppContext,
238*84e33947SAndroid Build Coastguard Worker                                    &mServiceState.outReqStates[command],
239*84e33947SAndroid Build Coastguard Worker                                    request, timeoutNs);
240*84e33947SAndroid Build Coastguard Worker     }
241*84e33947SAndroid Build Coastguard Worker   }
242*84e33947SAndroid Build Coastguard Worker 
TimestampIncomingResponse(struct ChppAppHeader * response)243*84e33947SAndroid Build Coastguard Worker   bool TimestampIncomingResponse(struct ChppAppHeader *response) {
244*84e33947SAndroid Build Coastguard Worker     CHPP_NOT_NULL(response);
245*84e33947SAndroid Build Coastguard Worker 
246*84e33947SAndroid Build Coastguard Worker     const uint16_t command = response->command;
247*84e33947SAndroid Build Coastguard Worker 
248*84e33947SAndroid Build Coastguard Worker     if (GetParam() == CHPP_MESSAGE_TYPE_CLIENT_REQUEST) {
249*84e33947SAndroid Build Coastguard Worker       return chppTimestampIncomingResponse(
250*84e33947SAndroid Build Coastguard Worker           &mClientAppContext, &mClientState.outReqStates[command], response);
251*84e33947SAndroid Build Coastguard Worker     }
252*84e33947SAndroid Build Coastguard Worker     return chppTimestampIncomingResponse(
253*84e33947SAndroid Build Coastguard Worker         &mServiceAppContext, &mServiceState.outReqStates[command], response);
254*84e33947SAndroid Build Coastguard Worker   }
255*84e33947SAndroid Build Coastguard Worker 
GetNextRequestTimeoutNs(void)256*84e33947SAndroid Build Coastguard Worker   uint64_t GetNextRequestTimeoutNs(void) {
257*84e33947SAndroid Build Coastguard Worker     return GetParam() == CHPP_MESSAGE_TYPE_CLIENT_REQUEST
258*84e33947SAndroid Build Coastguard Worker                ? mClientAppContext.nextClientRequestTimeoutNs
259*84e33947SAndroid Build Coastguard Worker                : mServiceAppContext.nextServiceRequestTimeoutNs;
260*84e33947SAndroid Build Coastguard Worker   }
261*84e33947SAndroid Build Coastguard Worker 
GetTimeoutResponse(void)262*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *GetTimeoutResponse(void) {
263*84e33947SAndroid Build Coastguard Worker     return GetParam() == CHPP_MESSAGE_TYPE_CLIENT_REQUEST
264*84e33947SAndroid Build Coastguard Worker                ? chppTransportGetRequestTimeoutResponse(
265*84e33947SAndroid Build Coastguard Worker                      &mClientTransportContext, CHPP_ENDPOINT_CLIENT)
266*84e33947SAndroid Build Coastguard Worker                : chppTransportGetRequestTimeoutResponse(
267*84e33947SAndroid Build Coastguard Worker                      &mServiceTransportContext, CHPP_ENDPOINT_SERVICE);
268*84e33947SAndroid Build Coastguard Worker   }
269*84e33947SAndroid Build Coastguard Worker 
ValidateRequestState(struct ChppAppHeader * request)270*84e33947SAndroid Build Coastguard Worker   void ValidateRequestState(struct ChppAppHeader *request) {
271*84e33947SAndroid Build Coastguard Worker     CHPP_NOT_NULL(request);
272*84e33947SAndroid Build Coastguard Worker     if (GetParam() == CHPP_MESSAGE_TYPE_CLIENT_REQUEST) {
273*84e33947SAndroid Build Coastguard Worker       ValidateClientStateAndReqState(&mClientState.chppClientState, request);
274*84e33947SAndroid Build Coastguard Worker     } else {
275*84e33947SAndroid Build Coastguard Worker       ValidateServiceStateAndReqState(&mServiceState.chppServiceState, request);
276*84e33947SAndroid Build Coastguard Worker     }
277*84e33947SAndroid Build Coastguard Worker   }
278*84e33947SAndroid Build Coastguard Worker 
RegisterAndValidateRequestForTimeout(struct ChppAppHeader * request,uint64_t kTimeoutNs,uint64_t expectedTimeNs)279*84e33947SAndroid Build Coastguard Worker   void RegisterAndValidateRequestForTimeout(struct ChppAppHeader *request,
280*84e33947SAndroid Build Coastguard Worker                                             uint64_t kTimeoutNs,
281*84e33947SAndroid Build Coastguard Worker                                             uint64_t expectedTimeNs) {
282*84e33947SAndroid Build Coastguard Worker     CHPP_NOT_NULL(request);
283*84e33947SAndroid Build Coastguard Worker     ValidateRequestState(request);
284*84e33947SAndroid Build Coastguard Worker     TimestampOutgoingRequest(request, kTimeoutNs);
285*84e33947SAndroid Build Coastguard Worker 
286*84e33947SAndroid Build Coastguard Worker     validateTimeout(GetNextRequestTimeoutNs(), expectedTimeNs);
287*84e33947SAndroid Build Coastguard Worker   }
288*84e33947SAndroid Build Coastguard Worker 
RegisterAndValidateResponseForTimeout(struct ChppAppHeader * request,uint64_t expectedTimeNs)289*84e33947SAndroid Build Coastguard Worker   void RegisterAndValidateResponseForTimeout(struct ChppAppHeader *request,
290*84e33947SAndroid Build Coastguard Worker                                              uint64_t expectedTimeNs) {
291*84e33947SAndroid Build Coastguard Worker     CHPP_NOT_NULL(request);
292*84e33947SAndroid Build Coastguard Worker 
293*84e33947SAndroid Build Coastguard Worker     struct ChppAppHeader *response =
294*84e33947SAndroid Build Coastguard Worker         chppAllocResponse(request, sizeof(*request));
295*84e33947SAndroid Build Coastguard Worker 
296*84e33947SAndroid Build Coastguard Worker     ValidateRequestState(request);
297*84e33947SAndroid Build Coastguard Worker     TimestampIncomingResponse(response);
298*84e33947SAndroid Build Coastguard Worker 
299*84e33947SAndroid Build Coastguard Worker     validateTimeout(GetNextRequestTimeoutNs(), expectedTimeNs);
300*84e33947SAndroid Build Coastguard Worker 
301*84e33947SAndroid Build Coastguard Worker     chppFree(response);
302*84e33947SAndroid Build Coastguard Worker   }
303*84e33947SAndroid Build Coastguard Worker 
304*84e33947SAndroid Build Coastguard Worker   // Client side.
305*84e33947SAndroid Build Coastguard Worker   ChppLinuxLinkState mClientLinkContext = {};
306*84e33947SAndroid Build Coastguard Worker   ChppTransportState mClientTransportContext = {};
307*84e33947SAndroid Build Coastguard Worker   ChppAppState mClientAppContext = {};
308*84e33947SAndroid Build Coastguard Worker   ClientState mClientState;
309*84e33947SAndroid Build Coastguard Worker 
310*84e33947SAndroid Build Coastguard Worker   // Service side
311*84e33947SAndroid Build Coastguard Worker   ChppLinuxLinkState mServiceLinkContext = {};
312*84e33947SAndroid Build Coastguard Worker   ChppTransportState mServiceTransportContext = {};
313*84e33947SAndroid Build Coastguard Worker   ChppAppState mServiceAppContext = {};
314*84e33947SAndroid Build Coastguard Worker   ServiceState mServiceState;
315*84e33947SAndroid Build Coastguard Worker };
316*84e33947SAndroid Build Coastguard Worker 
317*84e33947SAndroid Build Coastguard Worker // Simulates a request and a response.
318*84e33947SAndroid Build Coastguard Worker // There should be no error as the timeout is infinite.
TEST_P(TimeoutParamTest,RequestResponseTimestampValid)319*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, RequestResponseTimestampValid) {
320*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request = AllocRequestCommand(0 /* command */);
321*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request, nullptr);
322*84e33947SAndroid Build Coastguard Worker   TimestampOutgoingRequest(request, CHPP_REQUEST_TIMEOUT_INFINITE);
323*84e33947SAndroid Build Coastguard Worker 
324*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *response = chppAllocResponse(request, sizeof(*request));
325*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(TimestampIncomingResponse(response));
326*84e33947SAndroid Build Coastguard Worker 
327*84e33947SAndroid Build Coastguard Worker   chppFree(request);
328*84e33947SAndroid Build Coastguard Worker   chppFree(response);
329*84e33947SAndroid Build Coastguard Worker }
330*84e33947SAndroid Build Coastguard Worker 
331*84e33947SAndroid Build Coastguard Worker // Simulates a single request with 2 responses.
TEST_P(TimeoutParamTest,RequestResponseTimestampDuplicate)332*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, RequestResponseTimestampDuplicate) {
333*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request = AllocRequestCommand(0 /* command */);
334*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request, nullptr);
335*84e33947SAndroid Build Coastguard Worker   TimestampOutgoingRequest(request, CHPP_REQUEST_TIMEOUT_INFINITE);
336*84e33947SAndroid Build Coastguard Worker 
337*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *response = chppAllocResponse(request, sizeof(*request));
338*84e33947SAndroid Build Coastguard Worker 
339*84e33947SAndroid Build Coastguard Worker   // The first response has no error.
340*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(TimestampIncomingResponse(response));
341*84e33947SAndroid Build Coastguard Worker 
342*84e33947SAndroid Build Coastguard Worker   // The second response errors as one response has already been received.
343*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(TimestampIncomingResponse(response));
344*84e33947SAndroid Build Coastguard Worker 
345*84e33947SAndroid Build Coastguard Worker   chppFree(request);
346*84e33947SAndroid Build Coastguard Worker   chppFree(response);
347*84e33947SAndroid Build Coastguard Worker }
348*84e33947SAndroid Build Coastguard Worker 
349*84e33947SAndroid Build Coastguard Worker // Simulates a response to a request that has not been timestamped.
TEST_P(TimeoutParamTest,RequestResponseTimestampInvalidId)350*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, RequestResponseTimestampInvalidId) {
351*84e33947SAndroid Build Coastguard Worker   constexpr uint16_t command = 0;
352*84e33947SAndroid Build Coastguard Worker 
353*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request1 = AllocRequestCommand(command);
354*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request1, nullptr);
355*84e33947SAndroid Build Coastguard Worker   TimestampOutgoingRequest(request1, CHPP_REQUEST_TIMEOUT_INFINITE);
356*84e33947SAndroid Build Coastguard Worker 
357*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request2 = AllocRequestCommand(command);
358*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request2, nullptr);
359*84e33947SAndroid Build Coastguard Worker 
360*84e33947SAndroid Build Coastguard Worker   // We expect a response for req but get a response for newReq.
361*84e33947SAndroid Build Coastguard Worker   // That is an error (the transaction does not match).
362*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *response =
363*84e33947SAndroid Build Coastguard Worker       chppAllocResponse(request2, sizeof(*request1));
364*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(TimestampIncomingResponse(response));
365*84e33947SAndroid Build Coastguard Worker 
366*84e33947SAndroid Build Coastguard Worker   chppFree(request1);
367*84e33947SAndroid Build Coastguard Worker   chppFree(request2);
368*84e33947SAndroid Build Coastguard Worker   chppFree(response);
369*84e33947SAndroid Build Coastguard Worker }
370*84e33947SAndroid Build Coastguard Worker 
371*84e33947SAndroid Build Coastguard Worker // Make sure the request does not timeout right away.
TEST_P(TimeoutParamTest,RequestTimeoutAddRemoveSingle)372*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, RequestTimeoutAddRemoveSingle) {
373*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetNextRequestTimeoutNs(), CHPP_TIME_MAX);
374*84e33947SAndroid Build Coastguard Worker 
375*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request = AllocRequestCommand(1 /* command */);
376*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request, nullptr);
377*84e33947SAndroid Build Coastguard Worker 
378*84e33947SAndroid Build Coastguard Worker   const uint64_t timeNs = chppGetCurrentTimeNs();
379*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeoutNs = 1000 * CHPP_NSEC_PER_MSEC;
380*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request, kTimeoutNs,
381*84e33947SAndroid Build Coastguard Worker                                        timeNs + kTimeoutNs);
382*84e33947SAndroid Build Coastguard Worker 
383*84e33947SAndroid Build Coastguard Worker   // Timeout is not expired yet.
384*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetTimeoutResponse(), nullptr);
385*84e33947SAndroid Build Coastguard Worker 
386*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request, CHPP_TIME_MAX);
387*84e33947SAndroid Build Coastguard Worker 
388*84e33947SAndroid Build Coastguard Worker   chppFree(request);
389*84e33947SAndroid Build Coastguard Worker }
390*84e33947SAndroid Build Coastguard Worker 
TEST_P(TimeoutParamTest,RequestTimeoutAddRemoveMultiple)391*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, RequestTimeoutAddRemoveMultiple) {
392*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetNextRequestTimeoutNs(), CHPP_TIME_MAX);
393*84e33947SAndroid Build Coastguard Worker 
394*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request1 = AllocRequestCommand(0 /* command */);
395*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request2 = AllocRequestCommand(1 /* command */);
396*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request3 = AllocRequestCommand(2 /* command */);
397*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request1, nullptr);
398*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request2, nullptr);
399*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request3, nullptr);
400*84e33947SAndroid Build Coastguard Worker 
401*84e33947SAndroid Build Coastguard Worker   // kTimeout1Ns is the smallest so it will be the first timeout to expire
402*84e33947SAndroid Build Coastguard Worker   // for all the requests.
403*84e33947SAndroid Build Coastguard Worker   const uint64_t time1Ns = chppGetCurrentTimeNs();
404*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout1Ns = 2000 * CHPP_NSEC_PER_MSEC;
405*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request1, kTimeout1Ns,
406*84e33947SAndroid Build Coastguard Worker                                        time1Ns + kTimeout1Ns);
407*84e33947SAndroid Build Coastguard Worker 
408*84e33947SAndroid Build Coastguard Worker   const uint64_t time2Ns = chppGetCurrentTimeNs();
409*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout2Ns = 4000 * CHPP_NSEC_PER_MSEC;
410*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request2, kTimeout2Ns,
411*84e33947SAndroid Build Coastguard Worker                                        time1Ns + kTimeout1Ns);
412*84e33947SAndroid Build Coastguard Worker 
413*84e33947SAndroid Build Coastguard Worker   const uint64_t time3Ns = chppGetCurrentTimeNs();
414*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout3Ns = 3000 * CHPP_NSEC_PER_MSEC;
415*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request3, kTimeout3Ns,
416*84e33947SAndroid Build Coastguard Worker                                        time1Ns + kTimeout1Ns);
417*84e33947SAndroid Build Coastguard Worker 
418*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request1, time3Ns + kTimeout3Ns);
419*84e33947SAndroid Build Coastguard Worker 
420*84e33947SAndroid Build Coastguard Worker   // Timeout is not expired yet.
421*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetTimeoutResponse(), nullptr);
422*84e33947SAndroid Build Coastguard Worker 
423*84e33947SAndroid Build Coastguard Worker   // kTimeout4Ns is now the smallest timeout.
424*84e33947SAndroid Build Coastguard Worker   const uint64_t time4Ns = chppGetCurrentTimeNs();
425*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout4Ns = 1000 * CHPP_NSEC_PER_MSEC;
426*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request1, kTimeout4Ns,
427*84e33947SAndroid Build Coastguard Worker                                        time4Ns + kTimeout4Ns);
428*84e33947SAndroid Build Coastguard Worker 
429*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request1, time3Ns + kTimeout3Ns);
430*84e33947SAndroid Build Coastguard Worker 
431*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request3, time2Ns + kTimeout2Ns);
432*84e33947SAndroid Build Coastguard Worker 
433*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request2, CHPP_TIME_MAX);
434*84e33947SAndroid Build Coastguard Worker 
435*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetTimeoutResponse(), nullptr);
436*84e33947SAndroid Build Coastguard Worker 
437*84e33947SAndroid Build Coastguard Worker   chppFree(request1);
438*84e33947SAndroid Build Coastguard Worker   chppFree(request2);
439*84e33947SAndroid Build Coastguard Worker   chppFree(request3);
440*84e33947SAndroid Build Coastguard Worker }
441*84e33947SAndroid Build Coastguard Worker 
TEST_P(TimeoutParamTest,DuplicateRequestTimeoutResponse)442*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, DuplicateRequestTimeoutResponse) {
443*84e33947SAndroid Build Coastguard Worker   // Sleep padding to make sure we timeout.
444*84e33947SAndroid Build Coastguard Worker   constexpr auto kTimeoutPadding = std::chrono::milliseconds(50);
445*84e33947SAndroid Build Coastguard Worker 
446*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetNextRequestTimeoutNs(), CHPP_TIME_MAX);
447*84e33947SAndroid Build Coastguard Worker 
448*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request = AllocRequestCommand(1 /* command */);
449*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request, nullptr);
450*84e33947SAndroid Build Coastguard Worker 
451*84e33947SAndroid Build Coastguard Worker   // Send the first request.
452*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout1Ns = 20 * CHPP_NSEC_PER_MSEC;
453*84e33947SAndroid Build Coastguard Worker   const uint64_t kShouldTimeout1AtNs = chppGetCurrentTimeNs() + kTimeout1Ns;
454*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request, kTimeout1Ns,
455*84e33947SAndroid Build Coastguard Worker                                        kShouldTimeout1AtNs);
456*84e33947SAndroid Build Coastguard Worker 
457*84e33947SAndroid Build Coastguard Worker   // Override with a new request.
458*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout2Ns = 400 * CHPP_NSEC_PER_MSEC;
459*84e33947SAndroid Build Coastguard Worker   const uint64_t kShouldTimeout2AtNs = chppGetCurrentTimeNs() + kTimeout2Ns;
460*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request, kTimeout2Ns,
461*84e33947SAndroid Build Coastguard Worker                                        kShouldTimeout2AtNs);
462*84e33947SAndroid Build Coastguard Worker 
463*84e33947SAndroid Build Coastguard Worker   std::this_thread::sleep_for(
464*84e33947SAndroid Build Coastguard Worker       std::chrono::nanoseconds(kShouldTimeout1AtNs - chppGetCurrentTimeNs()) +
465*84e33947SAndroid Build Coastguard Worker       kTimeoutPadding);
466*84e33947SAndroid Build Coastguard Worker   // First request would have timed out but superseded by second request.
467*84e33947SAndroid Build Coastguard Worker   EXPECT_GT(GetNextRequestTimeoutNs(), chppGetCurrentTimeNs());
468*84e33947SAndroid Build Coastguard Worker 
469*84e33947SAndroid Build Coastguard Worker   std::this_thread::sleep_for(
470*84e33947SAndroid Build Coastguard Worker       std::chrono::nanoseconds(kShouldTimeout2AtNs - chppGetCurrentTimeNs()) +
471*84e33947SAndroid Build Coastguard Worker       kTimeoutPadding);
472*84e33947SAndroid Build Coastguard Worker   // Second request should have timed out - so we get a response.
473*84e33947SAndroid Build Coastguard Worker   EXPECT_LT(GetNextRequestTimeoutNs(), chppGetCurrentTimeNs());
474*84e33947SAndroid Build Coastguard Worker 
475*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *response = GetTimeoutResponse();
476*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(response, nullptr);
477*84e33947SAndroid Build Coastguard Worker   validateTimeoutResponse(request, response);
478*84e33947SAndroid Build Coastguard Worker   chppFree(response);
479*84e33947SAndroid Build Coastguard Worker 
480*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request, CHPP_TIME_MAX);
481*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetTimeoutResponse(), nullptr);
482*84e33947SAndroid Build Coastguard Worker 
483*84e33947SAndroid Build Coastguard Worker   chppFree(request);
484*84e33947SAndroid Build Coastguard Worker }
485*84e33947SAndroid Build Coastguard Worker 
TEST_P(TimeoutParamTest,RequestTimeoutResponse)486*84e33947SAndroid Build Coastguard Worker TEST_P(TimeoutParamTest, RequestTimeoutResponse) {
487*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetNextRequestTimeoutNs(), CHPP_TIME_MAX);
488*84e33947SAndroid Build Coastguard Worker 
489*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request1 = AllocRequestCommand(1 /* command */);
490*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request2 = AllocRequestCommand(2 /* command */);
491*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request1, nullptr);
492*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(request2, nullptr);
493*84e33947SAndroid Build Coastguard Worker 
494*84e33947SAndroid Build Coastguard Worker   const uint64_t time1Ns = chppGetCurrentTimeNs();
495*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout1Ns = 200 * CHPP_NSEC_PER_MSEC;
496*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request1, kTimeout1Ns,
497*84e33947SAndroid Build Coastguard Worker                                        time1Ns + kTimeout1Ns);
498*84e33947SAndroid Build Coastguard Worker 
499*84e33947SAndroid Build Coastguard Worker   std::this_thread::sleep_for(std::chrono::nanoseconds(kTimeout1Ns));
500*84e33947SAndroid Build Coastguard Worker   ASSERT_LT(GetNextRequestTimeoutNs(), chppGetCurrentTimeNs());
501*84e33947SAndroid Build Coastguard Worker 
502*84e33947SAndroid Build Coastguard Worker   // No response in time, we then get a timeout response.
503*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *response = GetTimeoutResponse();
504*84e33947SAndroid Build Coastguard Worker   validateTimeoutResponse(request1, response);
505*84e33947SAndroid Build Coastguard Worker   chppFree(response);
506*84e33947SAndroid Build Coastguard Worker 
507*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateResponseForTimeout(request1, CHPP_TIME_MAX);
508*84e33947SAndroid Build Coastguard Worker   // No other request in timeout.
509*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(GetTimeoutResponse(), nullptr);
510*84e33947SAndroid Build Coastguard Worker 
511*84e33947SAndroid Build Coastguard Worker   // Simulate a new timeout and make sure we have a timeout response.
512*84e33947SAndroid Build Coastguard Worker   const uint64_t time2Ns = chppGetCurrentTimeNs();
513*84e33947SAndroid Build Coastguard Worker   constexpr uint64_t kTimeout2Ns = 200 * CHPP_NSEC_PER_MSEC;
514*84e33947SAndroid Build Coastguard Worker   RegisterAndValidateRequestForTimeout(request2, kTimeout2Ns,
515*84e33947SAndroid Build Coastguard Worker                                        time2Ns + kTimeout2Ns);
516*84e33947SAndroid Build Coastguard Worker 
517*84e33947SAndroid Build Coastguard Worker   std::this_thread::sleep_for(std::chrono::nanoseconds(kTimeout2Ns));
518*84e33947SAndroid Build Coastguard Worker   ASSERT_LT(GetNextRequestTimeoutNs(), chppGetCurrentTimeNs());
519*84e33947SAndroid Build Coastguard Worker 
520*84e33947SAndroid Build Coastguard Worker   response = GetTimeoutResponse();
521*84e33947SAndroid Build Coastguard Worker   validateTimeoutResponse(request2, response);
522*84e33947SAndroid Build Coastguard Worker   chppFree(response);
523*84e33947SAndroid Build Coastguard Worker 
524*84e33947SAndroid Build Coastguard Worker   chppFree(request1);
525*84e33947SAndroid Build Coastguard Worker   chppFree(request2);
526*84e33947SAndroid Build Coastguard Worker }
527*84e33947SAndroid Build Coastguard Worker 
528*84e33947SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
529*84e33947SAndroid Build Coastguard Worker     TimeoutTest, TimeoutParamTest,
530*84e33947SAndroid Build Coastguard Worker     testing::Values(CHPP_MESSAGE_TYPE_CLIENT_REQUEST,
531*84e33947SAndroid Build Coastguard Worker                     CHPP_MESSAGE_TYPE_SERVICE_REQUEST),
__anon37ed931a0202(const testing::TestParamInfo<TimeoutParamTest::ParamType> &info) 532*84e33947SAndroid Build Coastguard Worker     [](const testing::TestParamInfo<TimeoutParamTest::ParamType> &info) {
533*84e33947SAndroid Build Coastguard Worker       return info.param == CHPP_MESSAGE_TYPE_CLIENT_REQUEST ? "ClientRequests"
534*84e33947SAndroid Build Coastguard Worker                                                             : "ServiceRequests";
535*84e33947SAndroid Build Coastguard Worker     });
536*84e33947SAndroid Build Coastguard Worker 
537*84e33947SAndroid Build Coastguard Worker }  // namespace
538*84e33947SAndroid Build Coastguard Worker }  // namespace chre