blob: 2f00fbb8b7d02d316c3969ee5fa09fe90a711a28 [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>
23#include <hardware/nfc.h>
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070024
Yuexi Ma859f18b2017-03-29 18:11:01 -070025#include <VtsHalHidlTargetCallbackBase.h>
Yuexi Ma6b872012017-03-10 00:42:13 -080026#include <VtsHalHidlTargetTestBase.h>
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070027
28using ::android::hardware::nfc::V1_0::INfc;
29using ::android::hardware::nfc::V1_0::INfcClientCallback;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080030using ::android::hardware::nfc::V1_0::NfcEvent;
31using ::android::hardware::nfc::V1_0::NfcStatus;
32using ::android::hardware::nfc::V1_0::NfcData;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070033using ::android::hardware::Return;
34using ::android::hardware::Void;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080035using ::android::hardware::hidl_vec;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070036using ::android::sp;
37
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080038/* NCI Commands */
39#define CORE_RESET_CMD \
40 { 0x20, 0x00, 0x01, 0x00 }
Ruchi Kandoi185b5a72017-01-18 11:12:58 -080041#define CORE_RESET_CMD_CONFIG_RESET \
42 { 0x20, 0x00, 0x01, 0x01 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080043#define CORE_CONN_CREATE_CMD \
44 { 0x20, 0x04, 0x02, 0x01, 0x00 }
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -070045#define CORE_INIT_CMD \
46 { 0x20, 0x01, 0x00 }
Ruchi Kandoi029633d2017-08-01 17:30:17 -070047#define CORE_INIT_CMD_NCI20 \
48 { 0x20, 0x01, 0x02, 0x00, 0x00 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080049#define INVALID_COMMAND \
50 { 0x20, 0x00, 0x00 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070051
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080052#define LOOP_BACK_HEADER_SIZE 3
53#define SYNTAX_ERROR 5
54#define NUMBER_LOOPS 3922
Ruchi Kandoid695ccf2017-06-08 10:27:08 -070055#define NCI_VERSION_1_1 0x11
56#define NCI_VERSION_2 0x20
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080057#define TIMEOUT_PERIOD 5
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070058
Yuexi Ma859f18b2017-03-29 18:11:01 -070059constexpr char kCallbackNameSendEvent[] = "sendEvent";
60constexpr char kCallbackNameSendData[] = "sendData";
61
62class NfcClientCallbackArgs {
63 public:
64 NfcEvent last_event_;
65 NfcStatus last_status_;
66 NfcData last_data_;
67};
68
69/* Callback class for data & Event. */
70class NfcClientCallback
71 : public ::testing::VtsHalHidlTargetCallbackBase<NfcClientCallbackArgs>,
72 public INfcClientCallback {
73 public:
74 virtual ~NfcClientCallback() = default;
75
76 /* sendEvent callback function - Records the Event & Status
77 * and notifies the TEST
78 **/
79 Return<void> sendEvent(NfcEvent event, NfcStatus event_status) override {
80 NfcClientCallbackArgs args;
81 args.last_event_ = event;
82 args.last_status_ = event_status;
83 NotifyFromCallback(kCallbackNameSendEvent, args);
84 return Void();
85 };
86
87 /* sendData callback function. Records the data and notifies the TEST*/
88 Return<void> sendData(const NfcData& data) override {
89 NfcClientCallbackArgs args;
90 args.last_data_ = data;
91 NotifyFromCallback(kCallbackNameSendData, args);
92 return Void();
93 };
94};
95
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070096// The main test class for NFC HIDL HAL.
Yuexi Ma6b872012017-03-10 00:42:13 -080097class NfcHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070098 public:
99 virtual void SetUp() override {
Yuexi Ma6b872012017-03-10 00:42:13 -0800100 nfc_ = ::testing::VtsHalHidlTargetTestBase::getService<INfc>();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800101 ASSERT_NE(nfc_, nullptr);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700102
Yuexi Ma859f18b2017-03-29 18:11:01 -0700103 nfc_cb_ = new NfcClientCallback();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800104 ASSERT_NE(nfc_cb_, nullptr);
105
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800106 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
107 // Wait for OPEN_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700108 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
109 EXPECT_TRUE(res.no_timeout);
110 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
111 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700112
113 /* Get the NCI version that the device supports */
114 std::vector<uint8_t> cmd = CORE_RESET_CMD;
115 NfcData data = cmd;
116 EXPECT_EQ(data.size(), nfc_->write(data));
117 // Wait for CORE_RESET_RSP
118 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
119 EXPECT_TRUE(res.no_timeout);
120 EXPECT_GE(6ul, res.args->last_data_.size());
121 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
122 if (res.args->last_data_.size() == 6) {
123 nci_version = res.args->last_data_[4];
124 } else {
125 EXPECT_EQ(4ul, res.args->last_data_.size());
126 nci_version = NCI_VERSION_2;
127 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
128 EXPECT_TRUE(res.no_timeout);
129 }
130
131 /*
132 * Close the hal and then re-open to make sure we are in a predictable
133 * state for all the tests.
134 */
135 EXPECT_EQ(NfcStatus::OK, nfc_->close());
136 // Wait for CLOSE_CPLT event
137 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
138 EXPECT_TRUE(res.no_timeout);
139 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
140 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
141
142 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
143 // Wait for OPEN_CPLT event
144 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
145 EXPECT_TRUE(res.no_timeout);
146 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
147 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700148 }
149
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800150 virtual void TearDown() override {
151 EXPECT_EQ(NfcStatus::OK, nfc_->close());
152 // Wait for CLOSE_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700153 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
154 EXPECT_TRUE(res.no_timeout);
155 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
156 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800157 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700158
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700159 /* NCI version the device supports
160 * 0x11 for NCI 1.1, 0x20 for NCI 2.0 and so forth */
161 uint8_t nci_version;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800162 sp<INfc> nfc_;
Yuexi Ma859f18b2017-03-29 18:11:01 -0700163 sp<NfcClientCallback> nfc_cb_;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700164};
165
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700166// A class for test environment setup (kept since this file is a template).
167class NfcHidlEnvironment : public ::testing::Environment {
168 public:
169 virtual void SetUp() {}
170 virtual void TearDown() {}
171
172 private:
173};
174
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800175/*
176 * OpenAndClose:
177 * Makes an open call, waits for NfcEvent.OPEN_CPLT
178 * Immediately calls close() and waits for NfcEvent.CLOSE_CPLT
179 * Since open and close calls are a part of SetUp() and TearDown(),
180 * the function definition is intentionally kept empty
181 */
182TEST_F(NfcHidlTest, OpenAndClose) {}
183
184/*
185 * WriteCoreReset:
186 * Sends CORE_RESET_CMD
187 * Waits for CORE_RESET_RSP
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800188 * Checks the status, version number and configuration status
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800189 */
190TEST_F(NfcHidlTest, WriteCoreReset) {
191 std::vector<uint8_t> cmd = CORE_RESET_CMD;
192 NfcData data = cmd;
193 EXPECT_EQ(data.size(), nfc_->write(data));
194 // Wait for CORE_RESET_RSP
Yuexi Ma859f18b2017-03-29 18:11:01 -0700195 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
196 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700197
198 /* The response/notification format for CORE_RESET_CMD differs
199 * with NCI 1.0 and 2.0. */
200 if (nci_version <= NCI_VERSION_1_1) {
201 EXPECT_EQ(6ul, res.args->last_data_.size());
202 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
203 EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
204 EXPECT_GE(1ul, res.args->last_data_[5]);
205 } else {
206 EXPECT_EQ(4ul, res.args->last_data_.size());
207 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
208 // Wait for CORE_RESET_NTF
209 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
210 EXPECT_TRUE(res.no_timeout);
211 // Check if reset trigger was due to CORE_RESET_CMD
212 EXPECT_LE(8ul, res.args->last_data_.size());
213 EXPECT_EQ(2ul, res.args->last_data_[3]);
214 EXPECT_GE(1ul, res.args->last_data_[4]);
215 EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
216 }
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800217}
218
219/*
220 * WriteCoreResetConfigReset:
221 * Sends CORE_RESET_CMD_CONFIG_RESET
222 * Waits for CORE_RESET_RSP
223 * Checks the status, version number and configuration status
224 */
225TEST_F(NfcHidlTest, WriteCoreResetConfigReset) {
226 std::vector<uint8_t> cmd = CORE_RESET_CMD_CONFIG_RESET;
227 NfcData data = cmd;
228 EXPECT_EQ(data.size(), nfc_->write(data));
229 // Wait for CORE_RESET_RSP
Yuexi Ma859f18b2017-03-29 18:11:01 -0700230 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
231 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700232
233 /* The response/notification format for CORE_RESET_CMD differs
234 * with NCI 1.0 and 2.0. */
235 if (nci_version <= NCI_VERSION_1_1) {
236 EXPECT_EQ(6ul, res.args->last_data_.size());
237 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
238 EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
239 EXPECT_EQ(1ul, res.args->last_data_[5]);
240 } else {
241 EXPECT_EQ(4ul, res.args->last_data_.size());
242 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
243 // Wait for CORE_RESET_NTF
244 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
245 EXPECT_TRUE(res.no_timeout);
246 // Check if reset trigger was due to CORE_RESET_CMD
247 EXPECT_LE(8ul, res.args->last_data_.size());
248 EXPECT_EQ(2ul, res.args->last_data_[3]);
249 EXPECT_EQ(1ul, res.args->last_data_[4]);
250 EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
251 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700252}
253
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800254/*
255 * WriteInvalidCommand:
256 * Sends an invalid command
257 * Waits for response
258 * Checks SYNTAX_ERROR status
259 */
260TEST_F(NfcHidlTest, WriteInvalidCommand) {
261 // Send an Error Command
262 std::vector<uint8_t> cmd = INVALID_COMMAND;
263 NfcData data = cmd;
264 EXPECT_EQ(data.size(), nfc_->write(data));
265 // Wait for RSP
Yuexi Ma859f18b2017-03-29 18:11:01 -0700266 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
267 EXPECT_TRUE(res.no_timeout);
268 EXPECT_EQ(4ul, res.args->last_data_.size());
269 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800270}
271
272/*
273 * WriteInvalidAndThenValidCommand:
Ruchi Kandoi36193652017-06-15 13:22:51 -0700274 * Sends an Invalid command
275 * Waits for response
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800276 * Checks SYNTAX_ERROR status
277 * Repeat for 100 times appending 0xFF each time to the packet
278 * Send CORE_CONN_CREATE_CMD for loop-back mode
279 * Check the response
280 */
281TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) {
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700282 std::vector<uint8_t> cmd = CORE_RESET_CMD;
283 NfcData data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800284 EXPECT_EQ(data.size(), nfc_->write(data));
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700285 // Wait for CORE_RESET_RSP
Yuexi Ma859f18b2017-03-29 18:11:01 -0700286 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
287 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700288 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700289
290 /* NCI 2.0 sends CORE_RESET_NTF everytime. */
291 if (nci_version == NCI_VERSION_2) {
292 // Wait for CORE_RESET_NTF
293 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
294 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi029633d2017-08-01 17:30:17 -0700295 cmd = CORE_INIT_CMD_NCI20;
296 } else {
297 cmd = CORE_INIT_CMD;
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700298 }
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700299 data = cmd;
Ruchi Kandoi029633d2017-08-01 17:30:17 -0700300
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700301 EXPECT_EQ(data.size(), nfc_->write(data));
302 // Wait for CORE_INIT_RSP
303 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
304 EXPECT_TRUE(res.no_timeout);
305 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoi029633d2017-08-01 17:30:17 -0700306 if (nci_version == NCI_VERSION_2 && res.args->last_data_.size() > 13 &&
307 res.args->last_data_[13] == 0x00) {
308 // Wait for CORE_CONN_CREDITS_NTF
309 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
310 EXPECT_TRUE(res.no_timeout);
311 }
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700312 // Send an Error Data Packet
Ruchi Kandoi36193652017-06-15 13:22:51 -0700313 cmd = INVALID_COMMAND;
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700314 data = cmd;
315 size_t size = data.size();
316
317 for (int i = 0; i < 100; i++) {
318 data.resize(++size);
319 data[size - 1] = 0xFF;
320 EXPECT_EQ(data.size(), nfc_->write(data));
Ruchi Kandoi36193652017-06-15 13:22:51 -0700321 // Wait for response with SYNTAX_ERROR
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700322 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
323 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi36193652017-06-15 13:22:51 -0700324 EXPECT_EQ(4ul, res.args->last_data_.size());
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700325 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800326 }
327
328 cmd = CORE_CONN_CREATE_CMD;
329 data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800330 EXPECT_EQ(data.size(), nfc_->write(data));
331 // Wait for CORE_CONN_CREATE_RSP
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700332 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
Yuexi Ma859f18b2017-03-29 18:11:01 -0700333 EXPECT_TRUE(res.no_timeout);
334 EXPECT_EQ(7ul, res.args->last_data_.size());
335 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800336}
337/*
338 * Bandwidth:
339 * Sets the loop-back mode using CORE_CONN_CREATE_CMD
340 * Sends max payload size data
341 * Waits for the response
342 * Checks the data received
343 * Repeat to send total of 1Mb data
344 */
345TEST_F(NfcHidlTest, Bandwidth) {
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700346 std::vector<uint8_t> cmd = CORE_RESET_CMD;
347 NfcData data = cmd;
348 EXPECT_EQ(data.size(), nfc_->write(data));
349 // Wait for CORE_RESET_RSP
350 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
351 EXPECT_TRUE(res.no_timeout);
352 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700353
354 /* NCI 2.0 sends CORE_RESET_NTF everytime. */
355 if (nci_version == NCI_VERSION_2) {
356 // Wait for CORE_RESET_NTF
357 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
358 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi029633d2017-08-01 17:30:17 -0700359 cmd = CORE_INIT_CMD_NCI20;
360 } else {
361 cmd = CORE_INIT_CMD;
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700362 }
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700363 data = cmd;
Ruchi Kandoi029633d2017-08-01 17:30:17 -0700364
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700365 EXPECT_EQ(data.size(), nfc_->write(data));
366 // Wait for CORE_INIT_RSP
367 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
368 EXPECT_TRUE(res.no_timeout);
369 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoi029633d2017-08-01 17:30:17 -0700370 if (nci_version == NCI_VERSION_2 && res.args->last_data_.size() > 13 &&
371 res.args->last_data_[13] == 0x00) {
372 // Wait for CORE_CONN_CREDITS_NTF
373 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
374 EXPECT_TRUE(res.no_timeout);
375 }
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800376
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700377 cmd = CORE_CONN_CREATE_CMD;
378 data = cmd;
379 EXPECT_EQ(data.size(), nfc_->write(data));
380 // Wait for CORE_CONN_CREATE_RSP
381 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
382 EXPECT_TRUE(res.no_timeout);
383 EXPECT_TRUE(res.no_timeout);
384 EXPECT_EQ(7ul, res.args->last_data_.size());
385 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
386 uint8_t conn_id = res.args->last_data_[6];
387 uint32_t max_payload_size = res.args->last_data_[4];
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800388
Ruchi Kandoi8e3c66e2017-05-12 14:19:25 -0700389 for (int loops = 0; loops < NUMBER_LOOPS; loops++) {
390 res.args->last_data_.resize(0);
391 data.resize(max_payload_size + LOOP_BACK_HEADER_SIZE);
392 data[0] = conn_id;
393 data[1] = 0x00;
394 data[2] = max_payload_size;
395 for (uint32_t i = 0; i < max_payload_size; i++) {
396 data[i + LOOP_BACK_HEADER_SIZE] = i;
397 }
398 EXPECT_EQ(max_payload_size + LOOP_BACK_HEADER_SIZE, nfc_->write(data));
399 // Wait for data and CORE_CONN_CREDITS_NTF
400 auto res1 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
401 EXPECT_TRUE(res1.no_timeout);
402 auto res2 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
403 EXPECT_TRUE(res2.no_timeout);
404 // Check if the same data was received back
405 EXPECT_TRUE(res1.args);
406 EXPECT_TRUE(res2.args);
407
408 NfcData credits_ntf = res1.args->last_data_;
409 NfcData received_data = res2.args->last_data_;
410 /* It is possible that CORE_CONN_CREDITS_NTF is received before data,
411 * Find the order and do further checks depending on that */
412 if (received_data.size() != data.size()) {
413 credits_ntf = res2.args->last_data_;
414 received_data = res1.args->last_data_;
415 }
416 EXPECT_EQ(data.size(), received_data.size());
417 for (size_t i = 0; i < data.size(); i++) {
418 EXPECT_EQ(data[i], received_data[i]);
419 }
420
421 EXPECT_EQ(6ul, credits_ntf.size());
422 // Check if the credit is refilled to 1
423 EXPECT_EQ(1, credits_ntf[5]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800424 }
425}
426
427/*
428 * PowerCycle:
429 * Calls powerCycle()
430 * Waits for NfcEvent.OPEN_CPLT
431 * Checks status
432 */
433TEST_F(NfcHidlTest, PowerCycle) {
434 EXPECT_EQ(NfcStatus::OK, nfc_->powerCycle());
435 // Wait for NfcEvent.OPEN_CPLT
Yuexi Ma859f18b2017-03-29 18:11:01 -0700436 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
437 EXPECT_TRUE(res.no_timeout);
438 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
439 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800440}
441
442/*
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800443 * PowerCycleAfterClose:
444 * Calls powerCycle() after close()
445 * Checks status
446 */
447TEST_F(NfcHidlTest, PowerCycleAfterClose) {
448 EXPECT_EQ(NfcStatus::OK, nfc_->close());
449 // Wait for CLOSE_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700450 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
451 EXPECT_TRUE(res.no_timeout);
452 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
453 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800454
455 EXPECT_EQ(NfcStatus::FAILED, nfc_->powerCycle());
456
457 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
458 // Wait for OPEN_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700459 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
460 EXPECT_TRUE(res.no_timeout);
461 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
462 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800463}
464
465/*
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800466 * CoreInitialized:
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800467 * Calls coreInitialized() with different data
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800468 * Waits for NfcEvent.POST_INIT_CPLT
469 */
470TEST_F(NfcHidlTest, CoreInitialized) {
471 NfcData data;
472 data.resize(1);
Ruchi Kandoi8a7ac5d2017-03-31 16:32:15 -0700473 // These parameters might lead to device specific proprietary behavior
474 // Using > 10 values should result in predictable and common results for
475 // most devices.
476 for (int i = 10; i <= 16; i++) {
Yuexi Ma859f18b2017-03-29 18:11:01 -0700477 data[0] = i;
Ruchi Kandoid695ccf2017-06-08 10:27:08 -0700478 NfcStatus status = nfc_->coreInitialized(data);
479
480 /* In case coreInitialized returned FAILED, do not wait for
481 * POST_INIT_CLPT event. */
482 if (status == NfcStatus::FAILED) continue;
483
484 EXPECT_EQ(NfcStatus::OK, status);
Yuexi Ma859f18b2017-03-29 18:11:01 -0700485 // Wait for NfcEvent.POST_INIT_CPLT
Ruchi Kandoi8a7ac5d2017-03-31 16:32:15 -0700486 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
Yuexi Ma859f18b2017-03-29 18:11:01 -0700487 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi8a7ac5d2017-03-31 16:32:15 -0700488 EXPECT_EQ(NfcEvent::POST_INIT_CPLT, res.args->last_event_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800489 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800490}
491
492/*
493 * ControlGranted:
494 * Calls controlGranted()
495 * Checks the return value
496 */
497TEST_F(NfcHidlTest, ControlGranted) {
498 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
499}
500
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800501/*
502 * ControlGrantedAfterClose:
503 * Call controlGranted() after close
504 * Checks the return value
505 */
506TEST_F(NfcHidlTest, ControlGrantedAfterClose) {
507 EXPECT_EQ(NfcStatus::OK, nfc_->close());
508 // Wait for CLOSE_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700509 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
510 EXPECT_TRUE(res.no_timeout);
511 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
512 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800513
514 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
515
516 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
517 // Wait for OPEN_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700518 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
519 EXPECT_TRUE(res.no_timeout);
520 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
521 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800522}
523
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800524/* PreDiscover:
525 * Calls prediscover()
526 * Checks the return value
527 */
528TEST_F(NfcHidlTest, PreDiscover) {
529 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
530}
531
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800532/*
533 * PreDiscoverAfterClose:
534 * Call prediscover() after close
535 * Checks the return value
536 */
537TEST_F(NfcHidlTest, PreDiscoverAfterClose) {
538 EXPECT_EQ(NfcStatus::OK, nfc_->close());
539 // Wait for CLOSE_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700540 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
541 EXPECT_TRUE(res.no_timeout);
542 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
543 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800544
545 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
546
547 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
548 // Wait for OPEN_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700549 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
550 EXPECT_TRUE(res.no_timeout);
551 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
552 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800553}
554
555/*
556 * CloseAfterClose:
557 * Calls close() multiple times
558 * Checks status
559 */
560TEST_F(NfcHidlTest, CloseAfterClose) {
561 EXPECT_EQ(NfcStatus::OK, nfc_->close());
562 // Wait for CLOSE_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700563 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
564 EXPECT_TRUE(res.no_timeout);
565 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
566 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800567
568 EXPECT_EQ(NfcStatus::FAILED, nfc_->close());
569
570 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
571 // Wait for OPEN_CPLT event
Yuexi Ma859f18b2017-03-29 18:11:01 -0700572 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
573 EXPECT_TRUE(res.no_timeout);
574 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
575 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800576}
577
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800578/*
579 * OpenAfterOpen:
580 * Calls open() multiple times
581 * Checks status
582 */
583TEST_F(NfcHidlTest, OpenAfterOpen) {
584 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
585 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
586}
587
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800588int main(int argc, char** argv) {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700589 ::testing::AddGlobalTestEnvironment(new NfcHidlEnvironment);
590 ::testing::InitGoogleTest(&argc, argv);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800591
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800592 std::system("svc nfc disable"); /* Turn off NFC */
593 sleep(5);
594
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700595 int status = RUN_ALL_TESTS();
Ruchi Kandoi6b600362017-01-11 12:38:40 -0800596 LOG(INFO) << "Test result = " << status;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800597
598 std::system("svc nfc enable"); /* Turn on NFC */
599 sleep(5);
600
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700601 return status;
602}