Fork PyRPL on GitHub

Source code for pyrpl.test.test_base

# unitary test for the RedPitaya and Pyrpl modules and baseclass for all other
# tests
import logging
logger = logging.getLogger(name=__name__)
import os
from .. import Pyrpl, APP, user_config_dir, global_config
from ..pyrpl_utils import time
from ..async_utils import sleep as async_sleep
from ..errors import UnexpectedPyrplError, ExpectedPyrplError

# I don't know why, in nosetests, the logger goes to UNSET...
logger_quamash = logging.getLogger(name='quamash')
logger_quamash.setLevel(logging.INFO)

[docs]class TestPyrpl(object): """ base class for all pyrpl tests """ # names of the configfiles to use source_config_file = "nosetests_source.yml" tmp_config_file = "nosetests_config.yml" curves = [] OPEN_ALL_DOCKWIDGETS = False @classmethod
[docs] def erase_temp_file(self): tmp_conf = os.path.join(user_config_dir, self.tmp_config_file) if os.path.isfile(tmp_conf): try: os.remove(tmp_conf) # sometimes, an earlier test delete file between exists and # remove calls, this gives a WindowsError except WindowsError: pass while os.path.exists(tmp_conf): pass # make sure the file is really gone before proceeding further
@classmethod
[docs] def setUpAll(cls): print("=======SETTING UP %s=============" % cls.__name__) # these tests will not succeed without the hardware cls.erase_temp_file() # also before (for instance in case of Ctrl-C) cls.pyrpl = Pyrpl(config=cls.tmp_config_file, source=cls.source_config_file) # self.pyrpl.create_widget() # create a second widget to be sure cls.r = cls.pyrpl.rp # get an estimate of the read/write time N = 10 t0 = time() for i in range(N): cls.r.hk.led cls.read_time = (time()-t0)/float(N) t0 = time() for i in range(N): cls.r.hk.led = 0 cls.write_time = (time()-t0)/float(N) cls.communication_time = (cls.read_time + cls.write_time)/2.0 print("Estimated time per read / write operation: %.1f ms / %.1f ms" % (cls.read_time*1000.0, cls.write_time*1000.0)) async_sleep(0.1) # give some time for events to get processed # open all dockwidgets if this is enabled if cls.OPEN_ALL_DOCKWIDGETS: for name, dock_widget in cls.pyrpl.widgets[0].dock_widgets.items(): print("Showing widget %s..." % name) dock_widget.setVisible(True) async_sleep(3.0) # give some time for startup APP.processEvents()
[docs] def test_read_write_time(self): # maximum time per read/write in seconds try: maxtime = global_config.test.max_communication_time except: raise ExpectedPyrplError("Error with global config file. " "Please delete the file %s and retry!" % os.path.join(user_config_dir, 'global_config.yml')) assert self.read_time < maxtime, \ "Read operation is very slow: %e s (expected < %e s). It is " \ "highly recommended that you improve the network connection to " \ "your Red Pitaya device. " % (self.read_time, maxtime) assert self.write_time < maxtime, \ "Write operation is very slow: %e s (expected < %e s). It is " \ "highly recommended that you improve the network connection to " \ "your Red Pitaya device. " % (self.write_time, maxtime)
@classmethod
[docs] def tearDownAll(cls): print("=======TEARING DOWN %s===========" % cls.__name__) # delete the curves fabricated in the test if hasattr(cls, 'curves'): while len(cls.curves) > 0: cls.curves.pop().delete() # shut down Pyrpl cls.pyrpl._clear() APP.processEvents() # give some time for events to get processed cls.erase_temp_file() # delete the configfile APP.processEvents()
[docs] def test_pyrpl(self): assert (self.pyrpl is not None)
# only one test class per file is allowed due to conflicts with # inheritance from TestPyrpl base class