From b015c6bf5879ebbf17d0c0608d94330e813f2234 Mon Sep 17 00:00:00 2001
From: yunhanw <yunhanw@google.com>
Date: Fri, 10 Mar 2023 14:34:03 -0800
Subject: [PATCH] add kotlin IM read test and enable im test in CI

---
 .github/workflows/tests.yaml                  | 48 +++++++++++
 examples/java-matter-controller/BUILD.gn      |  1 +
 .../java/src/com/matter/controller/Main.kt    |  1 +
 .../pairing/PairOnNetworkLongImReadCommand.kt | 82 +++++++++++++++++++
 4 files changed, 132 insertions(+)
 create mode 100644 examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt

diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index 5686eb04e38fc5..f3cbdfb2ad145b 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -601,6 +601,54 @@ jobs:
                      --tool-args "onnetwork-long --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \
                      --factoryreset \
                   '
+              - name: Run IM Invoke Test
+              timeout-minutes: 10
+              run: |
+                  scripts/run_in_build_env.sh \
+                  './scripts/tests/run_java_test.py \
+                     --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \
+                     --app-args "--discriminator 3840 --interface-id -1" \
+                     --tool-path out/linux-x64-java-matter-controller \
+                     --tool-cluster "pairing" \
+                     --tool-args "onnetwork-long-im-invoke --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \
+                     --factoryreset \
+                  '
+              - name: Run IM Read Test
+              timeout-minutes: 10
+              run: |
+                  scripts/run_in_build_env.sh \
+                  './scripts/tests/run_java_test.py \
+                     --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \
+                     --app-args "--discriminator 3840 --interface-id -1" \
+                     --tool-path out/linux-x64-java-matter-controller \
+                     --tool-cluster "pairing" \
+                     --tool-args "onnetwork-long-im-read --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \
+                     --factoryreset \
+                  '
+              - name: Run IM Write Test
+              timeout-minutes: 10
+              run: |
+                  scripts/run_in_build_env.sh \
+                  './scripts/tests/run_java_test.py \
+                     --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \
+                     --app-args "--discriminator 3840 --interface-id -1" \
+                     --tool-path out/linux-x64-java-matter-controller \
+                     --tool-cluster "pairing" \
+                     --tool-args "onnetwork-long-im-write --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \
+                     --factoryreset \
+                  '
+              - name: Run IM Subscribe Test
+              timeout-minutes: 10
+              run: |
+                  scripts/run_in_build_env.sh \
+                  './scripts/tests/run_java_test.py \
+                     --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \
+                     --app-args "--discriminator 3840 --interface-id -1" \
+                     --tool-path out/linux-x64-java-matter-controller \
+                     --tool-cluster "pairing" \
+                     --tool-args "onnetwork-long-im-subscribe --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \
+                     --factoryreset \
+                  '
             - name: Run Pairing AlreadyDiscovered Test
               timeout-minutes: 10
               run: |
diff --git a/examples/java-matter-controller/BUILD.gn b/examples/java-matter-controller/BUILD.gn
index f48c17ff3c9519..d26b0340ab15b0 100644
--- a/examples/java-matter-controller/BUILD.gn
+++ b/examples/java-matter-controller/BUILD.gn
@@ -69,6 +69,7 @@ kotlin_binary("java-matter-controller") {
     "java/src/com/matter/controller/commands/pairing/PairOnNetworkInstanceNameCommand.kt",
     "java/src/com/matter/controller/commands/pairing/PairOnNetworkLongCommand.kt",
     "java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImInvokeCommand.kt",
+    "java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt",
     "java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImSubscribeCommand.kt",
     "java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImWriteCommand.kt",
     "java/src/com/matter/controller/commands/pairing/PairOnNetworkShortCommand.kt",
diff --git a/examples/java-matter-controller/java/src/com/matter/controller/Main.kt b/examples/java-matter-controller/java/src/com/matter/controller/Main.kt
index b3604caf582186..051c2f02bfb8d0 100644
--- a/examples/java-matter-controller/java/src/com/matter/controller/Main.kt
+++ b/examples/java-matter-controller/java/src/com/matter/controller/Main.kt
@@ -62,6 +62,7 @@ private fun getImCommands(
   credentialsIssuer: CredentialsIssuer
 ): List<Command> {
   return listOf(
+    PairOnNetworkLongImReadCommand(controller, credentialsIssuer),
     PairOnNetworkLongImSubscribeCommand(controller, credentialsIssuer),
     PairOnNetworkLongImWriteCommand(controller, credentialsIssuer),
     PairOnNetworkLongImInvokeCommand(controller, credentialsIssuer),
diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt
new file mode 100644
index 00000000000000..218c1ac5230259
--- /dev/null
+++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt
@@ -0,0 +1,82 @@
+package com.matter.controller.commands.pairing
+
+import chip.devicecontroller.ChipDeviceController
+import chip.devicecontroller.GetConnectedDeviceCallbackJni.GetConnectedDeviceCallback
+import chip.devicecontroller.ReportCallback
+import chip.devicecontroller.model.NodeState
+import chip.devicecontroller.model.ChipAttributePath
+import chip.devicecontroller.model.ChipEventPath
+import com.matter.controller.commands.common.CredentialsIssuer
+import java.util.Collections
+import java.util.logging.Level
+import java.util.logging.Logger
+
+class PairOnNetworkLongImReadCommand(
+  controller: ChipDeviceController, credsIssue: CredentialsIssuer?
+) : PairingCommand(
+  controller,
+  "onnetwork-long-im-read",
+  credsIssue,
+  PairingModeType.ON_NETWORK,
+  PairingNetworkType.NONE,
+  DiscoveryFilterType.LONG_DISCRIMINATOR
+) {
+  private var devicePointer: Long = 0
+
+  private inner class InternalReportCallback : ReportCallback {
+    override fun onError(attributePath: ChipAttributePath?, eventPath: ChipEventPath?, e: Exception) {
+      logger.log(Level.INFO, "Read receive onError")
+      setFailure("read failure")
+    }
+
+    override fun onReport(nodeState: NodeState) {
+      logger.log(Level.INFO, "Read receve onReport")
+      setSuccess()
+    }
+    
+  }
+
+  private inner class InternalGetConnectedDeviceCallback : GetConnectedDeviceCallback {
+    override fun onDeviceConnected(devicePointer: Long) {
+      this@PairOnNetworkLongImReadCommand.devicePointer = devicePointer
+      logger.log(Level.INFO, "onDeviceConnected")
+    }
+
+    override fun onConnectionFailure(nodeId: Long, error: Exception?) {
+      logger.log(Level.INFO, "onConnectionFailure")
+    }
+  }
+
+  override fun runCommand() {
+    val attributePathList = listOf(ChipAttributePath.newInstance(
+        /* endpointId= */ 0, CLUSTER_ID_BASIC, ATTR_ID_LOCAL_CONFIG_DISABLED))
+
+    currentCommissioner()
+      .pairDeviceWithAddress(
+        getNodeId(),
+        getRemoteAddr().getHostAddress(),
+        MATTER_PORT,
+        getDiscriminator(),
+        getSetupPINCode(),
+        null
+      )
+    currentCommissioner().setCompletionListener(this)
+    waitCompleteMs(getTimeoutMillis())
+    currentCommissioner()
+      .getConnectedDevicePointer(getNodeId(), InternalGetConnectedDeviceCallback())
+    clear()
+    currentCommissioner()
+      .readPath(InternalReportCallback(), devicePointer, attributePathList, Collections.emptyList(), false)
+    waitCompleteMs(getTimeoutMillis())
+  }
+
+  companion object {
+    private val logger = Logger.getLogger(
+      PairOnNetworkLongImReadCommand::class.java.name
+    )
+
+    private const val MATTER_PORT = 5540
+    private const val CLUSTER_ID_BASIC = 0x0028L
+    private const val ATTR_ID_LOCAL_CONFIG_DISABLED = 16L
+  }
+}