Chris@14
|
1 <?php
|
Chris@14
|
2 /**
|
Chris@14
|
3 * Copyright 2012-2017 Anthon Pang. All Rights Reserved.
|
Chris@14
|
4 *
|
Chris@14
|
5 * Licensed under the Apache License, Version 2.0 (the "License");
|
Chris@14
|
6 * you may not use this file except in compliance with the License.
|
Chris@14
|
7 * You may obtain a copy of the License at
|
Chris@14
|
8 *
|
Chris@14
|
9 * http://www.apache.org/licenses/LICENSE-2.0
|
Chris@14
|
10 *
|
Chris@14
|
11 * Unless required by applicable law or agreed to in writing, software
|
Chris@14
|
12 * distributed under the License is distributed on an "AS IS" BASIS,
|
Chris@14
|
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
Chris@14
|
14 * See the License for the specific language governing permissions and
|
Chris@14
|
15 * limitations under the License.
|
Chris@14
|
16 *
|
Chris@14
|
17 * @package WebDriver
|
Chris@14
|
18 *
|
Chris@14
|
19 * @author Anthon Pang <apang@softwaredevelopment.ca>
|
Chris@14
|
20 * @author Fabrizio Branca <mail@fabrizio-branca.de>
|
Chris@14
|
21 */
|
Chris@14
|
22
|
Chris@14
|
23 namespace WebDriver\SauceLabs;
|
Chris@14
|
24
|
Chris@14
|
25 use WebDriver\ServiceFactory;
|
Chris@14
|
26
|
Chris@14
|
27 /**
|
Chris@14
|
28 * WebDriver\SauceLabs\SauceRest class
|
Chris@14
|
29 *
|
Chris@14
|
30 * @package WebDriver
|
Chris@14
|
31 */
|
Chris@14
|
32 class SauceRest
|
Chris@14
|
33 {
|
Chris@14
|
34 /**
|
Chris@14
|
35 * @var string
|
Chris@14
|
36 */
|
Chris@14
|
37 private $userId;
|
Chris@14
|
38
|
Chris@14
|
39 /**
|
Chris@14
|
40 * @var string
|
Chris@14
|
41 */
|
Chris@14
|
42 private $accessKey;
|
Chris@14
|
43
|
Chris@14
|
44 /**
|
Chris@14
|
45 * Constructor
|
Chris@14
|
46 *
|
Chris@14
|
47 * @param string $userId Your Sauce user name
|
Chris@14
|
48 * @param string $accessKey Your Sauce API key
|
Chris@14
|
49 */
|
Chris@14
|
50 public function __construct($userId, $accessKey)
|
Chris@14
|
51 {
|
Chris@14
|
52 $this->userId = $userId;
|
Chris@14
|
53 $this->accessKey = $accessKey;
|
Chris@14
|
54 }
|
Chris@14
|
55
|
Chris@14
|
56 /**
|
Chris@14
|
57 * Execute Sauce Labs REST API command
|
Chris@14
|
58 *
|
Chris@14
|
59 * @param string $requestMethod HTTP request method
|
Chris@14
|
60 * @param string $url URL
|
Chris@14
|
61 * @param mixed $parameters Parameters
|
Chris@14
|
62 *
|
Chris@14
|
63 * @return mixed
|
Chris@14
|
64 *
|
Chris@14
|
65 * @throws \WebDriver\Exception\CurlExec
|
Chris@14
|
66 *
|
Chris@14
|
67 * @see http://saucelabs.com/docs/saucerest
|
Chris@14
|
68 */
|
Chris@14
|
69 protected function execute($requestMethod, $url, $parameters = null)
|
Chris@14
|
70 {
|
Chris@14
|
71 $extraOptions = array(
|
Chris@14
|
72 CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
|
Chris@14
|
73 CURLOPT_USERPWD => $this->userId . ':' . $this->accessKey,
|
Chris@14
|
74
|
Chris@14
|
75 // don't verify SSL certificates
|
Chris@14
|
76 CURLOPT_SSL_VERIFYPEER => false,
|
Chris@14
|
77 CURLOPT_SSL_VERIFYHOST => false,
|
Chris@14
|
78
|
Chris@14
|
79 CURLOPT_HTTPHEADER => array('Expect:'),
|
Chris@14
|
80 CURLOPT_FAILONERROR => true,
|
Chris@14
|
81 );
|
Chris@14
|
82
|
Chris@14
|
83 $url = 'https://saucelabs.com/rest/v1/' . $url;
|
Chris@14
|
84
|
Chris@14
|
85 list($rawResult, $info) = ServiceFactory::getInstance()->getService('service.curl')->execute($requestMethod, $url, $parameters, $extraOptions);
|
Chris@14
|
86
|
Chris@14
|
87 return json_decode($rawResult, true);
|
Chris@14
|
88 }
|
Chris@14
|
89
|
Chris@14
|
90 /**
|
Chris@14
|
91 * Get account details: /rest/v1/users/:userId (GET)
|
Chris@14
|
92 *
|
Chris@14
|
93 * @param string $userId
|
Chris@14
|
94 *
|
Chris@14
|
95 * @return array
|
Chris@14
|
96 */
|
Chris@14
|
97 public function getAccountDetails($userId)
|
Chris@14
|
98 {
|
Chris@14
|
99 return $this->execute('GET', 'users/' . $userId);
|
Chris@14
|
100 }
|
Chris@14
|
101
|
Chris@14
|
102 /**
|
Chris@14
|
103 * Check account limits: /rest/v1/limits (GET)
|
Chris@14
|
104 *
|
Chris@14
|
105 * @return array
|
Chris@14
|
106 */
|
Chris@14
|
107 public function getAccountLimits()
|
Chris@14
|
108 {
|
Chris@14
|
109 return $this->execute('GET', 'limits');
|
Chris@14
|
110 }
|
Chris@14
|
111
|
Chris@14
|
112 /**
|
Chris@14
|
113 * Create new sub-account: /rest/v1/users/:userId (POST)
|
Chris@14
|
114 *
|
Chris@14
|
115 * For "partners", $accountInfo also contains 'plan' => (one of 'free', 'small', 'team', 'com', or 'complus')
|
Chris@14
|
116 *
|
Chris@14
|
117 * @param array $accountInfo array('username' => ..., 'password' => ..., 'name' => ..., 'email' => ...)
|
Chris@14
|
118 *
|
Chris@14
|
119 * @return array array('access_key' => ..., 'minutes' => ..., 'id' => ...)
|
Chris@14
|
120 */
|
Chris@14
|
121 public function createSubAccount($accountInfo)
|
Chris@14
|
122 {
|
Chris@14
|
123 return $this->execute('POST', 'users/' . $this->userId, $accountInfo);
|
Chris@14
|
124 }
|
Chris@14
|
125
|
Chris@14
|
126 /**
|
Chris@14
|
127 * Update sub-account service plan: /rest/v1/users/:userId/subscription (POST)
|
Chris@14
|
128 *
|
Chris@14
|
129 * @param string $userId User ID
|
Chris@14
|
130 * @param string $plan Plan
|
Chris@14
|
131 *
|
Chris@14
|
132 * @return array
|
Chris@14
|
133 */
|
Chris@14
|
134 public function updateSubAccount($userId, $plan)
|
Chris@14
|
135 {
|
Chris@14
|
136 return $this->execute('POST', 'users/' . $userId . '/subscription', array('plan' => $plan));
|
Chris@14
|
137 }
|
Chris@14
|
138
|
Chris@14
|
139 /**
|
Chris@14
|
140 * Unsubscribe a sub-account: /rest/v1/users/:userId/subscription (DELETE)
|
Chris@14
|
141 *
|
Chris@14
|
142 * @param string $userId User ID
|
Chris@14
|
143 *
|
Chris@14
|
144 * @return array
|
Chris@14
|
145 */
|
Chris@14
|
146 public function unsubscribeSubAccount($userId)
|
Chris@14
|
147 {
|
Chris@14
|
148 return $this->execute('DELETE', 'users/' . $userId . '/subscription');
|
Chris@14
|
149 }
|
Chris@14
|
150
|
Chris@14
|
151 /**
|
Chris@14
|
152 * Get current account activity: /rest/v1/:userId/activity (GET)
|
Chris@14
|
153 *
|
Chris@14
|
154 * @return array
|
Chris@14
|
155 */
|
Chris@14
|
156 public function getActivity()
|
Chris@14
|
157 {
|
Chris@14
|
158 return $this->execute('GET', $this->userId . '/activity');
|
Chris@14
|
159 }
|
Chris@14
|
160
|
Chris@14
|
161 /**
|
Chris@14
|
162 * Get historical account usage: /rest/v1/:userId/usage (GET)
|
Chris@14
|
163 *
|
Chris@14
|
164 * @param string $start Optional start date YYYY-MM-DD
|
Chris@14
|
165 * @param string $end Optional end date YYYY-MM-DD
|
Chris@14
|
166 *
|
Chris@14
|
167 * @return array
|
Chris@14
|
168 */
|
Chris@14
|
169 public function getUsage($start = null, $end = null)
|
Chris@14
|
170 {
|
Chris@14
|
171 $query = http_build_query(array(
|
Chris@14
|
172 'start' => $start,
|
Chris@14
|
173 'end' => $end,
|
Chris@14
|
174 ));
|
Chris@14
|
175
|
Chris@14
|
176 return $this->execute('GET', $this->userId . '/usage' . (strlen($query) ? '?' . $query : ''));
|
Chris@14
|
177 }
|
Chris@14
|
178
|
Chris@14
|
179 /**
|
Chris@14
|
180 * Get jobs: /rest/v1/:userId/jobs (GET)
|
Chris@14
|
181 *
|
Chris@14
|
182 * @param boolean $full
|
Chris@14
|
183 *
|
Chris@14
|
184 * @return array
|
Chris@14
|
185 */
|
Chris@14
|
186 public function getJobs($full = null)
|
Chris@14
|
187 {
|
Chris@14
|
188 $query = http_build_query(array(
|
Chris@14
|
189 'full' => (isset($full) && $full) ? 'true' : null,
|
Chris@14
|
190 ));
|
Chris@14
|
191
|
Chris@14
|
192 return $this->execute('GET', $this->userId . '/jobs' . (strlen($query) ? '?' . $query : ''));
|
Chris@14
|
193 }
|
Chris@14
|
194
|
Chris@14
|
195 /**
|
Chris@14
|
196 * Get full information for job: /rest/v1/:userId/jobs/:jobId (GET)
|
Chris@14
|
197 *
|
Chris@14
|
198 * @param string $jobId
|
Chris@14
|
199 *
|
Chris@14
|
200 * @return array
|
Chris@14
|
201 */
|
Chris@14
|
202 public function getJob($jobId)
|
Chris@14
|
203 {
|
Chris@14
|
204 return $this->execute('GET', $this->userId . '/jobs/' . $jobId);
|
Chris@14
|
205 }
|
Chris@14
|
206
|
Chris@14
|
207 /**
|
Chris@14
|
208 * Update existing job: /rest/v1/:userId/jobs/:jobId (PUT)
|
Chris@14
|
209 *
|
Chris@14
|
210 * @param string $jobId Job ID
|
Chris@14
|
211 * @param array $jobInfo Job information
|
Chris@14
|
212 *
|
Chris@14
|
213 * @return array
|
Chris@14
|
214 */
|
Chris@14
|
215 public function updateJob($jobId, $jobInfo)
|
Chris@14
|
216 {
|
Chris@14
|
217 return $this->execute('PUT', $this->userId . '/jobs/' . $jobId, $jobInfo);
|
Chris@14
|
218 }
|
Chris@14
|
219
|
Chris@14
|
220 /**
|
Chris@14
|
221 * Stop job: /rest/v1/:userId/jobs/:jobId/stop (PUT)
|
Chris@14
|
222 *
|
Chris@14
|
223 * @param string $jobId
|
Chris@14
|
224 *
|
Chris@14
|
225 * @return array
|
Chris@14
|
226 */
|
Chris@14
|
227 public function stopJob($jobId)
|
Chris@14
|
228 {
|
Chris@14
|
229 return $this->execute('PUT', $this->userId . '/jobs/' . $jobId . '/stop');
|
Chris@14
|
230 }
|
Chris@14
|
231
|
Chris@14
|
232 /**
|
Chris@14
|
233 * Delete job: /rest/v1/:userId/jobs/:jobId (DELETE)
|
Chris@14
|
234 *
|
Chris@14
|
235 * @param string $jobId
|
Chris@14
|
236 *
|
Chris@14
|
237 * @return array
|
Chris@14
|
238 */
|
Chris@14
|
239 public function deleteJob($jobId)
|
Chris@14
|
240 {
|
Chris@14
|
241 return $this->execute('DELETE', $this->userId . '/jobs/' . $jobId);
|
Chris@14
|
242 }
|
Chris@14
|
243
|
Chris@14
|
244 /**
|
Chris@14
|
245 * Get running tunnels for a given user: /rest/v1/:userId/tunnels (GET)
|
Chris@14
|
246 *
|
Chris@14
|
247 * @return array
|
Chris@14
|
248 */
|
Chris@14
|
249 public function getTunnels()
|
Chris@14
|
250 {
|
Chris@14
|
251 return $this->execute('GET', $this->userId . '/tunnels');
|
Chris@14
|
252 }
|
Chris@14
|
253
|
Chris@14
|
254 /**
|
Chris@14
|
255 * Get full information for a tunnel: /rest/v1/:userId/tunnels/:tunnelId (GET)
|
Chris@14
|
256 *
|
Chris@14
|
257 * @param string $tunnelId
|
Chris@14
|
258 *
|
Chris@14
|
259 * @return array
|
Chris@14
|
260 */
|
Chris@14
|
261 public function getTunnel($tunnelId)
|
Chris@14
|
262 {
|
Chris@14
|
263 return $this->execute('GET', $this->userId . '/tunnels/' . $tunnelId);
|
Chris@14
|
264 }
|
Chris@14
|
265
|
Chris@14
|
266 /**
|
Chris@14
|
267 * Shut down a tunnel: /rest/v1/:userId/tunnels/:tunnelId (DELETE)
|
Chris@14
|
268 *
|
Chris@14
|
269 * @param string $tunnelId
|
Chris@14
|
270 *
|
Chris@14
|
271 * @return array
|
Chris@14
|
272 */
|
Chris@14
|
273 public function shutdownTunnel($tunnelId)
|
Chris@14
|
274 {
|
Chris@14
|
275 return $this->execute('DELETE', $this->userId . '/tunnels/' . $tunnelId);
|
Chris@14
|
276 }
|
Chris@14
|
277
|
Chris@14
|
278 /**
|
Chris@14
|
279 * Get current status of Sauce Labs' services: /rest/v1/info/status (GET)
|
Chris@14
|
280 *
|
Chris@14
|
281 * @return array array('wait_time' => ..., 'service_operational' => ..., 'status_message' => ...)
|
Chris@14
|
282 */
|
Chris@14
|
283 public function getStatus()
|
Chris@14
|
284 {
|
Chris@14
|
285 return $this->execute('GET', 'info/status');
|
Chris@14
|
286 }
|
Chris@14
|
287
|
Chris@14
|
288 /**
|
Chris@14
|
289 * Get currently supported browsers: /rest/v1/info/browsers (GET)
|
Chris@14
|
290 *
|
Chris@14
|
291 * @param string $termination Optional termination (one of "all", "selenium-rc", or "webdriver')
|
Chris@14
|
292 *
|
Chris@14
|
293 * @return array
|
Chris@14
|
294 */
|
Chris@14
|
295 public function getBrowsers($termination = false)
|
Chris@14
|
296 {
|
Chris@14
|
297 if ($termination) {
|
Chris@14
|
298 return $this->execute('GET', 'info/browsers/' . $termination);
|
Chris@14
|
299 }
|
Chris@14
|
300
|
Chris@14
|
301 return $this->execute('GET', 'info/browsers');
|
Chris@14
|
302 }
|
Chris@14
|
303
|
Chris@14
|
304 /**
|
Chris@14
|
305 * Get number of tests executed so far on Sauce Labs: /rest/v1/info/counter (GET)
|
Chris@14
|
306 *
|
Chris@14
|
307 * @return array
|
Chris@14
|
308 */
|
Chris@14
|
309 public function getCounter()
|
Chris@14
|
310 {
|
Chris@14
|
311 return $this->execute('GET', 'info/counter');
|
Chris@14
|
312 }
|
Chris@14
|
313 }
|