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
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "nfc_aidl_hal_test"
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/nfc/BnNfc.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/nfc/BnNfcClientCallback.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/nfc/INfc.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_auto_utils.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_enums.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_interface_utils.h>
29*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_manager.h>
30*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_process.h>
31*4d7e907cSAndroid Build Coastguard Worker
32*4d7e907cSAndroid Build Coastguard Worker #include <chrono>
33*4d7e907cSAndroid Build Coastguard Worker #include <future>
34*4d7e907cSAndroid Build Coastguard Worker
35*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::INfc;
36*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::INfcClientCallback;
37*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::NfcCloseType;
38*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::NfcConfig;
39*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::NfcEvent;
40*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::NfcStatus;
41*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::nfc::PresenceCheckAlgorithm;
42*4d7e907cSAndroid Build Coastguard Worker
43*4d7e907cSAndroid Build Coastguard Worker using android::getAidlHalInstanceNames;
44*4d7e907cSAndroid Build Coastguard Worker using android::PrintInstanceNameToString;
45*4d7e907cSAndroid Build Coastguard Worker using android::base::StringPrintf;
46*4d7e907cSAndroid Build Coastguard Worker using ndk::enum_range;
47*4d7e907cSAndroid Build Coastguard Worker using ndk::ScopedAStatus;
48*4d7e907cSAndroid Build Coastguard Worker using ndk::SharedRefBase;
49*4d7e907cSAndroid Build Coastguard Worker using ndk::SpAIBinder;
50*4d7e907cSAndroid Build Coastguard Worker
51*4d7e907cSAndroid Build Coastguard Worker constexpr static int kCallbackTimeoutMs = 10000;
52*4d7e907cSAndroid Build Coastguard Worker
53*4d7e907cSAndroid Build Coastguard Worker // 261 bytes is the default and minimum transceive length
54*4d7e907cSAndroid Build Coastguard Worker constexpr unsigned int MIN_ISO_DEP_TRANSCEIVE_LENGTH = 261;
55*4d7e907cSAndroid Build Coastguard Worker
56*4d7e907cSAndroid Build Coastguard Worker // Range of valid off host route ids
57*4d7e907cSAndroid Build Coastguard Worker constexpr uint8_t MIN_OFFHOST_ROUTE_ID = 0x01;
58*4d7e907cSAndroid Build Coastguard Worker constexpr uint8_t MAX_OFFHOST_ROUTE_ID = 0xFE;
59*4d7e907cSAndroid Build Coastguard Worker
60*4d7e907cSAndroid Build Coastguard Worker class NfcClientCallback : public aidl::android::hardware::nfc::BnNfcClientCallback {
61*4d7e907cSAndroid Build Coastguard Worker public:
NfcClientCallback(const std::function<void (NfcEvent,NfcStatus)> & on_hal_event_cb,const std::function<void (const std::vector<uint8_t> &)> & on_nci_data_cb)62*4d7e907cSAndroid Build Coastguard Worker NfcClientCallback(const std::function<void(NfcEvent, NfcStatus)>& on_hal_event_cb,
63*4d7e907cSAndroid Build Coastguard Worker const std::function<void(const std::vector<uint8_t>&)>& on_nci_data_cb)
64*4d7e907cSAndroid Build Coastguard Worker : on_nci_data_cb_(on_nci_data_cb), on_hal_event_cb_(on_hal_event_cb) {}
65*4d7e907cSAndroid Build Coastguard Worker virtual ~NfcClientCallback() = default;
66*4d7e907cSAndroid Build Coastguard Worker
sendEvent(NfcEvent event,NfcStatus event_status)67*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus sendEvent(NfcEvent event, NfcStatus event_status) override {
68*4d7e907cSAndroid Build Coastguard Worker on_hal_event_cb_(event, event_status);
69*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
70*4d7e907cSAndroid Build Coastguard Worker };
sendData(const std::vector<uint8_t> & data)71*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus sendData(const std::vector<uint8_t>& data) override {
72*4d7e907cSAndroid Build Coastguard Worker on_nci_data_cb_(data);
73*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
74*4d7e907cSAndroid Build Coastguard Worker };
75*4d7e907cSAndroid Build Coastguard Worker
76*4d7e907cSAndroid Build Coastguard Worker private:
77*4d7e907cSAndroid Build Coastguard Worker std::function<void(const std::vector<uint8_t>&)> on_nci_data_cb_;
78*4d7e907cSAndroid Build Coastguard Worker std::function<void(NfcEvent, NfcStatus)> on_hal_event_cb_;
79*4d7e907cSAndroid Build Coastguard Worker };
80*4d7e907cSAndroid Build Coastguard Worker
81*4d7e907cSAndroid Build Coastguard Worker class NfcAidl : public testing::TestWithParam<std::string> {
82*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()83*4d7e907cSAndroid Build Coastguard Worker void SetUp() override {
84*4d7e907cSAndroid Build Coastguard Worker SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str()));
85*4d7e907cSAndroid Build Coastguard Worker infc_ = INfc::fromBinder(binder);
86*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(infc_, nullptr);
87*4d7e907cSAndroid Build Coastguard Worker }
88*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfc> infc_;
89*4d7e907cSAndroid Build Coastguard Worker };
90*4d7e907cSAndroid Build Coastguard Worker
91*4d7e907cSAndroid Build Coastguard Worker /*
92*4d7e907cSAndroid Build Coastguard Worker * OpenAndCloseForDisable:
93*4d7e907cSAndroid Build Coastguard Worker * Makes an open call, waits for NfcEvent::OPEN_CPLT
94*4d7e907cSAndroid Build Coastguard Worker * Immediately calls close(NfcCloseType::DISABLE) and
95*4d7e907cSAndroid Build Coastguard Worker * waits for NfcEvent::CLOSE_CPLT
96*4d7e907cSAndroid Build Coastguard Worker *
97*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,OpenAndCloseForDisable)98*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, OpenAndCloseForDisable) {
99*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
100*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
101*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
102*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
103*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
104*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise](auto event, auto status) {
105*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
106*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("%s,%d ", __func__, event);
107*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
108*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
109*4d7e907cSAndroid Build Coastguard Worker },
110*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
111*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
112*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
113*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
114*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
115*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
116*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
117*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close DISABLE";
118*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
119*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "wait for close";
120*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
121*4d7e907cSAndroid Build Coastguard Worker }
122*4d7e907cSAndroid Build Coastguard Worker
123*4d7e907cSAndroid Build Coastguard Worker /*
124*4d7e907cSAndroid Build Coastguard Worker * OpenAndCloseForHostSwitchedOff:
125*4d7e907cSAndroid Build Coastguard Worker * Makes an open call, waits for NfcEvent::OPEN_CPLT
126*4d7e907cSAndroid Build Coastguard Worker * Immediately calls close(NfcCloseType::HOST_SWITCHED_OFF) and
127*4d7e907cSAndroid Build Coastguard Worker * waits for NfcEvent::CLOSE_CPLT
128*4d7e907cSAndroid Build Coastguard Worker *
129*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,OpenAndCloseForHostSwitchedOff)130*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, OpenAndCloseForHostSwitchedOff) {
131*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
132*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
133*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
134*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
135*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
136*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise](auto event, auto status) {
137*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
138*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
139*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
140*4d7e907cSAndroid Build Coastguard Worker },
141*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
142*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
143*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
144*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
145*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
146*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
147*4d7e907cSAndroid Build Coastguard Worker
148*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
149*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close HOST_SWITCHED_OFF";
150*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::HOST_SWITCHED_OFF).isOk());
151*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
152*4d7e907cSAndroid Build Coastguard Worker }
153*4d7e907cSAndroid Build Coastguard Worker
154*4d7e907cSAndroid Build Coastguard Worker /*
155*4d7e907cSAndroid Build Coastguard Worker * OpenAfterOpen:
156*4d7e907cSAndroid Build Coastguard Worker * Calls open() multiple times
157*4d7e907cSAndroid Build Coastguard Worker * Checks status
158*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,OpenAfterOpen)159*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, OpenAfterOpen) {
160*4d7e907cSAndroid Build Coastguard Worker int open_count = 0;
161*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
162*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open2_cb_promise;
163*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
164*4d7e907cSAndroid Build Coastguard Worker auto open2_cb_future = open2_cb_promise.get_future();
165*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
166*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &open2_cb_promise, &open_count](auto event, auto status) {
167*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
168*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) {
169*4d7e907cSAndroid Build Coastguard Worker open_count == 0 ? open_cb_promise.set_value() : open2_cb_promise.set_value();
170*4d7e907cSAndroid Build Coastguard Worker open_count++;
171*4d7e907cSAndroid Build Coastguard Worker }
172*4d7e907cSAndroid Build Coastguard Worker },
173*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
174*4d7e907cSAndroid Build Coastguard Worker
175*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
176*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
177*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
178*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
179*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
180*4d7e907cSAndroid Build Coastguard Worker
181*4d7e907cSAndroid Build Coastguard Worker // Open again and wait for OPEN_CPLT
182*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open again";
183*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
184*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open2_cb_future.wait_for(timeout), std::future_status::ready);
185*4d7e907cSAndroid Build Coastguard Worker }
186*4d7e907cSAndroid Build Coastguard Worker
187*4d7e907cSAndroid Build Coastguard Worker /*
188*4d7e907cSAndroid Build Coastguard Worker * CloseAfterClose:
189*4d7e907cSAndroid Build Coastguard Worker * Calls close() multiple times
190*4d7e907cSAndroid Build Coastguard Worker * Checks status
191*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,CloseAfterClose)192*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, CloseAfterClose) {
193*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
194*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
195*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
196*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
197*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
198*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise](auto event, auto status) {
199*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
200*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
201*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
202*4d7e907cSAndroid Build Coastguard Worker },
203*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
204*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
205*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
206*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
207*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
208*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
209*4d7e907cSAndroid Build Coastguard Worker
210*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
211*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close";
212*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
213*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
214*4d7e907cSAndroid Build Coastguard Worker // Close again should fail.
215*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close again";
216*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(!(infc_->close(NfcCloseType::DISABLE).isOk()));
217*4d7e907cSAndroid Build Coastguard Worker }
218*4d7e907cSAndroid Build Coastguard Worker
219*4d7e907cSAndroid Build Coastguard Worker /*
220*4d7e907cSAndroid Build Coastguard Worker * PowerCycleAfterOpen:
221*4d7e907cSAndroid Build Coastguard Worker * Calls powerCycle() after open
222*4d7e907cSAndroid Build Coastguard Worker * Waits for NfcEvent.OPEN_CPLT
223*4d7e907cSAndroid Build Coastguard Worker * Checks status
224*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,PowerCycleAfterOpen)225*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, PowerCycleAfterOpen) {
226*4d7e907cSAndroid Build Coastguard Worker int open_cplt_count = 0;
227*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
228*4d7e907cSAndroid Build Coastguard Worker std::promise<void> power_cycle_cb_promise;
229*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
230*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
231*4d7e907cSAndroid Build Coastguard Worker auto power_cycle_cb_future = power_cycle_cb_promise.get_future();
232*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
233*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
234*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise, &power_cycle_cb_promise, &open_cplt_count](
235*4d7e907cSAndroid Build Coastguard Worker auto event, auto status) {
236*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
237*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) {
238*4d7e907cSAndroid Build Coastguard Worker if (open_cplt_count == 0) {
239*4d7e907cSAndroid Build Coastguard Worker open_cplt_count++;
240*4d7e907cSAndroid Build Coastguard Worker open_cb_promise.set_value();
241*4d7e907cSAndroid Build Coastguard Worker } else {
242*4d7e907cSAndroid Build Coastguard Worker power_cycle_cb_promise.set_value();
243*4d7e907cSAndroid Build Coastguard Worker }
244*4d7e907cSAndroid Build Coastguard Worker }
245*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
246*4d7e907cSAndroid Build Coastguard Worker },
247*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
248*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
249*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
250*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
251*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
252*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
253*4d7e907cSAndroid Build Coastguard Worker
254*4d7e907cSAndroid Build Coastguard Worker // PowerCycle and wait for OPEN_CPLT
255*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "PowerCycle";
256*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->powerCycle().isOk());
257*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(power_cycle_cb_future.wait_for(timeout), std::future_status::ready);
258*4d7e907cSAndroid Build Coastguard Worker
259*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
260*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close";
261*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
262*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
263*4d7e907cSAndroid Build Coastguard Worker }
264*4d7e907cSAndroid Build Coastguard Worker
265*4d7e907cSAndroid Build Coastguard Worker /*
266*4d7e907cSAndroid Build Coastguard Worker * PowerCycleAfterClose:
267*4d7e907cSAndroid Build Coastguard Worker * Calls powerCycle() after close
268*4d7e907cSAndroid Build Coastguard Worker * PowerCycle should fail immediately
269*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,PowerCycleAfterClose)270*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, PowerCycleAfterClose) {
271*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
272*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
273*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
274*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
275*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
276*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise](auto event, auto status) {
277*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
278*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
279*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
280*4d7e907cSAndroid Build Coastguard Worker },
281*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
282*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
283*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
284*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
285*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
286*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
287*4d7e907cSAndroid Build Coastguard Worker
288*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
289*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close";
290*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
291*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
292*4d7e907cSAndroid Build Coastguard Worker
293*4d7e907cSAndroid Build Coastguard Worker // PowerCycle should fail
294*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "PowerCycle";
295*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(!(infc_->powerCycle().isOk()));
296*4d7e907cSAndroid Build Coastguard Worker }
297*4d7e907cSAndroid Build Coastguard Worker
298*4d7e907cSAndroid Build Coastguard Worker /*
299*4d7e907cSAndroid Build Coastguard Worker * CoreInitializedAfterOpen:
300*4d7e907cSAndroid Build Coastguard Worker * Calls coreInitialized() after open
301*4d7e907cSAndroid Build Coastguard Worker * Waits for NfcEvent.POST_INIT_CPLT
302*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,CoreInitializedAfterOpen)303*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, CoreInitializedAfterOpen) {
304*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
305*4d7e907cSAndroid Build Coastguard Worker std::promise<void> core_init_cb_promise;
306*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
307*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
308*4d7e907cSAndroid Build Coastguard Worker auto core_init_cb_future = core_init_cb_promise.get_future();
309*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
310*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
311*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise, &core_init_cb_promise](auto event, auto status) {
312*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
313*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
314*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::POST_INIT_CPLT) core_init_cb_promise.set_value();
315*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
316*4d7e907cSAndroid Build Coastguard Worker },
317*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
318*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
319*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
320*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
321*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
322*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
323*4d7e907cSAndroid Build Coastguard Worker
324*4d7e907cSAndroid Build Coastguard Worker // CoreInitialized and wait for POST_INIT_CPLT
325*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "coreInitialized";
326*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->coreInitialized().isOk());
327*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(core_init_cb_future.wait_for(timeout), std::future_status::ready);
328*4d7e907cSAndroid Build Coastguard Worker
329*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
330*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close";
331*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
332*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
333*4d7e907cSAndroid Build Coastguard Worker }
334*4d7e907cSAndroid Build Coastguard Worker
335*4d7e907cSAndroid Build Coastguard Worker /*
336*4d7e907cSAndroid Build Coastguard Worker * CoreInitializedAfterClose:
337*4d7e907cSAndroid Build Coastguard Worker * Calls coreInitialized() after close
338*4d7e907cSAndroid Build Coastguard Worker * coreInitialized() should fail immediately
339*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,CoreInitializedAfterClose)340*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, CoreInitializedAfterClose) {
341*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
342*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
343*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
344*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
345*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
346*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise](auto event, auto status) {
347*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
348*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
349*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
350*4d7e907cSAndroid Build Coastguard Worker },
351*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
352*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
353*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
354*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
355*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
356*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
357*4d7e907cSAndroid Build Coastguard Worker
358*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
359*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close";
360*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
361*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
362*4d7e907cSAndroid Build Coastguard Worker
363*4d7e907cSAndroid Build Coastguard Worker // coreInitialized should fail
364*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "CoreInitialized";
365*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(!(infc_->coreInitialized().isOk()));
366*4d7e907cSAndroid Build Coastguard Worker }
367*4d7e907cSAndroid Build Coastguard Worker
368*4d7e907cSAndroid Build Coastguard Worker /*
369*4d7e907cSAndroid Build Coastguard Worker * PreDiscoverAfterClose:
370*4d7e907cSAndroid Build Coastguard Worker * Call preDiscover() after close
371*4d7e907cSAndroid Build Coastguard Worker * preDiscover() should fail immediately
372*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,PreDiscoverAfterClose)373*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, PreDiscoverAfterClose) {
374*4d7e907cSAndroid Build Coastguard Worker std::promise<void> open_cb_promise;
375*4d7e907cSAndroid Build Coastguard Worker std::promise<void> close_cb_promise;
376*4d7e907cSAndroid Build Coastguard Worker auto open_cb_future = open_cb_promise.get_future();
377*4d7e907cSAndroid Build Coastguard Worker auto close_cb_future = close_cb_promise.get_future();
378*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<INfcClientCallback> mCallback = ::ndk::SharedRefBase::make<NfcClientCallback>(
379*4d7e907cSAndroid Build Coastguard Worker [&open_cb_promise, &close_cb_promise](auto event, auto status) {
380*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
381*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::OPEN_CPLT) open_cb_promise.set_value();
382*4d7e907cSAndroid Build Coastguard Worker if (event == NfcEvent::CLOSE_CPLT) close_cb_promise.set_value();
383*4d7e907cSAndroid Build Coastguard Worker },
384*4d7e907cSAndroid Build Coastguard Worker [](auto) {});
385*4d7e907cSAndroid Build Coastguard Worker std::chrono::milliseconds timeout{kCallbackTimeoutMs};
386*4d7e907cSAndroid Build Coastguard Worker // Open and wait for OPEN_CPLT
387*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "open";
388*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->open(mCallback).isOk());
389*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
390*4d7e907cSAndroid Build Coastguard Worker
391*4d7e907cSAndroid Build Coastguard Worker // Close and wait for CLOSE_CPLT
392*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "close";
393*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->close(NfcCloseType::DISABLE).isOk());
394*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(close_cb_future.wait_for(timeout), std::future_status::ready);
395*4d7e907cSAndroid Build Coastguard Worker
396*4d7e907cSAndroid Build Coastguard Worker // preDiscover should fail
397*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "preDiscover";
398*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(!(infc_->preDiscover().isOk()));
399*4d7e907cSAndroid Build Coastguard Worker }
400*4d7e907cSAndroid Build Coastguard Worker
401*4d7e907cSAndroid Build Coastguard Worker /*
402*4d7e907cSAndroid Build Coastguard Worker * checkGetConfigValues:
403*4d7e907cSAndroid Build Coastguard Worker * Calls getConfig()
404*4d7e907cSAndroid Build Coastguard Worker * checks if fields in NfcConfig are populated correctly
405*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,CheckGetConfigValues)406*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, CheckGetConfigValues) {
407*4d7e907cSAndroid Build Coastguard Worker NfcConfig configValue;
408*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->getConfig(&configValue).isOk());
409*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(configValue.maxIsoDepTransceiveLength, MIN_ISO_DEP_TRANSCEIVE_LENGTH);
410*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("configValue.maxIsoDepTransceiveLength = %x",
411*4d7e907cSAndroid Build Coastguard Worker configValue.maxIsoDepTransceiveLength);
412*4d7e907cSAndroid Build Coastguard Worker for (auto uicc : configValue.offHostRouteUicc) {
413*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("offHostRouteUicc = %x", uicc);
414*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(uicc, MIN_OFFHOST_ROUTE_ID);
415*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE(uicc, MAX_OFFHOST_ROUTE_ID);
416*4d7e907cSAndroid Build Coastguard Worker }
417*4d7e907cSAndroid Build Coastguard Worker for (auto ese : configValue.offHostRouteEse) {
418*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("offHostRouteEse = %x", ese);
419*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(ese, MIN_OFFHOST_ROUTE_ID);
420*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE(ese, MAX_OFFHOST_ROUTE_ID);
421*4d7e907cSAndroid Build Coastguard Worker }
422*4d7e907cSAndroid Build Coastguard Worker if (configValue.defaultIsoDepRoute != 0) {
423*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE((uint8_t)configValue.defaultIsoDepRoute, MIN_OFFHOST_ROUTE_ID);
424*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE((uint8_t)configValue.defaultIsoDepRoute, MAX_OFFHOST_ROUTE_ID);
425*4d7e907cSAndroid Build Coastguard Worker }
426*4d7e907cSAndroid Build Coastguard Worker for (auto simPipeId : configValue.offHostSimPipeIds) {
427*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("offHostSimPipeId= %x", simPipeId);
428*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(simPipeId, MIN_OFFHOST_ROUTE_ID);
429*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE(simPipeId, MAX_OFFHOST_ROUTE_ID);
430*4d7e907cSAndroid Build Coastguard Worker }
431*4d7e907cSAndroid Build Coastguard Worker }
432*4d7e907cSAndroid Build Coastguard Worker
433*4d7e907cSAndroid Build Coastguard Worker /*
434*4d7e907cSAndroid Build Coastguard Worker * CheckisVerboseLoggingEnabledAfterSetEnableVerboseLogging:
435*4d7e907cSAndroid Build Coastguard Worker * Calls setEnableVerboseLogging()
436*4d7e907cSAndroid Build Coastguard Worker * checks the return value of isVerboseLoggingEnabled
437*4d7e907cSAndroid Build Coastguard Worker */
TEST_P(NfcAidl,CheckisVerboseLoggingEnabledAfterSetEnableVerboseLogging)438*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, CheckisVerboseLoggingEnabledAfterSetEnableVerboseLogging) {
439*4d7e907cSAndroid Build Coastguard Worker bool enabled = false;
440*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->setEnableVerboseLogging(true).isOk());
441*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->isVerboseLoggingEnabled(&enabled).isOk());
442*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(enabled);
443*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->setEnableVerboseLogging(false).isOk());
444*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->isVerboseLoggingEnabled(&enabled).isOk());
445*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(!enabled);
446*4d7e907cSAndroid Build Coastguard Worker }
447*4d7e907cSAndroid Build Coastguard Worker
TEST_P(NfcAidl,CheckControlGrantedStatus)448*4d7e907cSAndroid Build Coastguard Worker TEST_P(NfcAidl, CheckControlGrantedStatus) {
449*4d7e907cSAndroid Build Coastguard Worker int interface_version;
450*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->getInterfaceVersion(&interface_version).isOk());
451*4d7e907cSAndroid Build Coastguard Worker if (interface_version > 1) {
452*4d7e907cSAndroid Build Coastguard Worker NfcStatus status;
453*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(infc_->controlGranted(&status).isOk());
454*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(status, NfcStatus::OK);
455*4d7e907cSAndroid Build Coastguard Worker }
456*4d7e907cSAndroid Build Coastguard Worker }
457*4d7e907cSAndroid Build Coastguard Worker
458*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NfcAidl);
459*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Nfc, NfcAidl,
460*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(::android::getAidlHalInstanceNames(INfc::descriptor)),
461*4d7e907cSAndroid Build Coastguard Worker ::android::PrintInstanceNameToString);
462*4d7e907cSAndroid Build Coastguard Worker
main(int argc,char ** argv)463*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
464*4d7e907cSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
465*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_startThreadPool();
466*4d7e907cSAndroid Build Coastguard Worker std::system("/system/bin/svc nfc disable"); /* Turn off NFC */
467*4d7e907cSAndroid Build Coastguard Worker sleep(5);
468*4d7e907cSAndroid Build Coastguard Worker int status = RUN_ALL_TESTS();
469*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "Test result = " << status;
470*4d7e907cSAndroid Build Coastguard Worker std::system("/system/bin/svc nfc enable"); /* Turn on NFC */
471*4d7e907cSAndroid Build Coastguard Worker sleep(5);
472*4d7e907cSAndroid Build Coastguard Worker return status;
473*4d7e907cSAndroid Build Coastguard Worker }
474