X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2Fautogen%2FTestcase.py;h=c540d8ccec5a335fc503cb1be75005ad688f458c;hb=refs%2Fchanges%2F55%2F24455%2F17;hp=4f92e6c2e108ffaa52a93a4cbafc3cbfec62d211;hpb=7dda8f57f750c253d3c96ac1b02a84c58e36a6d8;p=csit.git diff --git a/resources/libraries/python/autogen/Testcase.py b/resources/libraries/python/autogen/Testcase.py index 4f92e6c2e1..c540d8ccec 100644 --- a/resources/libraries/python/autogen/Testcase.py +++ b/resources/libraries/python/autogen/Testcase.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Cisco and/or its affiliates. +# Copyright (c) 2019 Cisco and/or its affiliates. # 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: @@ -16,7 +16,7 @@ from string import Template -class Testcase(object): +class Testcase: """Class containing a template string and a substitution method.""" def __init__(self, template_string): @@ -34,37 +34,105 @@ class Testcase(object): """ self.template = Template(template_string) - def generate(self, num, framesize, phy_cores): + def generate(self, num, frame_size, phy_cores, clients, streams, + bytes_str): """Return string of test case code with placeholders filled. Fail if there are placeholders left unfilled. + It is not required for all placeholders to be present in template. :param num: Test case number. Example value: 4. - :param framesize: Imix string or numeric frame size. Example: 74. + :param frame_size: Imix string or numeric frame size. Example: 74. :param phy_cores: Number of physical cores to use. Example: 2. + :param clients: Number of clients used by test program. Example: 4. + :param streams: Number of streams used by test program. Example: 10. + :param bytes_str: Size in bytes of stream sent by test program. + Example: 1G :type num: int - :type framesize: str or int + :type frame_size: str or int :type phy_cores: int or str + :type clients: int + :type streams: int + :type bytes_str: str :returns: Filled template, usable as test case code. :rtype: str """ try: - fs = int(framesize) + fsize = int(frame_size) subst_dict = { - "frame_num": "${%d}" % fs, - "frame_str": "%dB" % fs + u"frame_num": f"${{{fsize:d}}}", + u"frame_str": f"{fsize:d}B" } except ValueError: # Assuming an IMIX string. subst_dict = { - "frame_num": str(framesize), - "frame_str": "IMIX" + u"frame_num": str(frame_size), + u"frame_str": u"IMIX" } cores_str = str(phy_cores) cores_num = int(cores_str) subst_dict.update( { - "cores_num": "${%d}" % cores_num, - "cores_str": phy_cores, - "tc_num": "tc{num:02d}".format(num=num) - }) + u"cores_num": f"${{{cores_num:d}}}", + u"cores_str": phy_cores, + u"tc_num": f"tc{num:02d}", + u"clients_num": f"${{{clients:d}}}", + u"clients_str": str(clients), + u"streams_num": f"${{{streams:d}}}", + u"streams_str": str(streams), + u"bytes_str": bytes_str, + } + ) return self.template.substitute(subst_dict) + + @classmethod + def default(cls, suite_id): + """Factory method for creating "default" testcase objects. + + Testcase name will contain both frame size and core count. + Used for most performance tests, except TCP ones. + + :param suite_id: Part of suite name to distinguish from other suites. + :type suite_id: str + :returns: Instance for generating testcase text of this type. + :rtype: Testcase + """ + template_string = f''' +| ${{tc_num}}-${{frame_str}}-${{cores_str}}c-{suite_id} +| | [Tags] | ${{frame_str}} | ${{cores_str}}C +| | frame_size=${{frame_num}} | phy_cores=${{cores_num}} +''' + return cls(template_string) + + @classmethod + def tcp(cls, suite_id): + """Factory method for creating "tcp" testcase objects. + + Testcase name will contain core count, but not frame size. + + :param suite_id: Part of suite name to distinguish from other suites. + :type suite_id: str + :returns: Instance for generating testcase text of this type. + :rtype: Testcase + """ + # TODO: Choose a better frame size identifier for streamed protocols + # (TCP, QUIC, SCTP, ...) where DUT (not TG) decides frame size. + if u"tcphttp" in suite_id: + template_string = f''' +| ${{tc_num}}-IMIX-${{cores_str}}c-{suite_id} +| | [Tags] | ${{cores_str}}C +| | phy_cores=${{cores_num}} +''' + elif u"iperf3" in suite_id: + template_string = f''' +| ${{tc_num}}-9000B-${{cores_str}}c-{suite_id} +| | [Tags] | ${{cores_str}}C | ${{clients_str}}CLIENT | ${{streams_str}}STREAM +| | phy_cores=${{cores_num}} | clients=${{clients_num}}''' + template_string += f" | streams=${{streams_num}}\n" + else: + template_string = f''' +| ${{tc_num}}-9000B-${{cores_str}}c-{suite_id} +| | [Tags] | ${{cores_str}}C | ${{clients_str}}CLIENT | ${{streams_str}}STREAM +| | phy_cores=${{cores_num}} | clients=${{clients_num}}''' + template_string += f" | streams=${{streams_num}}" \ + f" | bytes=${{bytes_str}}\n" + return cls(template_string)