Add manager.acquire_dut_by_name() and change sdb server refresh concept
authorDonghoon Shin <dhs.shine@gmail.com>
Wed, 21 Sep 2016 00:26:54 +0000 (09:26 +0900)
committerDonghoon Shin <dhs.shine@gmail.com>
Wed, 21 Sep 2016 00:26:54 +0000 (09:26 +0900)
litmus/core/manager.py
litmus/device/devicemock.py

index 332b8bc308d50ea8ed6cee3e5a77ef87a7c0780c..2af4246168972ac7b70778e9b9df6b0ecf1b3220 100644 (file)
@@ -133,6 +133,52 @@ Lightweight test manager for tizen automated testing
                     time.sleep(retry_delay)
         raise Exception('{} device is not available.'.format(devicetype))
 
+    def acquire_dut_by_name(self, devicename,
+                            max_retry_times=10, retry_delay=10):
+        """
+        Acquire an available device for testing.
+
+        :param str devicename: device name
+        :param int max_retry_times: max retry times for device acquisition
+        :param float retry_delay: delay time for each device acquisition retry
+
+        Example:
+            >>> mgr = manager()
+            >>> dut = mgr.acquire_dut_by_name('XU3_001')
+
+        :returns device: acquired device instance
+        """
+        logging.debug('===============Acquire an available DUT===============')
+
+        candidate = next((dev for dev in self._all_devices
+                          if dev['devicename'] == devicename), None)
+
+        if candidate:
+            for times in range(0, max_retry_times):
+                if not candidate['ilock'].acquired:
+                    gotten_tlock = candidate['tlock'].acquire(blocking=False)
+                    gotten_ilock = candidate['ilock'].acquire(blocking=False)
+                    try:
+                        os.chmod(candidate['ilock'].path, 0o664)
+                    except PermissionError:
+                        logging.debug('Can\'t change lock file permission')
+
+                    # if acquire tlock and ilock, assign a device.
+                    if gotten_tlock and gotten_ilock:
+                        dut = device.create(manager=self, **candidate)
+                        self._duts.append(dut)
+                        logging.debug('{} is assigned.'
+                                      .format(dut.get_name()))
+                        return dut
+                    # if acquire tlock only then release it for next time.
+                    elif gotten_tlock and not gotten_ilock:
+                        candidate['tlock'].release()
+                else:
+                    logging.debug('{} is busy. Wait {} seconds.'
+                                  .format(devicename, retry_delay))
+                    time.sleep(retry_delay)
+        raise Exception('{} is not available.'.format(devicename))
+
     def release_dut(self, dut=None):
         """
         Release acquired devices under test.
@@ -147,7 +193,6 @@ Lightweight test manager for tizen automated testing
             >>> mgr.release_dut()
 
         """
-        # TODO: self._duts.remove(dev) doesn't delete device instance.
         # release all _duts if dut param is None
         if not dut:
             for dev in self._duts:
@@ -243,22 +288,25 @@ Lightweight test manager for tizen automated testing
 
         for section in configparser.sections():
             items = dict(configparser.items(section))
-            items['deviceid'] = section
+            items['devicename'] = section
 
             # Interproces Lock and Thread Lock
             ilock_filename = os.path.join(self._path_for_locks,
-                                          items['deviceid'])
+                                          items['devicename'])
             items['tlock'] = Lock()
             items['ilock'] = fasteners.InterProcessLock(ilock_filename)
 
             # Append items
             self._all_devices.append(items)
 
-        # Add mock device
-        mock_deviceid = 'MOCK_001'
-        mock_ilock_filename = os.path.join(self._path_for_locks, mock_deviceid)
-        mock = {'deviceid': mock_deviceid,
-                'dev_type': 'mock',
-                'tlock': Lock(),
-                'ilock': fasteners.InterProcessLock(mock_ilock_filename)}
-        self._all_devices.append(mock)
+        if not next((d for d in self._all_devices if d['dev_type'] == 'mock'),
+                    None):
+            # Add mock device
+            mock_devicename = 'MOCK_001'
+            mock_ilock_filename = os.path.join(self._path_for_locks,
+                                               mock_devicename)
+            mock = {'devicename': mock_devicename,
+                    'dev_type': 'mock',
+                    'tlock': Lock(),
+                    'ilock': fasteners.InterProcessLock(mock_ilock_filename)}
+            self._all_devices.append(mock)
index 4403de0bd1dde886000fd742e608d883fb261c78..22b992e9e46fac52a0c6da8a4904cb10c04b0c5c 100644 (file)
@@ -30,8 +30,11 @@ class devicemock(device):
     def __init__(self, *args, **kwargs):
         self.args = args
         self.kwargs = kwargs
-        self._name = kwargs['deviceid']
-        self._id = self._find_device_id()
+        self._name = kwargs['devicename']
+        if 'serialno' in kwargs:
+            self._id = kwargs['serialno']
+        else:
+            self._id = self._find_device_id()
 
         # init a cutter instance.
         self._manager = kwargs['manager']
@@ -42,7 +45,7 @@ class devicemock(device):
 
     def _find_device_id(self):
         """docstring for _find_device_id"""
-        self.refresh_sdb_server()
+        self.start_sdb_server()
         outs = check_output(['sdb', 'devices'], timeout=10)
         pattern = '.*List of devices attached \n([a-zA-Z0-9]*).*device.*'
         found = find_pattern(pattern, outs, groupindex=1)
@@ -72,12 +75,12 @@ class devicemock(device):
         """
         logging.debug('turn on device {}'.format(self.get_name()))
 
-        self.refresh_sdb_server()
+        self.start_sdb_server()
         if self._find_device_id() == self.get_id():
             self._sdb_root_on()
-            self.run_cmd('reboot -f')
+            self.run_cmd('reboot -f', timeout=10)
         time.sleep(60)
-        self.refresh_sdb_server()
+        self.start_sdb_server()
         self._sdb_root_on()
 
     def off(self, powercut_delay=2):
@@ -144,7 +147,7 @@ class devicemock(device):
         """
         logging.debug('flash binaries to device : {}'.format(filenames))
 
-        self.refresh_sdb_server()
+        self.start_sdb_server()
 
         if not filenames:
             raise Exception('There\'s no file to flash.')
@@ -165,3 +168,8 @@ class devicemock(device):
         """docstring for refresh_sdb_server"""
         call('sdb kill-server; sdb start-server', shell=True, timeout=10)
         time.sleep(1)
+
+    def start_sdb_server(self):
+        """docstring for start_sdb_server"""
+        call('sdb start-server', shell=True, timeout=10)
+        time.sleep(1)