1 import os
2 import socket
3 import subprocess
4 import pytest
5 import logging
6 import tempfile
7
8 _author__ = 'Andres Osorio'
9
11 """
12 Returns tlib's absolute path
13 """
14 file_folder = os.path.dirname(__file__)
15 return os.path.abspath(os.path.join(file_folder, os.pardir))
16
17
19 """
20 Returns absolute path of tlib's asset folder
21 """
22 return os.path.abspath(os.path.join(tlib_folder(), "asset"))
23
24
26 """
27 Returns absolute path of tlib's config folder
28 """
29 return os.path.abspath(os.path.join(tlib_folder(), "config"))
30
31
33 """
34 Returns absolute path of tlib's template folder\n
35 Template folder contains jinja templates used for generation of reports\n
36 like screenshots
37 """
38 return os.path.abspath(os.path.join(tlib_folder(), "templates"))
39
40
42 """
43 Returns path to Chrome WebDriver executable
44 """
45 return os.path.join(tlib_asset_folder(), "selenium", "chromedriver.exe")
46
47
49 """
50 Returns path to IE WebDriver executable
51 """
52 return os.path.join(tlib_asset_folder(), "selenium", "IEDriverServer.exe")
53
54
56 """
57 Returns path to Webdriver for android
58 """
59 return os.path.join(tlib_asset_folder(), "selenium", "android-server-2.21.0.apk")
60
61
63 """
64 Returns true if IP parameter is a valid IP address.\n
65 Currently IPs in this format are valid:\n
66 X.X.X.X\n
67 X.X.X.X:PORT
68
69 @type ip: str
70 @return: bool
71 """
72
73 if ip is None:
74 return False
75
76 try:
77 (ip, port) = ip.split(":", 1)
78 except ValueError:
79
80 port = None
81
82 try:
83 socket.inet_aton(ip)
84 except socket.error:
85 return False
86
87 if port is not None:
88 try:
89 return (int(port) >= 1) and (int(port) <= 65535)
90 except ValueError:
91
92 return False
93
94 return True
95
97 """
98 Run a command and skip test if exit code is not 0
99
100 Example:
101 Run 'adb devices' and don't skip test if commands returns non-zero status
102 run_command(logger, ["adb", "devices"], fail_on_error=False)
103
104 @param logger: logger for debugging purposes
105 @type logger: logging.logger
106 @param command: Command to run
107 @type command: list
108 @param fail_on_error: When True, skip test if command returned a non-zero exit code
109 @type fail_on_error: bool
110 @rtype: list
111 @return: Returns a list with stdout and stderr output
112 """
113
114 fd_out = tempfile.NamedTemporaryFile(delete=True)
115
116 fd_err = tempfile.NamedTemporaryFile(delete=True)
117 try:
118 process = subprocess.Popen(command, stdout=fd_out, stderr=fd_err)
119 except WindowsError as e:
120 logger.error(r"Problem running command, skipping test.\n%s" % e)
121
122 if fail_on_error:
123 pytest.skip(r"Problem running command, skipping test.\n%s" % e)
124
125
126 process.communicate()
127 fd_out.seek(0)
128 fd_err.seek(0)
129 out = (fd_out.read(), fd_err.read())
130 fd_out.close()
131 fd_err.close()
132 errcode = process.returncode
133
134 if (errcode != 0) and fail_on_error:
135 logger.error(r"Program exited with code {errcode}, skipping test\n{out}".format(errcode=errcode, out=out))
136
137 pytest.skip(r"Program exited with code {errcode}, skipping test\n{out}".format(errcode=errcode, out=out))
138
139 return out
140