static {
   boolean disabled;
   if (SystemPropertyUtil.get("io.netty.noResourceLeakDetection") != null) {
     boolean disabled = SystemPropertyUtil.getBoolean("io.netty.noResourceLeakDetection", false);
     logger.debug("-Dio.netty.noResourceLeakDetection: {}", Boolean.valueOf(disabled));
     logger.warn(
         "-Dio.netty.noResourceLeakDetection is deprecated. Use '-D{}={}' instead.",
         "io.netty.leakDetectionLevel",
         DEFAULT_LEVEL.name().toLowerCase());
   } else {
     disabled = false;
   }
   Level defaultLevel = disabled ? Level.DISABLED : DEFAULT_LEVEL;
   String levelStr =
       SystemPropertyUtil.get("io.netty.leakDetectionLevel", defaultLevel.name())
           .trim()
           .toUpperCase();
   Level level = DEFAULT_LEVEL;
   for (Level l : EnumSet.allOf(Level.class)) {
     if ((levelStr.equals(l.name())) || (levelStr.equals(String.valueOf(l.ordinal())))) {
       level = l;
     }
   }
   level = level;
   if (logger.isDebugEnabled()) {
     logger.debug("-D{}: {}", "io.netty.leakDetectionLevel", level.name().toLowerCase());
   }
 }
  private static String sanitizeUri(String rootPath, String uri) {
    // Decode the path.
    try {
      uri = URLDecoder.decode(uri, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw new Error(e);
    }

    if (uri.isEmpty() || uri.charAt(0) != '/') {
      return null;
    }

    // Convert file separators.
    uri = uri.replace('/', File.separatorChar);

    // Simplistic dumb security check.
    // You will have to do something serious in the production environment.
    if (uri.contains(File.separator + '.')
        || uri.contains('.' + File.separator)
        || uri.charAt(0) == '.'
        || uri.charAt(uri.length() - 1) == '.'
        || INSECURE_URI.matcher(uri).matches()) {
      return null;
    }

    // Convert to absolute path.
    return SystemPropertyUtil.get("user.dir") + File.separator + rootPath + File.separator + uri;
  }
  static {
    DEFAULT_EVENT_LOOP_THREADS =
        Math.max(
            1,
            SystemPropertyUtil.getInt(
                "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2));

    if (logger.isDebugEnabled()) {
      logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
    }
  }
public class SocketConnectionAttemptTest extends AbstractClientSocketTest {

  private static final String BAD_HOST =
      SystemPropertyUtil.get("io.netty.testsuite.badHost", "netty.io");
  private static final int BAD_PORT =
      SystemPropertyUtil.getInt("io.netty.testsuite.badPort", 65535);

  static {
    InternalLogger logger = InternalLoggerFactory.getInstance(SocketConnectionAttemptTest.class);
    logger.debug("-Dio.netty.testsuite.badHost: {}", BAD_HOST);
    logger.debug("-Dio.netty.testsuite.badPort: {}", BAD_PORT);
  }

  @Test(timeout = 30000)
  public void testConnectTimeout() throws Throwable {
    run();
  }

  public void testConnectTimeout(Bootstrap cb) throws Throwable {
    cb.handler(new TestHandler()).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000);
    ChannelFuture future = cb.connect(BAD_HOST, BAD_PORT);
    try {
      assertThat(future.await(3000), is(true));
    } finally {
      future.channel().close();
    }
  }

  @Test
  public void testConnectCancellation() throws Throwable {
    // Check if the test can be executed or should be skipped because of no network/internet
    // connection
    // See https://github.com/netty/netty/issues/1474
    boolean badHostTimedOut = true;
    Socket socket = new Socket();
    try {
      socket.connect(new InetSocketAddress(BAD_HOST, BAD_PORT), 10);
    } catch (ConnectException e) {
      badHostTimedOut = false;
      // is thrown for no route to host when using Socket connect
    } catch (Exception e) {
      // ignore
    } finally {
      try {
        socket.close();
      } catch (IOException e) {
        // ignore
      }
    }

    assumeThat(
        "The connection attempt to " + BAD_HOST + " does not time out.", badHostTimedOut, is(true));

    run();
  }

  public void testConnectCancellation(Bootstrap cb) throws Throwable {
    cb.handler(new TestHandler()).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 4000);
    ChannelFuture future = cb.connect(BAD_HOST, BAD_PORT);
    try {
      if (future.await(1000)) {
        if (future.isSuccess()) {
          fail("A connection attempt to " + BAD_HOST + " must not succeed.");
        } else {
          throw future.cause();
        }
      }

      if (future.cancel(true)) {
        assertThat(future.channel().closeFuture().await(500), is(true));
        assertThat(future.isCancelled(), is(true));
      } else {
        // Cancellation not supported by the transport.
      }
    } finally {
      future.channel().close();
    }
  }

  private static class TestHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
      InternalLoggerFactory.getInstance(SocketConnectionAttemptTest.class)
          .warn("Unexpected exception:", cause);
    }
  }
}
 private void linuxOnly() {
   String osName = SystemPropertyUtil.get("os.name").toLowerCase(Locale.UK).trim();
   assumeTrue("Only supported on Linux, your os is " + osName, osName.startsWith("linux"));
 }