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_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_resume_transmitting_when_acknowledge_previously_sent(self): """ L2CAP/ERM/BV-06-C [Resume Transmitting I-Frames when an I-Frame is Received] Verify the IUT will cease transmission of I-frames when the negotiated TxWindow is full. Verify the IUT will resume transmission of I-frames when an I-frame is received that acknowledges previously sent I-frames. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=1) (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') dut_channel.send(b'def') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc')) # TODO: If 1 second is greater than their retransmit timeout, use a smaller timeout assertThat(cert_channel).emitsNone(L2capMatchers.IFrame( tx_seq=1, payload=b'abc'), timeout=timedelta(seconds=1)) cert_channel.send_i_frame(tx_seq=0, req_seq=1, payload=SAMPLE_PACKET) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=1, payload=b'def')) cert_channel.send_i_frame(tx_seq=1, req_seq=2, payload=SAMPLE_PACKET)
def test_transmit_i_frames(self): """ L2CAP/ERM/BV-01-C [Transmit I-frames] """ 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') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b"abc")) # Assemble a sample packet. TODO: Use RawBuilder SAMPLE_PACKET = l2cap_packets.CommandRejectNotUnderstoodBuilder(1) # todo: verify packet received? cert_channel.send_i_frame(tx_seq=0, req_seq=1, payload=SAMPLE_PACKET) dut_channel.send(b'abc') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=1, payload=b"abc")) cert_channel.send_i_frame(tx_seq=1, req_seq=2, payload=SAMPLE_PACKET) dut_channel.send(b'abc') assertThat(cert_channel).emits(L2capMatchers.PartialData(b"abc")) cert_channel.send_i_frame(tx_seq=2, req_seq=3, payload=SAMPLE_PACKET)
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_connect_and_send_data_ertm_no_segmentation(self): 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' * 34) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc' * 34)) cert_channel.send_i_frame(tx_seq=0, req_seq=1, payload=SAMPLE_PACKET)
def test_respond_to_rej(self): """ L2CAP/ERM/BV-13-C [Respond to S-Frame [REJ]] Verify the IUT retransmits I-frames starting from the sequence number specified in the S-frame [REJ]. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=2, max_transmit=2) (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, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc')).inOrder() cert_channel.send_s_frame(req_seq=0, s=SupervisoryFunction.REJECT) assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc'), L2capMatchers.IFrame(tx_seq=1, payload=b'abc')).inOrder()
def test_resume_transmitting_when_received_rr(self): """ L2CAP/ERM/BV-05-C [Resume Transmitting I-Frames when an S-Frame [RR] is Received] Verify the IUT will cease transmission of I-frames when the negotiated TxWindow is full. Verify the IUT will resume transmission of I-frames when an S-frame [RR] is received that acknowledges previously sent I-frames. """ self._setup_link_from_cert() self.cert_l2cap.turn_on_ertm(tx_window_size=1) (dut_channel, cert_channel) = self._open_channel(scid=0x41, psm=0x33, use_ertm=True) dut_channel.send(b'abc') dut_channel.send(b'def') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc')) assertThat(cert_channel).emitsNone( L2capMatchers.IFrame(tx_seq=1, payload=b'def')) cert_channel.send_s_frame(req_seq=1, f=Final.POLL_RESPONSE) assertThat(cert_channel).emits(L2capMatchers.IFrame(tx_seq=1))
def test_config_channel_not_use_FCS(self): """ L2CAP/FOC/BV-01-C [IUT Initiated Configuration of the FCS Option] Verify the IUT can configure a channel to not use FCS in I/S-frames. """ 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') assertThat(cert_channel).emits( L2capMatchers.IFrame(tx_seq=0, payload=b'abc'))
def test_i_frame_transmissions_exceed_max_transmit(self): """ L2CAP/ERM/BV-12-C [I-Frame Transmissions Exceed MaxTransmit] Verify the IUT will close the channel when it receives an S-frame [RR] with the final bit set that does not acknowledge the previous I-frame sent by the IUT. """ 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') assertThat(cert_channel).emits(L2capMatchers.IFrame(tx_seq=0)) cert_channel.send_s_frame(req_seq=0, f=Final.POLL_RESPONSE) assertThat(self.cert_l2cap.get_control_channel()).emits( L2capMatchers.DisconnectionRequest())
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))