#!/usr/bin/env python3 import unittest from vpp_serializer import VPPType, VPPEnumType, VPPUnionType from socket import inet_pton, AF_INET, AF_INET6 import logging logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG) es_logger = logging.getLogger('vpp_serializer') es_logger.setLevel(logging.DEBUG) class VPPMessage(VPPType): pass class TestAddType(unittest.TestCase): def test_union(self): un = VPPUnionType('test_union', [['u8', 'is_bool'], ['u32', 'is_int']]) b = un.pack({'is_int': 0x1234}) self.assertEqual(len(b), 4) nt = un.unpack(b) self.assertEqual(nt.is_bool, 52) self.assertEqual(nt.is_int, 0x1234) def test_address(self): af = VPPEnumType('vl_api_address_family_t', [["ADDRESS_IP4", 0], ["ADDRESS_IP6", 1], {"enumtype": "u32"}]) ip4 = VPPType('vl_api_ip4_address_t', [['u8', 'address', 4]]) ip6 = VPPType('vl_api_ip6_address_t', [['u8', 'address', 16]]) VPPUnionType('vl_api_address_union_t', [["vl_api_ip4_address_t", "ip4"], ["vl_api_ip6_address_t", "ip6"]]) address = VPPType('address', [['vl_api_address_family_t', 'af'], ['vl_api_address_union_t', 'un']]) b = ip4.pack({'address': inet_pton(AF_INET, '1.1.1.1')}) self.assertEqual(len(b), 4) nt = ip4.unpack(b) self.assertEqual(nt.address, inet_pton(AF_INET, '1.1.1.1')) b = ip6.pack({'address': inet_pton(AF_INET6, '1::1')}) self.assertEqual(len(b), 16) b = address.pack({'af': af.ADDRESS_IP4, 'un': {'ip4': {'address': inet_pton(AF_INET, '2.2.2.2')}}}) self.assertEqual(len(b), 20) nt = address.unpack(b) print('NT union', nt) self.assertEqual(nt.af, af.ADDRESS_IP4) self.assertEqual(nt.un.ip4.address, inet_pton(AF_INET, '2.2.2.2')) self.assertEqual(nt.un.ip6.address, inet_pton(AF_INET6, '::0202:0202')) def test_arrays(self): # Test cases # 1. Fixed list # 2. Fixed list of variable length sub type # 3. Variable length type # ip4 = VPPType('ip4_address', [['u8', 'address', 4]]) listip4 = VPPType('list_ip4_t', [['ip4_address', 'addresses', 4]]) valistip4 = VPPType('list_ip4_t', [['u8', 'count'], ['ip4_address', 'addresses', 0, 'count']]) valistip4_legacy = VPPType('list_ip4_t', [['u8', 'foo'], ['ip4_address', 'addresses', 0]]) addresses = [] for i in range(4): addresses.append({'address': inet_pton(AF_INET, '2.2.2.2')}) b = listip4.pack({'addresses': addresses}) self.assertEqual(len(b), 16) nt = listip4.unpack(b) self.assertEqual(nt.addresses[0].address, inet_pton(AF_INET, '2.2.2.2')) b = valistip4.pack({'count': len(addresses), 'addresses': addresses}) self.assertEqual(len(b), 17) nt = valistip4.unpack(b) print('NT', nt) b = valistip4_legacy.pack({'foo': 1, 'addresses': addresses}) self.assertEqual(len(b), 17) nt = valistip4_legacy.unpack(b) print('NT', nt) def test_message(self): foo = VPPMessage('foo', [['u16', '_vl_msg_id'], ['u8', 'client_index'], ['u8', 'something'], {"crc": "0x559b9f3c"}]) b = foo.pack({'_vl_msg_id': 1, 'client_index': 5, 'something': 200}) self.assertEqual(len(b), 4) nt = foo.unpack(b) print('NT', nt) if __name__ == '__main__': unittest.main()