Chris@14: Chris@14: * @author Fabrizio Branca Chris@14: */ Chris@14: Chris@14: namespace WebDriver\SauceLabs; Chris@14: Chris@14: use WebDriver\ServiceFactory; Chris@14: Chris@14: /** Chris@14: * WebDriver\SauceLabs\SauceRest class Chris@14: * Chris@14: * @package WebDriver Chris@14: */ Chris@14: class SauceRest Chris@14: { Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $userId; Chris@14: Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $accessKey; Chris@14: Chris@14: /** Chris@14: * Constructor Chris@14: * Chris@14: * @param string $userId Your Sauce user name Chris@14: * @param string $accessKey Your Sauce API key Chris@14: */ Chris@14: public function __construct($userId, $accessKey) Chris@14: { Chris@14: $this->userId = $userId; Chris@14: $this->accessKey = $accessKey; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Execute Sauce Labs REST API command Chris@14: * Chris@14: * @param string $requestMethod HTTP request method Chris@14: * @param string $url URL Chris@14: * @param mixed $parameters Parameters Chris@14: * Chris@14: * @return mixed Chris@14: * Chris@14: * @throws \WebDriver\Exception\CurlExec Chris@14: * Chris@14: * @see http://saucelabs.com/docs/saucerest Chris@14: */ Chris@14: protected function execute($requestMethod, $url, $parameters = null) Chris@14: { Chris@14: $extraOptions = array( Chris@14: CURLOPT_HTTPAUTH => CURLAUTH_BASIC, Chris@14: CURLOPT_USERPWD => $this->userId . ':' . $this->accessKey, Chris@14: Chris@14: // don't verify SSL certificates Chris@14: CURLOPT_SSL_VERIFYPEER => false, Chris@14: CURLOPT_SSL_VERIFYHOST => false, Chris@14: Chris@14: CURLOPT_HTTPHEADER => array('Expect:'), Chris@14: CURLOPT_FAILONERROR => true, Chris@14: ); Chris@14: Chris@14: $url = 'https://saucelabs.com/rest/v1/' . $url; Chris@14: Chris@14: list($rawResult, $info) = ServiceFactory::getInstance()->getService('service.curl')->execute($requestMethod, $url, $parameters, $extraOptions); Chris@14: Chris@14: return json_decode($rawResult, true); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get account details: /rest/v1/users/:userId (GET) Chris@14: * Chris@14: * @param string $userId Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getAccountDetails($userId) Chris@14: { Chris@14: return $this->execute('GET', 'users/' . $userId); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Check account limits: /rest/v1/limits (GET) Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getAccountLimits() Chris@14: { Chris@14: return $this->execute('GET', 'limits'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Create new sub-account: /rest/v1/users/:userId (POST) Chris@14: * Chris@14: * For "partners", $accountInfo also contains 'plan' => (one of 'free', 'small', 'team', 'com', or 'complus') Chris@14: * Chris@14: * @param array $accountInfo array('username' => ..., 'password' => ..., 'name' => ..., 'email' => ...) Chris@14: * Chris@14: * @return array array('access_key' => ..., 'minutes' => ..., 'id' => ...) Chris@14: */ Chris@14: public function createSubAccount($accountInfo) Chris@14: { Chris@14: return $this->execute('POST', 'users/' . $this->userId, $accountInfo); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Update sub-account service plan: /rest/v1/users/:userId/subscription (POST) Chris@14: * Chris@14: * @param string $userId User ID Chris@14: * @param string $plan Plan Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function updateSubAccount($userId, $plan) Chris@14: { Chris@14: return $this->execute('POST', 'users/' . $userId . '/subscription', array('plan' => $plan)); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Unsubscribe a sub-account: /rest/v1/users/:userId/subscription (DELETE) Chris@14: * Chris@14: * @param string $userId User ID Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function unsubscribeSubAccount($userId) Chris@14: { Chris@14: return $this->execute('DELETE', 'users/' . $userId . '/subscription'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get current account activity: /rest/v1/:userId/activity (GET) Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getActivity() Chris@14: { Chris@14: return $this->execute('GET', $this->userId . '/activity'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get historical account usage: /rest/v1/:userId/usage (GET) Chris@14: * Chris@14: * @param string $start Optional start date YYYY-MM-DD Chris@14: * @param string $end Optional end date YYYY-MM-DD Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getUsage($start = null, $end = null) Chris@14: { Chris@14: $query = http_build_query(array( Chris@14: 'start' => $start, Chris@14: 'end' => $end, Chris@14: )); Chris@14: Chris@14: return $this->execute('GET', $this->userId . '/usage' . (strlen($query) ? '?' . $query : '')); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get jobs: /rest/v1/:userId/jobs (GET) Chris@14: * Chris@14: * @param boolean $full Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getJobs($full = null) Chris@14: { Chris@14: $query = http_build_query(array( Chris@14: 'full' => (isset($full) && $full) ? 'true' : null, Chris@14: )); Chris@14: Chris@14: return $this->execute('GET', $this->userId . '/jobs' . (strlen($query) ? '?' . $query : '')); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get full information for job: /rest/v1/:userId/jobs/:jobId (GET) Chris@14: * Chris@14: * @param string $jobId Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getJob($jobId) Chris@14: { Chris@14: return $this->execute('GET', $this->userId . '/jobs/' . $jobId); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Update existing job: /rest/v1/:userId/jobs/:jobId (PUT) Chris@14: * Chris@14: * @param string $jobId Job ID Chris@14: * @param array $jobInfo Job information Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function updateJob($jobId, $jobInfo) Chris@14: { Chris@14: return $this->execute('PUT', $this->userId . '/jobs/' . $jobId, $jobInfo); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Stop job: /rest/v1/:userId/jobs/:jobId/stop (PUT) Chris@14: * Chris@14: * @param string $jobId Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function stopJob($jobId) Chris@14: { Chris@14: return $this->execute('PUT', $this->userId . '/jobs/' . $jobId . '/stop'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Delete job: /rest/v1/:userId/jobs/:jobId (DELETE) Chris@14: * Chris@14: * @param string $jobId Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function deleteJob($jobId) Chris@14: { Chris@14: return $this->execute('DELETE', $this->userId . '/jobs/' . $jobId); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get running tunnels for a given user: /rest/v1/:userId/tunnels (GET) Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getTunnels() Chris@14: { Chris@14: return $this->execute('GET', $this->userId . '/tunnels'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get full information for a tunnel: /rest/v1/:userId/tunnels/:tunnelId (GET) Chris@14: * Chris@14: * @param string $tunnelId Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getTunnel($tunnelId) Chris@14: { Chris@14: return $this->execute('GET', $this->userId . '/tunnels/' . $tunnelId); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Shut down a tunnel: /rest/v1/:userId/tunnels/:tunnelId (DELETE) Chris@14: * Chris@14: * @param string $tunnelId Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function shutdownTunnel($tunnelId) Chris@14: { Chris@14: return $this->execute('DELETE', $this->userId . '/tunnels/' . $tunnelId); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get current status of Sauce Labs' services: /rest/v1/info/status (GET) Chris@14: * Chris@14: * @return array array('wait_time' => ..., 'service_operational' => ..., 'status_message' => ...) Chris@14: */ Chris@14: public function getStatus() Chris@14: { Chris@14: return $this->execute('GET', 'info/status'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get currently supported browsers: /rest/v1/info/browsers (GET) Chris@14: * Chris@14: * @param string $termination Optional termination (one of "all", "selenium-rc", or "webdriver') Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getBrowsers($termination = false) Chris@14: { Chris@14: if ($termination) { Chris@14: return $this->execute('GET', 'info/browsers/' . $termination); Chris@14: } Chris@14: Chris@14: return $this->execute('GET', 'info/browsers'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get number of tests executed so far on Sauce Labs: /rest/v1/info/counter (GET) Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getCounter() Chris@14: { Chris@14: return $this->execute('GET', 'info/counter'); Chris@14: } Chris@14: }