/*
* JBoss, Home of Professional Open Source.
* Copyright 2013 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* Licensed 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 org.xnio.nio.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;
import org.junit.Test;
import org.xnio.FileAccess;
import org.xnio.Option;
import org.xnio.OptionMap;
import org.xnio.Options;
import org.xnio.Property;
import org.xnio.Sequence;
import org.xnio.SslClientAuthMode;
import org.xnio.XnioWorker;
import org.xnio.sasl.SaslQop;
import org.xnio.sasl.SaslStrength;
/**
* Test for setting connection options at the TCP server.
*
* @author <a href="mailto:frainone@redhat.com">Flavia Rainone</a>
*/
@SuppressWarnings("deprecation")
public class ConnectionOptionSetupTestCase extends TcpServerTest {
@Test
public void defaultOptionValues() throws IOException {
createServer(OptionMap.EMPTY);
assertNotNull(server);
assertTrue(server.getOption(Options.REUSE_ADDRESSES));
assertTrue((int) server.getOption(Options.RECEIVE_BUFFER) > 0);
assertEquals(null, server.getOption(Options.SEND_BUFFER));
assertFalse(server.getOption(Options.KEEP_ALIVE));
assertFalse(server.getOption(Options.TCP_OOB_INLINE));
assertFalse(server.getOption(Options.TCP_NODELAY));
assertEquals(0, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(0, (int) server.getOption(Options.WRITE_TIMEOUT));
assertTrue(server.getOption(Options.CONNECTION_LOW_WATER) > 0);
assertTrue(server.getOption(Options.CONNECTION_HIGH_WATER) > 0);
assertTrue((int) server.getOption(Options.CONNECTION_LOW_WATER) <= server.getOption(Options.CONNECTION_HIGH_WATER));
server.close();
}
@Test
public void optionSetupOnServerCreation() throws IOException {
final OptionMap.Builder optionMapBuilder = OptionMap.builder();
optionMapBuilder.set(Options.WORKER_ESTABLISH_WRITING, true);
optionMapBuilder.set(Options.REUSE_ADDRESSES, true);
optionMapBuilder.set(Options.RECEIVE_BUFFER, 50000);
optionMapBuilder.set(Options.SEND_BUFFER, 49999);
optionMapBuilder.set(Options.KEEP_ALIVE, true);
optionMapBuilder.set(Options.TCP_OOB_INLINE, true);
optionMapBuilder.set(Options.TCP_NODELAY, true);
optionMapBuilder.set(Options.READ_TIMEOUT, 300000);
optionMapBuilder.set(Options.WRITE_TIMEOUT, 250000);
optionMapBuilder.set(Options.CONNECTION_LOW_WATER, 12345);
optionMapBuilder.set(Options.CONNECTION_HIGH_WATER, 23456);
createServer(optionMapBuilder.getMap());
assertTrue(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(50000, (int) server.getOption(Options.RECEIVE_BUFFER));
// assertEquals(49999, (int) server.getOption(Options.SEND_BUFFER));
assertTrue(server.getOption(Options.KEEP_ALIVE));
assertTrue(server.getOption(Options.TCP_OOB_INLINE));
assertTrue(server.getOption(Options.TCP_NODELAY));
assertEquals(300000, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(250000, (int) server.getOption(Options.WRITE_TIMEOUT));
assertEquals(12345, (int) server.getOption(Options.CONNECTION_LOW_WATER));
assertEquals(23456, (int) server.getOption(Options.CONNECTION_HIGH_WATER));
server.close();
}
@Test
public void resetOptions() throws IOException {
final OptionMap.Builder optionMapBuilder = OptionMap.builder();
optionMapBuilder.set(Options.WORKER_ESTABLISH_WRITING, true);
optionMapBuilder.set(Options.REUSE_ADDRESSES, true);
optionMapBuilder.set(Options.RECEIVE_BUFFER, 10);
optionMapBuilder.set(Options.SEND_BUFFER, 1000000);
optionMapBuilder.set(Options.KEEP_ALIVE, true);
optionMapBuilder.set(Options.TCP_OOB_INLINE, true);
optionMapBuilder.set(Options.TCP_NODELAY, true);
optionMapBuilder.set(Options.READ_TIMEOUT, 1000000);
optionMapBuilder.set(Options.WRITE_TIMEOUT, 1000000);
optionMapBuilder.set(Options.CONNECTION_HIGH_WATER, 1000000);
optionMapBuilder.set(Options.CONNECTION_LOW_WATER, 1000000);
createServer(optionMapBuilder.getMap());
assertTrue(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertTrue(server.getOption(Options.RECEIVE_BUFFER) > 0);
// assertEquals(1000000, (int) server.getOption(Options.SEND_BUFFER));
assertTrue(server.getOption(Options.KEEP_ALIVE));
assertTrue(server.getOption(Options.TCP_OOB_INLINE));
assertTrue(server.getOption(Options.TCP_NODELAY));
assertEquals(1000000, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(1000000, (int) server.getOption(Options.WRITE_TIMEOUT));
assertEquals(1000000, (int) server.getOption(Options.CONNECTION_HIGH_WATER));
assertEquals(1000000, (int) server.getOption(Options.CONNECTION_LOW_WATER));
assertTrue(server.setOption(Options.REUSE_ADDRESSES, false));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertTrue(server.setOption(Options.RECEIVE_BUFFER, 20000) > 0);
// assertEquals(1000000, (int) server.setOption(Options.SEND_BUFFER, 2000000));
assertTrue(server.setOption(Options.KEEP_ALIVE, false));
assertTrue(server.setOption(Options.TCP_OOB_INLINE, false));
assertTrue(server.setOption(Options.TCP_NODELAY, false));
assertEquals(1000000, (int) server.setOption(Options.READ_TIMEOUT, 2000000));
assertEquals(1000000, (int) server.setOption(Options.WRITE_TIMEOUT, 2000000));
assertEquals(1000000, (int) server.setOption(Options.CONNECTION_HIGH_WATER, 200000)); // this will automatically update low water
assertEquals(200000, (int) server.setOption(Options.CONNECTION_LOW_WATER, 20000));
assertFalse(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(20000, (int) server.getOption(Options.RECEIVE_BUFFER));
// assertEquals(2000000, (int) server.getOption(Options.SEND_BUFFER));
assertFalse(server.getOption(Options.KEEP_ALIVE));
assertFalse(server.getOption(Options.TCP_OOB_INLINE));
assertFalse(server.getOption(Options.TCP_NODELAY));
assertEquals(2000000, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(2000000, (int) server.getOption(Options.WRITE_TIMEOUT));
assertEquals(200000, (int) server.getOption(Options.CONNECTION_HIGH_WATER));
assertEquals(20000, (int) server.getOption(Options.CONNECTION_LOW_WATER));
assertFalse(server.setOption(Options.REUSE_ADDRESSES, true));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(20000, (int) server.setOption(Options.RECEIVE_BUFFER, 2000));
// assertEquals(2000000, (int) server.setOption(Options.SEND_BUFFER, 2200));
assertFalse(server.setOption(Options.KEEP_ALIVE, true));
assertFalse(server.setOption(Options.TCP_OOB_INLINE, true));
assertFalse(server.setOption(Options.TCP_NODELAY, true));
assertEquals(2000000, (int) server.setOption(Options.READ_TIMEOUT, 2220000));
assertEquals(2000000, (int) server.setOption(Options.WRITE_TIMEOUT, 2222000));
assertEquals(200000, (int) server.setOption(Options.CONNECTION_HIGH_WATER, 222220)); // this will automatically update low water
assertEquals(20000, (int) server.setOption(Options.CONNECTION_LOW_WATER, 22222));
assertTrue(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(2000, (int) server.getOption(Options.RECEIVE_BUFFER));
// assertEquals(2200, (int) server.getOption(Options.SEND_BUFFER));
assertTrue(server.getOption(Options.KEEP_ALIVE));
assertTrue(server.getOption(Options.TCP_OOB_INLINE));
assertTrue(server.getOption(Options.TCP_NODELAY));
assertEquals(2220000, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(2222000, (int) server.getOption(Options.WRITE_TIMEOUT));
assertEquals(222220, (int) server.getOption(Options.CONNECTION_HIGH_WATER));
assertEquals(22222, (int) server.getOption(Options.CONNECTION_LOW_WATER));
// clear all options
assertTrue(server.setOption(Options.REUSE_ADDRESSES, null));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(2000, (int) server.setOption(Options.RECEIVE_BUFFER, null));
// assertEquals(2200, (int) server.setOption(Options.SEND_BUFFER, null));
assertTrue(server.setOption(Options.KEEP_ALIVE, null));
assertTrue(server.setOption(Options.TCP_OOB_INLINE, null));
assertTrue(server.setOption(Options.TCP_NODELAY, null));
assertEquals(2220000, (int) server.setOption(Options.READ_TIMEOUT, null));
assertEquals(2222000, (int) server.setOption(Options.WRITE_TIMEOUT, null));
assertEquals(222220, (int) server.setOption(Options.CONNECTION_HIGH_WATER, null)); // this will automatically update low water
assertEquals(22222, (int) server.setOption(Options.CONNECTION_LOW_WATER, null));
// check all default values have been set
assertFalse(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(0x10000, (int) server.getOption(Options.RECEIVE_BUFFER));
// assertEquals(0x10000, (int) server.getOption(Options.SEND_BUFFER));
assertFalse(server.getOption(Options.KEEP_ALIVE));
assertFalse(server.getOption(Options.TCP_OOB_INLINE));
assertFalse(server.getOption(Options.TCP_NODELAY));
assertEquals(0, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(0, (int) server.getOption(Options.WRITE_TIMEOUT));
assertTrue((int) server.getOption(Options.CONNECTION_LOW_WATER) > 0);
assertTrue((int) server.getOption(Options.CONNECTION_HIGH_WATER) > 0);
assertTrue(server.getOption(Options.CONNECTION_LOW_WATER) <= server.getOption(Options.CONNECTION_HIGH_WATER));
assertFalse(server.setOption(Options.REUSE_ADDRESSES, null));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// // FIXME XNIO-171 assertEquals(0x10000, (int) server.setOption(Options.RECEIVE_BUFFER, null));
// assertEquals(0x10000, (int) server.setOption(Options.SEND_BUFFER, null));
assertFalse(server.setOption(Options.KEEP_ALIVE, null));
assertFalse(server.setOption(Options.TCP_OOB_INLINE, null));
assertFalse(server.setOption(Options.TCP_NODELAY, null));
assertEquals(0, (int) server.setOption(Options.READ_TIMEOUT, null));
assertEquals(0, (int) server.setOption(Options.WRITE_TIMEOUT, null));
assertTrue((int) server.setOption(Options.CONNECTION_LOW_WATER, null) > 0);
assertTrue((int) server.setOption(Options.CONNECTION_HIGH_WATER, null) > 0);
server.close();
}
@Test
public void resetAllOptions() throws IOException {
final Option<?>[] unsupportedOptions = OptionHelper.getNotSupportedOptions(Options.WORKER_ACCEPT_THREADS,
Options.WORKER_ESTABLISH_WRITING, Options.REUSE_ADDRESSES, Options.RECEIVE_BUFFER, Options.SEND_BUFFER,
Options.KEEP_ALIVE, Options.TCP_OOB_INLINE, Options.TCP_NODELAY, Options.READ_TIMEOUT,
Options.WRITE_TIMEOUT, Options.CONNECTION_HIGH_WATER, Options.CONNECTION_LOW_WATER);
// supported options
final OptionMap.Builder optionMapBuilder = OptionMap.builder();
optionMapBuilder.set(Options.WORKER_ACCEPT_THREADS, getWorkerReadThreads() == 1? 1: getWorkerReadThreads() - 1);
optionMapBuilder.set(Options.WORKER_ESTABLISH_WRITING, false);
optionMapBuilder.set(Options.REUSE_ADDRESSES, true);
optionMapBuilder.set(Options.RECEIVE_BUFFER, 30000);
optionMapBuilder.set(Options.SEND_BUFFER, 29000);
optionMapBuilder.set(Options.KEEP_ALIVE, false);
optionMapBuilder.set(Options.TCP_OOB_INLINE, false);
optionMapBuilder.set(Options.TCP_NODELAY, false);
optionMapBuilder.set(Options.READ_TIMEOUT, 28);
optionMapBuilder.set(Options.WRITE_TIMEOUT, 27);
optionMapBuilder.set(Options.CONNECTION_HIGH_WATER, 26);
optionMapBuilder.set(Options.CONNECTION_LOW_WATER, 25);
// unsupported options
optionMapBuilder.set(Options.ALLOW_BLOCKING, true);
optionMapBuilder.set(Options.BACKLOG, 10000);
optionMapBuilder.set(Options.BROADCAST, false);
optionMapBuilder.set(Options.CLOSE_ABORT, true);
optionMapBuilder.set(Options.CORK, false);
optionMapBuilder.set(Options.FILE_ACCESS, FileAccess.READ_ONLY);
optionMapBuilder.set(Options.IP_TRAFFIC_CLASS, 20000);
optionMapBuilder.set(Options.MAX_INBOUND_MESSAGE_SIZE, 30000);
optionMapBuilder.set(Options.MAX_OUTBOUND_MESSAGE_SIZE, 40000);
optionMapBuilder.set(Options.MULTICAST, true);
optionMapBuilder.set(Options.MULTICAST_TTL, 50000);
optionMapBuilder.set(Options.SASL_DISALLOWED_MECHANISMS, Sequence.<String>empty());
optionMapBuilder.set(Options.SASL_MECHANISMS, Sequence.<String>of("mech1"));
optionMapBuilder.set(Options.SASL_POLICY_FORWARD_SECRECY, true);
optionMapBuilder.set(Options.SASL_POLICY_NOACTIVE, false);
optionMapBuilder.set(Options.SASL_POLICY_NOANONYMOUS, true);
optionMapBuilder.set(Options.SASL_POLICY_NODICTIONARY, false);
optionMapBuilder.set(Options.SASL_POLICY_NOPLAINTEXT, true);
optionMapBuilder.set(Options.SASL_POLICY_PASS_CREDENTIALS, false);
optionMapBuilder.set(Options.SASL_PROPERTIES, Sequence.<Property>empty());
optionMapBuilder.set(Options.SASL_QOP, Sequence.<SaslQop>of(SaslQop.AUTH_CONF));
optionMapBuilder.set(Options.SASL_REUSE, true);
optionMapBuilder.set(Options.SASL_SERVER_AUTH, false);
optionMapBuilder.set(Options.SASL_STRENGTH, SaslStrength.MEDIUM);
optionMapBuilder.set(Options.SECURE, true);
optionMapBuilder.set(Options.SSL_APPLICATION_BUFFER_REGION_SIZE, 60000);
optionMapBuilder.set(Options.SSL_APPLICATION_BUFFER_SIZE, 70000);
optionMapBuilder.set(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.NOT_REQUESTED);
optionMapBuilder.set(Options.SSL_CLIENT_SESSION_CACHE_SIZE, 80000);
optionMapBuilder.set(Options.SSL_CLIENT_SESSION_TIMEOUT, 90000);
optionMapBuilder.set(Options.SSL_ENABLE_SESSION_CREATION, false);
optionMapBuilder.set(Options.SSL_ENABLED, true);
optionMapBuilder.set(Options.SSL_ENABLED_CIPHER_SUITES, Sequence.<String>of("cipher foo"));
optionMapBuilder.set(Options.SSL_ENABLED_PROTOCOLS, Sequence.<String>of("foo", "dummy"));
optionMapBuilder.set(Options.SSL_JSSE_KEY_MANAGER_CLASSES, Sequence.<Class<? extends KeyManager>>empty());
optionMapBuilder.set(Options.SSL_JSSE_TRUST_MANAGER_CLASSES, Sequence.<Class<? extends TrustManager>>empty());
optionMapBuilder.set(Options.SSL_PACKET_BUFFER_REGION_SIZE, 100000);
optionMapBuilder.set(Options.SSL_PACKET_BUFFER_SIZE, 110000);
optionMapBuilder.set(Options.SSL_PEER_HOST_NAME, "none");
optionMapBuilder.set(Options.SSL_PEER_PORT, 0);
optionMapBuilder.set(Options.SSL_PROTOCOL, "any");
optionMapBuilder.set(Options.SSL_PROVIDER, "-");
optionMapBuilder.set(Options.SSL_RNG_OPTIONS, OptionMap.EMPTY);
optionMapBuilder.set(Options.SSL_SERVER_SESSION_CACHE_SIZE, 120000);
optionMapBuilder.set(Options.SSL_SERVER_SESSION_TIMEOUT, 130000);
optionMapBuilder.set(Options.SSL_STARTTLS, false);
optionMapBuilder.set(Options.SSL_SUPPORTED_CIPHER_SUITES, Sequence.<String>empty());
optionMapBuilder.set(Options.SSL_SUPPORTED_PROTOCOLS, Sequence.<String>empty());
optionMapBuilder.set(Options.SSL_USE_CLIENT_MODE, true);
optionMapBuilder.set(Options.STACK_SIZE, 140000);
optionMapBuilder.set(Options.THREAD_DAEMON, false);
optionMapBuilder.set(Options.THREAD_PRIORITY, 15);
optionMapBuilder.set(Options.USE_DIRECT_BUFFERS, true);
optionMapBuilder.set(Options.WORKER_NAME, "worker");
optionMapBuilder.set(Options.WORKER_READ_THREADS, 16);
optionMapBuilder.set(Options.WORKER_TASK_CORE_THREADS, 17);
optionMapBuilder.set(Options.WORKER_TASK_KEEPALIVE, 18);
optionMapBuilder.set(Options.WORKER_TASK_LIMIT, 19);
optionMapBuilder.set(Options.WORKER_TASK_MAX_THREADS, 20);
optionMapBuilder.set(Options.WORKER_WRITE_THREADS, 21);
createServer(optionMapBuilder.getMap());
assertTrue(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(30000, (int) server.getOption(Options.RECEIVE_BUFFER));
// assertEquals(29000, (int) server.getOption(Options.SEND_BUFFER));
assertFalse(server.getOption(Options.KEEP_ALIVE));
assertFalse(server.getOption(Options.TCP_OOB_INLINE));
assertFalse(server.getOption(Options.TCP_NODELAY));
assertEquals(28, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(27, (int) server.getOption(Options.WRITE_TIMEOUT));
assertEquals(26, (int) server.getOption(Options.CONNECTION_HIGH_WATER));
assertEquals(25, (int) server.getOption(Options.CONNECTION_LOW_WATER));
for (Option<?> option: unsupportedOptions) {
assertNull("Non null value for option " + option + ": " + server.getOption(option), server.getOption(option));
assertFalse(server.supportsOption(option));
}
assertTrue(server.supportsOption(Options.REUSE_ADDRESSES));
assertTrue(server.supportsOption(Options.RECEIVE_BUFFER));
assertTrue(server.supportsOption(Options.SEND_BUFFER));
assertTrue(server.supportsOption(Options.KEEP_ALIVE));
assertTrue(server.supportsOption(Options.TCP_NODELAY));
assertTrue(server.supportsOption(Options.TCP_OOB_INLINE));
assertTrue(server.supportsOption(Options.READ_TIMEOUT));
assertTrue(server.supportsOption(Options.WRITE_TIMEOUT));
assertTrue(server.supportsOption(Options.CONNECTION_LOW_WATER));
assertTrue(server.supportsOption(Options.CONNECTION_HIGH_WATER));
assertTrue(server.setOption(Options.REUSE_ADDRESSES, false));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(30000, (int) server.setOption(Options.RECEIVE_BUFFER, 24000));
// assertEquals(29000, (int) server.setOption(Options.SEND_BUFFER, 23000));
assertFalse(server.setOption(Options.KEEP_ALIVE, true));
assertFalse(server.setOption(Options.TCP_OOB_INLINE, true));
assertFalse(server.setOption(Options.TCP_NODELAY, true));
assertEquals(28, (int) server.setOption(Options.READ_TIMEOUT, 22000));
assertEquals(27, (int) server.setOption(Options.WRITE_TIMEOUT, 21000000));
assertEquals(25, (int) server.setOption(Options.CONNECTION_LOW_WATER, 190));
assertEquals(190, (int) server.setOption(Options.CONNECTION_HIGH_WATER, 200));
// unsupported options
assertNull(server.setOption(Options.ALLOW_BLOCKING, true));
assertNull(server.setOption(Options.BACKLOG, 10000));
assertNull(server.setOption(Options.BROADCAST, false));
assertNull(server.setOption(Options.CLOSE_ABORT, true));
assertNull(server.setOption(Options.CORK, false));
assertNull(server.setOption(Options.FILE_ACCESS, FileAccess.READ_ONLY));
assertNull(server.setOption(Options.IP_TRAFFIC_CLASS, 20000));
assertNull(server.setOption(Options.MAX_INBOUND_MESSAGE_SIZE, 30000));
assertNull(server.setOption(Options.MAX_OUTBOUND_MESSAGE_SIZE, 40000));
assertNull(server.setOption(Options.MULTICAST, true));
assertNull(server.setOption(Options.MULTICAST_TTL, 50000));
assertNull(server.setOption(Options.SASL_DISALLOWED_MECHANISMS, Sequence.<String>empty()));
assertNull(server.setOption(Options.SASL_MECHANISMS, Sequence.<String>of("mech1")));
assertNull(server.setOption(Options.SASL_POLICY_FORWARD_SECRECY, true));
assertNull(server.setOption(Options.SASL_POLICY_NOACTIVE, false));
assertNull(server.setOption(Options.SASL_POLICY_NOANONYMOUS, true));
assertNull(server.setOption(Options.SASL_POLICY_NODICTIONARY, false));
assertNull(server.setOption(Options.SASL_POLICY_NOPLAINTEXT, true));
assertNull(server.setOption(Options.SASL_POLICY_PASS_CREDENTIALS, false));
assertNull(server.setOption(Options.SASL_PROPERTIES, Sequence.<Property>empty()));
assertNull(server.setOption(Options.SASL_QOP, Sequence.<SaslQop>of(SaslQop.AUTH_CONF)));
assertNull(server.setOption(Options.SASL_REUSE, true));
assertNull(server.setOption(Options.SASL_SERVER_AUTH, false));
assertNull(server.setOption(Options.SASL_STRENGTH, SaslStrength.MEDIUM));
assertNull(server.setOption(Options.SECURE, true));
assertNull(server.setOption(Options.SSL_APPLICATION_BUFFER_REGION_SIZE, 60000));
assertNull(server.setOption(Options.SSL_APPLICATION_BUFFER_SIZE, 70000));
assertNull(server.setOption(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.NOT_REQUESTED));
assertNull(server.setOption(Options.SSL_CLIENT_SESSION_CACHE_SIZE, 80000));
assertNull(server.setOption(Options.SSL_CLIENT_SESSION_TIMEOUT, 90000));
assertNull(server.setOption(Options.SSL_ENABLE_SESSION_CREATION, false));
assertNull(server.setOption(Options.SSL_ENABLED, true));
assertNull(server.setOption(Options.SSL_ENABLED_CIPHER_SUITES, Sequence.<String>of("cipher foo")));
assertNull(server.setOption(Options.SSL_ENABLED_PROTOCOLS, Sequence.<String>of("foo", "dummy")));
assertNull(server.setOption(Options.SSL_JSSE_KEY_MANAGER_CLASSES, Sequence.<Class<? extends KeyManager>>empty()));
assertNull(server.setOption(Options.SSL_JSSE_TRUST_MANAGER_CLASSES, Sequence.<Class<? extends TrustManager>>empty()));
assertNull(server.setOption(Options.SSL_PACKET_BUFFER_REGION_SIZE, 100000));
assertNull(server.setOption(Options.SSL_PACKET_BUFFER_SIZE, 110000));
assertNull(server.setOption(Options.SSL_PEER_HOST_NAME, "none"));
assertNull(server.setOption(Options.SSL_PEER_PORT, 0));
assertNull(server.setOption(Options.SSL_PROTOCOL, "any"));
assertNull(server.setOption(Options.SSL_PROVIDER, "-"));
assertNull(server.setOption(Options.SSL_RNG_OPTIONS, OptionMap.EMPTY));
assertNull(server.setOption(Options.SSL_SERVER_SESSION_CACHE_SIZE, 120000));
assertNull(server.setOption(Options.SSL_SERVER_SESSION_TIMEOUT, 130000));
assertNull(server.setOption(Options.SSL_STARTTLS, false));
assertNull(server.setOption(Options.SSL_SUPPORTED_CIPHER_SUITES, Sequence.<String>empty()));
assertNull(server.setOption(Options.SSL_SUPPORTED_PROTOCOLS, Sequence.<String>empty()));
assertNull(server.setOption(Options.SSL_USE_CLIENT_MODE, true));
assertNull(server.setOption(Options.STACK_SIZE, 140000l));
assertNull(server.setOption(Options.THREAD_DAEMON, false));
assertNull(server.setOption(Options.THREAD_PRIORITY, 15));
assertNull(server.setOption(Options.USE_DIRECT_BUFFERS, true));
assertNull(server.setOption(Options.WORKER_NAME, "worker"));
assertNull(server.setOption(Options.WORKER_READ_THREADS, 16));
assertNull(server.setOption(Options.WORKER_TASK_CORE_THREADS, 17));
assertNull(server.setOption(Options.WORKER_TASK_KEEPALIVE, 18));
assertNull(server.setOption(Options.WORKER_TASK_LIMIT, 19));
assertNull(server.setOption(Options.WORKER_TASK_MAX_THREADS, 20));
assertNull(server.setOption(Options.WORKER_WRITE_THREADS, 21));
assertFalse(server.getOption(Options.REUSE_ADDRESSES));
// different OSes might change the value actually set in different ways, making these options essentially untestable
// assertEquals(24000, (int) server.getOption(Options.RECEIVE_BUFFER));
// assertEquals(23000, (int) server.getOption(Options.SEND_BUFFER));
assertTrue(server.getOption(Options.KEEP_ALIVE));
assertTrue(server.getOption(Options.TCP_OOB_INLINE));
assertTrue(server.getOption(Options.TCP_NODELAY));
assertEquals(22000, (int) server.getOption(Options.READ_TIMEOUT));
assertEquals(21000000, (int) server.getOption(Options.WRITE_TIMEOUT));
assertEquals(200, (int) server.getOption(Options.CONNECTION_HIGH_WATER));
assertEquals(190, (int) server.getOption(Options.CONNECTION_LOW_WATER));
for (Option<?> option: unsupportedOptions) {
assertNull("Non null value for option " + option + ": " + server.getOption(option), server.getOption(option));
assertFalse(server.supportsOption(option));
}
server.close();
}
@Test
public void largeNumberOfThreads() throws IllegalArgumentException, IOException {
final XnioWorker worker1 = xnio.createWorker(OptionMap.create(Options.WORKER_WRITE_THREADS, 30,
Options.WORKER_READ_THREADS, 50));
//make sure that a bigger number of threads is handled without any errors
createServer(worker1, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, true, Options.WORKER_ACCEPT_THREADS, 12));
createServer(worker1, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_ACCEPT_THREADS, 40));
createServer(worker1, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_ACCEPT_THREADS, 20));
createServer(worker1, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_ACCEPT_THREADS, 10));
// huge number of threads
final XnioWorker worker2 = xnio.createWorker(OptionMap.create(Options.WORKER_WRITE_THREADS, 100,
Options.WORKER_READ_THREADS, 70));
//make sure that a bigger number of threads is handled without any errors
createServer(worker2, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, true, Options.WORKER_ACCEPT_THREADS, 12));
createServer(worker2, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, true, Options.WORKER_ACCEPT_THREADS, 80));
createServer(worker2, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, true, Options.WORKER_ACCEPT_THREADS, 100));
createServer(worker2, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_ACCEPT_THREADS, 10));
createServer(worker2, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_ACCEPT_THREADS, 50));
createServer(worker2, OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_ACCEPT_THREADS, 69));
server.close();
}
}