Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TestsGenarator.py Source File

TestsGenarator.py

00001 # This script responsible to generate C files.
00002 # The generated C files will create a TestSuite
00003 # for the Stack Usage analyzer.
00004 import os
00005 import shutil
00006 
00007 
00008 SCRIPTDIR = os.path.dirname(os.path.realpath(__file__))
00009 TEMPLATEFILE = os.path.join(SCRIPTDIR, 'Template', 'template.c')
00010 TESTSDIR = os.path.join(SCRIPTDIR, 'Tests')
00011 function_pointer_list = []
00012 STACK_UNIT_SIZE = 1024
00013 STACK_UNIT_NUM = 3
00014 
00015 
00016 def generate_functions(filename, includes, mainfunction, variables, targetcall):
00017     generated = open(os.path.join(TESTSDIR, filename+'.c'), "a")
00018     generated_header = open(os.path.join(TESTSDIR, filename+'.h'), "a")
00019     template = open(TEMPLATEFILE, "r")
00020     main_added = False
00021     vars_added = False
00022 
00023     # insert includes if exist
00024     if len(includes) != 0:
00025         for inc in includes.split(';'):
00026             generated.write('#include \"' + inc + '\"\n')
00027 
00028     # insert test main function
00029     for line in template:
00030         if main_added == True and vars_added == False:
00031             if line.strip() == "{":
00032                 continue
00033             # insert variables if exist
00034             if len(variables) != 0:
00035                 for var in variables.split(';'):
00036                     if len(var.strip(' ')) == 0:
00037                         continue
00038                     generated.write("\t"+var.strip(' ')+";\n")
00039             generated.write(line)
00040             vars_added = True
00041             continue
00042 
00043         if line.strip() == "int stackUsage_Template()":
00044             generated_header.write("int "+mainfunction + "();\n")
00045             generated.write("int "+mainfunction + "()\n{\n")
00046             main_added = True
00047             if mainfunction in function_pointer_list:
00048                 print "Error! This function already exist in the functions vector\n"
00049                 raise Exception('This function: "'+ mainfunction + '" is already exist in the functions vector')
00050             function_pointer_list.append(mainfunction)
00051         elif line.strip() == "Template_Func();":
00052             generated.write("\t"+targetcall+"\n")
00053 
00054         else:
00055             generated.write(line)
00056     generated.write('/***********************************************************************/\n')
00057     generated.write("\n\n")
00058     generated.write('/***********************************************************************/\n')
00059     generated.close()
00060     generated_header.close()
00061     template.close()
00062 
00063 
00064 def generate_new_source_files(filename):
00065     if os.path.exists(TESTSDIR):
00066         shutil.rmtree(TESTSDIR)
00067 
00068     os.mkdir(TESTSDIR)
00069 
00070     generated_c = open(os.path.join(TESTSDIR, filename+'.c'), "w")
00071     generated_h = open(os.path.join(TESTSDIR, filename+'.h'), "w")
00072 
00073     generated_c.write('/* This file was generated automatically */\n')
00074     generated_c.write("#include \""+filename+".h\"\n")
00075     generated_c.write("\n\n")
00076     generated_c.close()
00077 
00078     generated_h.write('/**********************************************************************\n')
00079     generated_h.write('* This file was generated automatically and it describes the generated\n')
00080     generated_h.write('* Source file "'+filename+'.c" which contains stack usage test functions\n')
00081     generated_h.write('* for the listed functions in the "TargetFunction.txt" file.\n')
00082     generated_h.write('* Please do NOT edit these files (header and source) for requests please\n')
00083     generated_h.write('* send an email to PAL team leader: Alex.Volinski@arm.com \n')
00084     generated_h.write('**********************************************************************/\n\n')
00085     generated_h.write("#ifndef _FUNCTIONS_VECTOR_H_\n")
00086     generated_h.write("#define _FUNCTIONS_VECTOR_H_\n")
00087     generated_h.write("#include <stdlib.h>\n")
00088     generated_h.write("#include <stdio.h>\n")
00089     generated_h.write("#include <stdbool.h>\n")
00090     generated_h.write("#define STACK_UNIT_SIZE "+ str(STACK_UNIT_SIZE) +"\n")
00091     generated_h.write("#define STACK_UNIT_NUM "+ str(STACK_UNIT_NUM) +"\n")
00092     generated_h.write("char* paintStack();\n\n")
00093     generated_h.close()
00094 
00095 
00096 def create_functions_struct(filename):
00097 
00098     add_comma = False
00099     generated_h = open(os.path.join(TESTSDIR, filename+'.h'), "a")
00100     generated_h.write("\n\n#define BORDER_ARRAY_SIZE 32\n")
00101     generated_h.write("#define FUNC_NUM "+ str(len(function_pointer_list)) +"\n")
00102     generated_h.write("#define PATTERN_SIZE 4\n")
00103     generated_h.write("#define INIT_VALUE 190\n")
00104     generated_h.write("#define MAX_CHAR_VALUE 256\n")
00105     generated_h.write("\ntypedef struct{\n\tint (*fp)();\n\tchar name[64];\n}functionNode;\n")
00106     generated_h.write("\nstatic char memPattern[PATTERN_SIZE] = {0xDE, 0xAD, 0xFA, 0xCE};\n")
00107     generated_h.write("\nstatic functionNode funcArray[FUNC_NUM] = {\n")
00108 
00109     for func in function_pointer_list:
00110         if add_comma:
00111             generated_h.write(",\n")
00112         generated_h.write('{'+func+",\""+func[len("StackUsage_"):]+"()\"}")
00113         add_comma = True
00114 
00115     generated_h.write("};\n\n")
00116     generated_h.write("#endif //_FUNCTIONS_VECTOR_H_\n")
00117     generated_h.close()
00118 
00119 
00120 def create_runner_source(vector_filename):
00121     runner_c = open(os.path.join(TESTSDIR, 'TestSuiteRunner.c'), "w")
00122 
00123     runner_c.write('/* This file was generated automatically */\n')
00124     runner_c.write("#include \""+vector_filename+".h\"\n\n")
00125     runner_c.write("void main()\n{\n")
00126     runner_c.write("\tint i = 0;\n")
00127     runner_c.write("\tfor (; i < FUNC_NUM ; ++i)\n\t{\n")
00128     runner_c.write("\t\tprintf(\"%s function used: %d bytes in the stack\\n\", funcArray[i].name ,funcArray[i].fp());\n\t}\n")
00129     runner_c.write("\tprintf(\"Test Finished!\\n\");\n")
00130     runner_c.write("}\n")
00131 
00132 
00133 def create_runner_header():
00134     generated_h = open(os.path.join(TESTSDIR, 'TestSuiteRunner.h'), "w")
00135     generated_h.write('/**********************************************************************\n')
00136     generated_h.write('* This file was generated automatically and it describes the generated\n')
00137     generated_h.write('* Source file "TestSuiteRunner.c" which contains the test runner function\n')
00138     generated_h.write('* for the listed functions in the "TargetFunction.txt" file.\n')
00139     generated_h.write('* Please do NOT edit these files (header and source) for requests please\n')
00140     generated_h.write('* send an email to PAL team \n')
00141     generated_h.write('**********************************************************************/\n\n')
00142     generated_h.write("#ifndef _TES_SUITE_RUNNER_H_\n")
00143     generated_h.write("#define _TES_SUITE_RUNNER_H_\n")
00144     generated_h.write("\nint TestSuiteRunner();\n\n")
00145     generated_h.write("#endif //_TES_SUITE_RUNNER_H_\n")
00146 
00147 
00148 def generate_paint_stack():
00149     runner_c = open(os.path.join(TESTSDIR, 'functionsVector.c'), "a")
00150     runner_c.write("#pragma GCC diagnostic push\n")
00151     runner_c.write("#pragma GCC diagnostic ignored \"-Wreturn-local-addr\"\n")
00152     runner_c.write("/* We can not return the address of the (stackArr) directly, it will be NULL in run-time\n")
00153     runner_c.write("*  Therefore new pointer (arrayPtr) required to hold the address of the (stackArr)*/\n")
00154     runner_c.write("char* paintStack()\n{\n")
00155     runner_c.write("\tchar* arrayPtr = NULL;\n")
00156     runner_c.write("\tchar stackArr[STACK_UNIT_NUM*STACK_UNIT_SIZE] = {0};\n")
00157     runner_c.write("\tint i = 0;\n")
00158     runner_c.write("\tfor(i=0; i < STACK_UNIT_NUM*STACK_UNIT_SIZE; ++i)\n\t{\n")
00159     runner_c.write("\t\t// Painting the stack with memory pattern (DEADFACE) XORed running index to make the stack more unique\n")
00160     runner_c.write("\t\tstackArr[i] = memPattern[i%PATTERN_SIZE] ^ (i%MAX_CHAR_VALUE);\n\t}\n")
00161     runner_c.write("\tarrayPtr = stackArr;\n")
00162     runner_c.write("\treturn arrayPtr;\n}\n")
00163     runner_c.write("#pragma GCC diagnostic pop\n\n")
00164 
00165 
00166 def main():
00167     generate_new_source_files('functionsVector')
00168     f = open('TargetFunctions.txt', 'r')
00169     for line in f:
00170         if line.strip() == 'List Finished!':
00171             print "Code generation finished successfully"
00172             break
00173         if line[0] == "#" or line[0] == "\n":
00174             continue
00175         print "Reading new line: "+ line
00176         list = line.strip().split('$')
00177         generate_functions('functionsVector', list[0].strip(' '), list[1].strip(' '), list[2].strip(' '), list[3].strip(' '))
00178     create_functions_struct('functionsVector')
00179     create_runner_source('functionsVector')
00180     generate_paint_stack()
00181     create_runner_header()
00182 if __name__ == '__main__':
00183     main()