def test_4_invalid(): print "[4] Invalid CRCs cause otherwise correct packets to be rejected. Invalid headers cause otherwise correct packets to be rejected." # Start by turning off event reporting r = run_and_read(ser, CmdGetErr, False, True, test_apid) (opcode, length, source, payload) = extract_and_assert(r, CmdGetErr.opcode, 1, 1) mask = ord(payload) run_and_read(ser, CmdSetErr, 0, False, True, test_apid) pkt = spp.packetize(CmdGetGPO(True, True, test_apid), elysium_apid) pkt = pkt[:-2] + str(random.getrandbits(8)) + str(random.getrandbits(8)) ser.write(slip.stuff(pkt)) exception = False r = blocking_read(ser) try: assert r == '', "FAILURE - Elysium responded to command packet with invalid CRC" except: print "Returned %s" % readify(r) raise pkt = spp.packetize(CmdGetGPO(True, True, test_apid), elysium_apid) pkt = chr(ord(pkt[0]) | 0xE0) + pkt[1:] ser.write(slip.stuff(pkt)) exception = False r = blocking_read(ser) try: assert r == '', "FAILURE - Elysium responded to packet with invalid Packet Version Number" except: print "Returned %s" % readify(r) raise # Restore error settings run_and_read(ser, CmdSetErr, mask, False, True, test_apid) print "> SUCCESS"
def test_1_reporting(): print "[1] Errors reports are sent and formatted properly" # Enable reporting of all errors regardless of priority r = run_and_read(ser, CmdGetErr, False, True, test_apid) (opcode, length, source, payload) = extract_and_assert(r, CmdGetErr.opcode, 1, 1) mask = ord(payload) run_and_read(ser, CmdSetErr, 0x1F, False, True, test_apid) # Register Value Clipping r = run_and_read(ser, CmdSetRegs, 1, [0x31], [0xFF], True, True, test_apid) try: (opcode, length, source, payload) = extract_and_assert(r, ErrRegClip, 0, 1) except: print readify(r) raise r = blocking_read(ser) # receive the valid reply which we do get # Invalid Opcode r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: (opcode, length, source, payload) = extract_and_assert(r, ErrInvalidOpcode, 0, 1) except: print readify(r) raise # FCS Error pkt = spp.packetize(CmdGetGPO(True, True, test_apid), elysium_apid) pkt = pkt[:-2] + chr(random.getrandbits(8)) + chr(random.getrandbits(8)) ser.write(slip.stuff(pkt)) exception = False r = blocking_read(ser) try: (opcode, length, source, payload) = extract_and_assert(r, ErrFCSError, 0, 1) except: print readify(r) raise # Unreported Command Failure r = run_and_read(ser, CmdSetTXFreq, 0, True, False, test_apid) try: (opcode, length, source, payload) = extract_and_assert(r, ErrCmdFailure, 0, 1) except: print readify(r) raise # UART Error (?) # Subscription Overwritten (?) # Restore error settings run_and_read(ser, CmdSetErr, mask, False, True, test_apid) print "> SUCCESS"
def test_3_max(): print "[3] Receive 2048-byte packet. Transmit 2048-byte packet. Receive packet containing timestamp. Transmit packet containing timestamp. Receive packet containing p-field. Transmit packet containing p-field." pkt = rand_packet(length = 2037, timestamp = 1, pfield = 1) # TODO fix this in more fully featured sandboxes ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - sent and received 2048-byte packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_2_min(): print "[2] Receive 7-byte packet. Transmit 7-byte packet." pkt = rand_packet(length = 1, timestamp = 1, pfield = 1, tc=0) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - sent and received 7-byte packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_4_long(): print "[4] Reject malformed packets - > max length. Recover from invalid packet rejections." pkt = rand_packet(length = 4096) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == '', "FAILURE - long packet not rejected" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise pkt = rand_packet(maxlength=2036) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - state machine did not recover from long packet rejection" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_8_short(): print "[8] Reject malformed packets - < min length. Recover from invalid packet rejections." pkt = str(bytearray(random.getrandbits(8) for _ in xrange(6))) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == '', "FAILURE - short packet not rejected" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise pkt = rand_packet(maxlength=2036) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - state machine did not recover from short packet rejection" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_5_len(): print "[5] Reject malformed packets - > specified length. Recover from invalid packet rejections." pkt = rand_packet(maxlength=2036) pkt = pkt[:len(pkt)/2] + str(random.getrandbits(8) for _ in xrange(16)) + pkt[len(pkt)/2:] ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == '', "FAILURE - invalid packet not rejected" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise pkt = rand_packet(maxlength=2036) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - state machine did not recover from invalid packet rejection" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_1_nominal(): print "[1] Receive > 4 packets. Transmit > 4 packets." for i in range(0, 8): pkt = rand_packet(length = None, maxlength=1008, tc=0) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - sent and received packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_6_escape(): print "[6] Receive packet with > 2 consecutive escape sequences. Transmit packet with > 2 consecutive escape sequences." for arg in itertools.product('\xc0\xdb', repeat=4): arg = ''.join(arg) pkt = spp.packetize(arg, random.getrandbits(11)) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - sent and received multi-escape packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_5_len(): print "[5] Reject malformed packets - > specified length. Recover from invalid packet rejections." # Start by turning off event reporting r = run_and_read(ser, CmdGetErr, False, True, test_apid) (opcode, length, source, payload) = extract_and_assert(r, CmdGetErr.opcode, 1, 1) mask = ord(payload) run_and_read(ser, CmdSetErr, 0, False, True, test_apid) pkt = rand_packet(apid=elysium_apid, tc=False, length=None, maxlength=2036) pkt = pkt[:len(pkt) / 2] + str(random.getrandbits(8) for _ in xrange(16)) + pkt[len(pkt) / 2:] ser.write(slip.stuff(pkt)) tmp = blocking_read(ser) result = slip.unstuff(tmp) try: assert result == '', "FAILURE - invalid packet not rejected" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise pkt = rand_packet(apid=elysium_apid, tc=False, maxlength=2036) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert ord(result[0]) & ~0x10 == ord( pkt[0]), "FAILURE - state machine did not recover" assert result[1:] == pkt[1:], "FAILURE - state machine did not recover" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise # Restore error settings run_and_read(ser, CmdSetErr, mask, False, True, test_apid) print "> SUCCESS\n"
def test_3_max(): print "[3] Receive 2048-byte packet. Transmit 2048-byte packet. Receive packet containing timestamp. Transmit packet containing timestamp. Receive packet containing p-field. Transmit packet containing p-field." #pkt = rand_packet(apid = elysium_apid, tc = False, length = 2037, timestamp = 1, pfield = 1) # TODO fix this in more fully featured sandboxes pkt = rand_packet( apid=elysium_apid, tc=False, timestamp=0, pfield=0, length=2042) # TODO fix this in more fully featured sandboxes ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert ord(result[0]) & ~0x10 == ord( pkt[0]), "FAILURE - sent and received packets not equal" assert result[1:] == pkt[ 1:], "FAILURE - sent and received packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_6_escape(): print "[6] Receive packet with > 2 consecutive escape sequences. Transmit packet with > 2 consecutive escape sequences." for arg in itertools.product('\xc0\xdb', repeat=4): arg = ''.join(arg) pkt = spp.packetize(arg, elysium_apid, tc=False) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert ord(result[0]) & ~0x10 == ord( pkt[0] ), "FAILURE - sent and received multi-escape packets not equal" assert result[1:] == pkt[ 1:], "FAILURE - sent and received multi-escape packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_7_noescape(): print "[7] Receive packet with no escape sequences. Transmit packet with no escape sequences." length = random.randint(1, 2036) arg = '' while len(arg) < length: c = '\xc0' while c in ['\xc0', '\xdb']: c = chr(random.getrandbits(8)) arg += c pkt = spp.packetize(arg, random.getrandbits(11)) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - sent and received no-escape packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_2_min(): print "[2] Receive 7-byte packet. Transmit 7-byte packet." pkt = rand_packet(apid=elysium_apid, tc=False, length=1, timestamp=1, pfield=1) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert ord(result[0]) & ~0x10 == ord( pkt[0]), "FAILURE - sent and received packets not equal" assert result[1:] == pkt[ 1:], "FAILURE - sent and received packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print "> SUCCESS\n"
def test_1_nominal(): print "[1] Receive > 4 packets. Transmit > 4 packets." for i in range(0, 8): pkt = rand_packet(apid=elysium_apid, tc=False, length=None, maxlength=2036) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert ord(result[0]) & ~0x10 == ord( pkt[0]), "FAILURE - sent and received packets not equal" assert result[1:] == pkt[ 1:], "FAILURE - sent and received packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise print i print "> SUCCESS\n"
def test_1_nominal(): print "[1] Receive > 4 packets. Transmit > 4 packets." for i in range(0, 8): pkt = rand_packet(length=None, maxlength=1008, tc=0, timestamp=0, pfield=0) ser.write(slip.stuff(pkt)) result = slip.unstuff(blocking_read(ser)) try: assert result == pkt, "FAILURE - sent and received packets not equal" except: print "result is: " + readify(result) print "pkt is: " + readify(pkt) raise #try: # blocking_read(ser) # discard idle packet #except: # pass print "small success" print "> SUCCESS\n"
def test_2_priority(): print "[2] Errors reports are sent based on priority correctly" # Save error settings and active bank r = run_and_read(ser, CmdGetErr, False, True, test_apid) (opcode, length, source, payload) = extract_and_assert(r, CmdGetErr.opcode, 1, 1) mask = ord(payload) r = run_and_read(ser, CmdGetActiveBank, False, True, test_apid) try: (opcode, length, source, payload) = extract_and_assert(r, CmdGetActiveBank.opcode, 1, 1) value = ord(payload[0]) assert value in range( 1, 5), "FAILURE - value error in GetActiveBank response" except: print r print "GetActiveBank returned %d" % value raise # DEBUG run_and_read(ser, CmdSetRegs, 1, [0x30], [0x01], True, True, test_apid) run(ser, CmdReloadConfig, 1) time.sleep(5) ser.flushInput() ser.flushOutput() run_and_read(ser, CmdSetErr, 0x01, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: (opcode, length, source, payload) = extract_and_assert(r, ErrInvalidOpcode, 0, 1) except: print readify(r) raise run_and_read(ser, CmdSetErr, 0x1E, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: assert r == '' except: print readify(r) raise # INFO run_and_read(ser, CmdSetRegs, 1, [0x30], [0x02], True, True, test_apid) run(ser, CmdReloadConfig, 1) time.sleep(5) ser.flushInput() ser.flushOutput() run_and_read(ser, CmdSetErr, 0x02, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: (opcode, length, source, payload) = extract_and_assert(r, ErrInvalidOpcode, 0, 1) except: print readify(r) raise run_and_read(ser, CmdSetErr, 0x1D, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: assert r == '' except: print readify(r) raise # WARNING run_and_read(ser, CmdSetRegs, 1, [0x30], [0x04], True, True, test_apid) run(ser, CmdReloadConfig, 1) time.sleep(5) ser.flushInput() ser.flushOutput() run_and_read(ser, CmdSetErr, 0x04, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: (opcode, length, source, payload) = extract_and_assert(r, ErrInvalidOpcode, 0, 1) except: print readify(r) raise run_and_read(ser, CmdSetErr, 0x1B, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: assert r == '' except: print readify(r) raise # ERROR run_and_read(ser, CmdSetRegs, 1, [0x30], [0x08], True, True, test_apid) run(ser, CmdReloadConfig, 1) time.sleep(5) ser.flushInput() ser.flushOutput() run_and_read(ser, CmdSetErr, 0x08, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: (opcode, length, source, payload) = extract_and_assert(r, ErrInvalidOpcode, 0, 1) except: print readify(r) raise run_and_read(ser, CmdSetErr, 0x17, False, True, test_apid) r = header(0xFF, 0, False, True, 1) ser.write(slip.stuff(spp.packetize(r, elysium_apid))) r = blocking_read(ser) try: assert r == '' except: print readify(r) raise ## CRITICAL #run_and_read(ser, CmdSetRegs, 1, [0x30], [0x10], True, True, test_apid) #run(ser, CmdReloadConfig, 1) #time.sleep(5) #ser.flushInput() #ser.flushOutput() #run_and_read(ser, CmdSetErr, 0x10, False, True, test_apid) #r = header(0xFF, 0, False, True, 1) #ser.write(slip.stuff(spp.packetize(r, elysium_apid))) #r = blocking_read(ser) #try: # (opcode, length, source, payload) = extract_and_assert(r, ErrInvalidOpcode, 0, 1) #except: # print readify(r) # raise #run_and_read(ser, CmdSetErr, 0x0F, False, True, test_apid) #r = header(0xFF, 0, False, True, 1) #ser.write(slip.stuff(spp.packetize(r, elysium_apid))) #r = blocking_read(ser) #try: # assert r == '' #except: # print readify(r) # raise # Restore error settings run_and_read(ser, CmdSetErr, mask, False, True, test_apid) print "> SUCCESS"
def run(ser, cmd, *args): ser.write(slip.stuff(spp.packetize(cmd(*args), elysium_apid)))
#!/usr/bin/env python import spp import slip import math import itertools import serial import sys import time from cmds import * from ely_util import * pkt = spp.packetize( "ASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASDFASD", apid=7, tc=False, timestamp=False, pfield=False) print(len(pkt)) string = ':'.join(hex(ord(x))[2:] for x in pkt) print string #while True: ser.write(slip.stuff(pkt)) # time.sleep(0.5)
def run_and_read(ser, cmd, *args): ser.write(slip.stuff(spp.packetize(cmd(*args), elysium_apid))) return blocking_read(ser)