Package tlib :: Package base :: Module TestHelper |
[hide private]
[frames] | no frames]

# Source Code for Module tlib.base.TestHelper

      1  import os
      2  import socket
      3  import subprocess
      4  import pytest
      5  import logging
      6  import tempfile
      7  from glob import glob
      8
      9 -class Singleton(type):
     10      _instances = {}
     11 -    def __call__(cls, *args, **kwargs):
     12          if cls not in cls._instances:
     13              cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
     14          return cls._instances[cls]
     15
     16
     17 -def tlib_folder():
     18      """
     19      Returns tlib's absolute path
     20      """
     21      file_folder = os.path.dirname(__file__)
     22      return os.path.abspath(os.path.join(file_folder, os.pardir))
     23
     24
     25 -def tlib_asset_folder():
     26      """
     27      Returns absolute path of tlib's asset folder
     28      """
     29      return os.path.abspath(os.path.join(tlib_folder(), "asset"))
     30
     31
     32 -def tlib_modules_folder():
     33      """
     34      Returns absolute path of folder containing all modules
     35      """
     36      return os.path.abspath(os.path.join(tlib_folder(), "base"))
     37
     38
     39 -def tlib_config_folder():
     40      """
     41      Returns absolute path of tlib's config folder
     42      """
     43      return os.path.abspath(os.path.join(tlib_folder(), "config"))
     44
     45
     46 -def tlib_template_folder():
     47      """
     48      Returns absolute path of tlib's template folder\n
     49      Template folder contains jinja templates used for generation of reports\n
     50      like screenshots
     51      """
     52      return os.path.abspath(os.path.join(tlib_folder(), "templates"))
     53
     54
     55 -def webdriver_chrome_executable(version="latest"):
     56      """
     57      Returns path to Chrome WebDriver executable
     58      """
     59      if version == "latest":
     60          #Find all cromedriver files and sort by filename
     61          path = os.path.join(tlib_asset_folder(), "selenium", "chromedriver_*.exe")
     62          r = sorted(glob(path))
     63          return os.path.join(tlib_asset_folder(), "selenium", r[-1])
     64      else:
     65          return os.path.join(tlib_asset_folder(), "selenium", "chromedriver_%s.exe" % version)
     66
     67
     68 -def webdriver_ie_executable():
     69      """
     70      Alias for webdriver_ie32_executable
     71      """
     72      return webdriver_ie32_executable();
     73
     74
     75 -def webdriver_ie32_executable():
     76      """
     77      Returns path to IE WebDriver executable
     78      """
     79      return os.path.join(tlib_asset_folder(), "selenium", "IE", "2.41.0", "Win32", "IEDriverServer.exe")
     80
     81 -def webdriver_ie64_executable():
     82      """
     83      Returns path to IE WebDriver executable
     84      """
     85      return os.path.join(tlib_asset_folder(), "selenium", "IE", "2.41.0", "x64", "IEDriverServer.exe")
     86
     87 -def android_server_apk():
     88      """
     89      Returns path to Webdriver for android
     90      """
     91      return os.path.join(tlib_asset_folder(), "selenium", "android-server-2.21.0.apk")
     92
     93
     94 -def selendroid_server_jar():
     95      """
     96      Returns path to selendroid jar for android native app
     97      """
     98      return os.path.join(tlib_asset_folder(), "selenium", "selendroid-standalone-0.9.0-with-dependencies.jar")
     99
    100
    101 -def is_valid_ip(ip):
    102      """
    103      Returns true if IP parameter is a valid IP address.\n
    104      Currently IPs in this format are valid:\n
    105      X.X.X.X\n
    106      X.X.X.X:PORT
    107
    108      @type ip: str
    109      @return: bool
    110      """
    111
    112      if ip is None:
    113          return False
    114
    115      try:
    116          (ip, port) = ip.split(":", 1)
    117      except ValueError:
    118          #There is no ':' in the string
    119          port = None
    120
    121      try:
    122          socket.inet_aton(ip)
    123      except socket.error:
    124          return False
    125
    126      if port is not None:
    127          try:
    128              return (int(port) >= 1) and (int(port) <= 65535)
    129          except ValueError:
    130              #Not a valid integer
    131              return False
    132
    133      return True
    134
    135 -def run_command(logger, command, shell=False, fail_on_error=True):
    136      """
    137      Run a command and skip test if exit code is not 0
    138
    139      Example:
    140      Run 'adb devices' and don't skip test if commands returns non-zero status
    141      run_command(logger, ["adb", "devices"], fail_on_error=False)
    142
    143      @param logger: logger for debugging purposes
    144      @type logger: logging.logger
    145      @param command: Command to run
    146      @type command: list
    147      @param fail_on_error: When True, skip test if command returned a non-zero exit code
    148      @type fail_on_error: bool
    149      @rtype: list
    150      @return: Returns a list with stdout and stderr output
    151      """
    152
    153      fd_out = tempfile.NamedTemporaryFile(delete=True)
    154      #With delete = True option, the files will be automatically removed after close
    155      fd_err = tempfile.NamedTemporaryFile(delete=True)
    156      try:
    157          process = subprocess.Popen(command, shell=shell, stdout=fd_out, stderr=fd_err)
    158      except WindowsError as e:
    159          logger.error(r"Problem running command, skipping test.\n%s" % e)
    160          # noinspection PyUnresolvedReferences
    161          if fail_on_error:
    162              pytest.fail(r"Problem running command, skipping test.\n%s" % e)
    163
    164      # noinspection PyUnboundLocalVariable
    165      process.communicate()
    166      fd_out.seek(0)
    167      fd_err.seek(0)
    168      out = (fd_out.read(), fd_err.read())
    169      fd_out.close()
    170      fd_err.close()
    171      errcode = process.returncode
    172
    173      if (errcode != 0) and fail_on_error:
    174          logger.error(r"Program  exited with code {errcode}, skipping test\n{out}".format(errcode=errcode, out=out))
    175          # noinspection PyUnresolvedReferences
    176          pytest.fail(r"Program exited with code {errcode}, skipping test\n{out}".format(errcode=errcode, out=out))
    177
    178      return out
    179
    180
    181 -def start_process(logger, command, shell=False):
    182      """
    183      Run a command and skip test if exit code is not 0
    184
    185      Example:
    186      Run 'adb devices' and don't skip test if commands returns non-zero status
    187      run_command(logger, ["adb", "devices"], fail_on_error=False)
    188
    189      @param logger: logger for debugging purposes
    190      @type logger: logging.logger
    191      @param command: Command to run
    192      @type command: list
    193      @param fail_on_error: When True, skip test if command returned a non-zero exit code
    194      @type fail_on_error: bool
    195      @rtype: list
    196      @return: Returns a list with stdout and stderr output
    197      """
    198
    199      try:
    200          process = subprocess.Popen(command, shell=shell)
    201      except WindowsError as e:
    202          logger.error(r"Problem running command, skipping test.\n%s" % e)
    203          # noinspection PyUnresolvedReferences
    204      return process
    205
    206 -def sort_list(l):
    207      """
    208      Sorts a list, and if the list has other objects inside, it will iterate over them
    209      @param l: list to sort
    210      @type l: list
    211      @return: sorted list
    212      @rtype: list
    213      """
    214      if type(l) is not list:
    215          pytest.fail("Parameter l is not a list")
    216
    217      for i, s in enumerate(l):
    218          if type(s) is list:
    219              l[i] = sort_list(s)
    220          if type(s) is dict:
    221              l[i] = sort_dict(s)
    222
    223      l.sort()
    224
    225      return l
    226
    227
    228 -def sort_dict(d):
    229      """
    230      Sorts a dictionary, and if the list has other objects inside, it will iterate over them
    231      @param d: dictionary to sort
    232      @type d: dict
    233      @return: sorted dictionary
    234      @rtype: dict
    235      """
    236      if type(d) is not dict:
    237          pytest.fail("Parameter d is not a dictionary")
    238
    239      for key in d.keys():
    240          if type(d[key]) is list:
    241              #Sort list
    242              d[key] = sort_list(d[key])
    243          elif type(d[key]) is dict:
    244              d[key] = sort_dict(d[key])
    245
    246      return d
    247