blob: cf9f66ed1592a98c0de0053a7f3e1a7639555a22 [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 }
45#define INVALID_COMMAND \
46 { 0x20, 0x00, 0x00 }
47#define FAULTY_DATA_PACKET \
48 { 0x00, 0x00, 0xFF }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070049
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080050#define LOOP_BACK_HEADER_SIZE 3
51#define SYNTAX_ERROR 5
52#define NUMBER_LOOPS 3922
53#define VERSION 0x11
54#define TIMEOUT_PERIOD 5
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070055
Yuexi Mabfefc5e2017-03-29 18:11:01 -070056constexpr char kCallbackNameSendEvent[] = "sendEvent";
57constexpr char kCallbackNameSendData[] = "sendData";
58
59class NfcClientCallbackArgs {
60 public:
61 NfcEvent last_event_;
62 NfcStatus last_status_;
63 NfcData last_data_;
64};
65
66/* Callback class for data & Event. */
67class NfcClientCallback
68 : public ::testing::VtsHalHidlTargetCallbackBase<NfcClientCallbackArgs>,
69 public INfcClientCallback {
70 public:
71 virtual ~NfcClientCallback() = default;
72
73 /* sendEvent callback function - Records the Event & Status
74 * and notifies the TEST
75 **/
76 Return<void> sendEvent(NfcEvent event, NfcStatus event_status) override {
77 NfcClientCallbackArgs args;
78 args.last_event_ = event;
79 args.last_status_ = event_status;
80 NotifyFromCallback(kCallbackNameSendEvent, args);
81 return Void();
82 };
83
84 /* sendData callback function. Records the data and notifies the TEST*/
85 Return<void> sendData(const NfcData& data) override {
86 NfcClientCallbackArgs args;
87 args.last_data_ = data;
88 NotifyFromCallback(kCallbackNameSendData, args);
89 return Void();
90 };
91};
92
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070093// The main test class for NFC HIDL HAL.
Yuexi Ma6b872012017-03-10 00:42:13 -080094class NfcHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070095 public:
96 virtual void SetUp() override {
Yuexi Ma6b872012017-03-10 00:42:13 -080097 nfc_ = ::testing::VtsHalHidlTargetTestBase::getService<INfc>();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -080098 ASSERT_NE(nfc_, nullptr);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -070099
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700100 nfc_cb_ = new NfcClientCallback();
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800101 ASSERT_NE(nfc_cb_, nullptr);
102
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800103 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
104 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700105 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
106 EXPECT_TRUE(res.no_timeout);
107 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
108 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700109 }
110
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800111 virtual void TearDown() override {
112 EXPECT_EQ(NfcStatus::OK, nfc_->close());
113 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700114 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
115 EXPECT_TRUE(res.no_timeout);
116 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
117 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800118 }
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700119
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800120 sp<INfc> nfc_;
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700121 sp<NfcClientCallback> nfc_cb_;
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700122};
123
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700124// A class for test environment setup (kept since this file is a template).
125class NfcHidlEnvironment : public ::testing::Environment {
126 public:
127 virtual void SetUp() {}
128 virtual void TearDown() {}
129
130 private:
131};
132
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800133/*
134 * OpenAndClose:
135 * Makes an open call, waits for NfcEvent.OPEN_CPLT
136 * Immediately calls close() and waits for NfcEvent.CLOSE_CPLT
137 * Since open and close calls are a part of SetUp() and TearDown(),
138 * the function definition is intentionally kept empty
139 */
140TEST_F(NfcHidlTest, OpenAndClose) {}
141
142/*
143 * WriteCoreReset:
144 * Sends CORE_RESET_CMD
145 * Waits for CORE_RESET_RSP
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800146 * Checks the status, version number and configuration status
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800147 */
148TEST_F(NfcHidlTest, WriteCoreReset) {
149 std::vector<uint8_t> cmd = CORE_RESET_CMD;
150 NfcData data = cmd;
151 EXPECT_EQ(data.size(), nfc_->write(data));
152 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700153 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
154 EXPECT_TRUE(res.no_timeout);
155 EXPECT_EQ(6ul, res.args->last_data_.size());
156 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
157 EXPECT_GE(VERSION, res.args->last_data_[4]);
158 EXPECT_EQ(0ul, res.args->last_data_[5]);
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800159}
160
161/*
162 * WriteCoreResetConfigReset:
163 * Sends CORE_RESET_CMD_CONFIG_RESET
164 * Waits for CORE_RESET_RSP
165 * Checks the status, version number and configuration status
166 */
167TEST_F(NfcHidlTest, WriteCoreResetConfigReset) {
168 std::vector<uint8_t> cmd = CORE_RESET_CMD_CONFIG_RESET;
169 NfcData data = cmd;
170 EXPECT_EQ(data.size(), nfc_->write(data));
171 // Wait for CORE_RESET_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700172 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
173 EXPECT_TRUE(res.no_timeout);
174 EXPECT_EQ(6ul, res.args->last_data_.size());
175 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
176 EXPECT_GE(VERSION, res.args->last_data_[4]);
177 EXPECT_EQ(1ul, res.args->last_data_[5]);
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700178}
179
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800180/*
181 * WriteInvalidCommand:
182 * Sends an invalid command
183 * Waits for response
184 * Checks SYNTAX_ERROR status
185 */
186TEST_F(NfcHidlTest, WriteInvalidCommand) {
187 // Send an Error Command
188 std::vector<uint8_t> cmd = INVALID_COMMAND;
189 NfcData data = cmd;
190 EXPECT_EQ(data.size(), nfc_->write(data));
191 // Wait for RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700192 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
193 EXPECT_TRUE(res.no_timeout);
194 EXPECT_EQ(4ul, res.args->last_data_.size());
195 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800196}
197
198/*
199 * WriteInvalidAndThenValidCommand:
200 * Sends an Faulty Data Packet
201 * Waits for CORE_INTERFACE_ERROR_NTF
202 * Checks SYNTAX_ERROR status
203 * Repeat for 100 times appending 0xFF each time to the packet
204 * Send CORE_CONN_CREATE_CMD for loop-back mode
205 * Check the response
206 */
207TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) {
208 // Send an Error Data Packet
209 std::vector<uint8_t> cmd = FAULTY_DATA_PACKET;
210 NfcData data = cmd;
211 size_t size = data.size();
212
213 for (int i = 0; i < 100; i++) {
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800214 data.resize(++size);
215 data[size - 1] = 0xFF;
216 EXPECT_EQ(data.size(), nfc_->write(data));
217 // Wait for CORE_INTERFACE_ERROR_NTF
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700218 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
219 EXPECT_TRUE(res.no_timeout);
220 EXPECT_EQ(5ul, res.args->last_data_.size());
221 EXPECT_EQ(0x60, res.args->last_data_[0]);
222 EXPECT_EQ(0x08, res.args->last_data_[1]);
223 EXPECT_EQ(0x02, res.args->last_data_[2]);
224 EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800225 }
226
227 cmd = CORE_CONN_CREATE_CMD;
228 data = cmd;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800229 EXPECT_EQ(data.size(), nfc_->write(data));
230 // Wait for CORE_CONN_CREATE_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700231 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
232 EXPECT_TRUE(res.no_timeout);
233 EXPECT_EQ(7ul, res.args->last_data_.size());
234 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800235}
236/*
237 * Bandwidth:
238 * Sets the loop-back mode using CORE_CONN_CREATE_CMD
239 * Sends max payload size data
240 * Waits for the response
241 * Checks the data received
242 * Repeat to send total of 1Mb data
243 */
244TEST_F(NfcHidlTest, Bandwidth) {
245 std::vector<uint8_t> cmd = CORE_CONN_CREATE_CMD;
246 NfcData data = cmd;
247 EXPECT_EQ(data.size(), nfc_->write(data));
248 // Wait for CORE_CONN_CREATE_RSP
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700249 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
250 EXPECT_TRUE(res.no_timeout);
251 EXPECT_EQ(7ul, res.args->last_data_.size());
252 EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
253 uint8_t conn_id = res.args->last_data_[6];
254 uint32_t max_payload_size = res.args->last_data_[4];
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800255
256 for (int loops = 0; loops < NUMBER_LOOPS; loops++) {
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700257 res.args->last_data_.resize(0);
258 data.resize(max_payload_size + LOOP_BACK_HEADER_SIZE);
259 data[0] = conn_id;
260 data[1] = 0x00;
261 data[2] = max_payload_size;
262 for (uint32_t i = 0; i < max_payload_size; i++) {
263 data[i + LOOP_BACK_HEADER_SIZE] = i;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800264 }
265 EXPECT_EQ(max_payload_size + LOOP_BACK_HEADER_SIZE, nfc_->write(data));
266 // Wait for data and CORE_CONN_CREDITS_NTF
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700267 auto res1 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
268 EXPECT_TRUE(res1.no_timeout);
269 auto res2 = nfc_cb_->WaitForCallback(kCallbackNameSendData);
270 EXPECT_TRUE(res2.no_timeout);
271 // Check if the same data was received back
272 EXPECT_TRUE(res1.args);
273 EXPECT_TRUE(res2.args);
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800274
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700275 NfcData credits_ntf = res1.args->last_data_;
276 NfcData received_data = res2.args->last_data_;
Ruchi Kandoi185b5a72017-01-18 11:12:58 -0800277 /* It is possible that CORE_CONN_CREDITS_NTF is received before data,
278 * Find the order and do further checks depending on that */
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700279 if (received_data.size() != data.size()) {
280 credits_ntf = res2.args->last_data_;
281 received_data = res1.args->last_data_;
282 }
283 EXPECT_EQ(data.size(), received_data.size());
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800284 for (size_t i = 0; i < data.size(); i++) {
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700285 EXPECT_EQ(data[i], received_data[i]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800286 }
287
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700288 EXPECT_EQ(6ul, credits_ntf.size());
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800289 // Check if the credit is refilled to 1
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700290 EXPECT_EQ(1, credits_ntf[5]);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800291 }
292}
293
294/*
295 * PowerCycle:
296 * Calls powerCycle()
297 * Waits for NfcEvent.OPEN_CPLT
298 * Checks status
299 */
300TEST_F(NfcHidlTest, PowerCycle) {
301 EXPECT_EQ(NfcStatus::OK, nfc_->powerCycle());
302 // Wait for NfcEvent.OPEN_CPLT
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700303 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
304 EXPECT_TRUE(res.no_timeout);
305 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
306 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800307}
308
309/*
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800310 * PowerCycleAfterClose:
311 * Calls powerCycle() after close()
312 * Checks status
313 */
314TEST_F(NfcHidlTest, PowerCycleAfterClose) {
315 EXPECT_EQ(NfcStatus::OK, nfc_->close());
316 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700317 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
318 EXPECT_TRUE(res.no_timeout);
319 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
320 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800321
322 EXPECT_EQ(NfcStatus::FAILED, nfc_->powerCycle());
323
324 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
325 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700326 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
327 EXPECT_TRUE(res.no_timeout);
328 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
329 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800330}
331
332/*
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800333 * CoreInitialized:
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800334 * Calls coreInitialized() with different data
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800335 * Waits for NfcEvent.POST_INIT_CPLT
336 */
337TEST_F(NfcHidlTest, CoreInitialized) {
338 NfcData data;
339 data.resize(1);
Ruchi Kandoi91500252017-03-31 16:32:15 -0700340 // These parameters might lead to device specific proprietary behavior
341 // Using > 10 values should result in predictable and common results for
342 // most devices.
343 for (int i = 10; i <= 16; i++) {
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700344 data[0] = i;
345 EXPECT_EQ(NfcStatus::OK, nfc_->coreInitialized(data));
346 // Wait for NfcEvent.POST_INIT_CPLT
Ruchi Kandoi91500252017-03-31 16:32:15 -0700347 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700348 EXPECT_TRUE(res.no_timeout);
Ruchi Kandoi91500252017-03-31 16:32:15 -0700349 EXPECT_EQ(NfcEvent::POST_INIT_CPLT, res.args->last_event_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800350 }
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800351}
352
353/*
354 * ControlGranted:
355 * Calls controlGranted()
356 * Checks the return value
357 */
358TEST_F(NfcHidlTest, ControlGranted) {
359 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
360}
361
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800362/*
363 * ControlGrantedAfterClose:
364 * Call controlGranted() after close
365 * Checks the return value
366 */
367TEST_F(NfcHidlTest, ControlGrantedAfterClose) {
368 EXPECT_EQ(NfcStatus::OK, nfc_->close());
369 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700370 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
371 EXPECT_TRUE(res.no_timeout);
372 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
373 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800374
375 EXPECT_EQ(NfcStatus::OK, nfc_->controlGranted());
376
377 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
378 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700379 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
380 EXPECT_TRUE(res.no_timeout);
381 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
382 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800383}
384
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800385/* PreDiscover:
386 * Calls prediscover()
387 * Checks the return value
388 */
389TEST_F(NfcHidlTest, PreDiscover) {
390 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
391}
392
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800393/*
394 * PreDiscoverAfterClose:
395 * Call prediscover() after close
396 * Checks the return value
397 */
398TEST_F(NfcHidlTest, PreDiscoverAfterClose) {
399 EXPECT_EQ(NfcStatus::OK, nfc_->close());
400 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700401 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
402 EXPECT_TRUE(res.no_timeout);
403 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
404 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800405
406 EXPECT_EQ(NfcStatus::OK, nfc_->prediscover());
407
408 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
409 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700410 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
411 EXPECT_TRUE(res.no_timeout);
412 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
413 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800414}
415
416/*
417 * CloseAfterClose:
418 * Calls close() multiple times
419 * Checks status
420 */
421TEST_F(NfcHidlTest, CloseAfterClose) {
422 EXPECT_EQ(NfcStatus::OK, nfc_->close());
423 // Wait for CLOSE_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700424 auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
425 EXPECT_TRUE(res.no_timeout);
426 EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
427 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800428
429 EXPECT_EQ(NfcStatus::FAILED, nfc_->close());
430
431 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
432 // Wait for OPEN_CPLT event
Yuexi Mabfefc5e2017-03-29 18:11:01 -0700433 res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
434 EXPECT_TRUE(res.no_timeout);
435 EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
436 EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800437}
438
Ruchi Kandoi3d7c5f92017-01-25 17:08:35 -0800439/*
440 * OpenAfterOpen:
441 * Calls open() multiple times
442 * Checks status
443 */
444TEST_F(NfcHidlTest, OpenAfterOpen) {
445 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
446 EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
447}
448
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800449int main(int argc, char** argv) {
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700450 ::testing::AddGlobalTestEnvironment(new NfcHidlEnvironment);
451 ::testing::InitGoogleTest(&argc, argv);
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800452
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800453 std::system("svc nfc disable"); /* Turn off NFC */
454 sleep(5);
455
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700456 int status = RUN_ALL_TESTS();
Ruchi Kandoi6b600362017-01-11 12:38:40 -0800457 LOG(INFO) << "Test result = " << status;
Ruchi Kandoiea37e1a2016-11-11 16:37:34 -0800458
459 std::system("svc nfc enable"); /* Turn on NFC */
460 sleep(5);
461
Keun Soo Yim105bcaa2016-10-22 15:09:27 -0700462 return status;
463}