# For testing. # # Concept: This module allows to trigger abnormal situations, to test the reaction of the software ("fault insertion testing"). # In the place in the software, where the fault shall be injected, add a condition like # if (testsuite_faultinjection_is_triggered(TC_MY_TESTCASE_FOR_SOMETHING)): # DoSomethingStrange() # In normal software run, this condition is never fulfilled and does not disturb. If the related test case is activated, # by setting testsuite_testcase_number = TC_MY_TESTCASE_FOR_SOMETHING below, the condition will fire and the fault is injected. # A number of delay cycles can be configured with testsuite_delayCycles below. # # Detailled docu see doc/testing_and_simulation.md from udplog import udplog_log from configmodule import getConfigValue, getConfigValueBool # The list of test cases. Each must have a unique test case ID. TC_NOTHING_TO_TEST = 0 TC_EVSE_ResponseCode_SequenceError_for_SessionSetup = 1 TC_EVSE_ResponseCode_SequenceError_for_ServiceDiscoveryRes = 2 TC_EVSE_ResponseCode_SequenceError_for_ServicePaymentSelectionRes = 3 TC_EVSE_ResponseCode_SequenceError_for_ContractAuthenticationRes = 4 TC_EVSE_ResponseCode_ServiceSelectionInvalid_for_ChargeParameterDiscovery = 5 TC_EVSE_ResponseCode_Failed_for_CableCheckRes = 6 TC_EVSE_ResponseCode_Failed_for_PreChargeRes = 7 TC_EVSE_ResponseCode_Failed_for_PowerDeliveryRes = 8 TC_EVSE_ResponseCode_Failed_for_CurrentDemandRes = 9 TC_EVSE_Timeout_during_CableCheck = 10 TC_EVSE_Timeout_during_PreCharge = 11 TC_EVSE_Shutdown_during_PreCharge = 12 TC_EVSE_Shutdown_during_CurrentDemand = 13 TC_EVSE_Malfunction_during_CurrentDemand = 14 TC_EVSE_Timeout_during_CurrentDemand = 15 TC_EVSE_GoodCase = 16 TC_EVSE_LastTest = 17 # variables testsuite_testcase_number = 0 testsuite_delayCycles = 0 testsuite_TcTitle = "(title not initialized)" # Counter variable for delaying the trigger testsuite_counter = 0 def testsuite_printToTestLog(s): fileOut = open('testresults.txt', 'a') # open the result file for appending print(s, file=fileOut) fileOut.close() def testsuite_getTcNumber(): if (testsuite_testcase_number==0): return "(no tests)" else: return str(testsuite_testcase_number) + testsuite_TcTitle def testsuite_faultinjection_is_triggered(context): global testsuite_counter, testsuite_testcase_number, testsuite_delayCycles isTestcaseFired = False if (context==testsuite_testcase_number): # if the call context is matching the intended test case testsuite_counter += 1 # count the number of matching calls isTestcaseFired = testsuite_counter>=testsuite_delayCycles # and fire the test case if the intended number is reached if (isTestcaseFired): print("[TESTSUITE] Fired test case " + str(context) + " TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT") s = "[TESTSUITE] Fired test case " + str(context) udplog_log(s, "testsuite") return isTestcaseFired def testsuite_choose_testcase(): global testsuite_counter, testsuite_testcase_number, testsuite_delayCycles global testsuite_observedResult global testsuite_expectedResult global testsuite_TcTitle if (not getConfigValueBool("testsuite_enable")): testsuite_testcase_number = TC_NOTHING_TO_TEST return try: if (testsuite_expectedResult is None): testsuite_expectedResult = "" except: testsuite_expectedResult = "" # as first step, before choosing the next test case, check the result of the ongoing test case if (testsuite_expectedResult!=""): s = "ExpectedResult: " + testsuite_expectedResult s = s + ", ObservedResult: " + testsuite_observedResult if (testsuite_expectedResult!=testsuite_observedResult): s = "FAIL " + s else: s = "PASS " + s print(s) udplog_log(s, "testsuite") x = "Result for Testcase " + str(testsuite_testcase_number) + " " + testsuite_TcTitle testsuite_printToTestLog(x) testsuite_printToTestLog(s) if (testsuite_testcase_number50): protocol = pkt[23] destinationport = pkt[36]*256 + pkt[37] if ((protocol == 0x11) and (destinationport==0x0202)): # it is an UDP packet to the syslog port baSyslog = pkt[46:] strSyslog = "" syslogLen = len(baSyslog) if (syslogLen>100): syslogLen=100 for i in range(0, syslogLen-1): # one less, remove the trailing 0x00 x = baSyslog[i] if (x<0x20): x=0x20 # make unprintable character to space. strSyslog+=chr(x) # convert ASCII code to string print("[Testsuite] received syslog packet: " + strSyslog) if (strSyslog[0:5]=="TSRS_"): # it is a TestSuiteReportStatus message. testsuite_observedResult = strSyslog if __name__ == "__main__": print("Testing the mytestsuite") print("nothing to do")