1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
17*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include "VtsHalContexthubUtilsCommon.h"
20*4d7e907cSAndroid Build Coastguard Worker
21*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/contexthub/BnContextHub.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/contexthub/BnContextHubCallback.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/contexthub/BnEndpointCallback.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/contexthub/IContextHub.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/contexthub/IContextHubCallback.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/contexthub/IEndpointCallback.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
29*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h>
30*4d7e907cSAndroid Build Coastguard Worker
31*4d7e907cSAndroid Build Coastguard Worker #include <cinttypes>
32*4d7e907cSAndroid Build Coastguard Worker #include <future>
33*4d7e907cSAndroid Build Coastguard Worker
34*4d7e907cSAndroid Build Coastguard Worker using ::android::ProcessState;
35*4d7e907cSAndroid Build Coastguard Worker using ::android::sp;
36*4d7e907cSAndroid Build Coastguard Worker using ::android::String16;
37*4d7e907cSAndroid Build Coastguard Worker using ::android::binder::Status;
38*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::AsyncEventType;
39*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::BnEndpointCallback;
40*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::ContextHubInfo;
41*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::ContextHubMessage;
42*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::EndpointId;
43*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::EndpointInfo;
44*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::ErrorCode;
45*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::HostEndpointInfo;
46*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::HubInfo;
47*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::IContextHub;
48*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::IContextHubCallbackDefault;
49*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::Message;
50*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::MessageDeliveryStatus;
51*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::NanoappBinary;
52*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::NanoappInfo;
53*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::NanoappRpcService;
54*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::NanSessionRequest;
55*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::NanSessionStateUpdate;
56*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::Reason;
57*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::Service;
58*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::Setting;
59*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::vts_utils::kNonExistentAppId;
60*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::contexthub::vts_utils::waitForCallback;
61*4d7e907cSAndroid Build Coastguard Worker
62*4d7e907cSAndroid Build Coastguard Worker // 6612b522-b717-41c8-b48d-c0b1cc64e142
63*4d7e907cSAndroid Build Coastguard Worker constexpr std::array<uint8_t, 16> kUuid = {0x66, 0x12, 0xb5, 0x22, 0xb7, 0x17, 0x41, 0xc8,
64*4d7e907cSAndroid Build Coastguard Worker 0xb4, 0x8d, 0xc0, 0xb1, 0xcc, 0x64, 0xe1, 0x42};
65*4d7e907cSAndroid Build Coastguard Worker const String16 kName{"VtsAidlHalContextHubTargetTest"};
66*4d7e907cSAndroid Build Coastguard Worker
67*4d7e907cSAndroid Build Coastguard Worker class ContextHubAidl : public testing::TestWithParam<std::tuple<std::string, int32_t>> {
68*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()69*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
70*4d7e907cSAndroid Build Coastguard Worker contextHub = android::waitForDeclaredService<IContextHub>(
71*4d7e907cSAndroid Build Coastguard Worker String16(std::get<0>(GetParam()).c_str()));
72*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(contextHub, nullptr);
73*4d7e907cSAndroid Build Coastguard Worker
74*4d7e907cSAndroid Build Coastguard Worker // Best effort enable test mode - this may not be supported on older HALS, so we
75*4d7e907cSAndroid Build Coastguard Worker // ignore the return value.
76*4d7e907cSAndroid Build Coastguard Worker contextHub->setTestMode(/* enable= */ true);
77*4d7e907cSAndroid Build Coastguard Worker }
78*4d7e907cSAndroid Build Coastguard Worker
TearDown()79*4d7e907cSAndroid Build Coastguard Worker virtual void TearDown() override { contextHub->setTestMode(/* enable= */ false); }
80*4d7e907cSAndroid Build Coastguard Worker
getHubId()81*4d7e907cSAndroid Build Coastguard Worker uint32_t getHubId() { return std::get<1>(GetParam()); }
82*4d7e907cSAndroid Build Coastguard Worker
83*4d7e907cSAndroid Build Coastguard Worker void testSettingChanged(Setting setting);
84*4d7e907cSAndroid Build Coastguard Worker
85*4d7e907cSAndroid Build Coastguard Worker sp<IContextHub> contextHub;
86*4d7e907cSAndroid Build Coastguard Worker };
87*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestGetHubs)88*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestGetHubs) {
89*4d7e907cSAndroid Build Coastguard Worker std::vector<ContextHubInfo> hubs;
90*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->getContextHubs(&hubs).isOk());
91*4d7e907cSAndroid Build Coastguard Worker
92*4d7e907cSAndroid Build Coastguard Worker ALOGD("System reports %zu hubs", hubs.size());
93*4d7e907cSAndroid Build Coastguard Worker
94*4d7e907cSAndroid Build Coastguard Worker for (const ContextHubInfo& hub : hubs) {
95*4d7e907cSAndroid Build Coastguard Worker ALOGD("Checking hub ID %" PRIu32, hub.id);
96*4d7e907cSAndroid Build Coastguard Worker
97*4d7e907cSAndroid Build Coastguard Worker EXPECT_GT(hub.name.size(), 0);
98*4d7e907cSAndroid Build Coastguard Worker EXPECT_GT(hub.vendor.size(), 0);
99*4d7e907cSAndroid Build Coastguard Worker EXPECT_GT(hub.toolchain.size(), 0);
100*4d7e907cSAndroid Build Coastguard Worker EXPECT_GT(hub.peakMips, 0);
101*4d7e907cSAndroid Build Coastguard Worker EXPECT_GT(hub.chrePlatformId, 0);
102*4d7e907cSAndroid Build Coastguard Worker EXPECT_GT(hub.chreApiMajorVersion, 0);
103*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(hub.chreApiMinorVersion, 0);
104*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(hub.chrePatchVersion, 0);
105*4d7e907cSAndroid Build Coastguard Worker
106*4d7e907cSAndroid Build Coastguard Worker // Minimum 128 byte MTU as required by CHRE API v1.0
107*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(hub.maxSupportedMessageLengthBytes, UINT32_C(128));
108*4d7e907cSAndroid Build Coastguard Worker }
109*4d7e907cSAndroid Build Coastguard Worker }
110*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestEnableTestMode)111*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestEnableTestMode) {
112*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->setTestMode(true);
113*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
114*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
115*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
116*4d7e907cSAndroid Build Coastguard Worker } else {
117*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
118*4d7e907cSAndroid Build Coastguard Worker }
119*4d7e907cSAndroid Build Coastguard Worker }
120*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestDisableTestMode)121*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestDisableTestMode) {
122*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->setTestMode(false);
123*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
124*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
125*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
126*4d7e907cSAndroid Build Coastguard Worker } else {
127*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
128*4d7e907cSAndroid Build Coastguard Worker }
129*4d7e907cSAndroid Build Coastguard Worker }
130*4d7e907cSAndroid Build Coastguard Worker
131*4d7e907cSAndroid Build Coastguard Worker class EmptyContextHubCallback : public android::hardware::contexthub::BnContextHubCallback {
132*4d7e907cSAndroid Build Coastguard Worker public:
handleNanoappInfo(const std::vector<NanoappInfo> &)133*4d7e907cSAndroid Build Coastguard Worker Status handleNanoappInfo(const std::vector<NanoappInfo>& /* appInfo */) override {
134*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
135*4d7e907cSAndroid Build Coastguard Worker }
136*4d7e907cSAndroid Build Coastguard Worker
handleContextHubMessage(const ContextHubMessage &,const std::vector<String16> &)137*4d7e907cSAndroid Build Coastguard Worker Status handleContextHubMessage(const ContextHubMessage& /* msg */,
138*4d7e907cSAndroid Build Coastguard Worker const std::vector<String16>& /* msgContentPerms */) override {
139*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
140*4d7e907cSAndroid Build Coastguard Worker }
141*4d7e907cSAndroid Build Coastguard Worker
handleContextHubAsyncEvent(AsyncEventType)142*4d7e907cSAndroid Build Coastguard Worker Status handleContextHubAsyncEvent(AsyncEventType /* evt */) override { return Status::ok(); }
143*4d7e907cSAndroid Build Coastguard Worker
handleTransactionResult(int32_t,bool)144*4d7e907cSAndroid Build Coastguard Worker Status handleTransactionResult(int32_t /* transactionId */, bool /* success */) override {
145*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
146*4d7e907cSAndroid Build Coastguard Worker }
147*4d7e907cSAndroid Build Coastguard Worker
handleNanSessionRequest(const NanSessionRequest &)148*4d7e907cSAndroid Build Coastguard Worker Status handleNanSessionRequest(const NanSessionRequest& /* request */) override {
149*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
150*4d7e907cSAndroid Build Coastguard Worker }
151*4d7e907cSAndroid Build Coastguard Worker
handleMessageDeliveryStatus(char16_t,const MessageDeliveryStatus &)152*4d7e907cSAndroid Build Coastguard Worker Status handleMessageDeliveryStatus(
153*4d7e907cSAndroid Build Coastguard Worker char16_t /* hostEndPointId */,
154*4d7e907cSAndroid Build Coastguard Worker const MessageDeliveryStatus& /* messageDeliveryStatus */) override {
155*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
156*4d7e907cSAndroid Build Coastguard Worker }
157*4d7e907cSAndroid Build Coastguard Worker
getUuid(std::array<uint8_t,16> * out_uuid)158*4d7e907cSAndroid Build Coastguard Worker Status getUuid(std::array<uint8_t, 16>* out_uuid) override {
159*4d7e907cSAndroid Build Coastguard Worker *out_uuid = kUuid;
160*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
161*4d7e907cSAndroid Build Coastguard Worker }
162*4d7e907cSAndroid Build Coastguard Worker
getName(::android::String16 * out_name)163*4d7e907cSAndroid Build Coastguard Worker Status getName(::android::String16* out_name) override {
164*4d7e907cSAndroid Build Coastguard Worker *out_name = kName;
165*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
166*4d7e907cSAndroid Build Coastguard Worker }
167*4d7e907cSAndroid Build Coastguard Worker };
168*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestRegisterCallback)169*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestRegisterCallback) {
170*4d7e907cSAndroid Build Coastguard Worker sp<EmptyContextHubCallback> cb = sp<EmptyContextHubCallback>::make();
171*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->registerCallback(getHubId(), cb).isOk());
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker
174*4d7e907cSAndroid Build Coastguard Worker // Helper callback that puts the async appInfo callback data into a promise
175*4d7e907cSAndroid Build Coastguard Worker class QueryAppsCallback : public android::hardware::contexthub::BnContextHubCallback {
176*4d7e907cSAndroid Build Coastguard Worker public:
handleNanoappInfo(const std::vector<NanoappInfo> & appInfo)177*4d7e907cSAndroid Build Coastguard Worker Status handleNanoappInfo(const std::vector<NanoappInfo>& appInfo) override {
178*4d7e907cSAndroid Build Coastguard Worker ALOGD("Got app info callback with %zu apps", appInfo.size());
179*4d7e907cSAndroid Build Coastguard Worker promise.set_value(appInfo);
180*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
181*4d7e907cSAndroid Build Coastguard Worker }
182*4d7e907cSAndroid Build Coastguard Worker
handleContextHubMessage(const ContextHubMessage &,const std::vector<String16> &)183*4d7e907cSAndroid Build Coastguard Worker Status handleContextHubMessage(const ContextHubMessage& /* msg */,
184*4d7e907cSAndroid Build Coastguard Worker const std::vector<String16>& /* msgContentPerms */) override {
185*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
186*4d7e907cSAndroid Build Coastguard Worker }
187*4d7e907cSAndroid Build Coastguard Worker
handleContextHubAsyncEvent(AsyncEventType)188*4d7e907cSAndroid Build Coastguard Worker Status handleContextHubAsyncEvent(AsyncEventType /* evt */) override { return Status::ok(); }
189*4d7e907cSAndroid Build Coastguard Worker
handleTransactionResult(int32_t,bool)190*4d7e907cSAndroid Build Coastguard Worker Status handleTransactionResult(int32_t /* transactionId */, bool /* success */) override {
191*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
192*4d7e907cSAndroid Build Coastguard Worker }
193*4d7e907cSAndroid Build Coastguard Worker
handleNanSessionRequest(const NanSessionRequest &)194*4d7e907cSAndroid Build Coastguard Worker Status handleNanSessionRequest(const NanSessionRequest& /* request */) override {
195*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
196*4d7e907cSAndroid Build Coastguard Worker }
197*4d7e907cSAndroid Build Coastguard Worker
handleMessageDeliveryStatus(char16_t,const MessageDeliveryStatus &)198*4d7e907cSAndroid Build Coastguard Worker Status handleMessageDeliveryStatus(
199*4d7e907cSAndroid Build Coastguard Worker char16_t /* hostEndPointId */,
200*4d7e907cSAndroid Build Coastguard Worker const MessageDeliveryStatus& /* messageDeliveryStatus */) override {
201*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
202*4d7e907cSAndroid Build Coastguard Worker }
203*4d7e907cSAndroid Build Coastguard Worker
getUuid(std::array<uint8_t,16> * out_uuid)204*4d7e907cSAndroid Build Coastguard Worker Status getUuid(std::array<uint8_t, 16>* out_uuid) override {
205*4d7e907cSAndroid Build Coastguard Worker *out_uuid = kUuid;
206*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
207*4d7e907cSAndroid Build Coastguard Worker }
208*4d7e907cSAndroid Build Coastguard Worker
getName(::android::String16 * out_name)209*4d7e907cSAndroid Build Coastguard Worker Status getName(::android::String16* out_name) override {
210*4d7e907cSAndroid Build Coastguard Worker *out_name = kName;
211*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
212*4d7e907cSAndroid Build Coastguard Worker }
213*4d7e907cSAndroid Build Coastguard Worker
214*4d7e907cSAndroid Build Coastguard Worker std::promise<std::vector<NanoappInfo>> promise;
215*4d7e907cSAndroid Build Coastguard Worker };
216*4d7e907cSAndroid Build Coastguard Worker
217*4d7e907cSAndroid Build Coastguard Worker // Calls queryApps() and checks the returned metadata
TEST_P(ContextHubAidl,TestQueryApps)218*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestQueryApps) {
219*4d7e907cSAndroid Build Coastguard Worker sp<QueryAppsCallback> cb = sp<QueryAppsCallback>::make();
220*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->registerCallback(getHubId(), cb).isOk());
221*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->queryNanoapps(getHubId()).isOk());
222*4d7e907cSAndroid Build Coastguard Worker
223*4d7e907cSAndroid Build Coastguard Worker std::vector<NanoappInfo> appInfoList;
224*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &appInfoList));
225*4d7e907cSAndroid Build Coastguard Worker for (const NanoappInfo& appInfo : appInfoList) {
226*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(appInfo.nanoappId, UINT64_C(0));
227*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(appInfo.nanoappId, kNonExistentAppId);
228*4d7e907cSAndroid Build Coastguard Worker
229*4d7e907cSAndroid Build Coastguard Worker // Verify services are unique.
230*4d7e907cSAndroid Build Coastguard Worker std::set<uint64_t> existingServiceIds;
231*4d7e907cSAndroid Build Coastguard Worker for (const NanoappRpcService& rpcService : appInfo.rpcServices) {
232*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(rpcService.id, UINT64_C(0));
233*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(existingServiceIds.count(rpcService.id), 0);
234*4d7e907cSAndroid Build Coastguard Worker existingServiceIds.insert(rpcService.id);
235*4d7e907cSAndroid Build Coastguard Worker }
236*4d7e907cSAndroid Build Coastguard Worker }
237*4d7e907cSAndroid Build Coastguard Worker }
238*4d7e907cSAndroid Build Coastguard Worker
239*4d7e907cSAndroid Build Coastguard Worker // Calls getPreloadedNanoappsIds() and verifies there are preloaded nanoapps
TEST_P(ContextHubAidl,TestGetPreloadedNanoappIds)240*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestGetPreloadedNanoappIds) {
241*4d7e907cSAndroid Build Coastguard Worker std::vector<int64_t> preloadedNanoappIds;
242*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->getPreloadedNanoappIds(getHubId(), &preloadedNanoappIds);
243*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
244*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
245*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
246*4d7e907cSAndroid Build Coastguard Worker } else {
247*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
248*4d7e907cSAndroid Build Coastguard Worker }
249*4d7e907cSAndroid Build Coastguard Worker }
250*4d7e907cSAndroid Build Coastguard Worker
251*4d7e907cSAndroid Build Coastguard Worker // Helper callback that puts the TransactionResult for the expectedTransactionId into a
252*4d7e907cSAndroid Build Coastguard Worker // promise
253*4d7e907cSAndroid Build Coastguard Worker class TransactionResultCallback : public android::hardware::contexthub::BnContextHubCallback {
254*4d7e907cSAndroid Build Coastguard Worker public:
handleNanoappInfo(const std::vector<NanoappInfo> &)255*4d7e907cSAndroid Build Coastguard Worker Status handleNanoappInfo(const std::vector<NanoappInfo>& /* appInfo */) override {
256*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
257*4d7e907cSAndroid Build Coastguard Worker }
258*4d7e907cSAndroid Build Coastguard Worker
handleContextHubMessage(const ContextHubMessage &,const std::vector<String16> &)259*4d7e907cSAndroid Build Coastguard Worker Status handleContextHubMessage(const ContextHubMessage& /* msg */,
260*4d7e907cSAndroid Build Coastguard Worker const std::vector<String16>& /* msgContentPerms */) override {
261*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
262*4d7e907cSAndroid Build Coastguard Worker }
263*4d7e907cSAndroid Build Coastguard Worker
handleContextHubAsyncEvent(AsyncEventType)264*4d7e907cSAndroid Build Coastguard Worker Status handleContextHubAsyncEvent(AsyncEventType /* evt */) override { return Status::ok(); }
265*4d7e907cSAndroid Build Coastguard Worker
handleTransactionResult(int32_t transactionId,bool success)266*4d7e907cSAndroid Build Coastguard Worker Status handleTransactionResult(int32_t transactionId, bool success) override {
267*4d7e907cSAndroid Build Coastguard Worker ALOGD("Got transaction result callback for transactionId %" PRIu32 " (expecting %" PRIu32
268*4d7e907cSAndroid Build Coastguard Worker ") with success %d",
269*4d7e907cSAndroid Build Coastguard Worker transactionId, expectedTransactionId, success);
270*4d7e907cSAndroid Build Coastguard Worker if (transactionId == expectedTransactionId) {
271*4d7e907cSAndroid Build Coastguard Worker promise.set_value(success);
272*4d7e907cSAndroid Build Coastguard Worker }
273*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
274*4d7e907cSAndroid Build Coastguard Worker }
275*4d7e907cSAndroid Build Coastguard Worker
handleNanSessionRequest(const NanSessionRequest &)276*4d7e907cSAndroid Build Coastguard Worker Status handleNanSessionRequest(const NanSessionRequest& /* request */) override {
277*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
278*4d7e907cSAndroid Build Coastguard Worker }
279*4d7e907cSAndroid Build Coastguard Worker
handleMessageDeliveryStatus(char16_t,const MessageDeliveryStatus &)280*4d7e907cSAndroid Build Coastguard Worker Status handleMessageDeliveryStatus(
281*4d7e907cSAndroid Build Coastguard Worker char16_t /* hostEndPointId */,
282*4d7e907cSAndroid Build Coastguard Worker const MessageDeliveryStatus& /* messageDeliveryStatus */) override {
283*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
284*4d7e907cSAndroid Build Coastguard Worker }
285*4d7e907cSAndroid Build Coastguard Worker
getUuid(std::array<uint8_t,16> * out_uuid)286*4d7e907cSAndroid Build Coastguard Worker Status getUuid(std::array<uint8_t, 16>* out_uuid) override {
287*4d7e907cSAndroid Build Coastguard Worker *out_uuid = kUuid;
288*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
289*4d7e907cSAndroid Build Coastguard Worker }
290*4d7e907cSAndroid Build Coastguard Worker
getName(::android::String16 * out_name)291*4d7e907cSAndroid Build Coastguard Worker Status getName(::android::String16* out_name) override {
292*4d7e907cSAndroid Build Coastguard Worker *out_name = kName;
293*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
294*4d7e907cSAndroid Build Coastguard Worker }
295*4d7e907cSAndroid Build Coastguard Worker
296*4d7e907cSAndroid Build Coastguard Worker uint32_t expectedTransactionId = 0;
297*4d7e907cSAndroid Build Coastguard Worker std::promise<bool> promise;
298*4d7e907cSAndroid Build Coastguard Worker };
299*4d7e907cSAndroid Build Coastguard Worker
300*4d7e907cSAndroid Build Coastguard Worker // Parameterized fixture that sets the callback to TransactionResultCallback
301*4d7e907cSAndroid Build Coastguard Worker class ContextHubTransactionTest : public ContextHubAidl {
302*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()303*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
304*4d7e907cSAndroid Build Coastguard Worker ContextHubAidl::SetUp();
305*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->registerCallback(getHubId(), cb).isOk());
306*4d7e907cSAndroid Build Coastguard Worker }
307*4d7e907cSAndroid Build Coastguard Worker
308*4d7e907cSAndroid Build Coastguard Worker sp<TransactionResultCallback> cb = sp<TransactionResultCallback>::make();
309*4d7e907cSAndroid Build Coastguard Worker };
310*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestSendMessageToNonExistentNanoapp)311*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestSendMessageToNonExistentNanoapp) {
312*4d7e907cSAndroid Build Coastguard Worker ContextHubMessage message;
313*4d7e907cSAndroid Build Coastguard Worker message.nanoappId = kNonExistentAppId;
314*4d7e907cSAndroid Build Coastguard Worker message.messageType = 1;
315*4d7e907cSAndroid Build Coastguard Worker message.messageBody.resize(4);
316*4d7e907cSAndroid Build Coastguard Worker std::fill(message.messageBody.begin(), message.messageBody.end(), 0);
317*4d7e907cSAndroid Build Coastguard Worker
318*4d7e907cSAndroid Build Coastguard Worker ALOGD("Sending message to non-existent nanoapp");
319*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->sendMessageToHub(getHubId(), message).isOk());
320*4d7e907cSAndroid Build Coastguard Worker }
321*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestLoadEmptyNanoapp)322*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestLoadEmptyNanoapp) {
323*4d7e907cSAndroid Build Coastguard Worker cb->expectedTransactionId = 0123;
324*4d7e907cSAndroid Build Coastguard Worker NanoappBinary emptyApp;
325*4d7e907cSAndroid Build Coastguard Worker
326*4d7e907cSAndroid Build Coastguard Worker emptyApp.nanoappId = kNonExistentAppId;
327*4d7e907cSAndroid Build Coastguard Worker emptyApp.nanoappVersion = 1;
328*4d7e907cSAndroid Build Coastguard Worker emptyApp.flags = 0;
329*4d7e907cSAndroid Build Coastguard Worker emptyApp.targetChreApiMajorVersion = 1;
330*4d7e907cSAndroid Build Coastguard Worker emptyApp.targetChreApiMinorVersion = 0;
331*4d7e907cSAndroid Build Coastguard Worker
332*4d7e907cSAndroid Build Coastguard Worker ALOGD("Loading empty nanoapp");
333*4d7e907cSAndroid Build Coastguard Worker bool success = contextHub->loadNanoapp(getHubId(), emptyApp, cb->expectedTransactionId).isOk();
334*4d7e907cSAndroid Build Coastguard Worker if (success) {
335*4d7e907cSAndroid Build Coastguard Worker bool transactionSuccess;
336*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &transactionSuccess));
337*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(transactionSuccess);
338*4d7e907cSAndroid Build Coastguard Worker }
339*4d7e907cSAndroid Build Coastguard Worker }
340*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestUnloadNonexistentNanoapp)341*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestUnloadNonexistentNanoapp) {
342*4d7e907cSAndroid Build Coastguard Worker cb->expectedTransactionId = 1234;
343*4d7e907cSAndroid Build Coastguard Worker
344*4d7e907cSAndroid Build Coastguard Worker ALOGD("Unloading nonexistent nanoapp");
345*4d7e907cSAndroid Build Coastguard Worker bool success =
346*4d7e907cSAndroid Build Coastguard Worker contextHub->unloadNanoapp(getHubId(), kNonExistentAppId, cb->expectedTransactionId)
347*4d7e907cSAndroid Build Coastguard Worker .isOk();
348*4d7e907cSAndroid Build Coastguard Worker if (success) {
349*4d7e907cSAndroid Build Coastguard Worker bool transactionSuccess;
350*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &transactionSuccess));
351*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(transactionSuccess);
352*4d7e907cSAndroid Build Coastguard Worker }
353*4d7e907cSAndroid Build Coastguard Worker }
354*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestEnableNonexistentNanoapp)355*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestEnableNonexistentNanoapp) {
356*4d7e907cSAndroid Build Coastguard Worker cb->expectedTransactionId = 2345;
357*4d7e907cSAndroid Build Coastguard Worker
358*4d7e907cSAndroid Build Coastguard Worker ALOGD("Enabling nonexistent nanoapp");
359*4d7e907cSAndroid Build Coastguard Worker bool success =
360*4d7e907cSAndroid Build Coastguard Worker contextHub->enableNanoapp(getHubId(), kNonExistentAppId, cb->expectedTransactionId)
361*4d7e907cSAndroid Build Coastguard Worker .isOk();
362*4d7e907cSAndroid Build Coastguard Worker if (success) {
363*4d7e907cSAndroid Build Coastguard Worker bool transactionSuccess;
364*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &transactionSuccess));
365*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(transactionSuccess);
366*4d7e907cSAndroid Build Coastguard Worker }
367*4d7e907cSAndroid Build Coastguard Worker }
368*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestDisableNonexistentNanoapp)369*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestDisableNonexistentNanoapp) {
370*4d7e907cSAndroid Build Coastguard Worker cb->expectedTransactionId = 3456;
371*4d7e907cSAndroid Build Coastguard Worker
372*4d7e907cSAndroid Build Coastguard Worker ALOGD("Disabling nonexistent nanoapp");
373*4d7e907cSAndroid Build Coastguard Worker bool success =
374*4d7e907cSAndroid Build Coastguard Worker contextHub->disableNanoapp(getHubId(), kNonExistentAppId, cb->expectedTransactionId)
375*4d7e907cSAndroid Build Coastguard Worker .isOk();
376*4d7e907cSAndroid Build Coastguard Worker if (success) {
377*4d7e907cSAndroid Build Coastguard Worker bool transactionSuccess;
378*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &transactionSuccess));
379*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(transactionSuccess);
380*4d7e907cSAndroid Build Coastguard Worker }
381*4d7e907cSAndroid Build Coastguard Worker }
382*4d7e907cSAndroid Build Coastguard Worker
testSettingChanged(Setting setting)383*4d7e907cSAndroid Build Coastguard Worker void ContextHubAidl::testSettingChanged(Setting setting) {
384*4d7e907cSAndroid Build Coastguard Worker // In VTS, we only test that sending the values doesn't cause things to blow up - GTS tests
385*4d7e907cSAndroid Build Coastguard Worker // verify the expected E2E behavior in CHRE
386*4d7e907cSAndroid Build Coastguard Worker sp<EmptyContextHubCallback> cb = sp<EmptyContextHubCallback>::make();
387*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->registerCallback(getHubId(), cb).isOk());
388*4d7e907cSAndroid Build Coastguard Worker
389*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->onSettingChanged(setting, true /* enabled */).isOk());
390*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->onSettingChanged(setting, false /* enabled */).isOk());
391*4d7e907cSAndroid Build Coastguard Worker }
392*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnLocationSettingChanged)393*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnLocationSettingChanged) {
394*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::LOCATION);
395*4d7e907cSAndroid Build Coastguard Worker }
396*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnWifiMainSettingChanged)397*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnWifiMainSettingChanged) {
398*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::WIFI_MAIN);
399*4d7e907cSAndroid Build Coastguard Worker }
400*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnWifiScanningSettingChanged)401*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnWifiScanningSettingChanged) {
402*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::WIFI_SCANNING);
403*4d7e907cSAndroid Build Coastguard Worker }
404*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnAirplaneModeSettingChanged)405*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnAirplaneModeSettingChanged) {
406*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::AIRPLANE_MODE);
407*4d7e907cSAndroid Build Coastguard Worker }
408*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnMicrophoneSettingChanged)409*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnMicrophoneSettingChanged) {
410*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::MICROPHONE);
411*4d7e907cSAndroid Build Coastguard Worker }
412*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnBtMainSettingChanged)413*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnBtMainSettingChanged) {
414*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::BT_MAIN);
415*4d7e907cSAndroid Build Coastguard Worker }
416*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestOnBtScanningSettingChanged)417*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestOnBtScanningSettingChanged) {
418*4d7e907cSAndroid Build Coastguard Worker testSettingChanged(Setting::BT_SCANNING);
419*4d7e907cSAndroid Build Coastguard Worker }
420*4d7e907cSAndroid Build Coastguard Worker
generateContextHubMapping()421*4d7e907cSAndroid Build Coastguard Worker std::vector<std::tuple<std::string, int32_t>> generateContextHubMapping() {
422*4d7e907cSAndroid Build Coastguard Worker std::vector<std::tuple<std::string, int32_t>> tuples;
423*4d7e907cSAndroid Build Coastguard Worker auto contextHubAidlNames = android::getAidlHalInstanceNames(IContextHub::descriptor);
424*4d7e907cSAndroid Build Coastguard Worker std::vector<ContextHubInfo> contextHubInfos;
425*4d7e907cSAndroid Build Coastguard Worker
426*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < contextHubAidlNames.size(); i++) {
427*4d7e907cSAndroid Build Coastguard Worker auto contextHubName = contextHubAidlNames[i].c_str();
428*4d7e907cSAndroid Build Coastguard Worker auto contextHub = android::waitForDeclaredService<IContextHub>(String16(contextHubName));
429*4d7e907cSAndroid Build Coastguard Worker if (contextHub->getContextHubs(&contextHubInfos).isOk()) {
430*4d7e907cSAndroid Build Coastguard Worker for (auto& info : contextHubInfos) {
431*4d7e907cSAndroid Build Coastguard Worker tuples.push_back(std::make_tuple(contextHubName, info.id));
432*4d7e907cSAndroid Build Coastguard Worker }
433*4d7e907cSAndroid Build Coastguard Worker }
434*4d7e907cSAndroid Build Coastguard Worker }
435*4d7e907cSAndroid Build Coastguard Worker
436*4d7e907cSAndroid Build Coastguard Worker return tuples;
437*4d7e907cSAndroid Build Coastguard Worker }
438*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestHostConnection)439*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestHostConnection) {
440*4d7e907cSAndroid Build Coastguard Worker constexpr char16_t kHostEndpointId = 1;
441*4d7e907cSAndroid Build Coastguard Worker HostEndpointInfo hostEndpointInfo;
442*4d7e907cSAndroid Build Coastguard Worker hostEndpointInfo.type = HostEndpointInfo::Type::NATIVE;
443*4d7e907cSAndroid Build Coastguard Worker hostEndpointInfo.hostEndpointId = kHostEndpointId;
444*4d7e907cSAndroid Build Coastguard Worker
445*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->onHostEndpointConnected(hostEndpointInfo).isOk());
446*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->onHostEndpointDisconnected(kHostEndpointId).isOk());
447*4d7e907cSAndroid Build Coastguard Worker }
448*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestInvalidHostConnection)449*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestInvalidHostConnection) {
450*4d7e907cSAndroid Build Coastguard Worker constexpr char16_t kHostEndpointId = 1;
451*4d7e907cSAndroid Build Coastguard Worker
452*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->onHostEndpointDisconnected(kHostEndpointId).isOk());
453*4d7e907cSAndroid Build Coastguard Worker }
454*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubTransactionTest,TestNanSessionStateChange)455*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubTransactionTest, TestNanSessionStateChange) {
456*4d7e907cSAndroid Build Coastguard Worker NanSessionStateUpdate update;
457*4d7e907cSAndroid Build Coastguard Worker update.state = true;
458*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->onNanSessionStateChanged(update);
459*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
460*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
461*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
462*4d7e907cSAndroid Build Coastguard Worker } else {
463*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
464*4d7e907cSAndroid Build Coastguard Worker update.state = false;
465*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->onNanSessionStateChanged(update).isOk());
466*4d7e907cSAndroid Build Coastguard Worker }
467*4d7e907cSAndroid Build Coastguard Worker }
468*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,TestSendMessageDeliveryStatusToHub)469*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, TestSendMessageDeliveryStatusToHub) {
470*4d7e907cSAndroid Build Coastguard Worker MessageDeliveryStatus messageDeliveryStatus;
471*4d7e907cSAndroid Build Coastguard Worker messageDeliveryStatus.messageSequenceNumber = 123;
472*4d7e907cSAndroid Build Coastguard Worker messageDeliveryStatus.errorCode = ErrorCode::OK;
473*4d7e907cSAndroid Build Coastguard Worker
474*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->sendMessageDeliveryStatusToHub(getHubId(), messageDeliveryStatus);
475*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
476*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
477*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
478*4d7e907cSAndroid Build Coastguard Worker } else {
479*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
480*4d7e907cSAndroid Build Coastguard Worker }
481*4d7e907cSAndroid Build Coastguard Worker }
482*4d7e907cSAndroid Build Coastguard Worker
483*4d7e907cSAndroid Build Coastguard Worker class TestEndpointCallback : public BnEndpointCallback {
484*4d7e907cSAndroid Build Coastguard Worker public:
onEndpointStarted(const std::vector<EndpointInfo> &)485*4d7e907cSAndroid Build Coastguard Worker Status onEndpointStarted(const std::vector<EndpointInfo>& /* endpointInfos */) override {
486*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
487*4d7e907cSAndroid Build Coastguard Worker }
488*4d7e907cSAndroid Build Coastguard Worker
onEndpointStopped(const std::vector<EndpointId> &,Reason)489*4d7e907cSAndroid Build Coastguard Worker Status onEndpointStopped(const std::vector<EndpointId>& /* endpointIds */,
490*4d7e907cSAndroid Build Coastguard Worker Reason /* reason */) override {
491*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
492*4d7e907cSAndroid Build Coastguard Worker }
493*4d7e907cSAndroid Build Coastguard Worker
onMessageReceived(int32_t,const Message & message)494*4d7e907cSAndroid Build Coastguard Worker Status onMessageReceived(int32_t /* sessionId */, const Message& message) override {
495*4d7e907cSAndroid Build Coastguard Worker mMessages.push_back(message);
496*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
497*4d7e907cSAndroid Build Coastguard Worker }
498*4d7e907cSAndroid Build Coastguard Worker
onMessageDeliveryStatusReceived(int32_t,const MessageDeliveryStatus &)499*4d7e907cSAndroid Build Coastguard Worker Status onMessageDeliveryStatusReceived(int32_t /* sessionId */,
500*4d7e907cSAndroid Build Coastguard Worker const MessageDeliveryStatus& /* msgStatus */) override {
501*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
502*4d7e907cSAndroid Build Coastguard Worker }
503*4d7e907cSAndroid Build Coastguard Worker
onEndpointSessionOpenRequest(int32_t,const EndpointId &,const EndpointId &,const std::optional<String16> &)504*4d7e907cSAndroid Build Coastguard Worker Status onEndpointSessionOpenRequest(
505*4d7e907cSAndroid Build Coastguard Worker int32_t /* sessionId */, const EndpointId& /* destination */,
506*4d7e907cSAndroid Build Coastguard Worker const EndpointId& /* initiator */,
507*4d7e907cSAndroid Build Coastguard Worker const std::optional<String16>& /* serviceDescriptor */) override {
508*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
509*4d7e907cSAndroid Build Coastguard Worker }
510*4d7e907cSAndroid Build Coastguard Worker
onCloseEndpointSession(int32_t,Reason)511*4d7e907cSAndroid Build Coastguard Worker Status onCloseEndpointSession(int32_t /* sessionId */, Reason /* reason */) override {
512*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
513*4d7e907cSAndroid Build Coastguard Worker }
514*4d7e907cSAndroid Build Coastguard Worker
onEndpointSessionOpenComplete(int32_t)515*4d7e907cSAndroid Build Coastguard Worker Status onEndpointSessionOpenComplete(int32_t /* sessionId */) override {
516*4d7e907cSAndroid Build Coastguard Worker mWasOnEndpointSessionOpenCompleteCalled = true;
517*4d7e907cSAndroid Build Coastguard Worker return Status::ok();
518*4d7e907cSAndroid Build Coastguard Worker }
519*4d7e907cSAndroid Build Coastguard Worker
getMessages()520*4d7e907cSAndroid Build Coastguard Worker std::vector<Message> getMessages() { return mMessages; }
521*4d7e907cSAndroid Build Coastguard Worker
wasOnEndpointSessionOpenCompleteCalled()522*4d7e907cSAndroid Build Coastguard Worker bool wasOnEndpointSessionOpenCompleteCalled() {
523*4d7e907cSAndroid Build Coastguard Worker return mWasOnEndpointSessionOpenCompleteCalled;
524*4d7e907cSAndroid Build Coastguard Worker }
resetWasOnEndpointSessionOpenCompleteCalled()525*4d7e907cSAndroid Build Coastguard Worker void resetWasOnEndpointSessionOpenCompleteCalled() {
526*4d7e907cSAndroid Build Coastguard Worker mWasOnEndpointSessionOpenCompleteCalled = false;
527*4d7e907cSAndroid Build Coastguard Worker }
528*4d7e907cSAndroid Build Coastguard Worker
529*4d7e907cSAndroid Build Coastguard Worker private:
530*4d7e907cSAndroid Build Coastguard Worker std::vector<Message> mMessages;
531*4d7e907cSAndroid Build Coastguard Worker bool mWasOnEndpointSessionOpenCompleteCalled = false;
532*4d7e907cSAndroid Build Coastguard Worker };
533*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,RegisterEndpoint)534*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, RegisterEndpoint) {
535*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo;
536*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.id = 1;
537*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
538*4d7e907cSAndroid Build Coastguard Worker endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
539*4d7e907cSAndroid Build Coastguard Worker endpointInfo.name = String16("Test host endpoint 1");
540*4d7e907cSAndroid Build Coastguard Worker endpointInfo.version = 42;
541*4d7e907cSAndroid Build Coastguard Worker
542*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpoint(endpointInfo);
543*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
544*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
545*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
546*4d7e907cSAndroid Build Coastguard Worker } else {
547*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
548*4d7e907cSAndroid Build Coastguard Worker }
549*4d7e907cSAndroid Build Coastguard Worker }
550*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,RegisterEndpointSameNameFailure)551*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, RegisterEndpointSameNameFailure) {
552*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo;
553*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.id = 2;
554*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
555*4d7e907cSAndroid Build Coastguard Worker endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
556*4d7e907cSAndroid Build Coastguard Worker endpointInfo.name = String16("Test host endpoint 2");
557*4d7e907cSAndroid Build Coastguard Worker endpointInfo.version = 42;
558*4d7e907cSAndroid Build Coastguard Worker
559*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo2;
560*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.id.id = 3;
561*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.id.hubId = 0xCAFECAFECAFECAFE;
562*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.type = EndpointInfo::EndpointType::NATIVE;
563*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.name = String16("Test host endpoint 2");
564*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.version = 42;
565*4d7e907cSAndroid Build Coastguard Worker
566*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpoint(endpointInfo);
567*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
568*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
569*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
570*4d7e907cSAndroid Build Coastguard Worker } else {
571*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
572*4d7e907cSAndroid Build Coastguard Worker }
573*4d7e907cSAndroid Build Coastguard Worker
574*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(contextHub->registerEndpoint(endpointInfo2).isOk());
575*4d7e907cSAndroid Build Coastguard Worker }
576*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,RegisterEndpointSameIdFailure)577*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, RegisterEndpointSameIdFailure) {
578*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo;
579*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.id = 4;
580*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
581*4d7e907cSAndroid Build Coastguard Worker endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
582*4d7e907cSAndroid Build Coastguard Worker endpointInfo.name = String16("Test host endpoint 4");
583*4d7e907cSAndroid Build Coastguard Worker endpointInfo.version = 42;
584*4d7e907cSAndroid Build Coastguard Worker
585*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo2;
586*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.id.id = 4;
587*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.id.hubId = 0xCAFECAFECAFECAFE;
588*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.type = EndpointInfo::EndpointType::NATIVE;
589*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.name = String16("Test host endpoint - same ID test");
590*4d7e907cSAndroid Build Coastguard Worker endpointInfo2.version = 42;
591*4d7e907cSAndroid Build Coastguard Worker
592*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpoint(endpointInfo);
593*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
594*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
595*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
596*4d7e907cSAndroid Build Coastguard Worker } else {
597*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
598*4d7e907cSAndroid Build Coastguard Worker }
599*4d7e907cSAndroid Build Coastguard Worker
600*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(contextHub->registerEndpoint(endpointInfo2).isOk());
601*4d7e907cSAndroid Build Coastguard Worker }
602*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,UnregisterEndpoint)603*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, UnregisterEndpoint) {
604*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo;
605*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.id = 6;
606*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
607*4d7e907cSAndroid Build Coastguard Worker endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
608*4d7e907cSAndroid Build Coastguard Worker endpointInfo.name = String16("Test host endpoint 6");
609*4d7e907cSAndroid Build Coastguard Worker endpointInfo.version = 42;
610*4d7e907cSAndroid Build Coastguard Worker
611*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpoint(endpointInfo);
612*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
613*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
614*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
615*4d7e907cSAndroid Build Coastguard Worker } else {
616*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
617*4d7e907cSAndroid Build Coastguard Worker }
618*4d7e907cSAndroid Build Coastguard Worker
619*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(contextHub->unregisterEndpoint(endpointInfo).isOk());
620*4d7e907cSAndroid Build Coastguard Worker }
621*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,UnregisterEndpointNonexistent)622*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, UnregisterEndpointNonexistent) {
623*4d7e907cSAndroid Build Coastguard Worker EndpointInfo endpointInfo;
624*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.id = 100;
625*4d7e907cSAndroid Build Coastguard Worker endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
626*4d7e907cSAndroid Build Coastguard Worker endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
627*4d7e907cSAndroid Build Coastguard Worker endpointInfo.name = String16("Test host endpoint 100");
628*4d7e907cSAndroid Build Coastguard Worker endpointInfo.version = 42;
629*4d7e907cSAndroid Build Coastguard Worker
630*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->unregisterEndpoint(endpointInfo);
631*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
632*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
633*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
634*4d7e907cSAndroid Build Coastguard Worker } else {
635*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(status.isOk());
636*4d7e907cSAndroid Build Coastguard Worker }
637*4d7e907cSAndroid Build Coastguard Worker }
638*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,RegisterCallback)639*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, RegisterCallback) {
640*4d7e907cSAndroid Build Coastguard Worker auto cb = sp<TestEndpointCallback>::make();
641*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpointCallback(cb);
642*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
643*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
644*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
645*4d7e907cSAndroid Build Coastguard Worker } else {
646*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
647*4d7e907cSAndroid Build Coastguard Worker }
648*4d7e907cSAndroid Build Coastguard Worker }
649*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,OpenEndpointSessionInvalidRange)650*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, OpenEndpointSessionInvalidRange) {
651*4d7e907cSAndroid Build Coastguard Worker auto cb = sp<TestEndpointCallback>::make();
652*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpointCallback(cb);
653*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
654*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
655*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
656*4d7e907cSAndroid Build Coastguard Worker } else {
657*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
658*4d7e907cSAndroid Build Coastguard Worker }
659*4d7e907cSAndroid Build Coastguard Worker
660*4d7e907cSAndroid Build Coastguard Worker // Register the endpoint
661*4d7e907cSAndroid Build Coastguard Worker EndpointInfo initiatorEndpoint;
662*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.id.id = 7;
663*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.id.hubId = 0xCAFECAFECAFECAFE;
664*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.type = EndpointInfo::EndpointType::NATIVE;
665*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.name = String16("Test host endpoint 7");
666*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.version = 42;
667*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(contextHub->registerEndpoint(initiatorEndpoint).isOk());
668*4d7e907cSAndroid Build Coastguard Worker
669*4d7e907cSAndroid Build Coastguard Worker // Find the destination, if it exists
670*4d7e907cSAndroid Build Coastguard Worker std::vector<EndpointInfo> endpoints;
671*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(contextHub->getEndpoints(&endpoints).isOk());
672*4d7e907cSAndroid Build Coastguard Worker const EndpointInfo* destinationEndpoint = nullptr;
673*4d7e907cSAndroid Build Coastguard Worker for (const EndpointInfo& endpoint : endpoints) {
674*4d7e907cSAndroid Build Coastguard Worker for (const Service& service : endpoint.services) {
675*4d7e907cSAndroid Build Coastguard Worker if (service.serviceDescriptor == String16("ECHO")) {
676*4d7e907cSAndroid Build Coastguard Worker destinationEndpoint = &endpoint;
677*4d7e907cSAndroid Build Coastguard Worker break;
678*4d7e907cSAndroid Build Coastguard Worker }
679*4d7e907cSAndroid Build Coastguard Worker }
680*4d7e907cSAndroid Build Coastguard Worker }
681*4d7e907cSAndroid Build Coastguard Worker if (destinationEndpoint == nullptr) {
682*4d7e907cSAndroid Build Coastguard Worker return; // no echo service endpoint -> just return
683*4d7e907cSAndroid Build Coastguard Worker }
684*4d7e907cSAndroid Build Coastguard Worker
685*4d7e907cSAndroid Build Coastguard Worker // Request the range
686*4d7e907cSAndroid Build Coastguard Worker constexpr int32_t requestedRange = 100;
687*4d7e907cSAndroid Build Coastguard Worker std::vector<int32_t> range;
688*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->requestSessionIdRange(requestedRange, &range).isOk());
689*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(range.size(), 2);
690*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(range[1] - range[0] + 1, requestedRange);
691*4d7e907cSAndroid Build Coastguard Worker
692*4d7e907cSAndroid Build Coastguard Worker // Open the session
693*4d7e907cSAndroid Build Coastguard Worker cb->resetWasOnEndpointSessionOpenCompleteCalled();
694*4d7e907cSAndroid Build Coastguard Worker int32_t sessionId = range[1] + 10; // invalid
695*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(contextHub
696*4d7e907cSAndroid Build Coastguard Worker ->openEndpointSession(sessionId, destinationEndpoint->id,
697*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.id,
698*4d7e907cSAndroid Build Coastguard Worker /* in_serviceDescriptor= */ String16("ECHO"))
699*4d7e907cSAndroid Build Coastguard Worker .isOk());
700*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(cb->wasOnEndpointSessionOpenCompleteCalled());
701*4d7e907cSAndroid Build Coastguard Worker }
702*4d7e907cSAndroid Build Coastguard Worker
TEST_P(ContextHubAidl,OpenEndpointSessionAndSendMessageEchoesBack)703*4d7e907cSAndroid Build Coastguard Worker TEST_P(ContextHubAidl, OpenEndpointSessionAndSendMessageEchoesBack) {
704*4d7e907cSAndroid Build Coastguard Worker auto cb = sp<TestEndpointCallback>::make();
705*4d7e907cSAndroid Build Coastguard Worker Status status = contextHub->registerEndpointCallback(cb);
706*4d7e907cSAndroid Build Coastguard Worker if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
707*4d7e907cSAndroid Build Coastguard Worker status.transactionError() == android::UNKNOWN_TRANSACTION) {
708*4d7e907cSAndroid Build Coastguard Worker GTEST_SKIP() << "Not supported -> old API; or not implemented";
709*4d7e907cSAndroid Build Coastguard Worker } else {
710*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
711*4d7e907cSAndroid Build Coastguard Worker }
712*4d7e907cSAndroid Build Coastguard Worker
713*4d7e907cSAndroid Build Coastguard Worker // Register the endpoint
714*4d7e907cSAndroid Build Coastguard Worker EndpointInfo initiatorEndpoint;
715*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.id.id = 8;
716*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.id.hubId = 0xCAFECAFECAFECAFE;
717*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.type = EndpointInfo::EndpointType::NATIVE;
718*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.name = String16("Test host endpoint 7");
719*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.version = 42;
720*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(contextHub->registerEndpoint(initiatorEndpoint).isOk());
721*4d7e907cSAndroid Build Coastguard Worker
722*4d7e907cSAndroid Build Coastguard Worker // Find the destination, if it exists
723*4d7e907cSAndroid Build Coastguard Worker std::vector<EndpointInfo> endpoints;
724*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(contextHub->getEndpoints(&endpoints).isOk());
725*4d7e907cSAndroid Build Coastguard Worker const EndpointInfo* destinationEndpoint = nullptr;
726*4d7e907cSAndroid Build Coastguard Worker for (const EndpointInfo& endpoint : endpoints) {
727*4d7e907cSAndroid Build Coastguard Worker for (const Service& service : endpoint.services) {
728*4d7e907cSAndroid Build Coastguard Worker if (service.serviceDescriptor == String16("ECHO")) {
729*4d7e907cSAndroid Build Coastguard Worker destinationEndpoint = &endpoint;
730*4d7e907cSAndroid Build Coastguard Worker break;
731*4d7e907cSAndroid Build Coastguard Worker }
732*4d7e907cSAndroid Build Coastguard Worker }
733*4d7e907cSAndroid Build Coastguard Worker }
734*4d7e907cSAndroid Build Coastguard Worker if (destinationEndpoint == nullptr) {
735*4d7e907cSAndroid Build Coastguard Worker return; // no echo service endpoint -> just return
736*4d7e907cSAndroid Build Coastguard Worker }
737*4d7e907cSAndroid Build Coastguard Worker
738*4d7e907cSAndroid Build Coastguard Worker // Request the range
739*4d7e907cSAndroid Build Coastguard Worker constexpr int32_t requestedRange = 100;
740*4d7e907cSAndroid Build Coastguard Worker std::vector<int32_t> range;
741*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->requestSessionIdRange(requestedRange, &range).isOk());
742*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(range.size(), 2);
743*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(range[1] - range[0] + 1, requestedRange);
744*4d7e907cSAndroid Build Coastguard Worker
745*4d7e907cSAndroid Build Coastguard Worker // Open the session
746*4d7e907cSAndroid Build Coastguard Worker cb->resetWasOnEndpointSessionOpenCompleteCalled();
747*4d7e907cSAndroid Build Coastguard Worker int32_t sessionId = range[0];
748*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub
749*4d7e907cSAndroid Build Coastguard Worker ->openEndpointSession(sessionId, destinationEndpoint->id,
750*4d7e907cSAndroid Build Coastguard Worker initiatorEndpoint.id,
751*4d7e907cSAndroid Build Coastguard Worker /* in_serviceDescriptor= */ String16("ECHO"))
752*4d7e907cSAndroid Build Coastguard Worker .isOk());
753*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(cb->wasOnEndpointSessionOpenCompleteCalled());
754*4d7e907cSAndroid Build Coastguard Worker
755*4d7e907cSAndroid Build Coastguard Worker // Send the message
756*4d7e907cSAndroid Build Coastguard Worker Message message;
757*4d7e907cSAndroid Build Coastguard Worker message.flags = 0;
758*4d7e907cSAndroid Build Coastguard Worker message.sequenceNumber = 0;
759*4d7e907cSAndroid Build Coastguard Worker message.content.push_back(42);
760*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(contextHub->sendMessageToEndpoint(sessionId, message).isOk());
761*4d7e907cSAndroid Build Coastguard Worker
762*4d7e907cSAndroid Build Coastguard Worker // Check for echo
763*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(cb->getMessages().empty());
764*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(cb->getMessages().back().content.back(), 42);
765*4d7e907cSAndroid Build Coastguard Worker }
766*4d7e907cSAndroid Build Coastguard Worker
PrintGeneratedTest(const testing::TestParamInfo<ContextHubAidl::ParamType> & info)767*4d7e907cSAndroid Build Coastguard Worker std::string PrintGeneratedTest(const testing::TestParamInfo<ContextHubAidl::ParamType>& info) {
768*4d7e907cSAndroid Build Coastguard Worker return std::string("CONTEXT_HUB_ID_") + std::to_string(std::get<1>(info.param));
769*4d7e907cSAndroid Build Coastguard Worker }
770*4d7e907cSAndroid Build Coastguard Worker
771*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextHubAidl);
772*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(ContextHub, ContextHubAidl, testing::ValuesIn(generateContextHubMapping()),
773*4d7e907cSAndroid Build Coastguard Worker PrintGeneratedTest);
774*4d7e907cSAndroid Build Coastguard Worker
775*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextHubTransactionTest);
776*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(ContextHub, ContextHubTransactionTest,
777*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(generateContextHubMapping()), PrintGeneratedTest);
778*4d7e907cSAndroid Build Coastguard Worker
main(int argc,char ** argv)779*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
780*4d7e907cSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
781*4d7e907cSAndroid Build Coastguard Worker ProcessState::self()->setThreadPoolMaxThreadCount(1);
782*4d7e907cSAndroid Build Coastguard Worker ProcessState::self()->startThreadPool();
783*4d7e907cSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
784*4d7e907cSAndroid Build Coastguard Worker }
785