diff options
author | Ruchi Kandoi | 2017-05-12 16:19:25 -0500 |
---|---|---|
committer | Ruchi Kandoi | 2017-05-15 12:12:49 -0500 |
commit | 209a274c31f8654000561b080f64ee84dd221ed9 (patch) | |
tree | 7a137acc457fdbd92437475c8c188c91ab62136f /nfc | |
parent | a24592b396f372e8a7f3ca7b34d397100629fd48 (diff) | |
download | platform-hardware-interfaces-209a274c31f8654000561b080f64ee84dd221ed9.tar.gz platform-hardware-interfaces-209a274c31f8654000561b080f64ee84dd221ed9.tar.xz platform-hardware-interfaces-209a274c31f8654000561b080f64ee84dd221ed9.zip |
NFC: vts: Add commands to reset the NFC controller before other commands
Bandwidth and WriteInvalidAndThenValidCommand test assumes that the NFC
controller will be initialized before the test. This is not necessarily
true for all devices. Send CORE_RESET_CMD and CORE_INIT_CMD before
creating a loop-back connection.
CORE_RESET_RSP doesn't necessary return the configuration that was sent
in CORE_RESET_CMD. For instance, if CORE_RESET_CMD requested keeping
the configuration, and if the controller doesn't support that, the
configuration will be resetted and CORE_RESET_RSP will reflect that.
Bug: 38267593
Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check
--primary-abi-only --skip-preconditions
--module VtsHalNfcV1_0Target -l INFO
Change-Id: I65ae9746054ca767b928bdd461faa02f03719aea
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
Diffstat (limited to 'nfc')
-rw-r--r-- | nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp | 161 |
1 files changed, 99 insertions, 62 deletions
diff --git a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp index cf9f66ed..e77cc149 100644 --- a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp +++ b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp | |||
@@ -42,6 +42,8 @@ using ::android::sp; | |||
42 | { 0x20, 0x00, 0x01, 0x01 } | 42 | { 0x20, 0x00, 0x01, 0x01 } |
43 | #define CORE_CONN_CREATE_CMD \ | 43 | #define CORE_CONN_CREATE_CMD \ |
44 | { 0x20, 0x04, 0x02, 0x01, 0x00 } | 44 | { 0x20, 0x04, 0x02, 0x01, 0x00 } |
45 | #define CORE_INIT_CMD \ | ||
46 | { 0x20, 0x01, 0x00 } | ||
45 | #define INVALID_COMMAND \ | 47 | #define INVALID_COMMAND \ |
46 | { 0x20, 0x00, 0x00 } | 48 | { 0x20, 0x00, 0x00 } |
47 | #define FAULTY_DATA_PACKET \ | 49 | #define FAULTY_DATA_PACKET \ |
@@ -155,7 +157,7 @@ TEST_F(NfcHidlTest, WriteCoreReset) { | |||
155 | EXPECT_EQ(6ul, res.args->last_data_.size()); | 157 | EXPECT_EQ(6ul, res.args->last_data_.size()); |
156 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); | 158 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
157 | EXPECT_GE(VERSION, res.args->last_data_[4]); | 159 | EXPECT_GE(VERSION, res.args->last_data_[4]); |
158 | EXPECT_EQ(0ul, res.args->last_data_[5]); | 160 | EXPECT_GE(1ul, res.args->last_data_[5]); |
159 | } | 161 | } |
160 | 162 | ||
161 | /* | 163 | /* |
@@ -205,30 +207,47 @@ TEST_F(NfcHidlTest, WriteInvalidCommand) { | |||
205 | * Check the response | 207 | * Check the response |
206 | */ | 208 | */ |
207 | TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) { | 209 | TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) { |
208 | // Send an Error Data Packet | 210 | std::vector<uint8_t> cmd = CORE_RESET_CMD; |
209 | std::vector<uint8_t> cmd = FAULTY_DATA_PACKET; | 211 | NfcData data = cmd; |
210 | NfcData data = cmd; | ||
211 | size_t size = data.size(); | ||
212 | |||
213 | for (int i = 0; i < 100; i++) { | ||
214 | data.resize(++size); | ||
215 | data[size - 1] = 0xFF; | ||
216 | EXPECT_EQ(data.size(), nfc_->write(data)); | 212 | EXPECT_EQ(data.size(), nfc_->write(data)); |
217 | // Wait for CORE_INTERFACE_ERROR_NTF | 213 | // Wait for CORE_RESET_RSP |
218 | auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData); | 214 | auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData); |
219 | EXPECT_TRUE(res.no_timeout); | 215 | EXPECT_TRUE(res.no_timeout); |
220 | EXPECT_EQ(5ul, res.args->last_data_.size()); | 216 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
221 | EXPECT_EQ(0x60, res.args->last_data_[0]); | 217 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
222 | EXPECT_EQ(0x08, res.args->last_data_[1]); | 218 | |
223 | EXPECT_EQ(0x02, res.args->last_data_[2]); | 219 | cmd = CORE_INIT_CMD; |
224 | EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]); | 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]); | ||
225 | } | 244 | } |
226 | 245 | ||
227 | cmd = CORE_CONN_CREATE_CMD; | 246 | cmd = CORE_CONN_CREATE_CMD; |
228 | data = cmd; | 247 | data = cmd; |
229 | EXPECT_EQ(data.size(), nfc_->write(data)); | 248 | EXPECT_EQ(data.size(), nfc_->write(data)); |
230 | // Wait for CORE_CONN_CREATE_RSP | 249 | // Wait for CORE_CONN_CREATE_RSP |
231 | auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData); | 250 | res = nfc_cb_->WaitForCallback(kCallbackNameSendData); |
232 | EXPECT_TRUE(res.no_timeout); | 251 | EXPECT_TRUE(res.no_timeout); |
233 | EXPECT_EQ(7ul, res.args->last_data_.size()); | 252 | EXPECT_EQ(7ul, res.args->last_data_.size()); |
234 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); | 253 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
@@ -242,52 +261,70 @@ TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) { | |||
242 | * Repeat to send total of 1Mb data | 261 | * Repeat to send total of 1Mb data |
243 | */ | 262 | */ |
244 | TEST_F(NfcHidlTest, Bandwidth) { | 263 | TEST_F(NfcHidlTest, Bandwidth) { |
245 | std::vector<uint8_t> cmd = CORE_CONN_CREATE_CMD; | 264 | std::vector<uint8_t> cmd = CORE_RESET_CMD; |
246 | NfcData data = cmd; | 265 | NfcData data = cmd; |
247 | EXPECT_EQ(data.size(), nfc_->write(data)); | 266 | EXPECT_EQ(data.size(), nfc_->write(data)); |
248 | // Wait for CORE_CONN_CREATE_RSP | 267 | // Wait for CORE_RESET_RSP |
249 | auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData); | 268 | auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData); |
250 | EXPECT_TRUE(res.no_timeout); | 269 | EXPECT_TRUE(res.no_timeout); |
251 | EXPECT_EQ(7ul, res.args->last_data_.size()); | 270 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
252 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); | 271 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
253 | uint8_t conn_id = res.args->last_data_[6]; | 272 | |
254 | uint32_t max_payload_size = res.args->last_data_[4]; | 273 | cmd = CORE_INIT_CMD; |
255 | 274 | data = cmd; | |
256 | for (int loops = 0; loops < NUMBER_LOOPS; loops++) { | 275 | EXPECT_EQ(data.size(), nfc_->write(data)); |
257 | res.args->last_data_.resize(0); | 276 | // Wait for CORE_INIT_RSP |
258 | data.resize(max_payload_size + LOOP_BACK_HEADER_SIZE); | 277 | res = nfc_cb_->WaitForCallback(kCallbackNameSendData); |
259 | data[0] = conn_id; | 278 | EXPECT_TRUE(res.no_timeout); |
260 | data[1] = 0x00; | 279 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
261 | data[2] = max_payload_size; | 280 | |
262 | for (uint32_t i = 0; i < max_payload_size; i++) { | 281 | cmd = CORE_CONN_CREATE_CMD; |
263 | data[i + LOOP_BACK_HEADER_SIZE] = i; | 282 | data = cmd; |
264 | } | 283 | EXPECT_EQ(data.size(), nfc_->write(data)); |
265 | EXPECT_EQ(max_payload_size + LOOP_BACK_HEADER_SIZE, nfc_->write(data)); | 284 | // Wait for CORE_CONN_CREATE_RSP |
266 | // Wait for data and CORE_CONN_CREDITS_NTF | 285 | res = nfc_cb_->WaitForCallback(kCallbackNameSendData); |
267 | auto res1 = nfc_cb_->WaitForCallback(kCallbackNameSendData); | 286 | EXPECT_TRUE(res.no_timeout); |
268 | EXPECT_TRUE(res1.no_timeout); | 287 | EXPECT_TRUE(res.no_timeout); |
269 | auto res2 = nfc_cb_->WaitForCallback(kCallbackNameSendData); | 288 | EXPECT_EQ(7ul, res.args->last_data_.size()); |
270 | EXPECT_TRUE(res2.no_timeout); | 289 | EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]); |
271 | // Check if the same data was received back | 290 | uint8_t conn_id = res.args->last_data_[6]; |
272 | EXPECT_TRUE(res1.args); | 291 | uint32_t max_payload_size = res.args->last_data_[4]; |
273 | EXPECT_TRUE(res2.args); | 292 | |
274 | 293 | for (int loops = 0; loops < NUMBER_LOOPS; loops++) { | |
275 | NfcData credits_ntf = res1.args->last_data_; | 294 | res.args->last_data_.resize(0); |
276 | NfcData received_data = res2.args->last_data_; | 295 | data.resize(max_payload_size + LOOP_BACK_HEADER_SIZE); |
277 | /* It is possible that CORE_CONN_CREDITS_NTF is received before data, | 296 | data[0] = conn_id; |
278 | * Find the order and do further checks depending on that */ | 297 | data[1] = 0x00; |
279 | if (received_data.size() != data.size()) { | 298 | data[2] = max_payload_size; |
280 | credits_ntf = res2.args->last_data_; | 299 | for (uint32_t i = 0; i < max_payload_size; i++) { |
281 | received_data = res1.args->last_data_; | 300 | data[i + LOOP_BACK_HEADER_SIZE] = i; |
282 | } | 301 | } |
283 | EXPECT_EQ(data.size(), received_data.size()); | 302 | EXPECT_EQ(max_payload_size + LOOP_BACK_HEADER_SIZE, nfc_->write(data)); |
284 | for (size_t i = 0; i < data.size(); i++) { | 303 | // Wait for data and CORE_CONN_CREDITS_NTF |
285 | EXPECT_EQ(data[i], received_data[i]); | 304 | auto res1 = nfc_cb_->WaitForCallback(kCallbackNameSendData); |
286 | } | 305 | EXPECT_TRUE(res1.no_timeout); |
287 | 306 | auto res2 = nfc_cb_->WaitForCallback(kCallbackNameSendData); | |
288 | EXPECT_EQ(6ul, credits_ntf.size()); | 307 | EXPECT_TRUE(res2.no_timeout); |
289 | // Check if the credit is refilled to 1 | 308 | // Check if the same data was received back |
290 | EXPECT_EQ(1, credits_ntf[5]); | 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]); | ||
291 | } | 328 | } |
292 | } | 329 | } |
293 | 330 | ||