% MACControl test campaign

#
# execute test:
# $ test/run_tests -P "load_contrib('mac_control')" -t test/contrib/mac_control.uts
#

+ Basic layer handling

= pause frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\
      MACControlPause(pause_time=0x1234)

frm = Ether(frm.do_build())

pause_layer  = frm[MACControlPause]
assert(pause_layer.pause_time == 0x1234)
assert(pause_layer.get_pause_time(ETHER_SPEED_MBIT_10) == 0.238592)

= gate frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\
      MACControlGate(timestamp=0x12345678)
frm = Ether(frm.do_build())

gate_layer  = frm[MACControlGate]
assert(gate_layer.timestamp == 0x12345678)

= report frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\
      MACControlReport(timestamp=0x12345678, pending_grants=0x23)

frm = Ether(frm.do_build())

report_layer = frm[MACControlReport]

assert(report_layer.timestamp == 0x12345678)
assert(report_layer.pending_grants == 0x23)

= report frame flags (generic for all other register frame types)

for flag in MACControl.REGISTER_FLAGS:
      frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \
            MACControlReport(timestamp=0x12345678, flags=flag)
      frm = Ether(frm.do_build())
      report_layer = frm[MACControlReport]
      assert(report_layer.flags == flag)

= register_req frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\
            MACControlRegisterReq(timestamp=0x87654321,
                                  echoed_pending_grants=0x12,
                                  sync_time=0x3344,
                                  assigned_port=0x7766)

frm = Ether(frm.do_build())
register_req_layer = frm[MACControlRegisterReq]

assert(register_req_layer.timestamp == 0x87654321)
assert (register_req_layer.echoed_pending_grants == 0x12)
assert (register_req_layer.sync_time == 0x3344)
assert (register_req_layer.assigned_port == 0x7766)

= register frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\
            MACControlRegister(timestamp=0x11223344,
                               echoed_assigned_port=0x2277,
                               echoed_sync_time=0x3399)

frm = Ether(frm.do_build())
register_layer = frm[MACControlRegister]
assert(register_layer.timestamp == 0x11223344)
assert(register_layer.echoed_assigned_port == 0x2277)
assert(register_layer.echoed_sync_time == 0x3399)

= register_ack frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\
            MACControlRegisterAck(timestamp=0x11223344,
                                  echoed_assigned_port=0x2277,
                                  echoed_sync_time=0x3399)

frm = Ether(frm.do_build())
register_ack_layer = frm[MACControlRegisterAck]
assert(register_ack_layer.timestamp == 0x11223344)
assert(register_ack_layer.echoed_assigned_port == 0x2277)
assert(register_ack_layer.echoed_sync_time == 0x3399)

= class based flow control frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/ \
      MACControlClassBasedFlowControl(c0_enabled=1, c0_pause_time=0x4321,
                                      c5_enabled=1, c5_pause_time=0x1234)

frm = Ether(frm.do_build())
cbfc_layer = frm[MACControlClassBasedFlowControl]
assert(cbfc_layer.c0_enabled)
assert(cbfc_layer.c0_pause_time == 0x4321)
assert(cbfc_layer.c5_enabled)
assert(cbfc_layer.c5_pause_time == 0x1234)
assert(not cbfc_layer.c1_enabled)
assert(cbfc_layer.c1_pause_time == 0)
assert(not cbfc_layer.c7_enabled)
assert(cbfc_layer.c7_pause_time == 0)
assert(cbfc_layer._reserved == 0)

+ test padding

= naked frame

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \
            MACControlRegisterAck(timestamp=0x12345678)

frm = frm.do_build()
assert(len(frm) == 60)

= single vlan tag

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \
            Dot1Q(vlan=42) / \
            MACControlRegisterAck(timestamp=0x12345678)

frm = frm.do_build()
assert(len(frm) == 60)

= QinQ

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \
            Dot1Q(vlan=42) / \
            Dot1Q(vlan=42) / \
            MACControlRegisterAck(timestamp=0x12345678)

frm = frm.do_build()
assert(len(frm) == 60)

= hand craftet payload (disabled auto padding)

frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \
            MACControlRegisterAck(timestamp=0x12345678) / \
            Raw(b'may pass devices')

frm = Ether(frm.do_build())
raw_layer = frm[Raw]
assert(raw_layer.load == b'may pass devices')
assert(len(frm) < 64)
