diff options
author | Ray Kinsella <mdr@ashroe.eu> | 2020-03-10 14:35:32 +0000 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2020-04-28 11:10:50 +0000 |
commit | 4830e4f78fb8e46b23a1a0711cd06969a77d8d95 (patch) | |
tree | 36ff9c5252a62a8b5a50867a31c094c6a1bc1cda /test/test_node_variants.py | |
parent | a568a19b2956ed8b94b11c2ef041412473dc8442 (diff) |
vlib: startup multi-arch variant configuration
Support for startup node multi-arch variant selection through startup.conf.
This is to facilitate unit, functional testing and benchmarking of non-default
multi-arch variant node code path. Also added parameters to make test, to
specific using multi-arch variants in unit testing.
Type: improvement
Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Change-Id: I94fd332bb629683b7a7dd770ee9f615a9a424060
Diffstat (limited to 'test/test_node_variants.py')
-rw-r--r-- | test/test_node_variants.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/test/test_node_variants.py b/test/test_node_variants.py new file mode 100644 index 00000000000..8298dc863a4 --- /dev/null +++ b/test/test_node_variants.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +import re +import unittest +import platform +from framework 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 TestAVX512Variant(TestNodeVariant): + """ Test avx512 Node Variants """ + + VARIANT = "avx512" + LINUX_VARIANT = VARIANT + "f" + + @classmethod + def setUpConstants(cls): + super(TestAVX512Variant, cls).setUpConstants(cls.VARIANT) + + @classmethod + def setUpClass(cls): + super(TestAVX512Variant, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestAVX512Variant, cls).tearDownClass() + + @unittest.skipUnless(skipVariant(LINUX_VARIANT), + VARIANT + " not a supported variant, skip.") + def test_avx512(self): + self.checkVariant(self.VARIANT) + + +class TestAVX2Variant(TestNodeVariant): + """ Test avx2 Node Variants """ + + VARIANT = "avx2" + + @classmethod + def setUpConstants(cls): + super(TestAVX2Variant, cls).setUpConstants(cls.VARIANT) + + @classmethod + def setUpClass(cls): + super(TestAVX2Variant, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestAVX2Variant, cls).tearDownClass() + + @unittest.skipUnless(skipVariant(VARIANT), + VARIANT + " not a supported variant, skip.") + def test_avx2(self): + self.checkVariant(self.VARIANT) |