123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- <?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);
- }
- public function testStreamCacheHit()
- {
- $client = $this->getClient();
- $io = new Google_IO_Stream($client);
- $this->cacheHit($io);
- }
- public function testStreamAuthCache()
- {
- $client = $this->getClient();
- $io = new Google_IO_Stream($client);
- $this->authCache($io);
- }
- /**
- * @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);
- }
- 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);
- }
- 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);
- }
- /**
- * @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)
- {
- $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)
- {
- $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)
- {
- $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());
- }
- }
|