tests: initial asf framework refactoring for 'make test'
[vpp.git] / test / asf / test_node_variants.py
diff --git a/test/asf/test_node_variants.py b/test/asf/test_node_variants.py
new file mode 100644 (file)
index 0000000..5762664
--- /dev/null
@@ -0,0 +1,143 @@
+#!/usr/bin/env python3
+import re
+import unittest
+import platform
+from asfframework import VppTestCase
+
+
+def checkX86():
+    return platform.machine() in ["x86_64", "AMD64"]
+
+
+def skipVariant(variant):
+    with open("/proc/cpuinfo") as f:
+        cpuinfo = f.read()
+
+    exp = re.compile(r"(?:flags\s+:)(?:\s\w+)+(?:\s(" + variant + r"))(?:\s\w+)+")
+    match = exp.search(cpuinfo, re.DOTALL | re.MULTILINE)
+
+    return checkX86() and match is not None
+
+
+class TestNodeVariant(VppTestCase):
+    """Test Node Variants"""
+
+    @classmethod
+    def setUpConstants(cls, variant):
+        super(TestNodeVariant, cls).setUpConstants()
+        # find the position of node_variants in the cmdline args.
+
+        if checkX86():
+            node_variants = cls.vpp_cmdline.index("node { ") + 1
+            cls.vpp_cmdline[node_variants] = (
+                "default { variant default } "
+                "ip4-rewrite { variant " + variant + " } "
+            )
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestNodeVariant, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(TestNodeVariant, cls).tearDownClass()
+
+    def setUp(self):
+        super(TestNodeVariant, self).setUp()
+
+    def tearDown(self):
+        super(TestNodeVariant, self).tearDown()
+
+    def getActiveVariant(self, node):
+        node_desc = self.vapi.cli("show node " + node)
+        self.logger.info(node_desc)
+
+        match = re.search(
+            r"\s+(\S+)\s+(\d+)\s+(:?yes)", node_desc, re.DOTALL | re.MULTILINE
+        )
+
+        return match.groups(0)
+
+    def checkVariant(self, variant):
+        """Test node variants defaults"""
+
+        variant_info = self.getActiveVariant("ip4-lookup")
+        self.assertEqual(variant_info[0], "default")
+
+        variant_info = self.getActiveVariant("ip4-rewrite")
+        self.assertEqual(variant_info[0], variant)
+
+
+class TestICLVariant(TestNodeVariant):
+    """Test icl Node Variants"""
+
+    VARIANT = "icl"
+    LINUX_VARIANT = "avx512_bitalg"
+
+    @classmethod
+    def setUpConstants(cls):
+        super(TestICLVariant, cls).setUpConstants(cls.VARIANT)
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestICLVariant, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(TestICLVariant, cls).tearDownClass()
+
+    @unittest.skipUnless(
+        skipVariant(LINUX_VARIANT), VARIANT + " not a supported variant, skip."
+    )
+    def test_icl(self):
+        self.checkVariant(self.VARIANT)
+
+
+class TestSKXVariant(TestNodeVariant):
+    """Test skx Node Variants"""
+
+    VARIANT = "skx"
+    LINUX_VARIANT = "avx512f"
+
+    @classmethod
+    def setUpConstants(cls):
+        super(TestSKXVariant, cls).setUpConstants(cls.VARIANT)
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestSKXVariant, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(TestSKXVariant, cls).tearDownClass()
+
+    @unittest.skipUnless(
+        skipVariant(LINUX_VARIANT), VARIANT + " not a supported variant, skip."
+    )
+    def test_skx(self):
+        self.checkVariant(self.VARIANT)
+
+
+class TestHSWVariant(TestNodeVariant):
+    """Test avx2 Node Variants"""
+
+    VARIANT = "hsw"
+    LINUX_VARIANT = "avx2"
+
+    @classmethod
+    def setUpConstants(cls):
+        super(TestHSWVariant, cls).setUpConstants(cls.VARIANT)
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestHSWVariant, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(TestHSWVariant, cls).tearDownClass()
+
+    @unittest.skipUnless(
+        skipVariant(LINUX_VARIANT), VARIANT + " not a supported variant, skip."
+    )
+    def test_hsw(self):
+        self.checkVariant(self.VARIANT)