blob: e77cc149250ebed169f995dd0d992482abadcf4c [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 Mabfefc5e2017-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 Kandoi209a2742017-05-12 14:19:25 -070045#define CORE_INIT_CMD \
46 { 0x20, 0x01, 0x00 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080047#define INVALID_COMMAND \
48 { 0x20, 0x00, 0x00 }
49#define FAULTY_DATA_PACKET \
50 { 0x00, 0x00, 0xFF }
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
55#define VERSION 0x11
56#define TIMEOUT_PERIOD 5
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070057
Yuexi Mabfefc5e2017-03-29 18:11:01 -070058constexpr char kCallbackNameSendEvent[] = "sendEvent";
59constexpr char kCallbackNameSendData[] = "sendData";
60
61class NfcClientCallbackArgs {
62 public:
63 NfcEvent last_event_;
64 NfcStatus last_status_;
65 NfcData last_data_;
66};
67
68/* Callback class for data & Event. */
69class NfcClientCallback
70 : public ::testing::VtsHalHidlTargetCallbackBase<NfcClientCallbackArgs>,
71 public INfcClientCallback {
72 public:
73 virtual ~NfcClientCallback() = default;
74
75 /* sendEvent callback function - Records the Event & Status
76 * and notifies the TEST
77 **/
78 Return<void> sendEvent(NfcEvent event, NfcStatus event_status) override {
79 NfcClientCallbackArgs args;
80 args.last_event_ = event;
81 args.last_status_ = event_status;
82 NotifyFromCallback(kCallbackNameSendEvent, args);
83 return Void();
84 };
85
86 /* sendData callback function. Records the data and notifies the TEST*/
87 Return<void> sendData(const NfcData& data) override {
88 NfcClientCallbackArgs args;
89 args.last_data_ = data;
90 NotifyFromCallback(kCallbackNameSendData, args);
91 return Void();
92 };
93};
94
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070095// The main test class for NFC HIDL HAL.
Yuexi Ma6b872012017-03-10 00:42:13 -080096class NfcHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070097 public:
98 virtual void SetUp() override {
Yuexi Ma6b872012017-03-10 00:42:13 -080099 nfc_ = ::testing::VtsHalHidlTargetTestBase::getService<INfc>();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800100 ASSERT_NE(nfc_, nullptr);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700101
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700102 nfc_cb_ = new NfcClientCallback();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800103 ASSERT_NE(nfc_cb_, nullptr);
104
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800105 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
106 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700107 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
108 EXPECT_TRUE(res.no_timeout);
109 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
110 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700111 }
112
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800113 virtual void TearDown() override {
114 EXPECT_EQ(NfcStatus::OK, nfc_->close());
115 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700116 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
117 EXPECT_TRUE(res.no_timeout);
118 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
119 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800120 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700121
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800122 sp<INfc> nfc_;
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700123 sp<NfcClientCallback> nfc_cb_;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700124};
125
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700126// A class for test environment setup (kept since this file is a template).
127class NfcHidlEnvironment : public ::testing::Environment {
128 public:
129 virtual void SetUp() {}
130 virtual void TearDown() {}
131
132 private:
133};
134
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800135/*
136 * OpenAndClose:
137 * Makes an open call, waits for NfcEvent.OPEN_CPLT
138 * Immediately calls close() and waits for NfcEvent.CLOSE_CPLT
139 * Since open and close calls are a part of SetUp() and TearDown(),
140 * the function definition is intentionally kept empty
141 */
142TEST_F(NfcHidlTest, OpenAndClose) {}
143
144/*
145 * WriteCoreReset:
146 * Sends CORE_RESET_CMD
147 * Waits for CORE_RESET_RSP
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800148 * Checks the status, version number and configuration status
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800149 */
150TEST_F(NfcHidlTest, WriteCoreReset) {
151 std::vector<uint8_t> cmd = CORE_RESET_CMD;
152 NfcData data = cmd;
153 EXPECT_EQ(data.size(), nfc_->write(data));
154 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700155 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
156 EXPECT_TRUE(res.no_timeout);
157 EXPECT_EQ(6ul, res.args->last_data_.size());
158 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
159 EXPECT_GE(VERSION, res.args->last_data_[4]);
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700160 EXPECT_GE(1ul, res.args->last_data_[5]);
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800161}
162
163/*
164 * WriteCoreResetConfigReset:
165 * Sends CORE_RESET_CMD_CONFIG_RESET
166 * Waits for CORE_RESET_RSP
167 * Checks the status, version number and configuration status
168 */
169TEST_F(NfcHidlTest, WriteCoreResetConfigReset) {
170 std::vector<uint8_t> cmd = CORE_RESET_CMD_CONFIG_RESET;
171 NfcData data = cmd;
172 EXPECT_EQ(data.size(), nfc_->write(data));
173 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700174 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
175 EXPECT_TRUE(res.no_timeout);
176 EXPECT_EQ(6ul, res.args->last_data_.size());
177 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
178 EXPECT_GE(VERSION, res.args->last_data_[4]);
179 EXPECT_EQ(1ul, res.args->last_data_[5]);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700180}
181
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800182/*
183 * WriteInvalidCommand:
184 * Sends an invalid command
185 * Waits for response
186 * Checks SYNTAX_ERROR status
187 */
188TEST_F(NfcHidlTest, WriteInvalidCommand) {
189 // Send an Error Command
190 std::vector<uint8_t> cmd = INVALID_COMMAND;
191 NfcData data = cmd;
192 EXPECT_EQ(data.size(), nfc_->write(data));
193 // Wait for RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700194 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
195 EXPECT_TRUE(res.no_timeout);
196 EXPECT_EQ(4ul, res.args->last_data_.size());
197 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800198}
199
200/*
201 * WriteInvalidAndThenValidCommand:
202 * Sends an Faulty Data Packet
203 * Waits for CORE_INTERFACE_ERROR_NTF
204 * Checks SYNTAX_ERROR status
205 * Repeat for 100 times appending 0xFF each time to the packet
206 * Send CORE_CONN_CREATE_CMD for loop-back mode
207 * Check the response
208 */
209TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) {
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700210 std::vector<uint8_t> cmd = CORE_RESET_CMD;
211 NfcData data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800212 EXPECT_EQ(data.size(), nfc_->write(data));
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700213 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700214 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
215 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700216 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
217 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
218
219 cmd = CORE_INIT_CMD;
220 data = cmd;
221 EXPECT_EQ(data.size(), nfc_->write(data));
222 // Wait for CORE_INIT_RSP
223 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
224 EXPECT_TRUE(res.no_timeout);
225 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
226
227 // Send an Error Data Packet
228 cmd = FAULTY_DATA_PACKET;
229 data = cmd;
230 size_t size = data.size();
231
232 for (int i = 0; i < 100; i++) {
233 data.resize(++size);
234 data[size - 1] = 0xFF;
235 EXPECT_EQ(data.size(), nfc_->write(data));
236 // Wait for CORE_INTERFACE_ERROR_NTF
237 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
238 EXPECT_TRUE(res.no_timeout);
239 EXPECT_EQ(5ul, res.args->last_data_.size());
240 EXPECT_EQ(0x60, res.args->last_data_[0]);
241 EXPECT_EQ(0x08, res.args->last_data_[1]);
242 EXPECT_EQ(0x02, res.args->last_data_[2]);
243 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800244 }
245
246 cmd = CORE_CONN_CREATE_CMD;
247 data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800248 EXPECT_EQ(data.size(), nfc_->write(data));
249 // Wait for CORE_CONN_CREATE_RSP
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700250 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700251 EXPECT_TRUE(res.no_timeout);
252 EXPECT_EQ(7ul, res.args->last_data_.size());
253 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800254}
255/*
256 * Bandwidth:
257 * Sets the loop-back mode using CORE_CONN_CREATE_CMD
258 * Sends max payload size data
259 * Waits for the response
260 * Checks the data received
261 * Repeat to send total of 1Mb data
262 */
263TEST_F(NfcHidlTest, Bandwidth) {
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700264 std::vector<uint8_t> cmd = CORE_RESET_CMD;
265 NfcData data = cmd;
266 EXPECT_EQ(data.size(), nfc_->write(data));
267 // Wait for CORE_RESET_RSP
268 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
269 EXPECT_TRUE(res.no_timeout);
270 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
271 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800272
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700273 cmd = CORE_INIT_CMD;
274 data = cmd;
275 EXPECT_EQ(data.size(), nfc_->write(data));
276 // Wait for CORE_INIT_RSP
277 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
278 EXPECT_TRUE(res.no_timeout);
279 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800280
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700281 cmd = CORE_CONN_CREATE_CMD;
282 data = cmd;
283 EXPECT_EQ(data.size(), nfc_->write(data));
284 // Wait for CORE_CONN_CREATE_RSP
285 res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
286 EXPECT_TRUE(res.no_timeout);
287 EXPECT_TRUE(res.no_timeout);
288 EXPECT_EQ(7ul, res.args->last_data_.size());
289 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
290 uint8_t conn_id = res.args->last_data_[6];
291 uint32_t max_payload_size = res.args->last_data_[4];
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800292
Ruchi Kandoi209a2742017-05-12 14:19:25 -0700293 for (int loops = 0; loops < NUMBER_LOOPS; loops++) {
294 res.args->last_data_.resize(0);
295 data.resize(max_payload_size + LOOP_BACK_HEADER_SIZE);
296 data[0] = conn_id;
297 data[1] = 0x00;
298 data[2] = max_payload_size;
299 for (uint32_t i = 0; i < max_payload_size; i++) {
300 data[i + LOOP_BACK_HEADER_SIZE] = i;
301 }
302 EXPECT_EQ(max_payload_size + LOOP_BACK_HEADER_SIZE, nfc_->write(data));
303 // Wait for data and CORE_CONN_CREDITS_NTF
304 auto res1 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
305 EXPECT_TRUE(res1.no_timeout);
306 auto res2 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
307 EXPECT_TRUE(res2.no_timeout);
308 // Check if the same data was received back
309 EXPECT_TRUE(res1.args);
310 EXPECT_TRUE(res2.args);
311
312 NfcData credits_ntf = res1.args->last_data_;
313 NfcData received_data = res2.args->last_data_;
314 /* It is possible that CORE_CONN_CREDITS_NTF is received before data,
315 * Find the order and do further checks depending on that */
316 if (received_data.size() != data.size()) {
317 credits_ntf = res2.args->last_data_;
318 received_data = res1.args->last_data_;
319 }
320 EXPECT_EQ(data.size(), received_data.size());
321 for (size_t i = 0; i < data.size(); i++) {
322 EXPECT_EQ(data[i], received_data[i]);
323 }
324
325 EXPECT_EQ(6ul, credits_ntf.size());
326 // Check if the credit is refilled to 1
327 EXPECT_EQ(1, credits_ntf[5]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800328 }
329}
330
331/*
332 * PowerCycle:
333 * Calls powerCycle()
334 * Waits for NfcEvent.OPEN_CPLT
335 * Checks status
336 */
337TEST_F(NfcHidlTest, PowerCycle) {
338 EXPECT_EQ(NfcStatus::OK, nfc_->powerCycle());
339 // Wait for NfcEvent.OPEN_CPLT
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700340 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
341 EXPECT_TRUE(res.no_timeout);
342 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
343 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800344}
345
346/*
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800347 * PowerCycleAfterClose:
348 * Calls powerCycle() after close()
349 * Checks status
350 */
351TEST_F(NfcHidlTest, PowerCycleAfterClose) {
352 EXPECT_EQ(NfcStatus::OK, nfc_->close());
353 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700354 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
355 EXPECT_TRUE(res.no_timeout);
356 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
357 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800358
359 EXPECT_EQ(NfcStatus::FAILED, nfc_->powerCycle());
360
361 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
362 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700363 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
364 EXPECT_TRUE(res.no_timeout);
365 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
366 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800367}
368
369/*
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800370 * CoreInitialized:
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800371 * Calls coreInitialized() with different data
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800372 * Waits for NfcEvent.POST_INIT_CPLT
373 */
374TEST_F(NfcHidlTest, CoreInitialized) {
375 NfcData data;
376 data.resize(1);
Ruchi Kandoi91500252017-03-31 16:32:15 -0700377 // These parameters might lead to device specific proprietary behavior
378 // Using > 10 values should result in predictable and common results for
379 // most devices.
380 for (int i = 10; i <= 16; i++) {
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700381 data[0] = i;
382 EXPECT_EQ(NfcStatus::OK, nfc_->coreInitialized(data));
383 // Wait for NfcEvent.POST_INIT_CPLT
Ruchi Kandoi91500252017-03-31 16:32:15 -0700384 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700385 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi91500252017-03-31 16:32:15 -0700386 EXPECT_EQ(NfcEvent::POST_INIT_CPLT, res.args->last_event_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800387 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800388}
389
390/*
391 * ControlGranted:
392 * Calls controlGranted()
393 * Checks the return value
394 */
395TEST_F(NfcHidlTest, ControlGranted) {
396 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
397}
398
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800399/*
400 * ControlGrantedAfterClose:
401 * Call controlGranted() after close
402 * Checks the return value
403 */
404TEST_F(NfcHidlTest, ControlGrantedAfterClose) {
405 EXPECT_EQ(NfcStatus::OK, nfc_->close());
406 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700407 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
408 EXPECT_TRUE(res.no_timeout);
409 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
410 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800411
412 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
413
414 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
415 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700416 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
417 EXPECT_TRUE(res.no_timeout);
418 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
419 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800420}
421
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800422/* PreDiscover:
423 * Calls prediscover()
424 * Checks the return value
425 */
426TEST_F(NfcHidlTest, PreDiscover) {
427 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
428}
429
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800430/*
431 * PreDiscoverAfterClose:
432 * Call prediscover() after close
433 * Checks the return value
434 */
435TEST_F(NfcHidlTest, PreDiscoverAfterClose) {
436 EXPECT_EQ(NfcStatus::OK, nfc_->close());
437 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700438 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
439 EXPECT_TRUE(res.no_timeout);
440 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
441 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800442
443 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
444
445 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
446 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700447 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
448 EXPECT_TRUE(res.no_timeout);
449 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
450 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800451}
452
453/*
454 * CloseAfterClose:
455 * Calls close() multiple times
456 * Checks status
457 */
458TEST_F(NfcHidlTest, CloseAfterClose) {
459 EXPECT_EQ(NfcStatus::OK, nfc_->close());
460 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700461 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
462 EXPECT_TRUE(res.no_timeout);
463 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
464 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800465
466 EXPECT_EQ(NfcStatus::FAILED, nfc_->close());
467
468 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
469 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700470 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
471 EXPECT_TRUE(res.no_timeout);
472 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
473 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800474}
475
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800476/*
477 * OpenAfterOpen:
478 * Calls open() multiple times
479 * Checks status
480 */
481TEST_F(NfcHidlTest, OpenAfterOpen) {
482 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
483 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
484}
485
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800486int main(int argc, char** argv) {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700487 ::testing::AddGlobalTestEnvironment(new NfcHidlEnvironment);
488 ::testing::InitGoogleTest(&argc, argv);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800489
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800490 std::system("svc nfc disable"); /* Turn off NFC */
491 sleep(5);
492
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700493 int status = RUN_ALL_TESTS();
Ruchi Kandoi6b600362017-01-11 12:38:40 -0800494 LOG(INFO) << "Test result = " << status;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800495
496 std::system("svc nfc enable"); /* Turn on NFC */
497 sleep(5);
498
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700499 return status;
500}