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
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 folder containing all modules
28 """
29 return os.path.abspath(os.path.join(tlib_folder(), "base"))
30
31
33 """
34 Returns absolute path of tlib's config folder
35 """
36 return os.path.abspath(os.path.join(tlib_folder(), "config"))
37
38
40 """
41 Returns absolute path of tlib's template folder\n
42 Template folder contains jinja templates used for generation of reports\n
43 like screenshots
44 """
45 return os.path.abspath(os.path.join(tlib_folder(), "templates"))
46
47
49 """
50 Returns path to Chrome WebDriver executable
51 """
52 if version == "latest":
53
54 path = os.path.join(tlib_asset_folder(), "selenium", "chromedriver_*.exe")
55 r = sorted(glob(path))
56 return os.path.join(tlib_asset_folder(), "selenium", r[-1])
57 else:
58 return os.path.join(tlib_asset_folder(), "selenium", "chromedriver_%s.exe" % version)
59
60
66
67
69 """
70 Returns path to IE WebDriver executable
71 """
72 return os.path.join(tlib_asset_folder(), "selenium", "IE", "2.41.0", "Win32", "IEDriverServer.exe")
73
74
76 """
77 Returns path to IE WebDriver executable
78 """
79 return os.path.join(tlib_asset_folder(), "selenium", "IE", "2.41.0", "x64", "IEDriverServer.exe")
80
81
83 """
84 Returns path to Webdriver for android
85 """
86 return os.path.join(tlib_asset_folder(), "selenium", "android-server-2.21.0.apk")
87
88
90 """
91 Returns true if IP parameter is a valid IP address.\n
92 Currently IPs in this format are valid:\n
93 X.X.X.X\n
94 X.X.X.X:PORT
95
96 @type ip: str
97 @return: bool
98 """
99
100 if ip is None:
101 return False
102
103 try:
104 (ip, port) = ip.split(":", 1)
105 except ValueError:
106
107 port = None
108
109 try:
110 socket.inet_aton(ip)
111 except socket.error:
112 return False
113
114 if port is not None:
115 try:
116 return (int(port) >= 1) and (int(port) <= 65535)
117 except ValueError:
118
119 return False
120
121 return True
122
123
125 """
126 Run a command and skip test if exit code is not 0
127
128 Example:
129 Run 'adb devices' and don't skip test if commands returns non-zero status
130 run_command(logger, ["adb", "devices"], fail_on_error=False)
131
132 @param logger: logger for debugging purposes
133 @type logger: logging.logger
134 @param command: Command to run
135 @type command: list
136 @param fail_on_error: When True, skip test if command returned a non-zero exit code
137 @type fail_on_error: bool
138 @rtype: list
139 @return: Returns a list with stdout and stderr output
140 """
141
142 fd_out = tempfile.NamedTemporaryFile(delete=True)
143
144 fd_err = tempfile.NamedTemporaryFile(delete=True)
145 try:
146 process = subprocess.Popen(command, stdout=fd_out, stderr=fd_err)
147 except WindowsError as e:
148 logger.error(r"Problem running command, skipping test.\n%s" % e)
149
150 if fail_on_error:
151 pytest.fail(r"Problem running command, skipping test.\n%s" % e)
152
153
154 process.communicate()
155 fd_out.seek(0)
156 fd_err.seek(0)
157 out = (fd_out.read(), fd_err.read())
158 fd_out.close()
159 fd_err.close()
160 errcode = process.returncode
161
162 if (errcode != 0) and fail_on_error:
163 logger.error(r"Program exited with code {errcode}, skipping test\n{out}".format(errcode=errcode, out=out))
164
165 pytest.fail(r"Program exited with code {errcode}, skipping test\n{out}".format(errcode=errcode, out=out))
166
167 return out
168
169
171 """
172 Sorts a list, and if the list has other objects inside, it will iterate over them
173 @param l: list to sort
174 @type l: list
175 @return: sorted list
176 @rtype: list
177 """
178 if type(l) is not list:
179 pytest.fail("Parameter l is not a list")
180
181 for i, s in enumerate(l):
182 if type(s) is list:
183 l[i] = sort_list(s)
184 if type(s) is dict:
185 l[i] = sort_dict(s)
186
187 l.sort()
188
189 return l
190
191
193 """
194 Sorts a dictionary, and if the list has other objects inside, it will iterate over them
195 @param d: dictionary to sort
196 @type d: dict
197 @return: sorted dictionary
198 @rtype: dict
199 """
200 if type(d) is not dict:
201 pytest.fail("Parameter d is not a dictionary")
202
203 for key in d.keys():
204 if type(d[key]) is list:
205
206 d[key] = sort_list(d[key])
207 elif type(d[key]) is dict:
208 d[key] = sort_dict(d[key])
209
210 return d
211