blob: 1feae9d50fc36b264f4d82aaaa2f05d00c2332ca [file] [log] [blame]
Keun Soo Yim105bcaa2016-10-22 15:09:27 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "nfc_hidl_hal_test"
18#include <android-base/logging.h>
19
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070020#include <android/hardware/nfc/1.0/INfc.h>
21#include <android/hardware/nfc/1.0/INfcClientCallback.h>
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080022#include <android/hardware/nfc/1.0/types.h>
Dan Shie64262f2019-10-18 10:47:43 -070023#include <gtest/gtest.h>
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080024#include <hardware/nfc.h>
Dan Shie64262f2019-10-18 10:47:43 -070025#include <hidl/GtestPrinter.h>
26#include <hidl/ServiceManagement.h>
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070027
Yuexi Mabfefc5e2017-03-29 18:11:01 -070028#include <VtsHalHidlTargetCallbackBase.h>
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070029
30using ::android::hardware::nfc::V1_0::INfc;
31using ::android::hardware::nfc::V1_0::INfcClientCallback;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080032using ::android::hardware::nfc::V1_0::NfcEvent;
33using ::android::hardware::nfc::V1_0::NfcStatus;
34using ::android::hardware::nfc::V1_0::NfcData;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070035using ::android::hardware::Return;
36using ::android::hardware::Void;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080037using ::android::hardware::hidl_vec;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070038using ::android::sp;
39
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080040/* NCI Commands */
41#define CORE_RESET_CMD \
42 { 0x20, 0x00, 0x01, 0x00 }
Ruchi Kandoi185b5a72017-01-18 11:12:58 -080043#define CORE_RESET_CMD_CONFIG_RESET \
44 { 0x20, 0x00, 0x01, 0x01 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080045#define CORE_CONN_CREATE_CMD \
46 { 0x20, 0x04, 0x02, 0x01, 0x00 }
Ruchi Kandoi209a2742017-05-12 14:19:25 -070047#define CORE_INIT_CMD \
48 { 0x20, 0x01, 0x00 }
Ruchi Kandoic9012762017-08-01 17:30:17 -070049#define CORE_INIT_CMD_NCI20 \
50 { 0x20, 0x01, 0x02, 0x00, 0x00 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080051#define INVALID_COMMAND \
52 { 0x20, 0x00, 0x00 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070053
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080054#define LOOP_BACK_HEADER_SIZE 3
55#define SYNTAX_ERROR 5
56#define NUMBER_LOOPS 3922
Ruchi Kandoiff8068d2017-06-08 10:27:08 -070057#define NCI_VERSION_1_1 0x11
58#define NCI_VERSION_2 0x20
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080059#define TIMEOUT_PERIOD 5
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070060
Yuexi Mabfefc5e2017-03-29 18:11:01 -070061constexpr char kCallbackNameSendEvent[] = "sendEvent";
62constexpr char kCallbackNameSendData[] = "sendData";
63
64class NfcClientCallbackArgs {
65 public:
66 NfcEvent last_event_;
67 NfcStatus last_status_;
68 NfcData last_data_;
69};
70
71/* Callback class for data & Event. */
72class NfcClientCallback
73 : public ::testing::VtsHalHidlTargetCallbackBase<NfcClientCallbackArgs>,
74 public INfcClientCallback {
75 public:
76 virtual ~NfcClientCallback() = default;
77
78 /* sendEvent callback function - Records the Event & Status
79 * and notifies the TEST
80 **/
81 Return<void> sendEvent(NfcEvent event, NfcStatus event_status) override {
82 NfcClientCallbackArgs args;
83 args.last_event_ = event;
84 args.last_status_ = event_status;
85 NotifyFromCallback(kCallbackNameSendEvent, args);
86 return Void();
87 };
88
89 /* sendData callback function. Records the data and notifies the TEST*/
90 Return<void> sendData(const NfcData& data) override {
91 NfcClientCallbackArgs args;
92 args.last_data_ = data;
93 NotifyFromCallback(kCallbackNameSendData, args);
94 return Void();
95 };
96};
97
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070098// The main test class for NFC HIDL HAL.
Dan Shie64262f2019-10-18 10:47:43 -070099class NfcHidlTest : public ::testing::TestWithParam<std::string> {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700100 public:
101 virtual void SetUp() override {
Dan Shie64262f2019-10-18 10:47:43 -0700102 nfc_ = INfc::getService(GetParam());
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800103 ASSERT_NE(nfc_, nullptr);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700104
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700105 nfc_cb_ = new NfcClientCallback();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800106 ASSERT_NE(nfc_cb_, nullptr);
107
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800108 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
109 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700110 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
111 EXPECT_TRUE(res.no_timeout);
112 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
113 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700114
115 /* Get the NCI version that the device supports */
116 std::vector<uint8_t> cmd = CORE_RESET_CMD;
117 NfcData data = cmd;
118 EXPECT_EQ(data.size(), nfc_->write(data));
119 // Wait for CORE_RESET_RSP
120 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
121 EXPECT_TRUE(res.no_timeout);
122 EXPECT_GE(6ul, res.args->last_data_.size());
123 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
124 if (res.args->last_data_.size() == 6) {
125 nci_version = res.args->last_data_[4];
126 } else {
127 EXPECT_EQ(4ul, res.args->last_data_.size());
128 nci_version = NCI_VERSION_2;
129 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
130 EXPECT_TRUE(res.no_timeout);
131 }
132
133 /*
134 * Close the hal and then re-open to make sure we are in a predictable
135 * state for all the tests.
136 */
137 EXPECT_EQ(NfcStatus::OK, nfc_->close());
138 // Wait for CLOSE_CPLT event
139 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
140 EXPECT_TRUE(res.no_timeout);
141 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
142 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
143
144 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
145 // Wait for OPEN_CPLT event
146 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
147 EXPECT_TRUE(res.no_timeout);
148 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
149 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700150 }
151
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800152 virtual void TearDown() override {
153 EXPECT_EQ(NfcStatus::OK, nfc_->close());
154 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700155 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
156 EXPECT_TRUE(res.no_timeout);
157 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
158 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800159 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700160
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700161 /* NCI version the device supports
162 * 0x11 for NCI 1.1, 0x20 for NCI 2.0 and so forth */
163 uint8_t nci_version;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800164 sp<INfc> nfc_;
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700165 sp<NfcClientCallback> nfc_cb_;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700166};
167
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800168/*
169 * OpenAndClose:
170 * Makes an open call, waits for NfcEvent.OPEN_CPLT
171 * Immediately calls close() and waits for NfcEvent.CLOSE_CPLT
172 * Since open and close calls are a part of SetUp() and TearDown(),
173 * the function definition is intentionally kept empty
174 */
Dan Shie64262f2019-10-18 10:47:43 -0700175TEST_P(NfcHidlTest, OpenAndClose) {}
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800176
177/*
178 * WriteCoreReset:
179 * Sends CORE_RESET_CMD
180 * Waits for CORE_RESET_RSP
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800181 * Checks the status, version number and configuration status
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800182 */
Dan Shie64262f2019-10-18 10:47:43 -0700183TEST_P(NfcHidlTest, WriteCoreReset) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800184 std::vector<uint8_t> cmd = CORE_RESET_CMD;
185 NfcData data = cmd;
186 EXPECT_EQ(data.size(), nfc_->write(data));
187 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700188 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
189 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700190
191 /* The response/notification format for CORE_RESET_CMD differs
192 * with NCI 1.0 and 2.0. */
193 if (nci_version <= NCI_VERSION_1_1) {
194 EXPECT_EQ(6ul, res.args->last_data_.size());
195 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
196 EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
197 EXPECT_GE(1ul, res.args->last_data_[5]);
198 } else {
199 EXPECT_EQ(4ul, res.args->last_data_.size());
200 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
201 // Wait for CORE_RESET_NTF
202 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
203 EXPECT_TRUE(res.no_timeout);
204 // Check if reset trigger was due to CORE_RESET_CMD
205 EXPECT_LE(8ul, res.args->last_data_.size());
206 EXPECT_EQ(2ul, res.args->last_data_[3]);
207 EXPECT_GE(1ul, res.args->last_data_[4]);
208 EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
209 }
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800210}
211
212/*
213 * WriteCoreResetConfigReset:
214 * Sends CORE_RESET_CMD_CONFIG_RESET
215 * Waits for CORE_RESET_RSP
216 * Checks the status, version number and configuration status
217 */
Dan Shie64262f2019-10-18 10:47:43 -0700218TEST_P(NfcHidlTest, WriteCoreResetConfigReset) {
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800219 std::vector<uint8_t> cmd = CORE_RESET_CMD_CONFIG_RESET;
220 NfcData data = cmd;
221 EXPECT_EQ(data.size(), nfc_->write(data));
222 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700223 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
224 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700225
226 /* The response/notification format for CORE_RESET_CMD differs
227 * with NCI 1.0 and 2.0. */
228 if (nci_version <= NCI_VERSION_1_1) {
229 EXPECT_EQ(6ul, res.args->last_data_.size());
230 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
231 EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
232 EXPECT_EQ(1ul, res.args->last_data_[5]);
233 } else {
234 EXPECT_EQ(4ul, res.args->last_data_.size());
235 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
236 // Wait for CORE_RESET_NTF
237 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
238 EXPECT_TRUE(res.no_timeout);
239 // Check if reset trigger was due to CORE_RESET_CMD
240 EXPECT_LE(8ul, res.args->last_data_.size());
241 EXPECT_EQ(2ul, res.args->last_data_[3]);
242 EXPECT_EQ(1ul, res.args->last_data_[4]);
243 EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
244 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700245}
246
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800247/*
248 * WriteInvalidCommand:
249 * Sends an invalid command
250 * Waits for response
251 * Checks SYNTAX_ERROR status
252 */
Dan Shie64262f2019-10-18 10:47:43 -0700253TEST_P(NfcHidlTest, WriteInvalidCommand) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800254 // Send an Error Command
255 std::vector<uint8_t> cmd = INVALID_COMMAND;
256 NfcData data = cmd;
257 EXPECT_EQ(data.size(), nfc_->write(data));
258 // Wait for RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700259 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
260 EXPECT_TRUE(res.no_timeout);
261 EXPECT_EQ(4ul, res.args->last_data_.size());
262 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800263}
264
265/*
266 * WriteInvalidAndThenValidCommand:
Ruchi Kandoia915c5a2017-06-15 13:22:51 -0700267 * Sends an Invalid command
268 * Waits for response
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800269 * Checks SYNTAX_ERROR status
270 * Repeat for 100 times appending 0xFF each time to the packet
271 * Send CORE_CONN_CREATE_CMD for loop-back mode
272 * Check the response
273 */
Dan Shie64262f2019-10-18 10:47:43 -0700274TEST_P(NfcHidlTest, WriteInvalidAndThenValidCommand) {
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700275 std::vector<uint8_t> cmd = CORE_RESET_CMD;
276 NfcData data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800277 EXPECT_EQ(data.size(), nfc_->write(data));
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700278 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700279 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
280 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700281 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700282
283 /* NCI 2.0 sends CORE_RESET_NTF everytime. */
284 if (nci_version == NCI_VERSION_2) {
285 // Wait for CORE_RESET_NTF
286 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
287 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoic9012762017-08-01 17:30:17 -0700288 cmd = CORE_INIT_CMD_NCI20;
289 } else {
290 cmd = CORE_INIT_CMD;
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700291 }
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700292 data = cmd;
Ruchi Kandoic9012762017-08-01 17:30:17 -0700293
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700294 EXPECT_EQ(data.size(), nfc_->write(data));
295 // Wait for CORE_INIT_RSP
296 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
297 EXPECT_TRUE(res.no_timeout);
298 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoic9012762017-08-01 17:30:17 -0700299 if (nci_version == NCI_VERSION_2 && res.args->last_data_.size() > 13 &&
300 res.args->last_data_[13] == 0x00) {
301 // Wait for CORE_CONN_CREDITS_NTF
302 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
303 EXPECT_TRUE(res.no_timeout);
304 }
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700305 // Send an Error Data Packet
Ruchi Kandoia915c5a2017-06-15 13:22:51 -0700306 cmd = INVALID_COMMAND;
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700307 data = cmd;
308 size_t size = data.size();
309
310 for (int i = 0; i < 100; i++) {
311 data.resize(++size);
312 data[size - 1] = 0xFF;
313 EXPECT_EQ(data.size(), nfc_->write(data));
Ruchi Kandoia915c5a2017-06-15 13:22:51 -0700314 // Wait for response with SYNTAX_ERROR
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700315 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
316 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoia915c5a2017-06-15 13:22:51 -0700317 EXPECT_EQ(4ul, res.args->last_data_.size());
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700318 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800319 }
320
321 cmd = CORE_CONN_CREATE_CMD;
322 data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800323 EXPECT_EQ(data.size(), nfc_->write(data));
324 // Wait for CORE_CONN_CREATE_RSP
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700325 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700326 EXPECT_TRUE(res.no_timeout);
327 EXPECT_EQ(7ul, res.args->last_data_.size());
328 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800329}
330/*
331 * Bandwidth:
332 * Sets the loop-back mode using CORE_CONN_CREATE_CMD
333 * Sends max payload size data
334 * Waits for the response
335 * Checks the data received
336 * Repeat to send total of 1Mb data
337 */
Dan Shie64262f2019-10-18 10:47:43 -0700338TEST_P(NfcHidlTest, Bandwidth) {
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700339 std::vector<uint8_t> cmd = CORE_RESET_CMD;
340 NfcData data = cmd;
341 EXPECT_EQ(data.size(), nfc_->write(data));
342 // Wait for CORE_RESET_RSP
343 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
344 EXPECT_TRUE(res.no_timeout);
345 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700346
347 /* NCI 2.0 sends CORE_RESET_NTF everytime. */
348 if (nci_version == NCI_VERSION_2) {
349 // Wait for CORE_RESET_NTF
350 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
351 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoic9012762017-08-01 17:30:17 -0700352 cmd = CORE_INIT_CMD_NCI20;
353 } else {
354 cmd = CORE_INIT_CMD;
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700355 }
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700356 data = cmd;
Ruchi Kandoic9012762017-08-01 17:30:17 -0700357
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700358 EXPECT_EQ(data.size(), nfc_->write(data));
359 // Wait for CORE_INIT_RSP
360 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
361 EXPECT_TRUE(res.no_timeout);
362 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoic9012762017-08-01 17:30:17 -0700363 if (nci_version == NCI_VERSION_2 && res.args->last_data_.size() > 13 &&
364 res.args->last_data_[13] == 0x00) {
365 // Wait for CORE_CONN_CREDITS_NTF
366 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
367 EXPECT_TRUE(res.no_timeout);
368 }
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800369
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700370 cmd = CORE_CONN_CREATE_CMD;
371 data = cmd;
372 EXPECT_EQ(data.size(), nfc_->write(data));
373 // Wait for CORE_CONN_CREATE_RSP
374 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
375 EXPECT_TRUE(res.no_timeout);
376 EXPECT_TRUE(res.no_timeout);
377 EXPECT_EQ(7ul, res.args->last_data_.size());
378 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
379 uint8_t conn_id = res.args->last_data_[6];
380 uint32_t max_payload_size = res.args->last_data_[4];
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800381
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700382 for (int loops = 0; loops < NUMBER_LOOPS; loops++) {
383 res.args->last_data_.resize(0);
384 data.resize(max_payload_size + LOOP_BACK_HEADER_SIZE);
385 data[0] = conn_id;
386 data[1] = 0x00;
387 data[2] = max_payload_size;
388 for (uint32_t i = 0; i < max_payload_size; i++) {
389 data[i + LOOP_BACK_HEADER_SIZE] = i;
390 }
391 EXPECT_EQ(max_payload_size + LOOP_BACK_HEADER_SIZE, nfc_->write(data));
392 // Wait for data and CORE_CONN_CREDITS_NTF
393 auto res1 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
394 EXPECT_TRUE(res1.no_timeout);
395 auto res2 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
396 EXPECT_TRUE(res2.no_timeout);
397 // Check if the same data was received back
398 EXPECT_TRUE(res1.args);
399 EXPECT_TRUE(res2.args);
400
401 NfcData credits_ntf = res1.args->last_data_;
402 NfcData received_data = res2.args->last_data_;
403 /* It is possible that CORE_CONN_CREDITS_NTF is received before data,
404 * Find the order and do further checks depending on that */
405 if (received_data.size() != data.size()) {
406 credits_ntf = res2.args->last_data_;
407 received_data = res1.args->last_data_;
408 }
409 EXPECT_EQ(data.size(), received_data.size());
410 for (size_t i = 0; i < data.size(); i++) {
411 EXPECT_EQ(data[i], received_data[i]);
412 }
413
414 EXPECT_EQ(6ul, credits_ntf.size());
415 // Check if the credit is refilled to 1
416 EXPECT_EQ(1, credits_ntf[5]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800417 }
418}
419
420/*
421 * PowerCycle:
422 * Calls powerCycle()
423 * Waits for NfcEvent.OPEN_CPLT
424 * Checks status
425 */
Dan Shie64262f2019-10-18 10:47:43 -0700426TEST_P(NfcHidlTest, PowerCycle) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800427 EXPECT_EQ(NfcStatus::OK, nfc_->powerCycle());
428 // Wait for NfcEvent.OPEN_CPLT
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700429 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
430 EXPECT_TRUE(res.no_timeout);
431 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
432 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800433}
434
435/*
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800436 * PowerCycleAfterClose:
437 * Calls powerCycle() after close()
438 * Checks status
439 */
Dan Shie64262f2019-10-18 10:47:43 -0700440TEST_P(NfcHidlTest, PowerCycleAfterClose) {
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800441 EXPECT_EQ(NfcStatus::OK, nfc_->close());
442 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700443 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
444 EXPECT_TRUE(res.no_timeout);
445 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
446 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800447
448 EXPECT_EQ(NfcStatus::FAILED, nfc_->powerCycle());
449
450 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
451 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700452 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
453 EXPECT_TRUE(res.no_timeout);
454 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
455 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800456}
457
458/*
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800459 * CoreInitialized:
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800460 * Calls coreInitialized() with different data
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800461 * Waits for NfcEvent.POST_INIT_CPLT
462 */
Dan Shie64262f2019-10-18 10:47:43 -0700463TEST_P(NfcHidlTest, CoreInitialized) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800464 NfcData data;
465 data.resize(1);
Ruchi Kandoi91500252017-03-31 16:32:15 -0700466 // These parameters might lead to device specific proprietary behavior
467 // Using > 10 values should result in predictable and common results for
468 // most devices.
469 for (int i = 10; i <= 16; i++) {
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700470 data[0] = i;
Ruchi Kandoiff8068d2017-06-08 10:27:08 -0700471 NfcStatus status = nfc_->coreInitialized(data);
472
473 /* In case coreInitialized returned FAILED, do not wait for
474 * POST_INIT_CLPT event. */
475 if (status == NfcStatus::FAILED) continue;
476
477 EXPECT_EQ(NfcStatus::OK, status);
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700478 // Wait for NfcEvent.POST_INIT_CPLT
Ruchi Kandoi91500252017-03-31 16:32:15 -0700479 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700480 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi91500252017-03-31 16:32:15 -0700481 EXPECT_EQ(NfcEvent::POST_INIT_CPLT, res.args->last_event_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800482 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800483}
484
485/*
486 * ControlGranted:
487 * Calls controlGranted()
488 * Checks the return value
489 */
Dan Shie64262f2019-10-18 10:47:43 -0700490TEST_P(NfcHidlTest, ControlGranted) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800491 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
492}
493
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800494/*
495 * ControlGrantedAfterClose:
496 * Call controlGranted() after close
497 * Checks the return value
498 */
Dan Shie64262f2019-10-18 10:47:43 -0700499TEST_P(NfcHidlTest, ControlGrantedAfterClose) {
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800500 EXPECT_EQ(NfcStatus::OK, nfc_->close());
501 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700502 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
503 EXPECT_TRUE(res.no_timeout);
504 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
505 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800506
507 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
508
509 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
510 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700511 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
512 EXPECT_TRUE(res.no_timeout);
513 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
514 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800515}
516
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800517/* PreDiscover:
518 * Calls prediscover()
519 * Checks the return value
520 */
Dan Shie64262f2019-10-18 10:47:43 -0700521TEST_P(NfcHidlTest, PreDiscover) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800522 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
523}
524
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800525/*
526 * PreDiscoverAfterClose:
527 * Call prediscover() after close
528 * Checks the return value
529 */
Dan Shie64262f2019-10-18 10:47:43 -0700530TEST_P(NfcHidlTest, PreDiscoverAfterClose) {
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800531 EXPECT_EQ(NfcStatus::OK, nfc_->close());
532 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700533 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
534 EXPECT_TRUE(res.no_timeout);
535 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
536 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800537
538 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
539
540 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
541 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700542 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
543 EXPECT_TRUE(res.no_timeout);
544 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
545 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800546}
547
548/*
549 * CloseAfterClose:
550 * Calls close() multiple times
551 * Checks status
552 */
Dan Shie64262f2019-10-18 10:47:43 -0700553TEST_P(NfcHidlTest, CloseAfterClose) {
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800554 EXPECT_EQ(NfcStatus::OK, nfc_->close());
555 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700556 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
557 EXPECT_TRUE(res.no_timeout);
558 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
559 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800560
561 EXPECT_EQ(NfcStatus::FAILED, nfc_->close());
562
563 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
564 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700565 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
566 EXPECT_TRUE(res.no_timeout);
567 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
568 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800569}
570
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800571/*
572 * OpenAfterOpen:
573 * Calls open() multiple times
574 * Checks status
575 */
Dan Shie64262f2019-10-18 10:47:43 -0700576TEST_P(NfcHidlTest, OpenAfterOpen) {
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800577 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
578 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
579}
580
Dan Shie64262f2019-10-18 10:47:43 -0700581INSTANTIATE_TEST_SUITE_P(
582 PerInstance, NfcHidlTest,
583 testing::ValuesIn(android::hardware::getAllHalInstanceNames(INfc::descriptor)),
584 android::hardware::PrintInstanceNameToString);
585
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800586int main(int argc, char** argv) {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700587 ::testing::InitGoogleTest(&argc, argv);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800588
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800589 std::system("svc nfc disable"); /* Turn off NFC */
590 sleep(5);
591
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700592 int status = RUN_ALL_TESTS();
Ruchi Kandoi6b600362017-01-11 12:38:40 -0800593 LOG(INFO) << "Test result = " << status;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800594
595 std::system("svc nfc enable"); /* Turn on NFC */
596 sleep(5);
597
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700598 return status;
599}