/**
  * Initializes {@link Socket} instances for each namespaces.
  *
  * @param nsp namespace.
  * @return a socket instance for the namespace.
  */
 public Socket socket(String nsp) {
   Socket socket = this.nsps.get(nsp);
   if (socket == null) {
     socket = new Socket(this, nsp);
     Socket _socket = this.nsps.putIfAbsent(nsp, socket);
     if (_socket != null) {
       socket = _socket;
     } else {
       final Manager self = this;
       final Socket s = socket;
       socket.on(
           Socket.EVENT_CONNECTING,
           new Listener() {
             @Override
             public void call(Object... args) {
               self.connecting.add(s);
             }
           });
       socket.on(
           Socket.EVENT_CONNECT,
           new Listener() {
             @Override
             public void call(Object... objects) {
               s.id = self.engine.id();
             }
           });
     }
   }
   return socket;
 }
  @Test(timeout = TIMEOUT)
  public void receiveEmoji() throws InterruptedException {
    final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();

    socket = new Socket(createOptions());
    socket.on(
        Socket.EVENT_OPEN,
        new Emitter.Listener() {
          @Override
          public void call(Object... args) {
            socket.send("\uD800-\uDB7F\uDB80-\uDBFF\uDC00-\uDFFF\uE000-\uF8FF");
            socket.on(
                Socket.EVENT_MESSAGE,
                new Emitter.Listener() {
                  @Override
                  public void call(Object... args) {
                    if ("hi".equals(args[0])) return;
                    values.offer(args[0]);
                    socket.close();
                  }
                });
          }
        });
    socket.open();

    assertThat((String) values.take(), is("\uD800-\uDB7F\uDB80-\uDBFF\uDC00-\uDFFF\uE000-\uF8FF"));
  }
  @Test(timeout = TIMEOUT)
  public void receiveMultibyteUTF8StringsWithPolling() throws InterruptedException {
    final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();

    socket = new Socket(createOptions());
    socket.on(
        Socket.EVENT_OPEN,
        new Emitter.Listener() {
          @Override
          public void call(Object... args) {
            socket.send("cash money €€€");
            socket.on(
                Socket.EVENT_MESSAGE,
                new Emitter.Listener() {
                  @Override
                  public void call(Object... args) {
                    if ("hi".equals(args[0])) return;
                    values.offer(args[0]);
                    socket.close();
                  }
                });
          }
        });
    socket.open();

    assertThat((String) values.take(), is("cash money €€€"));
  }
  @Test(timeout = TIMEOUT)
  public void connectToLocalhost() throws InterruptedException {
    final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();

    socket = new Socket(createOptions());
    socket.on(
        Socket.EVENT_OPEN,
        new Emitter.Listener() {
          @Override
          public void call(Object... args) {
            socket.on(
                Socket.EVENT_MESSAGE,
                new Emitter.Listener() {
                  @Override
                  public void call(Object... args) {
                    values.offer(args[0]);
                    socket.close();
                  }
                });
          }
        });
    socket.open();

    assertThat((String) values.take(), is("hi"));
  }
  @Test(timeout = TIMEOUT)
  public void notSendPacketsIfSocketCloses() throws InterruptedException {
    final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();

    socket = new Socket(createOptions());
    socket.on(
        Socket.EVENT_OPEN,
        new Emitter.Listener() {
          @Override
          public void call(Object... args) {
            final boolean[] noPacket = new boolean[] {true};
            socket.on(
                Socket.EVENT_PACKET_CREATE,
                new Emitter.Listener() {
                  @Override
                  public void call(Object... args) {
                    noPacket[0] = false;
                  }
                });
            socket.close();
            Timer timer = new Timer();
            timer.schedule(
                new TimerTask() {
                  @Override
                  public void run() {
                    values.offer(noPacket[0]);
                  }
                },
                1200);
          }
        });
    socket.open();
    assertThat((Boolean) values.take(), is(true));
  }
  @Test(timeout = TIMEOUT)
  public void receiveBinaryDataAndMultibyteUTF8String() throws InterruptedException {
    final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();

    final byte[] binaryData = new byte[5];
    for (int i = 0; i < binaryData.length; i++) {
      binaryData[i] = (byte) i;
    }

    final int[] msg = new int[] {0};
    Socket.Options opts = new Socket.Options();
    opts.port = PORT;
    opts.transports = new String[] {Polling.NAME};
    socket = new Socket(opts);
    socket.on(
        Socket.EVENT_OPEN,
        new Emitter.Listener() {
          @Override
          public void call(Object... args) {
            socket.send(binaryData);
            socket.send("cash money €€€");
            socket.on(
                Socket.EVENT_MESSAGE,
                new Emitter.Listener() {
                  @Override
                  public void call(Object... args) {
                    if ("hi".equals(args[0])) return;

                    values.offer(args[0]);
                    msg[0]++;
                  }
                });
          }
        });
    socket.open();

    assertThat((byte[]) values.take(), is(binaryData));
    assertThat((String) values.take(), is("cash money €€€"));
    socket.close();
  }