diff options
author | BlueRaja <BlueRaja.admin@gmail.com> | 2015-05-07 23:14:47 -0500 |
---|---|---|
committer | BlueRaja <BlueRaja.admin@gmail.com> | 2015-05-07 23:14:47 -0500 |
commit | 3dc3919ce1b5336861979cde56884842615c967b (patch) | |
tree | f0a2418290cecd15f20c834bb071ffa9f3694b09 /includes/google-api-php-client-master/tests/general/IoTest.php | |
parent | 29e872fbc6c552ef02208fe9fa5416b69773aa38 (diff) | |
parent | c517b645c8723b5f4d20cbb91cbc4b9f45579cbb (diff) | |
download | pathery-3dc3919ce1b5336861979cde56884842615c967b.tar.xz |
Merge branch 'master' of git.raylu.net:pathery
Diffstat (limited to 'includes/google-api-php-client-master/tests/general/IoTest.php')
-rw-r--r-- | includes/google-api-php-client-master/tests/general/IoTest.php | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/includes/google-api-php-client-master/tests/general/IoTest.php b/includes/google-api-php-client-master/tests/general/IoTest.php new file mode 100644 index 0000000..212219e --- /dev/null +++ b/includes/google-api-php-client-master/tests/general/IoTest.php @@ -0,0 +1,381 @@ +<?php +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +class IoTest extends BaseTest +{ + + public function testExecutorSelection() + { + $default = function_exists('curl_version') ? 'Google_IO_Curl' : 'Google_IO_Stream'; + $client = $this->getClient(); + $this->assertInstanceOf($default, $client->getIo()); + $config = new Google_Config(); + $config->setIoClass('Google_IO_Stream'); + $client = new Google_Client($config); + $this->assertInstanceOf('Google_IO_Stream', $client->getIo()); + } + + public function testStreamSetTimeout() + { + $io = new Google_IO_Stream($this->getClient()); + $this->timeoutChecker($io); + } + + public function testStreamParseHttpResponseBody() + { + $io = new Google_IO_Stream($this->getClient()); + $this->responseChecker($io); + } + + public function testStreamProcessEntityRequest() + { + $client = $this->getClient(); + $io = new Google_IO_Stream($client); + $this->processEntityRequest($io, $client); + } + + public function testStreamCacheHit() + { + $client = $this->getClient(); + $io = new Google_IO_Stream($client); + $this->cacheHit($io, $client); + } + + public function testStreamAuthCache() + { + $client = $this->getClient(); + $io = new Google_IO_Stream($client); + $this->authCache($io, $client); + } + + /** + * @expectedException Google_IO_Exception + */ + public function testStreamInvalidRequest() + { + $io = new Google_IO_Stream($this->getClient()); + $this->invalidRequest($io); + } + + public function testCurlSetTimeout() + { + if (!function_exists('curl_version')) { + $this->markTestSkipped('cURL not present'); + } + $io = new Google_IO_Curl($this->getClient()); + $this->timeoutChecker($io); + } + + public function testCurlParseHttpResponseBody() + { + if (!function_exists('curl_version')) { + $this->markTestSkipped('cURL not present'); + } + $io = new Google_IO_Curl($this->getClient()); + $this->responseChecker($io); + } + + public function testCurlProcessEntityRequest() + { + if (!function_exists('curl_version')) { + $this->markTestSkipped('cURL not present'); + } + $client = $this->getClient(); + $io = new Google_IO_Curl($client); + $this->processEntityRequest($io, $client); + } + + public function testCurlCacheHit() + { + if (!function_exists('curl_version')) { + $this->markTestSkipped('cURL not present'); + } + $client = $this->getClient(); + $io = new Google_IO_Curl($client); + $this->cacheHit($io, $client); + } + + public function testCurlAuthCache() + { + if (!function_exists('curl_version')) { + $this->markTestSkipped('cURL not present'); + } + $client = $this->getClient(); + $io = new Google_IO_Curl($client); + $this->authCache($io, $client); + } + + /** + * @expectedException Google_IO_Exception + */ + public function testCurlInvalidRequest() + { + if (!function_exists('curl_version')) { + $this->markTestSkipped('cURL not present'); + } + $io = new Google_IO_Curl($this->getClient()); + $this->invalidRequest($io); + } + + public function testCacheRevalidate() + { + $client = $this->getClient(); + + $req = new Google_Http_Request('/test', 'GET'); + $req->setRequestHeaders(array('Accept' => '*/*')); + $req->setResponseBody('{"a": "foo"}'); + $req->setResponseHttpCode(200); + $req->setResponseHeaders( + array( + 'cache-control' => 'private', + 'etag' => '"this-is-an-etag"', + 'expires' => '-1', + 'date' => 'Sun, 1 Jan 2012 09:00:56 GMT', + 'content-type' => 'application/json; charset=UTF-8', + ) + ); + + $io = $this->getMockBuilder('Google_IO_Abstract') + ->setConstructorArgs(array($client)) + ->setMethods( + array( + 'getCachedRequest', + 'checkMustRevalidateCachedRequest' + ) + ) + ->getMockForAbstractClass(); + + $io->expects($this->once()) + ->method('getCachedRequest') + ->will($this->returnValue($req)); + + $io->expects($this->once()) + ->method('checkMustRevalidateCachedRequest') + ->will($this->returnValue(true)); + + $io->expects($this->once()) + ->method('executeRequest') + ->will( + $this->returnValue( + array( + '{"a": "foo"}', + array( + 'te' => 'gzip', + 'connection' => 'Keep-Alive, Foo, Bar', + 'foo' => '123', + 'keep-alive' => 'timeout=30', + 'cache-control' => 'private', + 'eTag' => '"this-is-a-new-etag"', + "expires" => 'Sun, 22 Jan 2022 09:00:56 GMT', + 'date' => 'Sun, 1 Jan 2012 09:00:56 GMT', + 'content-type' => 'application/json; charset=UTF-8', + ), + 304 + ) + ) + ); + + $res = $io->makeRequest(new Google_Http_Request('/test', 'GET')); + + $this->assertEquals('{"a": "foo"}', $res->getResponseBody()); + $this->assertEquals(200, $res->getResponseHttpCode()); + $this->assertEquals( + array( + 'cache-control' => 'private', + 'etag' => '"this-is-a-new-etag"', + "expires" => 'Sun, 22 Jan 2022 09:00:56 GMT', + 'date' => 'Sun, 1 Jan 2012 09:00:56 GMT', + 'content-type' => 'application/json; charset=UTF-8', + ), + $res->getResponseHeaders() + ); + } + + // Asserting Functions + + public function timeoutChecker($io) + { + $this->assertEquals(100, $io->getTimeout()); + $io->setTimeout(120); + $this->assertEquals(120, $io->getTimeout()); + } + + public function invalidRequest($io) + { + $url = "http://localhost:1"; + $req = new Google_Http_Request($url, "GET"); + $io->makeRequest($req); + } + + public function cacheHit($io, $client) + { + $url = "http://www.googleapis.com"; + // Create a cacheable request/response. + // Should not be revalidated. + $cacheReq = new Google_Http_Request($url, "GET"); + $cacheReq->setRequestHeaders( + array("Accept" => "*/*",) + ); + $cacheReq->setResponseBody("{\"a\": \"foo\"}"); + $cacheReq->setResponseHttpCode(200); + $cacheReq->setResponseHeaders( + array( + "Cache-Control" => "private", + "ETag" => "\"this-is-an-etag\"", + "Expires" => "Sun, 22 Jan 2022 09:00:56 GMT", + "Date" => "Sun, 1 Jan 2012 09:00:56 GMT", + "Content-Type" => "application/json; charset=UTF-8", + ) + ); + + // Populate the cache. + $io->setCachedRequest($cacheReq); + + // Execute the same mock request, and expect a cache hit. + $res = $io->makeRequest(new Google_Http_Request($url, "GET")); + $this->assertEquals("{\"a\": \"foo\"}", $res->getResponseBody()); + $this->assertEquals(200, $res->getResponseHttpCode()); + } + + public function authCache($io, $client) + { + $url = "http://www.googleapis.com/protected/resource"; + + // Create a cacheable request/response, but it should not be cached. + $cacheReq = new Google_Http_Request($url, "GET"); + $cacheReq->setRequestHeaders( + array( + "Accept" => "*/*", + "Authorization" => "Bearer Foo" + ) + ); + $cacheReq->setResponseBody("{\"a\": \"foo\"}"); + $cacheReq->setResponseHttpCode(200); + $cacheReq->setResponseHeaders( + array( + "Cache-Control" => "private", + "ETag" => "\"this-is-an-etag\"", + "Expires" => "Sun, 22 Jan 2022 09:00:56 GMT", + "Date: Sun, 1 Jan 2012 09:00:56 GMT", + "Content-Type" => "application/json; charset=UTF-8", + ) + ); + + $result = $io->setCachedRequest($cacheReq); + $this->assertFalse($result); + } + + public function responseChecker($io) + { + $hasQuirk = false; + if (function_exists('curl_version')) { + $curlVer = curl_version(); + $hasQuirk = $curlVer['version_number'] < Google_IO_Curl::NO_QUIRK_VERSION; + } + + $rawHeaders = "HTTP/1.1 200 OK\r\n" + . "Expires: Sun, 22 Jan 2012 09:00:56 GMT\r\n" + . "Date: Sun, 22 Jan 2012 09:00:56 GMT\r\n" + . "Content-Type: application/json; charset=UTF-8\r\n"; + $size = strlen($rawHeaders); + $rawBody = "{}"; + + $rawResponse = "$rawHeaders\r\n$rawBody"; + list($headers, $body) = $io->parseHttpResponse($rawResponse, $size); + $this->assertEquals(3, sizeof($headers)); + $this->assertEquals(array(), json_decode($body, true)); + + // Test empty bodies. + $rawResponse = $rawHeaders . "\r\n"; + list($headers, $body) = $io->parseHttpResponse($rawResponse, $size); + $this->assertEquals(3, sizeof($headers)); + $this->assertEquals(null, json_decode($body, true)); + + // Test no content. + $rawerHeaders = "HTTP/1.1 204 No Content\r\n" + . "Date: Fri, 19 Sep 2014 15:52:14 GMT"; + list($headers, $body) = $io->parseHttpResponse($rawerHeaders, 0); + $this->assertEquals(1, sizeof($headers)); + $this->assertEquals(null, json_decode($body, true)); + + // Test transforms from proxies. + $connection_established_headers = array( + "HTTP/1.0 200 Connection established\r\n\r\n", + "HTTP/1.1 200 Connection established\r\n\r\n", + ); + foreach ($connection_established_headers as $established_header) { + $rawHeaders = "{$established_header}HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n"; + $headersSize = strlen($rawHeaders); + // If we have a broken cURL version we have to simulate it to get the + // correct test result. + if ($hasQuirk && get_class($io) === 'Google_IO_Curl') { + $headersSize -= strlen($established_header); + } + $rawBody = "{}"; + + $rawResponse = "$rawHeaders\r\n$rawBody"; + list($headers, $body) = $io->parseHttpResponse($rawResponse, $headersSize); + $this->assertEquals(1, sizeof($headers)); + $this->assertEquals(array(), json_decode($body, true)); + } + } + + public function processEntityRequest($io, $client) + { + $req = new Google_Http_Request("http://localhost.com"); + $req->setRequestMethod("POST"); + + // Verify that the content-length is calculated. + $req->setPostBody("{}"); + $io->processEntityRequest($req); + $this->assertEquals(2, $req->getRequestHeader("content-length")); + + // Test an empty post body. + $req->setPostBody(""); + $io->processEntityRequest($req); + $this->assertEquals(0, $req->getRequestHeader("content-length")); + + // Test a null post body. + $req->setPostBody(null); + $io->processEntityRequest($req); + $this->assertEquals(0, $req->getRequestHeader("content-length")); + + // Set an array in the postbody, and verify that it is url-encoded. + $req->setPostBody(array("a" => "1", "b" => 2)); + $io->processEntityRequest($req); + $this->assertEquals(7, $req->getRequestHeader("content-length")); + $this->assertEquals( + Google_IO_Abstract::FORM_URLENCODED, + $req->getRequestHeader("content-type") + ); + $this->assertEquals("a=1&b=2", $req->getPostBody()); + + // Verify that the content-type isn't reset. + $payload = array("a" => "1", "b" => 2); + $req->setPostBody($payload); + $req->setRequestHeaders(array("content-type" => "multipart/form-data")); + $io->processEntityRequest($req); + $this->assertEquals( + "multipart/form-data", + $req->getRequestHeader("content-type") + ); + $this->assertEquals($payload, $req->getPostBody()); + } +} |