Loading android/pandora/mmi2grpc/mmi2grpc/__init__.py +8 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ from mmi2grpc.gatt import GATTProxy from mmi2grpc.hfp import HFPProxy from mmi2grpc.hid import HIDProxy from mmi2grpc.hogp import HOGPProxy from mmi2grpc.l2cap import L2CAPProxy from mmi2grpc.sdp import SDPProxy from mmi2grpc.sm import SMProxy from mmi2grpc._helpers import format_proxy Loading Loading @@ -66,6 +67,7 @@ class IUT: self._hfp = None self._hid = None self._hogp = None self._l2cap = None self._sdp = None self._sm = None Loading @@ -87,6 +89,7 @@ class IUT: self._avrcp = None self._gatt = None self._hfp = None self._l2cap = None self._hid = None self._hogp = None self._sdp = None Loading Loading @@ -175,6 +178,11 @@ class IUT: if not self._hogp: self._hogp = HOGPProxy(grpc.insecure_channel(f'localhost:{self.port}')) return self._hogp.interact(test, interaction, description, pts_address) # Instantiates L2CAP proxy and reroutes corresponding MMIs to it. if profile in ('L2CAP'): if not self._l2cap: self._l2cap = L2CAPProxy(grpc.insecure_channel(f'localhost:{self.port}')) return self._l2cap.interact(test, interaction, description, pts_address) # Handles SDP MMIs. if profile in ('SDP'): if not self._sdp: Loading android/pandora/mmi2grpc/mmi2grpc/l2cap.py 0 → 100644 +337 −0 Original line number Diff line number Diff line import time from mmi2grpc._helpers import assert_description from mmi2grpc._helpers import match_description from mmi2grpc._proxy import ProfileProxy from pandora_experimental.host_grpc import Host from pandora_experimental.host_pb2 import Connection from pandora_experimental.l2cap_grpc import L2CAP from typing import Optional import sys class L2CAPProxy(ProfileProxy): test_status_map = {} # record test status and pass them between MMI LE_DATA_PACKET_LARGE = "data: LE_DATA_PACKET_LARGE" connection: Optional[Connection] = None def __init__(self, channel): super().__init__() self.l2cap = L2CAP(channel) self.host = Host(channel) @assert_description def MMI_IUT_SEND_LE_CREDIT_BASED_CONNECTION_REQUEST(self, test: str, pts_addr: bytes, **kwargs): """ Using the Implementation Under Test (IUT), send a LE Credit based connection request to PTS. Description: Verify that IUT can setup LE credit based channel. """ tests_target_to_fail = [ 'L2CAP/LE/CFC/BV-01-C', 'L2CAP/LE/CFC/BV-04-C', 'L2CAP/LE/CFC/BV-10-C', 'L2CAP/LE/CFC/BV-11-C', 'L2CAP/LE/CFC/BV-12-C', 'L2CAP/LE/CFC/BV-14-C', 'L2CAP/LE/CFC/BV-16-C', 'L2CAP/LE/CFC/BV-18-C', 'L2CAP/LE/CFC/BV-19-C', "L2CAP/LE/CFC/BV-21-C", ] tests_require_secure_connection = [] # This MMI is called twice in 'L2CAP/LE/CFC/BV-04-C' # We are not sure whether the lower tester’s BluetoothServerSocket # will be closed after first connection is established. # Based on what we find, the first connection request is successful, # but the 2nd connection fails. # In PTS real world test, the system asks the human tester # whether it is connected. The human tester will press “Yes” twice. # So we use a counter to return “OK” for the 2nd call. if self.connection and test == 'L2CAP/LE/CFC/BV-02-C': return "OK" assert self.connection is None, f"the connection should be None for the first call" time.sleep(2) # avoid timing issue self.connection = self.host.GetLEConnection(address=pts_addr).connection psm = 0x25 # default TSPX_spsm value if test == 'L2CAP/LE/CFC/BV-04-C': psm = 0xF1 # default TSPX_psm_unsupported value if test == 'L2CAP/LE/CFC/BV-10-C': psm = 0xF2 # default TSPX_psm_authentication_required value if test == 'L2CAP/LE/CFC/BV-12-C': psm = 0xF3 # default TSPX_psm_authorization_required value secure_connection = test in tests_require_secure_connection try: self.l2cap.CreateLECreditBasedChannel(connection=self.connection, psm=psm, secure=secure_connection) except Exception as e: if test in tests_target_to_fail: self.test_status_map[test] = 'OK' print(test, 'target to fail', file=sys.stderr) return "OK" else: print(test, 'CreateLECreditBasedChannel failed', e, file=sys.stderr) raise e return "OK" @assert_description def MMI_TESTER_ENABLE_LE_CONNECTION(self, test: str, **kwargs): """ Place the IUT into LE connectable mode. """ self.host.SetLEConnectable() # not strictly necessary, but can save time on waiting connection tests_to_open_bluetooth_server_socket = [ "L2CAP/LE/CFC/BV-03-C", "L2CAP/LE/CFC/BV-05-C", "L2CAP/LE/CFC/BV-06-C", "L2CAP/LE/CFC/BV-09-C", "L2CAP/LE/CFC/BV-13-C", "L2CAP/LE/CFC/BV-20-C", ] tests_require_secure_connection = [ "L2CAP/LE/CFC/BV-13-C", ] if test in tests_to_open_bluetooth_server_socket: secure_connection = test in tests_require_secure_connection self.l2cap.ListenL2CAPChannel(connection=self.connection, secure=secure_connection) self.l2cap.AcceptL2CAPChannel(connection=self.connection) return "OK" @assert_description def MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_LARGE(self, **kwargs): """ Upper Tester command IUT to send LE data packet(s) to the PTS. Description : The Implementation Under Test(IUT) should send multiple LE frames of LE data to PTS. """ # NOTES: the data packet is made to be only 1 frame because of the # undeterministic behavior of the PTS-bot # this happened on "L2CAP/LE/CFC/BV-03-C" # when multiple frames are used, sometimes pass, sometimes fail # the PTS said "Failed to receive L2CAP data", but snoop log showed # all data frames arrived # it seemed like when the time gap between the 1st frame and 2nd frame # larger than 100ms this problem will occur self.l2cap.SendData(connection=self.connection, data=bytes(self.LE_DATA_PACKET_LARGE, "utf-8")) return "OK" @match_description def MMI_UPPER_TESTER_CONFIRM_LE_DATA(self, sent_data: str, **kwargs): """ Did the Upper Tester send the data (?P<sent_data>[0-9A-F]*) to to the PTS\? Click Yes if it matched, otherwise click No. Description: The Implementation Under Test \(IUT\) send data is receive correctly in the PTS. """ hex_LE_DATA_PACKET_LARGE = self.LE_DATA_PACKET_LARGE.encode("utf-8").hex().upper() if sent_data != hex_LE_DATA_PACKET_LARGE: print(f"data not match, sent_data:{sent_data} and {hex_LE_DATA_PACKET_LARGE}", file=sys.stderr) raise Exception(f"data not match, sent_data:{sent_data} and {hex_LE_DATA_PACKET_LARGE}") return "OK" @assert_description def MMI_UPPER_TESTER_SEND_LE_DATA_PACKET4(self, **kwargs): """ Upper Tester command IUT to send at least 4 frames of LE data packets to the PTS. """ self.l2cap.SendData( connection=self.connection, data=b"this is a large data package with at least 4 frames: MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_LARGE") return "OK" @assert_description def MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_CONTINUE(self, **kwargs): """ IUT continue to send LE data packet(s) to the PTS. """ self.l2cap.SendData( connection=self.connection, data=b"this is a large data package with at least 4 frames: MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_LARGE") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_COMMAND_NOT_UNDERSTAOOD(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive L2CAP Reject with 'command not understood' error? Click Yes if it is, otherwise click No. Description : Verify that after receiving the Command Reject from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MI_UPPER_TESTER_CONFIRM_RECEIVE_COMMAND_NOT_UNDERSTAOOD', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_DATA_RECEIVE(self, **kwargs): """ Please confirm the Upper Tester receive data """ data = self.l2cap.ReceiveData(connection=self.connection) assert data, "data received should not be empty" return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_PSM(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Request Reject with 'LE_PSM not supported' 0x0002 error.Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request reject from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_PSM', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHENTICATION(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Authentication' 0x0005 error? Click Yes if IUT received it, otherwise click NO. Description: Verify that after receiving the Credit Based Connection Request Refused With No Resources error from the Lower Tester, the IUT informs the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHENTICATION', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def _mmi_135(self, test: str, **kwargs): """ Please make sure an authentication requirement exists for a channel L2CAP. When receiving Credit Based Connection Request from PTS, please respond with Result 0x0005 (Insufficient Authentication) """ if self.test_status_map[test] != "OK": print('error in _mmi_135', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def _mmi_136(self, **kwargs): """ Please make sure an authorization requirement exists for a channel L2CAP. When receiving Credit Based Connection Request from PTS, please respond with Result 0x0006 (Insufficient Authorization) """ return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHORIZATION(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Authorization' 0x0006 error? Click Yes if IUT received it, otherwise click NO. Description: Verify that after receiving the Credit Based Connection Request Refused With No Resources error from the Lower Tester, the IUT informs the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHORIZATION', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_ENCRYPTION_KEY_SIZE(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Encryption Key Size' 0x0007 error? Click Yes if IUT received it, otherwise click NO. Description: Verify that after receiving the Credit Based Connection Request Refused With No Resources error from the Lower Tester, the IUT informs the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_ENCRYPTION_KEY_SIZE', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_INVALID_SOURCE_CID(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Invalid Source CID' 0x0009 error? And does not send anything over refuse LE data channel? Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request refused with Invalid Source CID error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_INVALID_SOURCE_CID', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_SOURCE_CID_ALREADY_ALLOCATED(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Source CID Already Allocated' 0x000A error? And did not send anything over refuse LE data channel.Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request refused with Source CID Already Allocated error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_SOURCE_CID_ALREADY_ALLOCATED', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_UNACCEPTABLE_PARAMETERS(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Unacceptable Parameters' 0x000B error? Click Yes if it is, otherwise click No. Description: Verify that after receiving the Credit Based Connection Request refused with Unacceptable Parameters error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_UNACCEPTABLE_PARAMETERS', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_RESOURCES(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Resources' 0x0004 error? Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request refused with No resources error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_RESOURCES', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" android/pandora/server/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,7 @@ genrule { "proto/pandora_experimental/hfp.proto", "proto/pandora_experimental/hid.proto", "proto/pandora_experimental/host.proto", "proto/pandora_experimental/l2cap.proto", "proto/pandora_experimental/security.proto", ], out: [ Loading @@ -151,6 +152,8 @@ genrule { "pandora_experimental/hid_pb2.py", "pandora_experimental/host_grpc.py", "pandora_experimental/host_pb2.py", "pandora_experimental/l2cap_grpc.py", "pandora_experimental/l2cap_pb2.py", "pandora_experimental/security_grpc.py", "pandora_experimental/security_pb2.py", ] Loading android/pandora/server/configs/PtsBotTest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ <option name="profile" value="HFP/AG/TCA" /> <option name="profile" value="HID/HOS" /> <option name="profile" value="HOGP/RH" /> <option name="profile" value="L2CAP/LE/CFC" /> <option name="profile" value="SDP/SR" /> <option name="profile" value="SM/CEN/EKS" /> <option name="profile" value="SM/CEN/JW" /> Loading android/pandora/server/configs/PtsBotTestMts.xml +1 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ <option name="profile" value="HFP/AG/HFI" /> <option name="profile" value="HFP/AG/SLC" /> <option name="profile" value="HFP/AG/TCA" /> <option name="profile" value="L2CAP/LE/CFC" /> <option name="profile" value="SDP/SR" /> <option name="profile" value="SM/CEN/EKS" /> <option name="profile" value="SM/CEN/JW" /> Loading Loading
android/pandora/mmi2grpc/mmi2grpc/__init__.py +8 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ from mmi2grpc.gatt import GATTProxy from mmi2grpc.hfp import HFPProxy from mmi2grpc.hid import HIDProxy from mmi2grpc.hogp import HOGPProxy from mmi2grpc.l2cap import L2CAPProxy from mmi2grpc.sdp import SDPProxy from mmi2grpc.sm import SMProxy from mmi2grpc._helpers import format_proxy Loading Loading @@ -66,6 +67,7 @@ class IUT: self._hfp = None self._hid = None self._hogp = None self._l2cap = None self._sdp = None self._sm = None Loading @@ -87,6 +89,7 @@ class IUT: self._avrcp = None self._gatt = None self._hfp = None self._l2cap = None self._hid = None self._hogp = None self._sdp = None Loading Loading @@ -175,6 +178,11 @@ class IUT: if not self._hogp: self._hogp = HOGPProxy(grpc.insecure_channel(f'localhost:{self.port}')) return self._hogp.interact(test, interaction, description, pts_address) # Instantiates L2CAP proxy and reroutes corresponding MMIs to it. if profile in ('L2CAP'): if not self._l2cap: self._l2cap = L2CAPProxy(grpc.insecure_channel(f'localhost:{self.port}')) return self._l2cap.interact(test, interaction, description, pts_address) # Handles SDP MMIs. if profile in ('SDP'): if not self._sdp: Loading
android/pandora/mmi2grpc/mmi2grpc/l2cap.py 0 → 100644 +337 −0 Original line number Diff line number Diff line import time from mmi2grpc._helpers import assert_description from mmi2grpc._helpers import match_description from mmi2grpc._proxy import ProfileProxy from pandora_experimental.host_grpc import Host from pandora_experimental.host_pb2 import Connection from pandora_experimental.l2cap_grpc import L2CAP from typing import Optional import sys class L2CAPProxy(ProfileProxy): test_status_map = {} # record test status and pass them between MMI LE_DATA_PACKET_LARGE = "data: LE_DATA_PACKET_LARGE" connection: Optional[Connection] = None def __init__(self, channel): super().__init__() self.l2cap = L2CAP(channel) self.host = Host(channel) @assert_description def MMI_IUT_SEND_LE_CREDIT_BASED_CONNECTION_REQUEST(self, test: str, pts_addr: bytes, **kwargs): """ Using the Implementation Under Test (IUT), send a LE Credit based connection request to PTS. Description: Verify that IUT can setup LE credit based channel. """ tests_target_to_fail = [ 'L2CAP/LE/CFC/BV-01-C', 'L2CAP/LE/CFC/BV-04-C', 'L2CAP/LE/CFC/BV-10-C', 'L2CAP/LE/CFC/BV-11-C', 'L2CAP/LE/CFC/BV-12-C', 'L2CAP/LE/CFC/BV-14-C', 'L2CAP/LE/CFC/BV-16-C', 'L2CAP/LE/CFC/BV-18-C', 'L2CAP/LE/CFC/BV-19-C', "L2CAP/LE/CFC/BV-21-C", ] tests_require_secure_connection = [] # This MMI is called twice in 'L2CAP/LE/CFC/BV-04-C' # We are not sure whether the lower tester’s BluetoothServerSocket # will be closed after first connection is established. # Based on what we find, the first connection request is successful, # but the 2nd connection fails. # In PTS real world test, the system asks the human tester # whether it is connected. The human tester will press “Yes” twice. # So we use a counter to return “OK” for the 2nd call. if self.connection and test == 'L2CAP/LE/CFC/BV-02-C': return "OK" assert self.connection is None, f"the connection should be None for the first call" time.sleep(2) # avoid timing issue self.connection = self.host.GetLEConnection(address=pts_addr).connection psm = 0x25 # default TSPX_spsm value if test == 'L2CAP/LE/CFC/BV-04-C': psm = 0xF1 # default TSPX_psm_unsupported value if test == 'L2CAP/LE/CFC/BV-10-C': psm = 0xF2 # default TSPX_psm_authentication_required value if test == 'L2CAP/LE/CFC/BV-12-C': psm = 0xF3 # default TSPX_psm_authorization_required value secure_connection = test in tests_require_secure_connection try: self.l2cap.CreateLECreditBasedChannel(connection=self.connection, psm=psm, secure=secure_connection) except Exception as e: if test in tests_target_to_fail: self.test_status_map[test] = 'OK' print(test, 'target to fail', file=sys.stderr) return "OK" else: print(test, 'CreateLECreditBasedChannel failed', e, file=sys.stderr) raise e return "OK" @assert_description def MMI_TESTER_ENABLE_LE_CONNECTION(self, test: str, **kwargs): """ Place the IUT into LE connectable mode. """ self.host.SetLEConnectable() # not strictly necessary, but can save time on waiting connection tests_to_open_bluetooth_server_socket = [ "L2CAP/LE/CFC/BV-03-C", "L2CAP/LE/CFC/BV-05-C", "L2CAP/LE/CFC/BV-06-C", "L2CAP/LE/CFC/BV-09-C", "L2CAP/LE/CFC/BV-13-C", "L2CAP/LE/CFC/BV-20-C", ] tests_require_secure_connection = [ "L2CAP/LE/CFC/BV-13-C", ] if test in tests_to_open_bluetooth_server_socket: secure_connection = test in tests_require_secure_connection self.l2cap.ListenL2CAPChannel(connection=self.connection, secure=secure_connection) self.l2cap.AcceptL2CAPChannel(connection=self.connection) return "OK" @assert_description def MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_LARGE(self, **kwargs): """ Upper Tester command IUT to send LE data packet(s) to the PTS. Description : The Implementation Under Test(IUT) should send multiple LE frames of LE data to PTS. """ # NOTES: the data packet is made to be only 1 frame because of the # undeterministic behavior of the PTS-bot # this happened on "L2CAP/LE/CFC/BV-03-C" # when multiple frames are used, sometimes pass, sometimes fail # the PTS said "Failed to receive L2CAP data", but snoop log showed # all data frames arrived # it seemed like when the time gap between the 1st frame and 2nd frame # larger than 100ms this problem will occur self.l2cap.SendData(connection=self.connection, data=bytes(self.LE_DATA_PACKET_LARGE, "utf-8")) return "OK" @match_description def MMI_UPPER_TESTER_CONFIRM_LE_DATA(self, sent_data: str, **kwargs): """ Did the Upper Tester send the data (?P<sent_data>[0-9A-F]*) to to the PTS\? Click Yes if it matched, otherwise click No. Description: The Implementation Under Test \(IUT\) send data is receive correctly in the PTS. """ hex_LE_DATA_PACKET_LARGE = self.LE_DATA_PACKET_LARGE.encode("utf-8").hex().upper() if sent_data != hex_LE_DATA_PACKET_LARGE: print(f"data not match, sent_data:{sent_data} and {hex_LE_DATA_PACKET_LARGE}", file=sys.stderr) raise Exception(f"data not match, sent_data:{sent_data} and {hex_LE_DATA_PACKET_LARGE}") return "OK" @assert_description def MMI_UPPER_TESTER_SEND_LE_DATA_PACKET4(self, **kwargs): """ Upper Tester command IUT to send at least 4 frames of LE data packets to the PTS. """ self.l2cap.SendData( connection=self.connection, data=b"this is a large data package with at least 4 frames: MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_LARGE") return "OK" @assert_description def MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_CONTINUE(self, **kwargs): """ IUT continue to send LE data packet(s) to the PTS. """ self.l2cap.SendData( connection=self.connection, data=b"this is a large data package with at least 4 frames: MMI_UPPER_TESTER_SEND_LE_DATA_PACKET_LARGE") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_COMMAND_NOT_UNDERSTAOOD(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive L2CAP Reject with 'command not understood' error? Click Yes if it is, otherwise click No. Description : Verify that after receiving the Command Reject from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MI_UPPER_TESTER_CONFIRM_RECEIVE_COMMAND_NOT_UNDERSTAOOD', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_DATA_RECEIVE(self, **kwargs): """ Please confirm the Upper Tester receive data """ data = self.l2cap.ReceiveData(connection=self.connection) assert data, "data received should not be empty" return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_PSM(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Request Reject with 'LE_PSM not supported' 0x0002 error.Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request reject from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_PSM', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHENTICATION(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Authentication' 0x0005 error? Click Yes if IUT received it, otherwise click NO. Description: Verify that after receiving the Credit Based Connection Request Refused With No Resources error from the Lower Tester, the IUT informs the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHENTICATION', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def _mmi_135(self, test: str, **kwargs): """ Please make sure an authentication requirement exists for a channel L2CAP. When receiving Credit Based Connection Request from PTS, please respond with Result 0x0005 (Insufficient Authentication) """ if self.test_status_map[test] != "OK": print('error in _mmi_135', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def _mmi_136(self, **kwargs): """ Please make sure an authorization requirement exists for a channel L2CAP. When receiving Credit Based Connection Request from PTS, please respond with Result 0x0006 (Insufficient Authorization) """ return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHORIZATION(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Authorization' 0x0006 error? Click Yes if IUT received it, otherwise click NO. Description: Verify that after receiving the Credit Based Connection Request Refused With No Resources error from the Lower Tester, the IUT informs the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_AUTHORIZATION', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_ENCRYPTION_KEY_SIZE(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Encryption Key Size' 0x0007 error? Click Yes if IUT received it, otherwise click NO. Description: Verify that after receiving the Credit Based Connection Request Refused With No Resources error from the Lower Tester, the IUT informs the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_ENCRYPTION_KEY_SIZE', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_INVALID_SOURCE_CID(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Invalid Source CID' 0x0009 error? And does not send anything over refuse LE data channel? Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request refused with Invalid Source CID error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_INVALID_SOURCE_CID', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_SOURCE_CID_ALREADY_ALLOCATED(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Source CID Already Allocated' 0x000A error? And did not send anything over refuse LE data channel.Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request refused with Source CID Already Allocated error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_SOURCE_CID_ALREADY_ALLOCATED', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_UNACCEPTABLE_PARAMETERS(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Unacceptable Parameters' 0x000B error? Click Yes if it is, otherwise click No. Description: Verify that after receiving the Credit Based Connection Request refused with Unacceptable Parameters error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_UNACCEPTABLE_PARAMETERS', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK" @assert_description def MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_RESOURCES(self, test: str, **kwargs): """ Did Implementation Under Test(IUT) receive Connection refused 'Insufficient Resources' 0x0004 error? Click Yes if it is, otherwise click No. Description : Verify that after receiving the Credit Based Connection Request refused with No resources error from the Lower Tester, the IUT inform the Upper Tester. """ if self.test_status_map[test] != "OK": print('error in MMI_UPPER_TESTER_CONFIRM_RECEIVE_REJECT_RESOURCES', file=sys.stderr) raise Exception("Unexpected RECEIVE_COMMAND") return "OK"
android/pandora/server/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,7 @@ genrule { "proto/pandora_experimental/hfp.proto", "proto/pandora_experimental/hid.proto", "proto/pandora_experimental/host.proto", "proto/pandora_experimental/l2cap.proto", "proto/pandora_experimental/security.proto", ], out: [ Loading @@ -151,6 +152,8 @@ genrule { "pandora_experimental/hid_pb2.py", "pandora_experimental/host_grpc.py", "pandora_experimental/host_pb2.py", "pandora_experimental/l2cap_grpc.py", "pandora_experimental/l2cap_pb2.py", "pandora_experimental/security_grpc.py", "pandora_experimental/security_pb2.py", ] Loading
android/pandora/server/configs/PtsBotTest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ <option name="profile" value="HFP/AG/TCA" /> <option name="profile" value="HID/HOS" /> <option name="profile" value="HOGP/RH" /> <option name="profile" value="L2CAP/LE/CFC" /> <option name="profile" value="SDP/SR" /> <option name="profile" value="SM/CEN/EKS" /> <option name="profile" value="SM/CEN/JW" /> Loading
android/pandora/server/configs/PtsBotTestMts.xml +1 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ <option name="profile" value="HFP/AG/HFI" /> <option name="profile" value="HFP/AG/SLC" /> <option name="profile" value="HFP/AG/TCA" /> <option name="profile" value="L2CAP/LE/CFC" /> <option name="profile" value="SDP/SR" /> <option name="profile" value="SM/CEN/EKS" /> <option name="profile" value="SM/CEN/JW" /> Loading