###################################################################################################
#  Deployment specific global definitions - executed after startup.py
###################################################################################################

#Uncomment this line to create the simulated devices needed to the tutorial scripts.
#run("tutorial/devices")


# The code below is necessary to run the Testing List plug-in:
global print_log, sendFeedback,  sys, inspect, os, traceback
import sys, inspect, os, traceback

class TestingTool:
    """
    Common tools for running the test
    """

    def __init__(self, testName, testPath, deviceName, testParams):
        """
        Init class with test data
        """
        self.deviceName = deviceName
        self.testName   = testName
        self.testPath   = testPath
        self.testParams = testParams


    def getParam(self, paramName):
        """
        get specific test parameter
        paramName = the name of the parameter for which the value must be read
        """
        try:
            return self.testParams[paramName]["value"]
        except:
            self.log('Could not retrieve testing parameter ' + paramName + ' - Details: ' + traceback.format_exc())
            return None


    def getName(self):
        """
        get test name
        """
        return self.testName


    def getPlotName(self):
        """
        get test plot name
        """
        return self.deviceName + ' - ' + self.testName


    def getDeviceName(self):
        """
        get device name
        """
        return self.deviceName


    def getPath(self):
        """
        get test path
        """
        return self.testPath


    def log(self, text):
        """
        Print/log information
        text = the string to be printed/logged
        """
        import time
        time.ctime()
        now = time.strftime('%Y.%m.%d %H:%M:%S')
        logText = self.deviceName + ' - ' + self.testName + ': ' + str(text) 
        print now + ' ' + logText
        try:
            log(logText)
        except:
            #cannot write log. maybe busy? Wait and retry
            time.sleep(1)
            try:
                log(logText)
            except:
                #cannot write log
                print now + ' ' + self.deviceName + ' - ' + self.testName + ': ' + 'cannot write Log in Data'


    def printParams(self):
        """
        Print/log the pshell parameters
        params = the JSON object with the parameters passed by pshell
        """
        columnsFormat = '{0:20}  {1:>7} {2}'
        self.log(columnsFormat.format("Parameter", "Value", "Description"))
        for key in self.testParams.keys():
            self.log(columnsFormat.format(key,
                                          self.testParams[key]['value'],
                                          self.testParams[key]['description']))




    def sendFeedback(self, returnString, testPassed):
        """
        Prepare and send feedback to calling tool
        returnString = the string containing info on the test result
        testPassed   = true if the test was successful, false if test had a problem
        """
        self.log('End of test. Result:')
        #self.log('Device:         ' + self.deviceName)
        #self.log('Test name:      ' + self.testName)
        #self.log('Test path:      ' + self.testPath)
        if testPassed:
            self.log('**** TEST PASSED ****')
        else:
            self.log('**** TEST FAILED ****')
        self.log('Return message: ' + returnString)
        ret = [self.testPath, self.deviceName, returnString, testPassed]
        set_return( ret)
