view bindings/as3/ext/asunit/framework/RemotingTestCase.as @ 770:c54bc2ffbf92 tip

update tags
author convert-repo
date Fri, 16 Dec 2011 11:34:01 +0000
parents 3a0b9700b3d2
children
line wrap: on
line source
package asunit.framework 
{
    import flash.errors.IllegalOperationError;
    import flash.events.IOErrorEvent;
    import flash.events.NetStatusEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.NetConnection;
    import flash.net.ObjectEncoding;
    import flash.net.Responder;
    
    import asunit.framework.TestCase;
    import asunit.util.ArrayIterator;    

    /**
     * RemotingTestCase 
     * @author     Jens Krause [www.websector.de]
     * @date     11/29/07
     * 
     */
    public class RemotingTestCase extends TestCase 
    {

        protected var connection: NetConnection;
        /**
        * Constructor
        * @param testMethod        String        Name of the test case
        * 
        */            
        public function RemotingTestCase(testMethod: String = null)
        {
            super(testMethod);
        }

        /**
        * Inits a netConnection instance and add all necessary event listeners
        * 
        */    
        protected function initConnection():void 
        {
            if (connection == null)
            {
                connection = new NetConnection();
                
                connection.addEventListener(NetStatusEvent.NET_STATUS, connectionStatusHandler);
                connection.addEventListener(IOErrorEvent.IO_ERROR, connectionIOErrorHandler);
                connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR , connectionSecurityErrorHandler);        
            }
        }

        /**
        * Dispose the netConnection instance
        * 
        */                    
        protected function disposeConnection():void 
        {
            if (connection != null)
            {
                connection.removeEventListener(NetStatusEvent.NET_STATUS, connectionStatusHandler);
                connection.removeEventListener(IOErrorEvent.IO_ERROR, connectionIOErrorHandler);
                connection.removeEventListener(SecurityErrorEvent.SECURITY_ERROR , connectionSecurityErrorHandler);    
                
                connection = null;            
            }
        }

        /**
        * Callback handler for receiving SecurityErrorEvent
        * @param event        SecurityErrorEvent
        * 
        */    
        protected function connectionSecurityErrorHandler(event: SecurityErrorEvent): void
        {
            result.addError(this, new IllegalOperationError(event.toString()));
            isComplete = true;  
        }

        /**
        * Callback handler for receiving IOErrorEvent
        * @param event        IOErrorEvent
        * 
        */    
        protected function connectionIOErrorHandler(event: IOErrorEvent): void
        {
            result.addError(this, new IllegalOperationError(event.toString()));
            isComplete = true;
        }

        /**
        * Callback handler for receiving NetStatusEvent
        * @param event        NetStatusEvent
        * 
        */
        protected function connectionStatusHandler(event: NetStatusEvent): void
        {
            
        }

        /**
        * Connects the gateway
        * 
        * @param $gateway        String        Remote gateway
        * @param $encoding        uint        Object encoding using either AMF0 or AMF3
        * 
        */                                    
        protected function connect ($gateway: String = null, $encoding: uint = 0): void 
        {
            initConnection();
            
               connection.objectEncoding = ($encoding > ObjectEncoding.AMF0) ? $encoding : ObjectEncoding.AMF0;
                          
               try {
                   connection.connect($gateway);
               }
               catch(error: Error)
               {
                   result.addError(this, error);                         
               }
        };
    
        /**
        * Calls a remote service method and test it 
        * 
        * @param $method        String        Remote service
        * @param $responder        Responder    Responder to handle remoting calls
        * @param $arguments        Array        Rest paramaters (optional) 
        * 
        */    
        protected function call ($method: String = null, $responder: Responder = null, ...$arguments): void    
        {
            var hasReferenceError: Boolean = false;
            
            // parameters for calling connection.call();
            // To avoid using the type unsafe ...rest operator I decided to use type safe parameters within RemotingTestCase.call() 
            // and apply these later to connection.call();
            var params: Array = [];
            
            // check remote method 
            if ($method != null) 
            {
                params.push($method);            
            }
            else
            {
                result.addError(this, new ReferenceError("RemotingTestCase.call() has to defined a remote method."));            
                hasReferenceError = true;
            } 
            
            // check responder
            if ($responder != null) 
            {
                params.push($responder);            
            }
            else
            {
                result.addError(this, new ReferenceError("RemotingTestCase.call() has to defined a responder to handling its results."));                
                hasReferenceError = true;            
            }    
            
            // In case of a reference error invoke test running instantly 
            // to show the errors created above and return
            if (hasReferenceError) 
            {
                super.run();
                return;
            }
            
            
            var arrIterator: ArrayIterator = new ArrayIterator($arguments);
            while (arrIterator.hasNext())
            {
                params.push(arrIterator.next());    
            }    
            
            // call remote service
               try {
                connection.call.apply(null, params);                
               }
               catch(error: Error)
               {
                   result.addError(this, error);                         
               }
                           

        };        
    }
}