<?xml version="1.0" encoding="UTF-8" ?>
<!--
  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.

-->
<library>

<class name="PortAvailabilityTest" extends="NetworkTest">

    <switch>
        <when property="$as3">
            <passthrough>
                import flash.events.*;
                import flash.net.*;
                import flash.system.*;
            </passthrough>
        </when>
    </switch>

    <rtmpconnection name="rtmp" autoconnect="false" debug="true" />

    <handler name="oninit">
        this.setAttribute("testName", "Port");
    </handler>

    <method name="start">
        var hostUrl = "rtmp://" + host + ":" + port + canvas.rtmpUriPath;
        rtmp.setAttribute("src", hostUrl);
        this.log(": start test... " + hostUrl);

        rtmp.connect();
    </method>

    <method name="forcedStop">
        this.log("stopped");
        // TODO: disconnect @rtmp
    </method>

    <handler name="onconnect" reference="rtmp">
        if (running) {
            this.log("port is available\n");
            this.setPassed();
        }
    </handler>

    <handler name="onerror" args="e" reference="rtmp">
        if (running) {
            this.log("connection error - " + e + "\n");
            this.setFailed();
        }
    </handler>

    <handler name="onstatus" args="e" reference="rtmp">
        if (running) {
            if ("timed out" == e) {
                this.setFailed();
            }
            if($debug) Debug.write(testName + ": RTMP connect status - ", e);
        }
    </handler>

</class>

</library>
