from test.helpers.int_registers import get_die_id from test.helpers.int_registers import get_mac from subprocess import call import os import unittest from test.helpers.testsrv_db import TestSrv_Database from test.helpers.setup_xml import XMLSetup from test.runners.simple import SimpleTestRunner from test.helpers.syscmd import TestSysCommand from test.tests.qethernet import Qethernet from test.tests.qaudio import Qaudio from test.tests.qram import Qram from test.tests.qusb import Qusb from test.tests.qi2c import Qi2c from test.tests.qeeprom import Qeeprom from test.tests.qserial import Qserial from test.tests.qwifi import Qwifi from test.tests.qrtc import Qrtc from test.tests.qduplex_ser import Qduplex from test.tests.qamper import Qamper from test.tests.qnand import Qnand from test.helpers.globalVariables import globalVar import socket from test.helpers.iseelogger import ISEE_Logger import logging import binascii from test.flashers.flasher import flash # global variables psdbObj = TestSrv_Database() xmlObj = None loggerObj = None # define clear function def clear(): # check and make call for specific operating system _ = call('clear' if os.name == 'posix' else 'cls') def create_paramslist(params): paramlist = {} for row in params: varname, varvalue = row paramlist[varname] = varvalue return paramlist def add_test_task(suite, testdefname, paramlist): if testdefname == "AUDIO": suite.addTest(Qaudio(testdefname, "execute", paramlist)) elif testdefname == "RAM": suite.addTest(Qram(testdefname, "execute", paramlist)) elif testdefname == "SERIALDUAL": suite.addTest(Qduplex(testdefname, "execute", paramlist)) elif testdefname == "EEPROM": suite.addTest(Qeeprom(testdefname, "execute", paramlist)) elif testdefname == "SERIAL": suite.addTest(Qserial(testdefname, "execute", paramlist)) elif testdefname == "RTC": suite.addTest(Qrtc(testdefname, "execute", paramlist)) elif testdefname == "CONSUMPTION": suite.addTest(Qamper(testdefname, "execute", paramlist)) elif testdefname == "DMESG": suite.addTest(TestSysCommand(testdefname, "execute", paramlist)) elif testdefname == "ETHERNET": suite.addTest(Qethernet(testdefname, "execute", paramlist)) elif testdefname == "NAND": suite.addTest(Qnand(testdefname, "execute", paramlist)) elif testdefname == "I2C": suite.addTest(Qi2c(testdefname, "execute", paramlist)) elif testdefname == "WIFI": suite.addTest(Qwifi(testdefname, "execute", paramlist)) elif testdefname == "USB": suite.addTest(Qusb(testdefname, "execute", paramlist)) else: raise Exception("Wrong testdefname") def create_testsuite(): # create an object TestSuite suite = unittest.TestSuite() # get id of the full test for this board globalVar.testid_ctl = psdbObj.open_test(globalVar.g_uuid) # get list of tests for this board tests = psdbObj.get_tests_list(globalVar.g_uuid) # loop in every test for this board for row in tests: testid, testdefname = row # get params for this test params = psdbObj.get_test_params_list(testid) paramlist = create_paramslist(params) # add the testid as parameter paramlist["testid"] = testid paramlist["boarduuid"] = globalVar.g_uuid paramlist["testidctl"] = globalVar.testid_ctl # add test to TestSuite add_test_task(suite, testdefname, paramlist) return suite def create_board(): model_id = xmlObj.gettagKey('board', 'model') variant = xmlObj.gettagKey('board', 'variant') # get model id globalVar.g_mid = model_id + "-" + variant # get station globalVar.station = socket.gethostname() processor_id = get_die_id(globalVar.g_mid) print(globalVar.g_mid) print(processor_id) globalVar.g_uuid = psdbObj.create_board(processor_id, model_id, variant, globalVar.station, get_mac(globalVar.g_mid)) def program_eeprom(eeprompath): print("Start programming Eeprom...") # check if eeprompath is correct if os.path.isfile(eeprompath): # create u-boot data struct data = bytearray() data += (2029785358).to_bytes(4, 'big') # magicid --> 0x78FC110E data += bytearray([0, 0, 0, 0]) # crc32 = 0 data += bytearray(globalVar.g_uuid + "\0", 'ascii') # uuid --> 'c0846c8a-5fa5-11ea-8576-f8b156ac62d7' and \0 at the end mac0 = get_mac(globalVar.g_mid) data += binascii.unhexlify(mac0.replace(':', '')) # mac0 --> 'f8:b1:56:ac:62:d7' data += bytearray([0, 0, 0, 0, 0, 0]) # mac1 --> 0:0:0:0:0:0 # calculate crc crc = (binascii.crc32(data, 0)).to_bytes(4, 'big') data[4:8] = crc # write into eeprom and read back f = open(eeprompath, "r+b") f.write(data) f.seek(0) data_rx = f.read(57) for i in range(57): if data_rx[i] != data[i]: print("Error while programming eeprom memory.") return 1 print("Eeprom programmed succesfully.") return 0 else: print("eeprom memory not found.") return 1 def create_boardvariables_list(uuid): varlist = {} for row in psdbObj.get_board_variables(globalVar.g_uuid): varname, varvalue = row varlist[varname] = varvalue return varlist def main(): # initialize the board create_board() # create and run tests according to the board type runner = SimpleTestRunner(psdbObj) testresult = runner.run(create_testsuite()) # execute aditional tasks, only if the test was succesfull if testresult.wasSuccessful(): varlist = create_boardvariables_list(globalVar.g_uuid) program_eeprom(varlist["eeprompath"]) flash(globalVar.g_mid) if __name__ == "__main__": # Clear the shell screen clear() # create logger loggerObj = ISEE_Logger(logging.INFO) # logger = loggerObj.getlogger().info("Starting test script...") # Try to parse the setup.xml file try: xmlObj = XMLSetup("setup.xml") except: print("Error: Cannot parse setup.xml file") exit(1) # Try to connect to the DB, according to setup.xml configuration if psdbObj.open(xmlObj): main() else: print("Error: Cannot open DB connection") exit(2)