| <?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. | |
| * | |
| * @category tests | |
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 | |
| * @link http://logging.apache.org/log4php | |
| */ | |
| namespace Apache\Log4php\Tests\Appenders; | |
| use Apache\Log4php\Appenders\SocketAppender; | |
| use Apache\Log4php\Logger; | |
| use Exception; | |
| /** | |
| * @group appenders | |
| */ | |
| class SocketAppenderTest extends \PHPUnit_Framework_TestCase | |
| { | |
| /** Port on which the socket server will run. */ | |
| const SOCKET_PORT = 12345; | |
| /** The socket server process resource. */ | |
| private $server; | |
| /** The pipes array for the server process. */ | |
| private $pipes; | |
| public function setUp() | |
| { | |
| Logger::clear(); | |
| } | |
| public function tearDown() | |
| { | |
| Logger::clear(); | |
| } | |
| public function testRequiresLayout() | |
| { | |
| $appender = new SocketAppender(); | |
| self::assertTrue($appender->requiresLayout()); | |
| } | |
| public function testLogging() | |
| { | |
| Logger::configure(array( | |
| 'appenders' => array( | |
| 'default' => array( | |
| 'class' => 'SocketAppender', | |
| 'params' => array( | |
| 'remoteHost' => 'localhost', | |
| 'port' => self::SOCKET_PORT | |
| ), | |
| 'layout' => array( | |
| 'class' => 'SimpleLayout' | |
| ) | |
| ), | |
| ), | |
| 'rootLogger' => array( | |
| 'appenders' => array('default'), | |
| ), | |
| )); | |
| $this->startServer(); | |
| $logger = Logger::getLogger("myLogger"); | |
| $logger->trace("This message is a test"); | |
| $logger->debug("This message is a test"); | |
| $logger->info("This message is a test"); | |
| $logger->warn("This message is a test"); | |
| $logger->error("This message is a test"); | |
| $logger->fatal("This message is a test"); | |
| $actual = $this->getPlayback(); | |
| $this->stopServer(); | |
| $expected = "DEBUG - This message is a test" . | |
| "INFO - This message is a test" . | |
| "WARN - This message is a test" . | |
| "ERROR - This message is a test" . | |
| "FATAL - This message is a test"; | |
| $this->assertEquals($expected, $actual); | |
| } | |
| /** Starts a socket server in a separate process. */ | |
| private function startServer() | |
| { | |
| $serverLog = PHPUNIT_TEMP_DIR . '/socketServer.log'; | |
| $descriptorspec = array( | |
| 0 => array("pipe", "r"), // stdin | |
| 1 => array("file", $serverLog, "a"),// stdout | |
| 2 => array("file", $serverLog, "a") // stderr | |
| ); | |
| $cmd = "php " . dirname(__FILE__) . '/socketServer.php'; | |
| $this->server = proc_open($cmd, $descriptorspec, $this->pipes); | |
| if ($this->server === false) { | |
| throw new Exception("Failed starting the socket server process."); | |
| } | |
| // Sleep a bit to allow server to start | |
| usleep(200000); | |
| // Verify the server is running | |
| $status = proc_get_status($this->server); | |
| if (!$status['running']) { | |
| throw new Exception("Socket server process failed to start. Check the log at [$serverLog]."); | |
| } | |
| } | |
| /** Sends a message to the socket server and returns the reply. */ | |
| private function socketSend($msg) | |
| { | |
| $sock = fsockopen('localhost', self::SOCKET_PORT, $errno, $errstr); | |
| if ($sock === false) { | |
| throw new Exception("Unable to open socket. Error: [$errno] $errstr"); | |
| } | |
| fputs($sock, "$msg\n"); | |
| $reply = ''; | |
| while (!feof($sock)) { | |
| $reply .= fgets($sock); | |
| } | |
| fclose($sock); | |
| return trim($reply); | |
| } | |
| /** Retrieves a playback of all sent messages from the socket server. */ | |
| private function getPlayback() | |
| { | |
| return $this->socketSend('playback'); | |
| } | |
| /** Stops the socket server and closes the process. */ | |
| private function stopServer() | |
| { | |
| $this->socketSend('shutdown'); | |
| foreach ($this->pipes as $pipe) { | |
| fclose($pipe); | |
| } | |
| proc_close($this->server); | |
| } | |
| } |