@Test
public void testCustomHandshake() {

    WebSocketServerExtension extension;
    Map<String, String> parameters;
    WebSocketExtensionData data;
    // initialize
    PerMessageDeflateServerExtensionHandshaker handshaker =
            new PerMessageDeflateServerExtensionHandshaker(6, true, 10, true, true);
    parameters = new HashMap<String, String>();
    parameters.put(CLIENT_MAX_WINDOW, null);
    parameters.put(SERVER_MAX_WINDOW, "12");
    parameters.put(CLIENT_NO_CONTEXT, null);
    parameters.put(SERVER_NO_CONTEXT, null);
    // execute
    extension = handshaker.handshakeExtension(
            new WebSocketExtensionData(PERMESSAGE_DEFLATE_EXTENSION, parameters));
    // test
    assertNotNull(extension);
    assertEquals(WebSocketServerExtension.RSV1, extension.rsv());
    assertTrue(extension.newExtensionDecoder() instanceof PerMessageDeflateDecoder);
    assertTrue(extension.newExtensionEncoder() instanceof PerMessageDeflateEncoder);
    // execute
    data = extension.newReponseData();
    // test
    assertEquals(PERMESSAGE_DEFLATE_EXTENSION, data.name());
    assertTrue(data.parameters().containsKey(CLIENT_MAX_WINDOW));
    assertEquals("10", data.parameters().get(CLIENT_MAX_WINDOW));
    assertTrue(data.parameters().containsKey(SERVER_MAX_WINDOW));
    assertEquals("12", data.parameters().get(SERVER_MAX_WINDOW));
    assertTrue(data.parameters().containsKey(CLIENT_MAX_WINDOW));
    assertTrue(data.parameters().containsKey(SERVER_MAX_WINDOW));
    // initialize
    parameters = new HashMap<String, String>();
    parameters.put(SERVER_MAX_WINDOW, "12");
    parameters.put(SERVER_NO_CONTEXT, null);
    // execute
    extension = handshaker.handshakeExtension(
            new WebSocketExtensionData(PERMESSAGE_DEFLATE_EXTENSION, parameters));
    // test
    assertNotNull(extension);
    assertEquals(WebSocketServerExtension.RSV1, extension.rsv());
    assertTrue(extension.newExtensionDecoder() instanceof PerMessageDeflateDecoder);
    assertTrue(extension.newExtensionEncoder() instanceof PerMessageDeflateEncoder);
    // execute
    data = extension.newReponseData();
    // test
    assertEquals(PERMESSAGE_DEFLATE_EXTENSION, data.name());
    assertEquals(2, data.parameters().size());
    assertTrue(data.parameters().containsKey(SERVER_MAX_WINDOW));
    assertEquals("12", data.parameters().get(SERVER_MAX_WINDOW));
    assertTrue(data.parameters().containsKey(SERVER_NO_CONTEXT));
    // initialize
    parameters = new HashMap<String, String>();
    // execute
    extension = handshaker.handshakeExtension(
            new WebSocketExtensionData(PERMESSAGE_DEFLATE_EXTENSION, parameters));
    // test
    assertNotNull(extension);
    // execute
    data = extension.newReponseData();
    // test
    assertEquals(PERMESSAGE_DEFLATE_EXTENSION, data.name());
    assertTrue(data.parameters().isEmpty());
}