misc: vpp_papi- add tests, clean up pep8
[vpp.git] / src / vpp-api / python / vpp_papi / tests / test_vpp_format.py
diff --git a/src/vpp-api/python/vpp_papi/tests/test_vpp_format.py b/src/vpp-api/python/vpp_papi/tests/test_vpp_format.py
new file mode 100644 (file)
index 0000000..54b4846
--- /dev/null
@@ -0,0 +1,130 @@
+#  Copyright (c) 2019. Vinci Consulting Corp. All Rights Reserved.
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import ipaddress
+import socket
+import unittest
+try:
+    text_type = unicode
+except NameError:
+    text_type = str
+
+from vpp_papi import vpp_format
+
+from parameterized import parameterized
+
+ip4_addr = '1.2.3.4'
+ip4_addrn = b'\x01\x02\x03\x04'
+ip4_prefix_len = 32
+ip4_prefix = '%s/%s' % (ip4_addr, ip4_prefix_len)
+ipv4_network = ipaddress.IPv4Network(text_type(ip4_prefix))
+ip4_addr_format_vl_api_address_t = {'un': {'ip4': b'\x01\x02\x03\x04'},
+                                    'af': 0}
+ip4_addr_format_vl_api_prefix_t = {'prefix':
+                                       {'un': {'ip4': b'\x01\x02\x03\x04'},
+                                        'af': 0},
+                                   'len': ip4_prefix_len}
+ip4_addr_format_vl_api_prefix_packed_t = {'prefix': b'\x01\x02\x03\x04',
+                                          'len': ip4_prefix_len}
+
+ip6_addr = 'dead::'
+ip6_addrn = b'\xde\xad\x00\x00\x00\x00\x00\x00' \
+            b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ip6_prefix_len = 127
+ip6_prefix = '%s/%s' % (ip6_addr, ip6_prefix_len)
+ipv6_network = ipaddress.IPv6Network(text_type(ip6_prefix))
+ip6_addr_format_vl_api_address_t = {'un': {'ip6': b'\xde\xad\x00\x00'
+                                                  b'\x00\x00\x00\x00'
+                                                  b'\x00\x00\x00\x00'
+                                                  b'\x00\x00\x00\x00'},
+                                    'af': 1}
+ip6_addr_format_vl_api_prefix_t = {'prefix':
+                                       {'af': 1,
+                                        'un': {
+                                            'ip6': b'\xde\xad\x00\x00'
+                                                   b'\x00\x00\x00\x00'
+                                                   b'\x00\x00\x00\x00'
+                                                   b'\x00\x00\x00\x00'}},
+                                   'len': ip6_prefix_len}
+ip6_addr_format_vl_api_prefix_packed_t = {'prefix': b'\xde\xad\x00\x00'
+                                                    b'\x00\x00\x00\x00'
+                                                    b'\x00\x00\x00\x00'
+                                                    b'\x00\x00\x00\x00',
+                                          'len': ip6_prefix_len}
+
+
+class TestVppFormat(unittest.TestCase):
+
+    def test_format_vl_api_address_t(self):
+        res = vpp_format.format_vl_api_address_t(ip4_addr)
+        self.assertEqual(res, ip4_addr_format_vl_api_address_t)
+
+        # PY2: raises socket.error
+        # PY3: raises OSError
+        with self.assertRaises((TypeError,
+                                socket.error,
+                                OSError)):
+            res = vpp_format.format_vl_api_address_t(ip4_addrn)
+
+        res = vpp_format.format_vl_api_address_t(ip6_addr)
+        self.assertEqual(res, ip6_addr_format_vl_api_address_t)
+
+        with self.assertRaises(TypeError):
+            es = vpp_format.format_vl_api_address_t(ip6_addrn)
+
+    @parameterized.expand([('ip4 prefix',
+                            ip4_prefix,
+                            ip4_addr_format_vl_api_prefix_t),
+                           ('ip6 prefix',
+                            ip6_prefix,
+                            ip6_addr_format_vl_api_prefix_t),
+                           ('IPv4Network',
+                            ipv4_network,
+                            ip4_addr_format_vl_api_prefix_t),
+                           ('IPv6Network',
+                            ipv6_network,
+                            ip6_addr_format_vl_api_prefix_t),
+                           ])
+    def test_format_vl_api_prefix_t(self, _, arg, expected):
+
+        res = vpp_format.format_vl_api_prefix_t(arg)
+        self.assertEqual(res, expected)
+
+    def test_format_vl_api_ip6_prefix_t(self):
+        res = vpp_format.format_vl_api_ip6_prefix_t(ip6_prefix)
+        self.assertEqual(res, ip6_addr_format_vl_api_prefix_packed_t)
+
+        res = vpp_format.format_vl_api_ip6_prefix_t(ipv6_network)
+        self.assertEqual(res, ip6_addr_format_vl_api_prefix_packed_t)
+
+    def test_format_vl_api_ip4_prefix_t(self):
+        res = vpp_format.format_vl_api_ip4_prefix_t(ip4_prefix)
+        self.assertEqual(res, ip4_addr_format_vl_api_prefix_packed_t)
+
+        res = vpp_format.format_vl_api_ip4_prefix_t(ipv4_network)
+        self.assertEqual(res, ip4_addr_format_vl_api_prefix_packed_t)
+
+
+    def test_format_vl_api_ip6_prefix_t_raises(self):
+        # PY2: raises socket.error
+        # PY3: raises OSError
+        with self.assertRaises((socket.error, OSError)):
+            res = vpp_format.format_vl_api_ip6_prefix_t(ip4_prefix)
+
+    def test_format_vl_api_ip4_prefix_t_raises(self):
+        # PY2: raises socket.error
+        # PY3: raises OSError
+        with self.assertRaises((socket.error, OSError)):
+            res = vpp_format.format_vl_api_ip4_prefix_t(ip6_prefix)
+