#!/router/bin/python
from .trex_general_test import CTRexGeneral_Test
from CPlatform import CStaticRouteConfig
from .tests_exceptions import *
#import sys
import time
from nose.tools import nottest

class CTRexIMIX_Test(CTRexGeneral_Test):
    """This class defines the IMIX testcase of the TRex traffic generator"""
    def __init__(self, *args, **kwargs):
        # super(CTRexIMIX_Test, self).__init__()
        CTRexGeneral_Test.__init__(self, *args, **kwargs)

    def setUp(self):
        super(CTRexIMIX_Test, self).setUp() # launch super test class setUp process
        # CTRexGeneral_Test.setUp(self)       # launch super test class setUp process
        # self.router.clear_counters()
        pass

    def test_routing_imix_64(self):
        # test initializtion
        if not self.is_loopback:
            self.router.configure_basic_interfaces()
            self.router.config_pbr(mode = "config")

#       self.trex.set_yaml_file('cap2/imix_64.yaml')
        mult  = self.get_benchmark_param('multiplier')
        core  = self.get_benchmark_param('cores')

#       trex_res = self.trex.run(multiplier = mult, cores = core, duration = 30, l = 1000, p = True)
        ret = self.trex.start_trex(
            c = core,
            m = mult,
            p  = True,
            nc = True,
            d = 30,   
            f = 'cap2/imix_64.yaml',
            l = 1000)

        trex_res = self.trex.sample_to_run_finish()

        # trex_res is a CTRexResult instance- and contains the summary of the test results
        # you may see all the results keys by simply calling here for 'print trex_res.result'
        print("\nLATEST RESULT OBJECT:")
        print(trex_res)

        self.check_general_scenario_results(trex_res)
        self.check_CPU_benchmark(trex_res)

    # the name intentionally not matches nose default pattern, including the test should be specified explicitly
    def dummy(self):
        ret = self.trex.start_trex(
            c = 1,
            m = 1,
            p  = True,
            nc = True,
            d = 5,
            f = 'cap2/imix_fast_1g.yaml',
            l = 1000,
            trex_development = True)

        trex_res = self.trex.sample_to_run_finish()
        print(trex_res)

    def test_routing_imix (self):
        # test initializtion
        if not self.is_loopback:
            self.router.configure_basic_interfaces()
            self.router.config_pbr(mode = "config")

#       self.trex.set_yaml_file('cap2/imix_fast_1g.yaml')
        mult = self.get_benchmark_param('multiplier')
        core = self.get_benchmark_param('cores')

        ret = self.trex.start_trex(
            c = core,
            m = mult,
            p  = True,
            nc = True,
            d = 60,   
            f = 'cap2/imix_fast_1g.yaml',
            l = 1000)

        trex_res = self.trex.sample_to_run_finish()

        # trex_res is a CTRexResult instance- and contains the summary of the test results
        # you may see all the results keys by simply calling here for 'print trex_res.result'
        print("\nLATEST RESULT OBJECT:")
        print(trex_res)

        self.check_general_scenario_results(trex_res)

        self.check_CPU_benchmark(trex_res)


    def test_static_routing_imix (self):
        if self.is_loopback:
            self.skip('In loopback mode the test is same as test_routing_imix')
        # test initializtion
        if not self.is_loopback:
            self.router.configure_basic_interfaces()

            # Configure static routing based on benchmark data input
            stat_route_dict = self.get_benchmark_param('stat_route_dict')
            stat_route_obj = CStaticRouteConfig(stat_route_dict)
            self.router.config_static_routing(stat_route_obj, mode = "config")

        mult = self.get_benchmark_param('multiplier')
        core = self.get_benchmark_param('cores')

        ret = self.trex.start_trex(
            c = core,
            m = mult,
            p  = True,
            nc = True,
            d = 60,   
            f = 'cap2/imix_fast_1g.yaml',
            l = 1000)

        trex_res = self.trex.sample_to_run_finish()

        # trex_res is a CTRexResult instance- and contains the summary of the test results
        # you may see all the results keys by simply calling here for 'print trex_res.result'
        print("\nLATEST RESULT OBJECT:")
        print(trex_res)
        print("\nLATEST DUMP:")
        print(trex_res.get_latest_dump())

        self.check_general_scenario_results(trex_res)
        self.check_CPU_benchmark(trex_res)


    def test_static_routing_imix_asymmetric (self):
        # test initializtion
        if not self.is_loopback:
            self.router.configure_basic_interfaces()

            # Configure static routing based on benchmark data input
            stat_route_dict = self.get_benchmark_param('stat_route_dict')
            stat_route_obj = CStaticRouteConfig(stat_route_dict)
            self.router.config_static_routing(stat_route_obj, mode = "config")

        mult = self.get_benchmark_param('multiplier')
        core = self.get_benchmark_param('cores')

        ret = self.trex.start_trex(
            c = core,
            m = mult,
            nc = True,
            d = 100,   
            f = 'cap2/imix_fast_1g.yaml',
            l = 1000)

        trex_res = self.trex.sample_to_run_finish()

        # trex_res is a CTRexResults instance- and contains the summary of the test results
        # you may see all the results keys by simply calling here for 'print trex_res.result'
        print("\nLATEST RESULT OBJECT:")
        print(trex_res)

        self.check_general_scenario_results(trex_res)

        self.check_CPU_benchmark(trex_res, minimal_cpu = 25)


    def test_jumbo(self, duration = 100, **kwargs):
        if not self.is_loopback:
            self.router.configure_basic_interfaces(mtu = 9216)
            self.router.config_pbr(mode = "config")

        mult = self.get_benchmark_param('multiplier')
        core = self.get_benchmark_param('cores')

        ret = self.trex.start_trex(
            c = core,
            m = mult,
            p = True,
            nc = True,
            d = duration,
            f = 'cap2/imix_9k.yaml',
            l = 1000,
            **kwargs)

        trex_res = self.trex.sample_to_run_finish()

        # trex_res is a CTRexResults instance- and contains the summary of the test results
        # you may see all the results keys by simply calling here for 'print trex_res.result'
        print("\nLATEST RESULT OBJECT:")
        print(trex_res)

        self.check_general_scenario_results(trex_res)
        self.check_CPU_benchmark(trex_res, minimal_cpu = 0, maximal_cpu = 10)

    # don't include it to regular nose search
    @nottest
    def test_warm_up(self):
        try:
            self._testMethodName = 'test_jumbo'
            self.test_jumbo(duration = 5, trex_development = True)
        except Exception as e:
            print('Ignoring this error: %s' % e)
        if self.fail_reasons:
            print('Ignoring this error(s):\n%s' % '\n'.join(self.fail_reasons))
            self.fail_reasons = []

    def tearDown(self):
        CTRexGeneral_Test.tearDown(self)
        # remove nbar config here
        pass

if __name__ == "__main__":
    pass