| #!/usr/bin/env python3 |
| import re |
| import unittest |
| import platform |
| from asfframework import VppAsfTestCase |
| |
| |
| def checkX86(): |
| return platform.machine() in ["x86_64", "AMD64", "amd64"] |
| |
| |
| def skipVariant(variant): |
| # TODO: We don't have cpu feature detection on FreeBSD yet, so always return |
| # that we don't have the requested variant. |
| if platform.uname().system == "FreeBSD": |
| return False |
| |
| 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(VppAsfTestCase): |
| """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) |