/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project 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.
 */
package io.netty.testsuite.util;

import com.sun.nio.sctp.SctpChannel;
import io.netty.util.NetworkConstants;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.util.*;

public class TestUtils {

    private static final int START_PORT = 32768;
    private static final int END_PORT = 65536;
    private static final int NUM_CANDIDATES = END_PORT - START_PORT;

    private static final List<Integer> PORTS = new ArrayList<Integer>();
    private static Iterator<Integer> PORTS_ITERATOR;

    static {
        for (int i = START_PORT; i < END_PORT; i ++) {
            PORTS.add(i);
        }
        Collections.shuffle(PORTS);
    }

    private static int nextCandidatePort() {
        if (PORTS_ITERATOR == null || !PORTS_ITERATOR.hasNext()) {
            PORTS_ITERATOR = PORTS.iterator();
        }
        return PORTS_ITERATOR.next();
    }

    /**
     * Return a free port which can be used to bind to
     *
     * @return port
     */
    public static int getFreePort() {
        for (int i = 0; i < NUM_CANDIDATES; i ++) {
            int port = nextCandidatePort();
            try {
                // Ensure it is possible to bind on both wildcard and loopback.
                ServerSocket ss;
                ss = new ServerSocket();
                ss.setReuseAddress(false);
                ss.bind(new InetSocketAddress(port));
                ss.close();

                ss = new ServerSocket();
                ss.setReuseAddress(false);
                ss.bind(new InetSocketAddress(NetworkConstants.LOCALHOST, port));
                ss.close();

                return port;
            } catch (IOException e) {
                // ignore
            }
        }

        throw new RuntimeException("unable to find a free port");
    }

    /**
     * Return <code>true</code> if SCTP is supported by the running os.
     *
     */
    public static boolean isSctpSupported() {
        String os = System.getProperty("os.name").toLowerCase(Locale.UK);
        if (os.equals("unix") || os.equals("linux") || os.equals("sun") || os.equals("solaris")) {
            try {
                SctpChannel.open();
            } catch (IOException e) {
                // ignore
            } catch (UnsupportedOperationException e) {
                // This exception may get thrown if the OS does not have
                // the shared libs installed.
                System.out.print("Not supported: " + e.getMessage());
                return false;

            }

            return true;
        }
        return false;
    }

    private TestUtils() { }
}
@@ -666,45 +666,8 @@
 l;%0A%0A
-import com.sun.nio.sctp.SctpChannel;%0A
 impo
@@ -795,16 +795,50 @@
 Socket;%0A
+import java.nio.channels.Channel;%0A
 import j
@@ -2798,28 +2798,425 @@
     
-SctpChannel.open();%0A
+// Try to open a SCTP Channel, by using reflection to make it compile also on%0A                // operation systems that not support SCTP like OSX and Windows%0A                Class%3C?%3E sctpChannelClass = Class.forName(%22com.sun.nio.sctp.SctpChannel%22);%0A                Channel channel = (Channel) sctpChannelClass.getMethod(%22open%22, null).invoke(null, null);%0A                try %7B%0A                    channel.close();%0A    
     
@@ -3257,32 +3257,36 @@
                 
+    
 // ignore%0A      
@@ -3271,32 +3271,50 @@
       // ignore%0A
+                %7D%0A
             %7D ca
@@ -3572,16 +3572,154 @@
  false;%0A
+            %7D catch (Throwable t) %7B%0A                if (!(t instanceof IOException)) %7B%0A                    return false;%0A                %7D
 %0A       
@@ -3717,33 +3717,32 @@
 %7D%0A            %7D%0A
-%0A
             retu

Make sure the TestUtils class will also compile on operation systems that not support SCTP by using reflection