def test_simple(self): b = parse('(0/1)') assert isinstance(b, Node), type(b) assert len(b) == 1, len(b) assert isinstance(b[0], BitString), type(b[0]) assert len(b[0]) == 1, len(b[0]) assert b[0].zero() b = parse('(0/1, 1/1)') assert isinstance(b, Node), type(b) assert len(b) == 2, len(b) assert isinstance(b[1], BitString), type(b[1]) assert len(b[1]) == 1, len(b[1]) assert not b[1].zero() b = parse('(a=0/1)') assert isinstance(b, Node), type(b) assert len(b) == 1, len(b) assert isinstance(b.a[0], BitString), type(b.a[0]) assert len(b.a[0]) == 1, len(b.a[0]) assert b.a[0].zero() b = parse('(a=(0/1))') assert isinstance(b, Node), type(b) assert len(b) == 1, len(b) assert isinstance(b.a[0], Node), type(b.a[0]) assert len(b.a[0]) == 1, len(b.a[0]) assert isinstance(b.a[0][0], BitString), type(b.a[0][0]) assert len(b.a[0][0]) == 1, len(b.a[0][0]) assert b.a[0][0].zero() b = parse('(0)') assert isinstance(b, Node), type(b) assert len(b) == 1, len(b) assert isinstance(b[0], BitString), type(b[0]) assert len(b[0]) == 32, len(b[0]) assert b[0].zero()
def test_single(self): b = parse('''(123/8, foo=0x123/2.0,\nbar=1111100010001000b0)''') self.bassert(b[0], '0x7b') self.bassert(b[1], '0x123', 16) self.bassert(b.foo[0], '0x123', 16) self.bassert(b[2], '1111100010001000b0') self.bassert(b.bar[0], '1111100010001000b0')
def test_parse(self): ''' An 803.3 MAC frame - see http://en.wikipedia.org/wiki/Ethernet ''' _b = parse(''' Frame( Header( preamble = 0b10101010*7, start = 0b10101011, destn = 123456x0, source = 890abcx0, ethertype = 0800x0 ), Data(1/8,2/8,3/8,4/8), CRC(234d0/4.) ) ''')
def test_encode(self): mac = parse(''' Frame( Header( preamble = 0b10101010*7, start = 0b10101011, destn = 010203040506x0, source = 0708090a0b0cx0, ethertype = 0800x0 ), Data(1/8,2/8,3/8,4/8), CRC(234d0/4.) ) ''') serial = simple_serialiser(mac, dispatch_table()) bs = serial.bytes() for _index in range(7): b = next(bs) assert b == BitString.from_int('0b10101010').to_int(), b b = next(bs) assert b == BitString.from_int('0b10101011').to_int(), b
def test_match(self): #basicConfig(level=DEBUG) # first, define some test data - we'll use a simple definition # language, but you could also construct this directly in Python # (Frame, Header etc are auto-generated subclasses of Node). mac = parse(''' Frame( Header( preamble = 0b10101010*7, start = 0b10101011, destn = 010203040506x0, source = 0708090a0b0cx0, ethertype = 0800x0 ), Data(1/8,2/8,3/8,4/8), CRC(234d0/4.) ) ''') # next, define a parser for the header structure # this is mainly literal values, but we make the two addresses # big-endian integers, which will be read from the data # this looks very like "normal" lepl because it is - there's # nothing in lepl that forces the data being parsed to be text. preamble = ~Const('0b10101010')[7] start = ~Const('0b10101011') destn = BEnd(6.0) > 'destn' source = BEnd(6.0) > 'source' ethertype = ~Const('0800x0') header = preamble & start & destn & source & ethertype > Node # so, what do the test data look like? # print(mac) # Frame # +- Header # | +- preamble BitString(b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa', 56, 0) # | +- start BitString(b'\xab', 8, 0) # | +- destn BitString(b'\x01\x02\x03\x04\x05\x06', 48, 0) # | +- source BitString(b'\x07\x08\t\n\x0b\x0c', 48, 0) # | `- ethertype BitString(b'\x08\x00', 16, 0) # +- Data # | +- BitString(b'\x01', 8, 0) # | +- BitString(b'\x02', 8, 0) # | +- BitString(b'\x03', 8, 0) # | `- BitString(b'\x04', 8, 0) # `- CRC # `- BitString(b'\x00\x00\x00\xea', 32, 0) # we can serialize that to a BitString b = simple_serialiser(mac, dispatch_table()) assert str(b) == 'aaaaaaaaaaaaaaab123456789abc801234000eax0/240' # and then we can parse it header.config.no_full_first_match() p = header.parse(b)[0] # print(p) # Node # +- destn Int(1108152157446,48) # `- source Int(7731092785932,48) # the destination address assert hex(p.destn[0]) == '0x10203040506' # the source address assert hex(p.source[0]) == '0x708090a0b0c'
def test_repeat(self): b = parse('(1*3)') self.bassert(b[0], '010000000100000001000000x0') b = parse('(a=0x1234 * 3)') self.bassert(b.a[0], '341234123412x0')
def test_named(self): #basicConfig(level=DEBUG) b = parse('A(B(1), B(2))') self.bassert(b.B[0][0], 1) self.bassert(b.B[1][0], 2)
def test_nested(self): b = parse('(123, (foo=123x0/2.))') self.bassert(b[0], 123) assert isinstance(b[1], Node), str(b) self.bassert(b[1].foo[0], 0x2301, 16)