Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

<?php
/**
 * SocketTest file
 *
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
 * @package       Cake.Test.Case.Network
 * @since         CakePHP(tm) v 1.2.0.4206
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('CakeSocket', 'Network');

/**
 * SocketTest class
 *
 * @package       Cake.Test.Case.Network
 */
class CakeSocketTest extends CakeTestCase {

/**
 * setUp method
 *
 * @return void
 */
        public function setUp() {
                parent::setUp();
                $this->Socket = new CakeSocket(array('timeout' => 1));
        }

/**
 * tearDown method
 *
 * @return void
 */
        public function tearDown() {
                parent::tearDown();
                unset($this->Socket);
        }

/**
 * testConstruct method
 *
 * @return void
 */
        public function testConstruct() {
                $this->Socket = new CakeSocket();
                $config = $this->Socket->config;
                $this->assertSame($config, array(
                        'persistent'    => false,
                        'host'                  => 'localhost',
                        'protocol'              => getprotobyname('tcp'),
                        'port'                  => 80,
                        'timeout'               => 30
                ));

                $this->Socket->reset();
                $this->Socket->__construct(array('host' => 'foo-bar'));
                $config['host'] = 'foo-bar';
                $this->assertSame($this->Socket->config, $config);

                $this->Socket = new CakeSocket(array('host' => 'www.cakephp.org', 'port' => 23, 'protocol' => 'udp'));
                $config = $this->Socket->config;

                $config['host'] = 'www.cakephp.org';
                $config['port'] = 23;
                $config['protocol'] = 17;

                $this->assertSame($this->Socket->config, $config);
        }

/**
 * testSocketConnection method
 *
 * @return void
 */
        public function testSocketConnection() {
                $this->assertFalse($this->Socket->connected);
                $this->Socket->disconnect();
                $this->assertFalse($this->Socket->connected);
                try {
                        $this->Socket->connect();
                        $this->assertTrue($this->Socket->connected);
                        $this->Socket->connect();
                        $this->assertTrue($this->Socket->connected);

                        $this->Socket->disconnect();
                        $config = array('persistent' => true);
                        $this->Socket = new CakeSocket($config);
                        $this->Socket->connect();
                        $this->assertTrue($this->Socket->connected);
                } catch (SocketException $e) {
                        $this->markTestSkipped('Cannot test network, skipping.');
                }
        }

/**
 * data provider function for testInvalidConnection
 *
 * @return array
 */
        public static function invalidConnections() {
                return array(
                        array(array('host' => 'invalid.host', 'port' => 9999, 'timeout' => 1)),
                        array(array('host' => '127.0.0.1', 'port' => '70000', 'timeout' => 1))
                );
        }

/**
 * testInvalidConnection method
 *
 * @dataProvider invalidConnections
 * @expectedException SocketException
 * @return void
 */
        public function testInvalidConnection($data) {
                $this->Socket->config = array_merge($this->Socket->config, $data);
                $this->Socket->connect();
        }

/**
 * testSocketHost method
 *
 * @return void
 */
        public function testSocketHost() {
                try {
                        $this->Socket = new CakeSocket();
                        $this->Socket->connect();
                        $this->assertEquals('127.0.0.1', $this->Socket->address());
                        $this->assertEquals(gethostbyaddr('127.0.0.1'), $this->Socket->host());
                        $this->assertEquals(null, $this->Socket->lastError());
                        $this->assertTrue(in_array('127.0.0.1', $this->Socket->addresses()));

                        $this->Socket = new CakeSocket(array('host' => '127.0.0.1'));
                        $this->Socket->connect();
                        $this->assertEquals('127.0.0.1', $this->Socket->address());
                        $this->assertEquals(gethostbyaddr('127.0.0.1'), $this->Socket->host());
                        $this->assertEquals(null, $this->Socket->lastError());
                        $this->assertTrue(in_array('127.0.0.1', $this->Socket->addresses()));
                } catch (SocketException $e) {
                        $this->markTestSkipped('Cannot test network, skipping.');
                }
        }

/**
 * testSocketWriting method
 *
 * @return void
 */
        public function testSocketWriting() {
                try {
                        $request = "GET / HTTP/1.1\r\nConnection: close\r\n\r\n";
                        $this->assertTrue((bool)$this->Socket->write($request));
                } catch (SocketException $e) {
                        $this->markTestSkipped('Cannot test network, skipping.');
                }
        }

/**
 * testSocketReading method
 *
 * @return void
 */
        public function testSocketReading() {
                $this->Socket = new CakeSocket(array('timeout' => 5));
                try {
                        $this->Socket->connect();
                        $this->assertEquals(null, $this->Socket->read(26));

                        $config = array('host' => 'google.com', 'port' => 80, 'timeout' => 1);
                        $this->Socket = new CakeSocket($config);
                        $this->assertTrue($this->Socket->connect());
                        $this->assertEquals(null, $this->Socket->read(26));
                        $this->assertEquals('2: ' . __d('cake_dev', 'Connection timed out'), $this->Socket->lastError());
                } catch (SocketException $e) {
                        $this->markTestSkipped('Cannot test network, skipping.');
                }
        }

/**
 * testTimeOutConnection method
 *
 * @return void
 */
        public function testTimeOutConnection() {
                $config = array('host' => '127.0.0.1', 'timeout' => 0.5);
                $this->Socket = new CakeSocket($config);
                try {
                        $this->assertTrue($this->Socket->connect());

                        $config = array('host' => '127.0.0.1', 'timeout' => 0.00001);
                        $this->Socket = new CakeSocket($config);
                        $this->assertFalse($this->Socket->read(1024 * 1024));
                        $this->assertEquals('2: ' . __d('cake_dev', 'Connection timed out'), $this->Socket->lastError());
                } catch (SocketException $e) {
                        $this->markTestSkipped('Cannot test network, skipping.');
                }
        }

/**
 * testLastError method
 *
 * @return void
 */
        public function testLastError() {
                $this->Socket = new CakeSocket();
                $this->Socket->setLastError(4, 'some error here');
                $this->assertEquals('4: some error here', $this->Socket->lastError());
        }

/**
 * testReset method
 *
 * @return void
 */
        public function testReset() {
                $config = array(
                        'persistent' => true,
                        'host' => '127.0.0.1',
                        'protocol' => 'udp',
                        'port' => 80,
                        'timeout' => 20
                );
                $anotherSocket = new CakeSocket($config);
                $anotherSocket->reset();
                $this->assertEquals(array(), $anotherSocket->config);
        }

/**
 * testEncrypt
 *
 * @expectedException SocketException
 * @return void
 */
        public function testEnableCryptoSocketExceptionNoSsl() {
                $this->skipIf(!extension_loaded('openssl'), 'OpenSSL is not enabled cannot test SSL.');
                $configNoSslOrTls = array('host' => 'localhost', 'port' => 80, 'timeout' => 0.1);

                // testing exception on no ssl socket server for ssl and tls methods
                $this->Socket = new CakeSocket($configNoSslOrTls);
                $this->Socket->connect();
                $this->Socket->enableCrypto('sslv3', 'client');
        }

/**
 * testEnableCryptoSocketExceptionNoTls
 *
 * @expectedException SocketException
 * @return void
 */
        public function testEnableCryptoSocketExceptionNoTls() {
                $configNoSslOrTls = array('host' => 'localhost', 'port' => 80, 'timeout' => 0.1);

                // testing exception on no ssl socket server for ssl and tls methods
                $this->Socket = new CakeSocket($configNoSslOrTls);
                $this->Socket->connect();
                $this->Socket->enableCrypto('tls', 'client');
        }

/**
 * _connectSocketToSslTls
 *
 * @return void
 */
        protected function _connectSocketToSslTls() {
                $this->skipIf(!extension_loaded('openssl'), 'OpenSSL is not enabled cannot test SSL.');
                $configSslTls = array('host' => 'smtp.gmail.com', 'port' => 465, 'timeout' => 5);
                $this->Socket = new CakeSocket($configSslTls);
                try {
                        $this->Socket->connect();
                } catch (SocketException $e) {
                        $this->markTestSkipped('Cannot test network, skipping.');
                }
        }

/**
 * testEnableCryptoBadMode
 *
 * @expectedException InvalidArgumentException
 * @return void
 */
        public function testEnableCryptoBadMode() {
                // testing wrong encryption mode
                $this->_connectSocketToSslTls();
                $this->Socket->enableCrypto('doesntExistMode', 'server');
                $this->Socket->disconnect();
        }

/**
 * testEnableCrypto
 *
 * @return void
 */
        public function testEnableCrypto() {
                // testing on ssl server
                $this->_connectSocketToSslTls();
                $this->assertTrue($this->Socket->enableCrypto('sslv3', 'client'));
                $this->Socket->disconnect();

                // testing on tls server
                $this->_connectSocketToSslTls();
                $this->assertTrue($this->Socket->enableCrypto('tls', 'client'));
                $this->Socket->disconnect();
        }

/**
 * testEnableCryptoExceptionEnableTwice
 *
 * @expectedException SocketException
 * @return void
 */
        public function testEnableCryptoExceptionEnableTwice() {
                // testing on tls server
                $this->_connectSocketToSslTls();
                $this->Socket->enableCrypto('tls', 'client');
                $this->Socket->enableCrypto('tls', 'client');
        }

/**
 * testEnableCryptoExceptionDisableTwice
 *
 * @expectedException SocketException
 * @return void
 */
        public function testEnableCryptoExceptionDisableTwice() {
                // testing on tls server
                $this->_connectSocketToSslTls();
                $this->Socket->enableCrypto('tls', 'client', false);
        }

/**
 * testEnableCryptoEnableStatus
 *
 * @return void
 */
        public function testEnableCryptoEnableStatus() {
                // testing on tls server
                $this->_connectSocketToSslTls();
                $this->assertFalse($this->Socket->encrypted);
                $this->Socket->enableCrypto('tls', 'client', true);
                $this->assertTrue($this->Socket->encrypted);
        }

/**
 * test getting the context for a socket.
 *
 * @return void
 */
        public function testGetContext() {
                $this->skipIf(!extension_loaded('openssl'), 'OpenSSL is not enabled cannot test SSL.');
                $config = array(
                        'host' => 'smtp.gmail.com',
                        'port' => 465,
                        'timeout' => 5,
                        'context' => array(
                                'ssl' => array('capture_peer' => true)
                        )
                );
                $this->Socket = new CakeSocket($config);
                $this->Socket->connect();
                $result = $this->Socket->context();
                $this->assertEquals($config['context'], $result);
        }

}