From 4149444a303972da680162e975ae99fefe520025 Mon Sep 17 00:00:00 2001 From: yunhanw-google Date: Mon, 13 Mar 2023 09:09:20 -0700 Subject: [PATCH] Fix Java CI (#25644) --- .github/workflows/tests.yaml | 8 +- .../app/src/main/jni/cpp/TvCastingApp-JNI.cpp | 64 +++++++--- scripts/tests/java/im_test.py | 120 ++++++++++++++++++ scripts/tests/run_java_test.py | 10 ++ 4 files changed, 181 insertions(+), 21 deletions(-) create mode 100755 scripts/tests/java/im_test.py diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 3caad23f17badf..25f780d6bfb530 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -609,7 +609,7 @@ jobs: --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-cluster "im" \ --tool-args "onnetwork-long-im-invoke --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ --factoryreset \ ' @@ -621,7 +621,7 @@ jobs: --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-cluster "im" \ --tool-args "onnetwork-long-im-read --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ --factoryreset \ ' @@ -633,7 +633,7 @@ jobs: --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-cluster "im" \ --tool-args "onnetwork-long-im-write --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ --factoryreset \ ' @@ -645,7 +645,7 @@ jobs: --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-cluster "im" \ --tool-args "onnetwork-long-im-subscribe --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ --factoryreset \ ' diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp index 66a710d137ff7d..eb584e2589bd5b 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp @@ -477,7 +477,7 @@ JNI_METHOD(jboolean, contentLauncher_1subscribeToSupportedStreamingProtocols) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(ContentLauncher_SupportedStreamingProtocols).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { + [](void * context, chip::SubscriptionId) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ContentLauncher_SupportedStreamingProtocols).Handle(); }); @@ -584,7 +584,9 @@ JNI_METHOD(jboolean, levelControl_1subscribeToCurrentLevel) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(LevelControl_CurrentLevel).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(LevelControl_CurrentLevel).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(LevelControl_CurrentLevel).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -628,7 +630,9 @@ JNI_METHOD(jboolean, levelControl_1subscribeToMinLevel) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(LevelControl_MinLevel).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(LevelControl_MinLevel).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(LevelControl_MinLevel).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -672,7 +676,9 @@ JNI_METHOD(jboolean, levelControl_1subscribeToMaxLevel) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(LevelControl_MaxLevel).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(LevelControl_MaxLevel).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(LevelControl_MaxLevel).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1054,7 +1060,9 @@ JNI_METHOD(jboolean, mediaPlayback_1subscribeToCurrentState) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(MediaPlayback_CurrentState).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_CurrentState).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_CurrentState).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1099,7 +1107,9 @@ JNI_METHOD(jboolean, mediaPlayback_1subscribeToDuration) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(MediaPlayback_Duration).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_Duration).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_Duration).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1146,7 +1156,9 @@ JNI_METHOD(jboolean, mediaPlayback_1subscribeToSampledPosition) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(MediaPlayback_SampledPosition).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_SampledPosition).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_SampledPosition).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1192,7 +1204,9 @@ JNI_METHOD(jboolean, mediaPlayback_1subscribeToPlaybackSpeed) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(MediaPlayback_PlaybackSpeed).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_PlaybackSpeed).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_PlaybackSpeed).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1238,7 +1252,9 @@ JNI_METHOD(jboolean, mediaPlayback_1subscribeToSeekRangeEnd) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(MediaPlayback_SeekRangeEnd).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_SeekRangeEnd).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_SeekRangeEnd).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1285,7 +1301,9 @@ JNI_METHOD(jboolean, mediaPlayback_1subscribeToSeekRangeStart) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(MediaPlayback_SeekRangeStart).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_SeekRangeStart).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(MediaPlayback_SeekRangeStart).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1467,7 +1485,9 @@ JNI_METHOD(jboolean, targetNavigator_1subscribeToCurrentTarget) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(TargetNavigator_CurrentTarget).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(TargetNavigator_CurrentTarget).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(TargetNavigator_CurrentTarget).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1513,7 +1533,9 @@ JNI_METHOD(jboolean, targetNavigator_1subscribeToTargetList) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(TargetNavigator_TargetList).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(TargetNavigator_TargetList).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(TargetNavigator_TargetList).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1587,7 +1609,9 @@ JNI_METHOD(jboolean, applicationBasic_1subscribeToVendorName) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(ApplicationBasic_VendorName).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_VendorName).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_VendorName).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1633,7 +1657,9 @@ JNI_METHOD(jboolean, applicationBasic_1subscribeToVendorID) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(ApplicationBasic_VendorID).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_VendorID).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_VendorID).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1680,7 +1706,9 @@ JNI_METHOD(jboolean, applicationBasic_1subscribeToApplicationName) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(ApplicationBasic_ApplicationName).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_ApplicationName).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_ApplicationName).Handle(); + }); VerifyOrExit(CHIP_NO_ERROR == err, ChipLogError(AppServer, "CastingServer.applicationBasic_subscribeToApplicationName failed %" CHIP_ERROR_FORMAT, @@ -1726,7 +1754,9 @@ JNI_METHOD(jboolean, applicationBasic_1subscribeToProductID) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(ApplicationBasic_ProductID).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_ProductID).Handle(); }); + [](void * context, chip::SubscriptionId) { + TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_ProductID).Handle(); + }); VerifyOrExit( CHIP_NO_ERROR == err, @@ -1774,7 +1804,7 @@ JNI_METHOD(jboolean, applicationBasic_1subscribeToApplicationVersion) TvCastingAppJNIMgr().getSubscriptionReadFailureHandler(ApplicationBasic_ApplicationVersion).Handle(err); }, static_cast(minInterval), static_cast(maxInterval), - [](void * context) { + [](void * context, chip::SubscriptionId) { TvCastingAppJNIMgr().getSubscriptionEstablishedHandler(ApplicationBasic_ApplicationVersion).Handle(); }); diff --git a/scripts/tests/java/im_test.py b/scripts/tests/java/im_test.py new file mode 100755 index 00000000000000..d8acc6362e000d --- /dev/null +++ b/scripts/tests/java/im_test.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 + +# +# Copyright (c) 2022 Project CHIP Authors +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import argparse +import logging +import queue +import subprocess +import threading +import typing + +from colorama import Fore, Style +from java.base import DumpProgramOutputToQueue + + +class IMTest: + def __init__(self, thread_list: typing.List[threading.Thread], queue: queue.Queue, cmd: [], args: str): + self.thread_list = thread_list + self.queue = queue + self.command = cmd + + parser = argparse.ArgumentParser(description='Process pairing arguments.') + + parser.add_argument('command', help="Command name") + parser.add_argument('-t', '--timeout', help="The program will return with timeout after specified seconds", default='200') + parser.add_argument('-a', '--address', help="Address of the device") + parser.add_argument('-p', '--port', help="Port of the remote device", default='5540') + parser.add_argument('-s', '--setup-payload', dest='setup_payload', + help="Setup Payload (manual pairing code or QR code content)") + parser.add_argument('-c', '--setup-pin-code', dest='setup_pin_code', + help=("Setup PIN code which can be used for password-authenticated " + "session establishment (PASE) with the Commissionee")) + parser.add_argument('-n', '--nodeid', help="The Node ID issued to the device", default='1') + parser.add_argument('-d', '--discriminator', help="Discriminator of the device", default='3840') + parser.add_argument('-u', '--paa-trust-store-path', dest='paa_trust_store_path', + help="Path that contains valid and trusted PAA Root Certificates") + + args = parser.parse_args(args.split()) + + self.command_name = args.command + self.nodeid = args.nodeid + self.address = args.address + self.port = args.port + self.setup_payload = args.setup_payload + self.setup_pin_code = args.setup_pin_code + self.discriminator = args.discriminator + self.timeout = args.timeout + + logging.basicConfig(level=logging.INFO) + + def TestCmdOnnetworkLongImInvoke(self, nodeid, setuppin, discriminator, timeout): + java_command = self.command + ['im', 'onnetwork-long-im-invoke', nodeid, setuppin, discriminator, timeout] + logging.info(f"Execute: {java_command}") + java_process = subprocess.Popen( + java_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + DumpProgramOutputToQueue(self.thread_list, Fore.GREEN + "JAVA " + Style.RESET_ALL, java_process, self.queue) + return java_process.wait() + + def TestCmdOnnetworkLongImWrite(self, nodeid, setuppin, discriminator, timeout): + java_command = self.command + ['im', 'onnetwork-long-im-write', nodeid, setuppin, discriminator, timeout] + logging.info(f"Execute: {java_command}") + java_process = subprocess.Popen( + java_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + DumpProgramOutputToQueue(self.thread_list, Fore.GREEN + "JAVA " + Style.RESET_ALL, java_process, self.queue) + return java_process.wait() + + def TestCmdOnnetworkLongImRead(self, nodeid, setuppin, discriminator, timeout): + java_command = self.command + ['im', 'onnetwork-long-im-read', nodeid, setuppin, discriminator, timeout] + logging.info(f"Execute: {java_command}") + java_process = subprocess.Popen( + java_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + DumpProgramOutputToQueue(self.thread_list, Fore.GREEN + "JAVA " + Style.RESET_ALL, java_process, self.queue) + return java_process.wait() + + def TestCmdOnnetworkLongImSubscribe(self, nodeid, setuppin, discriminator, timeout): + java_command = self.command + ['im', 'onnetwork-long-im-subscribe', nodeid, setuppin, discriminator, timeout] + logging.info(f"Execute: {java_command}") + java_process = subprocess.Popen( + java_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + DumpProgramOutputToQueue(self.thread_list, Fore.GREEN + "JAVA " + Style.RESET_ALL, java_process, self.queue) + return java_process.wait() + + def RunTest(self): + if self.command_name == 'onnetwork-long-im-invoke': + logging.info("Testing pairing onnetwork-long-im-invoke") + code = self.TestCmdOnnetworkLongImInvoke(self.nodeid, self.setup_pin_code, self.discriminator, self.timeout) + if code != 0: + raise Exception(f"Testing pairing onnetwork-long-im-invoke failed with error {code}") + elif self.command_name == 'onnetwork-long-im-write': + logging.info("Testing pairing onnetwork-long-im-write") + code = self.TestCmdOnnetworkLongImWrite(self.nodeid, self.setup_pin_code, self.discriminator, self.timeout) + if code != 0: + raise Exception(f"Testing pairing onnetwork-long-im-write failed with error {code}") + elif self.command_name == 'onnetwork-long-im-read': + logging.info("Testing pairing onnetwork-long-im-read") + code = self.TestCmdOnnetworkLongImRead(self.nodeid, self.setup_pin_code, self.discriminator, self.timeout) + if code != 0: + raise Exception(f"Testing pairing onnetwork-long-im-read failed with error {code}") + elif self.command_name == 'onnetwork-long-im-subscribe': + logging.info("Testing pairing onnetwork-long-im-subscribe") + code = self.TestCmdOnnetworkLongImSubscribe(self.nodeid, self.setup_pin_code, self.discriminator, self.timeout) + if code != 0: + raise Exception(f"Testing pairing onnetwork-long-im-subscribe failed with error {code}") + else: + raise Exception(f"Unsupported command {self.command_name}") diff --git a/scripts/tests/run_java_test.py b/scripts/tests/run_java_test.py index 9205c3fec49322..bb0021526f2276 100755 --- a/scripts/tests/run_java_test.py +++ b/scripts/tests/run_java_test.py @@ -29,6 +29,7 @@ from java.base import DumpProgramOutputToQueue from java.commissioning_test import CommissioningTest from java.discover_test import DiscoverTest +from java.im_test import IMTest @click.command() @@ -107,6 +108,15 @@ def main(app: str, app_args: str, tool_path: str, tool_cluster: str, tool_args: except Exception as e: logging.error(e) sys.exit(1) + elif tool_cluster == 'im': + logging.info("Testing IM") + + test = IMTest(log_cooking_threads, log_queue, command, tool_args) + try: + test.RunTest() + except Exception as e: + logging.error(e) + sys.exit(1) app_exit_code = 0 if app_process: