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