* * For more information visit https://developer.akamai.com * * Copyright 2014 Akamai Technologies, Inc. All rights reserved. * * Licensed 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. */ namespace Akamai\Open\EdgeGrid\Tests\Handler; use GuzzleHttp\Psr7\Response; use Akamai\Open\EdgeGrid\Client; class DebugTest extends \PHPUnit_Framework_TestCase { public function teardown() { Client::setDebug(false); } public function testInstanceDebug() { $handler = $this->getMockHandler([new Response(400, [], json_encode(['detail' => 'error info']))]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $client->setAuth('test', 'test', 'test'); $fp = fopen('php://memory', 'a+'); $client->setInstanceDebug($fp); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = << [ERROR] Call to /error failed with a 400 Bad Request result ===> [ERROR] This indicates a problem with authentication or headers. ===> [ERROR] Please ensure that the .edgerc file is formatted correctly. ===> [ERROR] If you still have issues, please use gen_edgerc.php to generate the credentials ===> [ERROR] Problem details: error info EOF; $this->assertEquals($expectedOutput, $output); } public function testStaticDebug() { $handler = $this->getMockHandler([new Response(400, [], json_encode(['detail' => 'error info']))]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $client->setAuth('test', 'test', 'test'); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = << [ERROR] Call to /error failed with a 400 Bad Request result ===> [ERROR] This indicates a problem with authentication or headers. ===> [ERROR] Please ensure that the .edgerc file is formatted correctly. ===> [ERROR] If you still have issues, please use gen_edgerc.php to generate the credentials ===> [ERROR] Problem details: error info EOF; $this->assertEquals($expectedOutput, $output); } public function testDebugOverride() { $handler = $this->getMockHandler([new Response(400, [], json_encode(['detail' => 'error string']))]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); $client->setInstanceDebug(false); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = ""; $this->assertEquals($expectedOutput, $output); } public function testInstanceOverrideStream() { $handler = $this->getMockHandler([new Response(400, [], json_encode(['detail' => 'error string']))]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); $fp2 = fopen('php://memory', 'a+'); $client->setInstanceDebug($fp2); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = ""; $this->assertEquals($expectedOutput, $output); $output = $this->readStreamData($fp2); $expectedOutput = << [ERROR] Call to /error failed with a 400 Bad Request result ===> [ERROR] This indicates a problem with authentication or headers. ===> [ERROR] Please ensure that the .edgerc file is formatted correctly. ===> [ERROR] If you still have issues, please use gen_edgerc.php to generate the credentials ===> [ERROR] Problem details: error string EOF; $this->assertEquals($expectedOutput, $output); } public function testDebugMessages() { $handler = $this->getMockHandler([ new Response(400, [], json_encode(['detail' => 'error message 1'])), new Response(401, [], json_encode(['detail' => 'error message 2'])), new Response(403, [], json_encode(['detail' => 'error message 3'])), new Response(404, [], json_encode(['detail' => 'error message 4'])) ]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $client->setAuth('test', 'test', 'test'); $fp = fopen('php://memory', 'a+'); $client->setInstanceDebug($fp); ob_start(); try { $client->get('/400'); } catch (\Exception $e) { } try { $client->get('/401'); } catch (\Exception $e) { } try { $client->get('/403'); } catch (\Exception $e) { } try { $client->get('/404'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = << [ERROR] Call to /400 failed with a 400 Bad Request result ===> [ERROR] This indicates a problem with authentication or headers. ===> [ERROR] Please ensure that the .edgerc file is formatted correctly. ===> [ERROR] If you still have issues, please use gen_edgerc.php to generate the credentials ===> [ERROR] Problem details: error message 1 ===> [ERROR] Call to /401 failed with a 401 Unauthorized result ===> [ERROR] This indicates a problem with authentication or headers. ===> [ERROR] Please ensure that the .edgerc file is formatted correctly. ===> [ERROR] If you still have issues, please use gen_edgerc.php to generate the credentials ===> [ERROR] Problem details: error message 2 ===> [ERROR] Call to /403 failed with a 403 Forbidden result ===> [ERROR] This indicates a problem with authorization. ===> [ERROR] Please ensure that the credentials you created for this script ===> [ERROR] have the necessary permissions in the Luna portal. ===> [ERROR] Problem details: error message 3 ===> [ERROR] Call to /404 failed with a 404 Not Found result ===> [ERROR] This means that the page does not exist as requested. ===> [ERROR] Please ensure that the URL you're calling is correctly formatted ===> [ERROR] or look at other examples to make sure yours matches. ===> [ERROR] Problem details: error message 4 EOF; $this->assertEquals($expectedOutput, $output); } public function testResponseNoDetail() { $handler = $this->getMockHandler([new Response(500, [], json_encode(['nodetail' => 'error info']))]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $client->setAuth('test', 'test', 'test'); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = << [ERROR] Call to /error failed with a 500 Internal Server Error result ===> [ERROR] Problem details: { "nodetail": "error info" } EOF; $this->assertEquals($expectedOutput, $output); } public function testResponseNoBody() { $handler = $this->getMockHandler([new Response(500, [])]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $client->setAuth('test', 'test', 'test'); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = << [ERROR] Call to /error failed with a 500 Internal Server Error result ===> [ERROR] Problem details: No response body returned EOF; $this->assertEquals($expectedOutput, $output); } public function testResponseNoJsonBody() { $handler = $this->getMockHandler([new Response(500, [], "error info")]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $client->setAuth('test', 'test', 'test'); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\Exception $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $expectedOutput = << [ERROR] Call to /error failed with a 500 Internal Server Error result ===> [ERROR] Problem details: error info EOF; $this->assertEquals($expectedOutput, $output); } public function testStringResource() { $handler = new \Akamai\Open\EdgeGrid\Handler\Debug('php://stdout'); $fp = \PHPUnit_Framework_Assert::readAttribute($handler, 'fp'); $this->assertEquals('php://stdout', stream_get_meta_data($fp)['uri']); } /** * @expectedException \Akamai\Open\EdgeGrid\Exception\HandlerException\IOException * @expectedExceptionMessage Unable to use resource: fake://stream */ public function testInvalidStringResource() { $handler = new \Akamai\Open\EdgeGrid\Handler\Debug('fake://stream'); } public function testDebugResponseExceptionNoCode() { $handler = $this->getMockHandler([ new \GuzzleHttp\Exception\RequestException("Error message", new \GuzzleHttp\Psr7\Request('GET', '/test')) ]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\GuzzleHttp\Exception\RequestException $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $this->assertEmpty($output); } public function testVerboseResponseExceptionWithCode() { $handler = $this->getMockHandler([ new \GuzzleHttp\Exception\RequestException( "Error message", new \GuzzleHttp\Psr7\Request('GET', '/test'), new Response(500) ) ]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $fp = fopen("php://memory", "a+"); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\GuzzleHttp\Exception\RequestException $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $this->assertEmpty($output); } public function testVerboseResponseExceptionWithBody() { $handler = $this->getMockHandler([ new \GuzzleHttp\Exception\RequestException( "Error message", new \GuzzleHttp\Psr7\Request('GET', '/test'), new Response(500, [], json_encode(["errorString" => "An error"])) ) ]); $client = new Client( [ 'base_uri' => 'http://example.org', 'handler' => $handler, ] ); $fp = fopen('php://memory', 'a+'); Client::setDebug($fp); ob_start(); try { $client->get('/error'); } catch (\GuzzleHttp\Exception\RequestException $e) { } $this->assertEmpty(ob_get_clean()); $output = $this->readStreamData($fp); $this->assertEmpty($output); } public function getMockHandler($request, array &$container = null) { $client = new \Akamai\Open\EdgeGrid\Tests\ClientTest(); return $client->getMockHandler($request, $container); } protected function readStreamData($fp) { fseek($fp, 0); $output = ''; while (!feof($fp)) { $output .= fgets($fp); } return $output; } }