def test_sent_rej_lost(self): """ L2CAP/ERM/BI-01-C [S-Frame [REJ] Lost or Corrupted] Verify the IUT can handle receipt of an S-=frame [RR] Poll = 1 if the S-frame [REJ] sent from the IUT is lost. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=5) ertm_tx_window_size = 5 (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x41, use_ertm=True) cert_channel.send_i_frame(tx_seq=0, req_seq=0, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=1)) cert_channel.send_i_frame(tx_seq=ertm_tx_window_size - 1, req_seq=0, payload=SAMPLE_PACKET) assertThat(cert_channel).emits( L2capMatchers.SFrame(s=SupervisoryFunction.REJECT)) cert_channel.send_s_frame(req_seq=0, p=Poll.POLL) assertThat(cert_channel).emits( L2capMatchers.SFrame(req_seq=1, f=l2cap_packets.Final.POLL_RESPONSE)) for i in range(1, ertm_tx_window_size): cert_channel.send_i_frame(tx_seq=i, req_seq=0, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=i + 1))
def test_receive_i_frames(self): """ L2CAP/ERM/BV-02-C [Receive I-Frames] Verify the IUT can receive in-sequence valid I-frames and deliver L2CAP SDUs to the Upper Tester """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) for i in range(3): cert_channel.send_i_frame(tx_seq=i, req_seq=0, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=i + 1)) cert_channel.send_i_frame(tx_seq=3, req_seq=0, sar=SegmentationAndReassembly.START, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=4)) cert_channel.send_i_frame(tx_seq=4, req_seq=0, sar=SegmentationAndReassembly.CONTINUATION, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=5)) cert_channel.send_i_frame(tx_seq=5, req_seq=0, sar=SegmentationAndReassembly.END, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=6))
def test_handle_rej_and_i_frame_with_f_set(self): """ L2CAP/ERM/BI-05-C [Handle receipt of S-Frame [REJ] and I-Frame [F=1] that Both Require Retransmission of the Same I-Frames] Verify the IUT will only retransmit the requested I-frames once after receiving an S-frame [REJ] followed by an I-frame with the Final bit set that indicates the same I-frames should be retransmitted. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0), L2capMatchers.IFrame(tx_seq=1), L2capMatchers.SFrame(p=l2cap_packets.Poll.POLL)).inOrder() # Send SREJ with F not set cert_channel.send_s_frame(req_seq=0, s=SupervisoryFunction.SELECT_REJECT) assertThat(cert_channel).emitsNone(timeout=timedelta(seconds=0.5)) cert_channel.send_i_frame(tx_seq=0, req_seq=0, f=Final.POLL_RESPONSE, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.IFrame(tx_seq=0)) assertThat(cert_channel).emits(L2capMatchers.IFrame(tx_seq=1))
def test_handle_duplicate_srej(self): """ L2CAP/ERM/BI-03-C [Handle Duplicate S-Frame [SREJ]] Verify the IUT will only retransmit the requested I-frame once after receiving a duplicate SREJ. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0), L2capMatchers.IFrame(tx_seq=1), L2capMatchers.SFrame(p=Poll.POLL)).inOrder() cert_channel.send_s_frame(req_seq=0, s=SupervisoryFunction.SELECT_REJECT) assertThat(cert_channel).emitsNone(timeout=timedelta(seconds=0.5)) cert_channel.send_s_frame(req_seq=0, s=SupervisoryFunction.SELECT_REJECT, f=Final.POLL_RESPONSE) assertThat(cert_channel).emits(L2capMatchers.IFrame(tx_seq=0))
def test_receive_i_frame_final_bit_set(self): """ L2CAP/ERM/BV-19-C [Receive I-Frame Final Bit = 1] Verify the IUT will retransmit any previously sent I-frames unacknowledged by receipt of an I-frame with the final bit set. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') # TODO: Always use their retransmission timeout value time.sleep(2) assertThat(cert_channel).emits(L2capMatchers.SFrame(p=Poll.POLL)) cert_channel.send_i_frame(tx_seq=0, req_seq=0, f=Final.POLL_RESPONSE, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.IFrame(tx_seq=0))
def test_receive_packet_from_unknown_channel(self): self._setup_link_from_cert() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33) i_frame = l2cap_packets.EnhancedInformationFrameBuilder( 0x99, 0, Final.NOT_SET, 1, l2cap_packets.SegmentationAndReassembly.UNSEGMENTED, SAMPLE_PACKET) self.cert_l2cap.send_acl(i_frame) assertThat(cert_channel).emitsNone(L2capMatchers.SFrame(req_seq=4), timeout=timedelta(seconds=1))
def test_acknowledging_received_i_frames(self): """ L2CAP/ERM/BV-03-C [Acknowledging Received I-Frames] Verify the IUT sends S-frame [RR] with the Poll bit not set to acknowledge data received from the Lower Tester """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) for i in range(3): cert_channel.send_i_frame(tx_seq=i, req_seq=0, payload=SAMPLE_PACKET) assertThat(cert_channel).emits(L2capMatchers.SFrame(req_seq=i + 1)) assertThat(cert_channel).emitsNone(L2capMatchers.SFrame(req_seq=4), timeout=timedelta(seconds=1))
def test_transmit_s_frame_rr_with_final_bit_set(self): """ L2CAP/ERM/BV-09-C [Send S-Frame [RR] with Final Bit Set] Verify the IUT responds with an S-frame [RR] with the Final bit set after receiving an S-frame [RR] with the Poll bit set. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) cert_channel.send_s_frame(req_seq=0, p=Poll.POLL) assertThat(cert_channel).emits( L2capMatchers.SFrame(f=Final.POLL_RESPONSE))
def test_transmit_s_frame_rr_with_poll_bit_set(self): """ L2CAP/ERM/BV-08-C [Send S-Frame [RR] with Poll Bit Set] Verify the IUT sends an S-frame [RR] with the Poll bit set when its retransmission timer expires. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') # TODO: Always use their retransmission timeout value time.sleep(2) assertThat(cert_channel).emits( L2capMatchers.SFrame(p=l2cap_packets.Poll.POLL))
def test_recieve_rnr(self): """ L2CAP/ERM/BV-20-C [Enter Remote Busy Condition] Verify the IUT will not retransmit any I-frames when it receives a remote busy indication from the Lower Tester (S-frame [RNR]). """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm() (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') # TODO: Always use their retransmission timeout value time.sleep(2) assertThat(cert_channel).emits( L2capMatchers.SFrame(p=l2cap_packets.Poll.POLL)) cert_channel.send_s_frame(req_seq=0, s=SupervisoryFunction.RECEIVER_NOT_READY, f=Final.POLL_RESPONSE) assertThat(cert_channel).emitsNone(L2capMatchers.IFrame(tx_seq=0))