Example #1
0
 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()
Example #2
0
 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()
Example #3
0
 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') 
Example #4
0
 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')
Example #5
0
     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.)
 )
 ''')
Example #6
0
     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.)
 )
 ''')
Example #7
0
        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
Example #8
0
        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'
Example #9
0
 def test_repeat(self):
     b = parse('(1*3)')
     self.bassert(b[0], '010000000100000001000000x0')
     b = parse('(a=0x1234 * 3)')
     self.bassert(b.a[0], '341234123412x0')
Example #10
0
 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)
Example #11
0
 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)
Example #12
0
 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)
Example #13
0
 def test_repeat(self):
     b = parse('(1*3)')
     self.bassert(b[0], '010000000100000001000000x0')
     b = parse('(a=0x1234 * 3)')
     self.bassert(b.a[0], '341234123412x0')
Example #14
0
 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)
Example #15
0
        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'