blob: 4879ee5bf9d9ba1398e877b2407d796fc3a64e3f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.sshd.common;
import java.util.Map;
import java.util.TreeMap;
import org.apache.sshd.common.session.Session;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.common.util.ValidateUtils;
import org.apache.sshd.util.test.BaseTestSupport;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.mockito.Mockito;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class PropertyResolverUtilsTest extends BaseTestSupport {
public PropertyResolverUtilsTest() {
super();
}
@Test
public void testResolveAndUpdateClosestPropertyValue() {
final String propName = getCurrentTestName();
final String rootValue = getClass().getPackage().getName();
Session resolver = createMockSession();
FactoryManager root = ValidateUtils.checkNotNull(resolver.getFactoryManager(), "No manager");
assertNull("Unexpected root previous value", PropertyResolverUtils.updateProperty(root, propName, rootValue));
assertSame("Mismatched root value", rootValue, PropertyResolverUtils.getString(resolver, propName));
final String nodeValue = getClass().getSimpleName();
assertNull("Unexpected node previous value", PropertyResolverUtils.updateProperty(resolver, propName, nodeValue));
assertSame("Mismatched node value", nodeValue, PropertyResolverUtils.getString(resolver, propName));
}
@Test
public void testSyspropsResolver() {
PropertyResolver resolver = SyspropsMapWrapper.SYSPROPS_RESOLVER;
Map<String, ?> props = resolver.getProperties();
assertTrue("Unexpected initial resolver values: " + props, GenericUtils.isEmpty(props));
final String propName = getCurrentTestName();
assertNull("Unexpected initial resolved value", PropertyResolverUtils.getObject(resolver, propName));
final String propKey = SyspropsMapWrapper.getMappedSyspropKey(propName);
assertNull("Unexpected property value for " + propKey, System.getProperty(propKey));
try {
long expected = System.currentTimeMillis();
System.setProperty(propKey, Long.toString(expected));
testLongProperty(resolver, propName, expected);
} finally {
System.clearProperty(propKey);
}
try {
int expected = 3777347;
System.setProperty(propKey, Integer.toString(expected));
testIntegerProperty(resolver, propName, expected);
} finally {
System.clearProperty(propKey);
}
for (final boolean expected : new boolean[]{false, true}) {
try {
System.setProperty(propKey, Boolean.toString(expected));
testBooleanProperty(resolver, propName, expected);
} finally {
System.clearProperty(propKey);
}
}
}
@Test
public void testLongProperty() {
final long expected = System.currentTimeMillis();
final String name = getCurrentTestName();
Session session = createMockSession();
assertEquals("Mismatched empty props value", expected, PropertyResolverUtils.getLongProperty(session, name, expected));
PropertyResolverUtils.updateProperty(session, name, expected);
testLongProperty(session, name, expected);
PropertyResolverUtils.updateProperty(session, name, Long.toString(expected));
testLongProperty(session, name, expected);
}
@SuppressWarnings("checkstyle:avoidnestedblocks")
private void testLongProperty(PropertyResolver resolver, String name, long expected) {
Map<String, ?> props = resolver.getProperties();
Object value = props.get(name);
Class<?> type = value.getClass();
String storage = type.getSimpleName();
{
Long actual = PropertyResolverUtils.getLong(resolver, name);
assertNotNull("No actual Long value found for storage as " + storage, actual);
assertEquals("Mismatched values on Long retrieval for storage as " + storage, expected, actual.longValue());
}
{
String actual = PropertyResolverUtils.getString(resolver, name);
assertNotNull("No actual String value found for storage as " + storage, actual);
assertEquals("Mismatched values on String retrieval for storage as " + storage, Long.toString(expected), actual.toString());
}
}
@Test
public void testIntegerProperty() {
final int expected = 3777347;
final String name = getCurrentTestName();
Session session = createMockSession();
assertEquals("Mismatched empty props value", expected, PropertyResolverUtils.getIntProperty(session, name, expected));
PropertyResolverUtils.updateProperty(session, name, expected);
testIntegerProperty(session, name, expected);
PropertyResolverUtils.updateProperty(session, name, Integer.toString(expected));
testIntegerProperty(session, name, expected);
// store as Long but retrieve as Integer
PropertyResolverUtils.updateProperty(session, name, Long.valueOf(expected));
testIntegerProperty(session, name, expected);
}
@SuppressWarnings("checkstyle:avoidnestedblocks")
private void testIntegerProperty(PropertyResolver resolver, String name, int expected) {
Map<String, ?> props = resolver.getProperties();
Object value = props.get(name);
Class<?> type = value.getClass();
String storage = type.getSimpleName();
{
Integer actual = PropertyResolverUtils.getInteger(resolver, name);
assertNotNull("No actual Integer value found for storage as " + storage, actual);
assertEquals("Mismatched values on Integer retrieval for storage as " + storage, expected, actual.intValue());
}
{
String actual = PropertyResolverUtils.getString(resolver, name);
assertNotNull("No actual String value found for storage as " + storage, actual);
assertEquals("Mismatched values on String retrieval for storage as " + storage, Integer.toString(expected), actual.toString());
}
}
@Test
public void testBooleanProperty() {
for (final boolean expected : new boolean[]{false, true}) {
final String name = getCurrentTestName();
Session session = createMockSession();
assertEquals("Mismatched empty props value", expected, PropertyResolverUtils.getBooleanProperty(session, name, expected));
PropertyResolverUtils.updateProperty(session, name, expected);
testBooleanProperty(session, name, expected);
PropertyResolverUtils.updateProperty(session, name, Boolean.toString(expected));
testBooleanProperty(session, name, expected);
}
}
@SuppressWarnings("checkstyle:avoidnestedblocks")
private void testBooleanProperty(PropertyResolver resolver, String name, boolean expected) {
Map<String, ?> props = resolver.getProperties();
Object value = props.get(name);
Class<?> type = value.getClass();
String storage = type.getSimpleName();
{
Boolean actual = PropertyResolverUtils.getBoolean(resolver, name);
assertNotNull("No actual Boolean value found for storage as " + storage, actual);
assertEquals("Mismatched values on Boolean retrieval for storage as " + storage, expected, actual.booleanValue());
}
{
String actual = PropertyResolverUtils.getString(resolver, name);
assertNotNull("No actual String value found for storage as " + storage, actual);
assertEquals("Mismatched values on String retrieval for storage as " + storage, Boolean.toString(expected), actual.toString());
}
}
private Session createMockSession() {
Map<String, Object> managerProps = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER);
FactoryManager manager = Mockito.mock(FactoryManager.class);
Mockito.when(manager.getProperties()).thenReturn(managerProps);
Mockito.when(manager.getParentPropertyResolver()).thenReturn(null);
Map<String, Object> sessionProps = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER);
Session session = Mockito.mock(Session.class);
Mockito.when(session.getUsername()).thenReturn(getCurrentTestName());
Mockito.when(session.getFactoryManager()).thenReturn(manager);
Mockito.when(session.getParentPropertyResolver()).thenReturn(manager);
Mockito.when(session.getProperties()).thenReturn(sessionProps);
return session;
}
}