/*
* JBoss, Home of Professional Open Source.
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates, 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;
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.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.junit.Test;
/**
* Test for {@link OptionMap}.
*
* @author <a href="mailto:frainone@redhat.com">Flavia Rainone</a>
*
*/
public class OptionMapTestCase {
// a few extra options that will be used with options contained in Options, for testing OptionMap
public static final Option<Long> LONG_OPTION = Option.simple(OptionMapTestCase.class, "LONG_OPTION", Long.class);
public static final Option<Long> ABSENT_LONG_OPTION = Option.simple(OptionMapTestCase.class, "ABSENT_LONG_OPTION", Long.class);
public static final Option<Sequence<Boolean>> BOOLEAN_SEQUENCE_OPTION = Option.sequence(OptionMapTestCase.class, "BOOLEAN_SEQUENCE_OPTION", Boolean.class);
public static final Option<Sequence<Integer>> INT_SEQUENCE_OPTION = Option.sequence(OptionMapTestCase.class, "INT_SEQUENCE_OPTION", Integer.class);
public static final Option<Sequence<Long>> LONG_SEQUENCE_OPTION = Option.sequence(OptionMapTestCase.class, "LONG_SEQUENCE_OPTION", Long.class);
@Test
public void emptyOptionMap() {
// check size
assertEquals(0, OptionMap.EMPTY.size());
// check iterator
final Iterator<Option<?>> iterator = OptionMap.EMPTY.iterator();
assertNotNull(iterator);
assertFalse(iterator.hasNext());
assertNotNull(OptionMap.EMPTY.toString());
}
// call only if map does not contain ALLOW_BLOCKING, FILE_ACCESS, MAX_INBOUND_MESSAGE_SIZE, and STACK_SIZE
private void checkAbsentOptions(final OptionMap optionMap) {
assertNull(optionMap.get(Options.ALLOW_BLOCKING));
assertEquals(false, optionMap.get(Options.ALLOW_BLOCKING, false));
assertEquals(true, optionMap.get(Options.ALLOW_BLOCKING, true));
assertNull(optionMap.get(Options.FILE_ACCESS));
assertSame(FileAccess.READ_ONLY, optionMap.get(Options.FILE_ACCESS, FileAccess.READ_ONLY));
assertSame(FileAccess.READ_WRITE, optionMap.get(Options.FILE_ACCESS, FileAccess.READ_WRITE));
assertNull(optionMap.get(Options.MAX_INBOUND_MESSAGE_SIZE));
assertEquals(30000, optionMap.get(Options.MAX_INBOUND_MESSAGE_SIZE, 30000));
assertEquals(150, optionMap.get(Options.MAX_INBOUND_MESSAGE_SIZE, 150));
assertNull(optionMap.get(Options.STACK_SIZE));
assertEquals(100, optionMap.get(Options.STACK_SIZE, 100));
assertEquals(200, optionMap.get(Options.STACK_SIZE, 200));
}
@Test
public void unitaryOptionMap() {
final OptionMap optionMap = OptionMap.create(Options.WORKER_ESTABLISH_WRITING, true);
assertNotNull(optionMap);
// check size
assertEquals(1, optionMap.size());
// check iterator
final Iterator<Option<?>> iterator = optionMap.iterator();
assertNotNull(iterator);
assertTrue(iterator.hasNext());
assertEquals(Options.WORKER_ESTABLISH_WRITING, iterator.next());
assertFalse(iterator.hasNext());
// check get methods
assertEquals(true, optionMap.get(Options.WORKER_ESTABLISH_WRITING));
assertEquals(true, optionMap.get(Options.WORKER_ESTABLISH_WRITING, false));
assertEquals(true, optionMap.get(Options.WORKER_ESTABLISH_WRITING, true));
checkAbsentOptions(optionMap);
// check toString
String optionMapToString = optionMap.toString();
assertNotNull(optionMapToString);
assertTrue(optionMapToString.contains("Options.WORKER_ESTABLISH_WRITING"));
assertTrue(optionMapToString.contains("true"));
}
@Test
public void optionMapWithTwoOptions() {
final OptionMap optionMap = OptionMap.create(Options.WORKER_ESTABLISH_WRITING, false, Options.WORKER_NAME, "WORKER1");
assertNotNull(optionMap);
// check size
assertEquals(2, optionMap.size());
// check iterator
final Iterator<Option<?>> iterator = optionMap.iterator();
assertNotNull(iterator);
assertTrue(iterator.hasNext());
final Option<?> firstOption = iterator.next();
assertTrue(iterator.hasNext());
if (firstOption == Options.WORKER_ESTABLISH_WRITING) {
assertEquals(Options.WORKER_NAME, iterator.next());
} else if (firstOption == Options.WORKER_NAME) {
assertEquals(Options.WORKER_ESTABLISH_WRITING, iterator.next());
} else {
fail("Unexpected option found in map: "+ firstOption);
}
assertFalse(iterator.hasNext());
// check get methods
assertEquals(false, optionMap.get(Options.WORKER_ESTABLISH_WRITING));
assertEquals(false, optionMap.get(Options.WORKER_ESTABLISH_WRITING, false));
assertEquals(false, optionMap.get(Options.WORKER_ESTABLISH_WRITING, true));
assertEquals("WORKER1", optionMap.get(Options.WORKER_NAME));
assertEquals("WORKER1", optionMap.get(Options.WORKER_NAME, ""));
assertEquals("WORKER1", optionMap.get(Options.WORKER_NAME, "WORKER3"));
checkAbsentOptions(optionMap);
// check toString
String optionMapToString = optionMap.toString();
assertNotNull(optionMapToString);
assertTrue(optionMapToString.contains("Options.WORKER_ESTABLISH_WRITING"));
assertTrue(optionMapToString.contains("false"));
assertTrue(optionMapToString.contains("Options.WORKER_NAME"));
assertTrue(optionMapToString.contains("WORKER1"));
}
@SuppressWarnings("deprecation")
@Test
public void checkOptionMapCreatedByBuilder() throws Exception {
final OptionMap.Builder optionMapBuilder = OptionMap.builder();
assertNotNull(optionMapBuilder);
optionMapBuilder.parse(Options.STACK_SIZE, "900");
optionMapBuilder.parse(Options.ALLOW_BLOCKING, "false", getClass().getClassLoader());
final Properties properties = new Properties();
properties.put("+ADD+." + Options.CLOSE_ABORT, "true");
properties.put("--."+ Options.RECEIVE_BUFFER, "50000");
properties.put("--." + Options.SSL_PEER_PORT, "989");
properties.put("+ADD." + Options.SEND_BUFFER, "20000");
properties.put("+ADD+." + Options.SSL_PEER_PORT, 990); // numbers are not parsed, only strings!
properties.put("--." + Options.CLOSE_ABORT, "false");
properties.put("+ADD+." + Options.CORK, "ture"); // typo that will cause an illegal argument exception on parsing
properties.put("+ADD+." + Options.SSL_APPLICATION_BUFFER_REGION_SIZE, "cant parse this"); // won't be able to read this value
properties.put("--." + Options.SSL_APPLICATION_BUFFER_SIZE, "cant parse this"); // won't be able to read this value
optionMapBuilder.parseAll(properties, "--");
optionMapBuilder.parseAll(properties, "+ADD+.", getClass().getClassLoader());
optionMapBuilder.parseAll(properties, "-ADD-.");
optionMapBuilder.parseAll(properties, "ADD", getClass().getClassLoader());
optionMapBuilder.set(Options.FILE_ACCESS, FileAccess.READ_ONLY);
optionMapBuilder.set(Options.MULTICAST, true);
optionMapBuilder.set(Options.THREAD_PRIORITY, 5);
optionMapBuilder.set(LONG_OPTION, 24352436);
optionMapBuilder.setSequence(Options.SASL_DISALLOWED_MECHANISMS, "FooMechanism");
optionMapBuilder.setSequence(BOOLEAN_SEQUENCE_OPTION, new boolean[]{ (Boolean) true, (Boolean) false, (Boolean) true, (Boolean) false});
optionMapBuilder.setSequence(INT_SEQUENCE_OPTION, new int[]{11, 13, 17, 19, 23});
optionMapBuilder.setSequence(LONG_SEQUENCE_OPTION, new long[]{300l, 400l, 500l});
final Map<Option<Integer>, Integer> map = new HashMap<Option<Integer>, Integer>();
map.put(Options.WORKER_READ_THREADS, 10);
map.put(Options.WORKER_WRITE_THREADS, 10);
optionMapBuilder.add(map);
// use builder to create option map
final OptionMap optionMap = optionMapBuilder.getMap();
assertNotNull(optionMap);
assertEquals(optionMap, optionMapBuilder.getMap());
assertEquals(optionMapBuilder.getMap(), optionMap);
// check size
assertEquals(16, optionMap.size());
// check iterator
final Set<Option<? extends Object>> options = new HashSet<Option<? extends Object>>();
options.add(Options.STACK_SIZE);
options.add(Options.ALLOW_BLOCKING);
options.add(Options.CLOSE_ABORT);
options.add(Options.RECEIVE_BUFFER);
options.add(Options.SSL_PEER_PORT);
options.add(Options.CORK);
options.add(Options.FILE_ACCESS);
options.add(Options.MULTICAST);
options.add(Options.THREAD_PRIORITY);
options.add(LONG_OPTION);
options.add(Options.SASL_DISALLOWED_MECHANISMS);
options.add(BOOLEAN_SEQUENCE_OPTION);
options.add(INT_SEQUENCE_OPTION);
options.add(LONG_SEQUENCE_OPTION);
options.add(Options.WORKER_READ_THREADS);
options.add(Options.WORKER_WRITE_THREADS);
final Set<Option<? extends Object>> optionsCopy = new HashSet<Option<? extends Object>>(options);
final Iterator<Option<?>> iterator = optionMap.iterator();
assertNotNull(iterator);
assertTrue(iterator.hasNext());
while(iterator.hasNext()) {
Option<?> option = iterator.next();
assertFalse("Unexpected option found: " + option, optionsCopy.isEmpty());
assertTrue("Unexpected option found: " + option, optionsCopy.remove(option));
}
assertTrue(optionsCopy.isEmpty());
assertFalse(iterator.hasNext());
// check get methods
assertEquals(900l, (long) optionMap.get(Options.STACK_SIZE));
assertEquals(900l, (long) optionMap.get(Options.STACK_SIZE), 800l);
assertEquals(false, optionMap.get(Options.ALLOW_BLOCKING));
assertEquals(false, optionMap.get(Options.ALLOW_BLOCKING, true));
assertEquals(true, optionMap.get(Options.CLOSE_ABORT));
assertEquals(true, optionMap.get(Options.CLOSE_ABORT, true));
assertEquals(50000,(int) optionMap.get(Options.RECEIVE_BUFFER));
assertEquals(50000,(int) optionMap.get(Options.RECEIVE_BUFFER, 0));
assertEquals(989,(int) optionMap.get(Options.SSL_PEER_PORT));
assertEquals(989,(int) optionMap.get(Options.SSL_PEER_PORT, 200));
assertFalse(optionMap.get(Options.CORK));
assertFalse(optionMap.get(Options.CORK, true));
assertEquals(FileAccess.READ_ONLY, optionMap.get(Options.FILE_ACCESS));
assertEquals(FileAccess.READ_ONLY, optionMap.get(Options.FILE_ACCESS, FileAccess.READ_WRITE));
assertEquals(true, optionMap.get(Options.MULTICAST));
assertEquals(true, optionMap.get(Options.MULTICAST, false));
assertEquals(5, (int) optionMap.get(Options.THREAD_PRIORITY));
assertEquals(5, optionMap.get(Options.THREAD_PRIORITY, 2));
assertEquals(24352436, (long) optionMap.get(LONG_OPTION));
assertEquals(24352436, optionMap.get(LONG_OPTION, Long.MAX_VALUE));
assertEquals(Sequence.of("FooMechanism"), optionMap.get(Options.SASL_DISALLOWED_MECHANISMS));
assertEquals(Sequence.of("FooMechanism"), optionMap.get(Options.SASL_DISALLOWED_MECHANISMS, Sequence.<String>empty()));
assertEquals(Sequence.of(true, false, true, false), optionMap.get(BOOLEAN_SEQUENCE_OPTION));
assertEquals(Sequence.of(true, false, true, false), optionMap.get(BOOLEAN_SEQUENCE_OPTION, Sequence.<Boolean>of(true, true)));
assertEquals(Sequence.of(11, 13, 17, 19, 23), optionMap.get(INT_SEQUENCE_OPTION));
assertEquals(Sequence.of(11, 13, 17, 19, 23), optionMap.get(INT_SEQUENCE_OPTION, Sequence.of(1, 2, 3, 4, 5)));
assertEquals(Sequence.of(300l, 400l, 500l), optionMap.get(LONG_SEQUENCE_OPTION));
assertEquals(Sequence.of(300l, 400l, 500l), optionMap.get(LONG_SEQUENCE_OPTION, Sequence.<Long>empty()));
assertEquals(10, (int) optionMap.get(Options.WORKER_READ_THREADS));
assertEquals(10, optionMap.get(Options.WORKER_READ_THREADS, 30));
assertEquals(10, (int) optionMap.get(Options.WORKER_WRITE_THREADS));
assertEquals(10, optionMap.get(Options.WORKER_WRITE_THREADS, 20));
// check absent options
assertNull(optionMap.get(Options.BROADCAST));
assertEquals(false, optionMap.get(Options.BROADCAST, false));
assertEquals(true, optionMap.get(Options.BROADCAST, true));
assertNull(optionMap.get(Options.WORKER_NAME));
assertSame("1", optionMap.get(Options.WORKER_NAME, "1"));
assertSame("MAIN_HOST", optionMap.get(Options.WORKER_NAME, "MAIN_HOST"));
assertNull(optionMap.get(Options.MAX_OUTBOUND_MESSAGE_SIZE));
assertEquals(1000, optionMap.get(Options.MAX_OUTBOUND_MESSAGE_SIZE, 1000));
assertEquals(7890, optionMap.get(Options.MAX_OUTBOUND_MESSAGE_SIZE, 7890));
assertNull(optionMap.get(ABSENT_LONG_OPTION));
assertEquals(1l, optionMap.get(ABSENT_LONG_OPTION, 1l));
assertEquals(0l, optionMap.get(ABSENT_LONG_OPTION, 0l));
assertNull(optionMap.get(Options.SSL_APPLICATION_BUFFER_REGION_SIZE));
assertEquals(500, optionMap.get(Options.SSL_APPLICATION_BUFFER_REGION_SIZE, 500));
assertEquals(700, optionMap.get(Options.SSL_APPLICATION_BUFFER_REGION_SIZE, 700));
assertNull(optionMap.get(Options.SSL_APPLICATION_BUFFER_SIZE));
assertEquals(570, optionMap.get(Options.SSL_APPLICATION_BUFFER_SIZE, 570));
assertEquals(880, optionMap.get(Options.SSL_APPLICATION_BUFFER_SIZE, 880));
// check toString
String optionMapToString = optionMap.toString();
assertNotNull(optionMapToString);
for (Option<?> option: options){
assertTrue(optionMapToString.contains(option.toString()));
assertTrue(optionMapToString.contains(optionMap.get(option).toString()));
}
}
@Test
public void invalidCreations() {
IllegalArgumentException expected = null;
try {
OptionMap.create(null, true);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
OptionMap.create(Options.SASL_POLICY_NOACTIVE, null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
OptionMap.create(null, null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
OptionMap.create(null, true, Options.BROADCAST, false);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
OptionMap.create(Options.SASL_POLICY_NOACTIVE, null, Options.BROADCAST, false);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
OptionMap.create(Options.SASL_POLICY_NOACTIVE, true, null, false);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
OptionMap.create(Options.SASL_POLICY_NOACTIVE, true, Options.BROADCAST, null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
@Test
public void invalidBuilderOperations() {
final OptionMap.Builder builder = OptionMap.builder();
assertNotNull(builder);
Exception expected = null;
try {
builder.set(null, "foo");
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.set(Options.WORKER_NAME, null);
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.set(null, false);
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.set((Option<Integer>) null, 1);
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.set(null, 10l);
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.<String>setSequence((Option<Sequence<String>>)null);
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.setSequence((Option<Sequence<Integer>>)null, new int[]{1});
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.setSequence((Option<Sequence<Long>>)null, new long[]{1});
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
builder.setSequence((Option<Sequence<Boolean>>)null, new boolean[]{false});
} catch(IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
@Test
public void optionMapEquality() {
final OptionMap emptyMap1 = OptionMap.EMPTY, emptyMap2 = OptionMap.builder().getMap();
assertEquals(emptyMap1, emptyMap2);
assertEquals(emptyMap1, emptyMap1);
assertEquals(emptyMap2, emptyMap1);
assertEquals(emptyMap2, emptyMap2);
assertEquals(emptyMap1.hashCode(), emptyMap1.hashCode());
assertEquals(emptyMap2.hashCode(), emptyMap2.hashCode());
assertEquals(emptyMap1.hashCode(), emptyMap2.hashCode());
final OptionMap optionMap1 = OptionMap.create(LONG_OPTION, 20l),
optionMap2 = OptionMap.create(LONG_OPTION, 10l, LONG_OPTION, 20l), // first option value will be ignored
optionMap3 = OptionMap.create(LONG_OPTION, 30l);
assertEquals(optionMap1, optionMap2);
assertTrue(optionMap1.equals((Object) optionMap2));
assertEquals(optionMap2, optionMap1);
assertTrue(optionMap2.equals((Object) optionMap1));
assertEquals(optionMap1, optionMap1);
assertTrue(optionMap1.equals((Object) optionMap1));
assertEquals(optionMap2, optionMap2);
assertTrue(optionMap2.equals((Object) optionMap2));
assertEquals(optionMap1.hashCode(), optionMap2.hashCode());
assertEquals(optionMap2.hashCode(), optionMap1.hashCode());
assertEquals(optionMap1.hashCode(), optionMap1.hashCode());
assertEquals(optionMap2.hashCode(), optionMap2.hashCode());
assertFalse(optionMap1.equals(emptyMap1));
assertFalse(optionMap1.equals((Object) emptyMap1));
assertFalse(optionMap2.equals(emptyMap1));
assertFalse(optionMap2.equals((Object) emptyMap1));
assertFalse(optionMap3.equals(emptyMap1));
assertFalse(optionMap3.equals((Object) emptyMap1));
assertFalse(emptyMap1.equals(optionMap1));
assertFalse(emptyMap1.equals((Object) optionMap1));
assertFalse(emptyMap1.equals(optionMap2));
assertFalse(emptyMap1.equals((Object) optionMap2));
assertFalse(emptyMap1.equals(optionMap3));
assertFalse(emptyMap1.equals((Object) optionMap3));
assertFalse(optionMap1.equals(emptyMap2));
assertFalse(optionMap1.equals((Object) emptyMap2));
assertFalse(optionMap2.equals(emptyMap2));
assertFalse(optionMap2.equals((Object) emptyMap2));
assertFalse(optionMap3.equals(emptyMap2));
assertFalse(optionMap3.equals((Object) emptyMap2));
assertFalse(emptyMap2.equals(optionMap1));
assertFalse(emptyMap2.equals((Object) optionMap1));
assertFalse(emptyMap2.equals(optionMap2));
assertFalse(emptyMap2.equals((Object) optionMap2));
assertFalse(emptyMap2.equals(optionMap3));
assertFalse(emptyMap2.equals((Object) optionMap3));
assertFalse(optionMap1.equals(optionMap3));
assertFalse(optionMap1.equals((Object) optionMap3));
assertFalse(optionMap2.equals(optionMap3));
assertFalse(optionMap2.equals((Object) optionMap3));
assertFalse(optionMap3.equals(optionMap1));
assertFalse(optionMap3.equals((Object) optionMap1));
assertFalse(optionMap3.equals(optionMap2));
assertFalse(optionMap3.equals((Object) optionMap2));
assertFalse(emptyMap1.equals(null));
assertFalse(emptyMap1.equals((OptionMap) null));
assertFalse(emptyMap2.equals(null));
assertFalse(emptyMap2.equals((OptionMap) null));
assertFalse(optionMap1.equals(null));
assertFalse(optionMap1.equals((OptionMap) null));
assertFalse(optionMap2.equals(null));
assertFalse(optionMap2.equals((OptionMap) null));
assertFalse(optionMap3.equals(null));
assertFalse(optionMap3.equals((OptionMap) null));
assertFalse(emptyMap1.equals(new Object()));
assertFalse(emptyMap2.equals(new Object()));
assertFalse(optionMap1.equals(new Object()));
assertFalse(optionMap2.equals(new Object()));
assertFalse(optionMap3.equals(new Object()));
}
}