OSDN Git Service

Support NCI 2.0 for NFC VTS
authorRuchi Kandoi <kandoiruchi@google.com>
Thu, 8 Jun 2017 17:27:08 +0000 (10:27 -0700)
committerRuchi Kandoi <kandoiruchi@google.com>
Tue, 13 Jun 2017 00:10:55 +0000 (17:10 -0700)
Bug: 62322170
Test: Run vts test
Change-Id: I7ed331dac9d5918675c091620f099b6250e20700
(cherry picked from commit ff8068d160b642c757f29ee56540dff0af468fe7)

nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp

index e77cc14..094e8a1 100644 (file)
@@ -52,7 +52,8 @@ using ::android::sp;
 #define LOOP_BACK_HEADER_SIZE 3
 #define SYNTAX_ERROR 5
 #define NUMBER_LOOPS 3922
-#define VERSION 0x11
+#define NCI_VERSION_1_1 0x11
+#define NCI_VERSION_2 0x20
 #define TIMEOUT_PERIOD 5
 
 constexpr char kCallbackNameSendEvent[] = "sendEvent";
@@ -108,6 +109,42 @@ class NfcHidlTest : public ::testing::VtsHalHidlTargetTestBase {
     EXPECT_TRUE(res.no_timeout);
     EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
     EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
+
+    /* Get the NCI version that the device supports */
+    std::vector<uint8_t> cmd = CORE_RESET_CMD;
+    NfcData data = cmd;
+    EXPECT_EQ(data.size(), nfc_->write(data));
+    // Wait for CORE_RESET_RSP
+    res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+    EXPECT_TRUE(res.no_timeout);
+    EXPECT_GE(6ul, res.args->last_data_.size());
+    EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+    if (res.args->last_data_.size() == 6) {
+        nci_version = res.args->last_data_[4];
+    } else {
+        EXPECT_EQ(4ul, res.args->last_data_.size());
+        nci_version = NCI_VERSION_2;
+        res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+        EXPECT_TRUE(res.no_timeout);
+    }
+
+    /*
+     * Close the hal and then re-open to make sure we are in a predictable
+     * state for all the tests.
+     */
+    EXPECT_EQ(NfcStatus::OK, nfc_->close());
+    // Wait for CLOSE_CPLT event
+    res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
+    EXPECT_TRUE(res.no_timeout);
+    EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
+    EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
+
+    EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
+    // Wait for OPEN_CPLT event
+    res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
+    EXPECT_TRUE(res.no_timeout);
+    EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
+    EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
   }
 
   virtual void TearDown() override {
@@ -119,6 +156,9 @@ class NfcHidlTest : public ::testing::VtsHalHidlTargetTestBase {
     EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
   }
 
+  /* NCI version the device supports
+   * 0x11 for NCI 1.1, 0x20 for NCI 2.0 and so forth */
+  uint8_t nci_version;
   sp<INfc> nfc_;
   sp<NfcClientCallback> nfc_cb_;
 };
@@ -154,10 +194,26 @@ TEST_F(NfcHidlTest, WriteCoreReset) {
   // Wait for CORE_RESET_RSP
   auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
   EXPECT_TRUE(res.no_timeout);
-  EXPECT_EQ(6ul, res.args->last_data_.size());
-  EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-  EXPECT_GE(VERSION, res.args->last_data_[4]);
-  EXPECT_GE(1ul, res.args->last_data_[5]);
+
+  /* The response/notification format for CORE_RESET_CMD differs
+   * with NCI 1.0 and 2.0. */
+  if (nci_version <= NCI_VERSION_1_1) {
+      EXPECT_EQ(6ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
+      EXPECT_GE(1ul, res.args->last_data_[5]);
+  } else {
+      EXPECT_EQ(4ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      // Wait for CORE_RESET_NTF
+      res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+      EXPECT_TRUE(res.no_timeout);
+      // Check if reset trigger was due to CORE_RESET_CMD
+      EXPECT_LE(8ul, res.args->last_data_.size());
+      EXPECT_EQ(2ul, res.args->last_data_[3]);
+      EXPECT_GE(1ul, res.args->last_data_[4]);
+      EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
+  }
 }
 
 /*
@@ -173,10 +229,26 @@ TEST_F(NfcHidlTest, WriteCoreResetConfigReset) {
   // Wait for CORE_RESET_RSP
   auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
   EXPECT_TRUE(res.no_timeout);
-  EXPECT_EQ(6ul, res.args->last_data_.size());
-  EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-  EXPECT_GE(VERSION, res.args->last_data_[4]);
-  EXPECT_EQ(1ul, res.args->last_data_[5]);
+
+  /* The response/notification format for CORE_RESET_CMD differs
+   * with NCI 1.0 and 2.0. */
+  if (nci_version <= NCI_VERSION_1_1) {
+      EXPECT_EQ(6ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      EXPECT_GE(NCI_VERSION_1_1, res.args->last_data_[4]);
+      EXPECT_EQ(1ul, res.args->last_data_[5]);
+  } else {
+      EXPECT_EQ(4ul, res.args->last_data_.size());
+      EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+      // Wait for CORE_RESET_NTF
+      res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+      EXPECT_TRUE(res.no_timeout);
+      // Check if reset trigger was due to CORE_RESET_CMD
+      EXPECT_LE(8ul, res.args->last_data_.size());
+      EXPECT_EQ(2ul, res.args->last_data_[3]);
+      EXPECT_EQ(1ul, res.args->last_data_[4]);
+      EXPECT_EQ(NCI_VERSION_2, res.args->last_data_[5]);
+  }
 }
 
 /*
@@ -214,7 +286,13 @@ TEST_F(NfcHidlTest, WriteInvalidAndThenValidCommand) {
     auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
     EXPECT_TRUE(res.no_timeout);
     EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-    EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+
+    /* NCI 2.0 sends CORE_RESET_NTF everytime. */
+    if (nci_version == NCI_VERSION_2) {
+        // Wait for CORE_RESET_NTF
+        res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+        EXPECT_TRUE(res.no_timeout);
+    }
 
     cmd = CORE_INIT_CMD;
     data = cmd;
@@ -268,7 +346,13 @@ TEST_F(NfcHidlTest, Bandwidth) {
     auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
     EXPECT_TRUE(res.no_timeout);
     EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
-    EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
+
+    /* NCI 2.0 sends CORE_RESET_NTF everytime. */
+    if (nci_version == NCI_VERSION_2) {
+        // Wait for CORE_RESET_NTF
+        res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
+        EXPECT_TRUE(res.no_timeout);
+    }
 
     cmd = CORE_INIT_CMD;
     data = cmd;
@@ -379,7 +463,13 @@ TEST_F(NfcHidlTest, CoreInitialized) {
   // most devices.
   for (int i = 10; i <= 16; i++) {
       data[0] = i;
-      EXPECT_EQ(NfcStatus::OK, nfc_->coreInitialized(data));
+      NfcStatus status = nfc_->coreInitialized(data);
+
+      /* In case coreInitialized returned FAILED, do not wait for
+       * POST_INIT_CLPT event. */
+      if (status == NfcStatus::FAILED) continue;
+
+      EXPECT_EQ(NfcStatus::OK, status);
       // Wait for NfcEvent.POST_INIT_CPLT
       auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
       EXPECT_TRUE(res.no_timeout);