Package org.hibernate.ogm.test.util.configurationreader.impl

Source Code of org.hibernate.ogm.test.util.configurationreader.impl.ConfigurationPropertyReaderTest

/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.test.util.configurationreader.impl;

import static org.fest.assertions.Assertions.assertThat;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.ElementType;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
import org.hibernate.ogm.util.configurationreader.impl.DefaultClassPropertyReaderContext;
import org.hibernate.ogm.util.configurationreader.impl.Instantiator;
import org.hibernate.ogm.util.configurationreader.impl.Validators;
import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader;
import org.hibernate.ogm.util.configurationreader.spi.ShortNameResolver;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

/**
* Unit test for {@link ConfigurationPropertyReader}.
*
* @author Gunnar Morling
*/
public class ConfigurationPropertyReaderTest {

  @Rule
  public ExpectedException thrown = ExpectedException.none();

  @Test
  public void shouldRetrievePropertyWithInstanceValue() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", new MyServiceImpl() );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = reader.property( "service", MyService.class )
        .instantiate()
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyServiceImpl.class );
  }

  @Test
  public void shouldRetrievePropertyWithClassValue() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", MyServiceImpl.class );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = reader.property( "service", MyService.class )
        .instantiate()
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyServiceImpl.class );
  }

  @Test
  public void shouldRetrievePropertyWithStringValue() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", MyServiceImpl.class.getName() );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = reader.property( "service", MyService.class )
        .instantiate()
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyServiceImpl.class );
  }

  @Test
  public void shouldRetrievePropertyWithDefaultImplementation() {
    Map<String, Object> properties = new HashMap<String, Object>();

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = reader.property( "service", MyService.class )
        .instantiate()
        .withDefaultImplementation( MyOtherServiceImpl.class )
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyOtherServiceImpl.class );
  }

  @Test
  public void shouldRetrievePropertyWithShortName() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", "other" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = reader.property( "service", MyService.class )
        .instantiate()
        .withShortNameResolver( new MyShortNameResolver() )
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyOtherServiceImpl.class );
  }

  @Test
  public void shouldRetrievePropertyWithDefaultImplementationName() {
    Map<String, Object> properties = new HashMap<String, Object>();

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = reader.property( "service", MyService.class )
        .instantiate()
        .withDefaultImplementation( MyServiceImpl.class.getName() )
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyServiceImpl.class );
  }

  @Test
  public void shouldRetrievePropertyUsingCustomInstantiator() {
    Map<String, Object> properties = new HashMap<String, Object>();

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );
    MyService value = ( (DefaultClassPropertyReaderContext<MyService>) reader.property( "service", MyService.class )
        .instantiate() )
        .withDefaultImplementation( MyYetAnotherServiceImpl.class )
        .withInstantiator( new MyInstantiator() )
        .getValue();

    assertThat( value.getClass() ).isEqualTo( MyYetAnotherServiceImpl.class );
  }

  @Test
  public void shouldRaiseExceptionDueToWrongInstanceType() {
    thrown.expect( HibernateException.class );
    thrown.expectMessage( "OGM000046" );

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", 42 );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );

    reader.property( "service", MyService.class )
        .instantiate()
        .getValue();
  }

  @Test
  public void shouldRaiseExceptionDueToWrongClassType() {
    thrown.expect( HibernateException.class );
    thrown.expectMessage( "OGM000045" );

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", Integer.class );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );

    reader.property( "service", MyService.class )
        .instantiate()
        .getValue();
  }

  @Test
  public void shouldRaiseExceptionDueToWrongClassTypeGivenAsString() {
    thrown.expect( HibernateException.class );
    thrown.expectMessage( "OGM000045" );

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "service", Integer.class.getName() );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties, new ClassLoaderServiceImpl() );

    reader.property( "service", MyService.class )
        .instantiate()
        .getValue();
  }

  @Test
  public void shouldRetrieveStringProperty() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "foo", "bar" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    String value = reader.property( "foo", String.class ).getValue();
    assertThat( value ).isEqualTo( "bar" );
  }

  @Test
  public void shouldRetrieveIntProperty() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "foo", "123" );
    properties.put( "bar", 456 );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    int value = reader.property( "foo", int.class ).getValue();
    assertThat( value ).isEqualTo( 123 );

    value = reader.property( "bar", int.class ).getValue();
    assertThat( value ).isEqualTo( 456 );
  }

  @Test
  public void shouldRetrieveBooleanProperty() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "foo", "true" );
    properties.put( "bar", true );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    boolean value = reader.property( "foo", boolean.class ).getValue();
    assertThat( value ).isEqualTo( true );

    value = reader.property( "bar", boolean.class ).getValue();
    assertThat( value ).isEqualTo( true );
  }

  @Test
  public void shouldRetrieveEnumProperty() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "foo", "ANNOTATION_TYPE" );
    properties.put( "bar", ElementType.FIELD );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    ElementType value = reader.property( "foo", ElementType.class ).getValue();
    assertThat( value ).isEqualTo( ElementType.ANNOTATION_TYPE );

    value = reader.property( "bar", ElementType.class ).getValue();
    assertThat( value ).isEqualTo( ElementType.FIELD );
  }

  @Test
  public void shouldRetrieveEnumPropertyWithDefaultValue() {
    Map<String, Object> properties = new HashMap<String, Object>();

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    ElementType value = reader.property( "foo", ElementType.class )
        .withDefault( ElementType.ANNOTATION_TYPE )
        .getValue();
    assertThat( value ).isEqualTo( ElementType.ANNOTATION_TYPE );
  }

  @Test
  public void shouldRetrieveUrlPropertyGivenAsClassPathResource() throws Exception {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "configuration_resource", "configuration-test.properties" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    URL value = reader.property( "configuration_resource", URL.class ).getValue();
    assertThat( value ).isNotNull();

    Properties loadedProperties = loadPropertiesFromUrl( value );
    assertThat( loadedProperties.get( "hibernate.ogm.configuration.testproperty" ) ).isEqualTo( "foobar" );
  }

  @Test
  public void shouldRetrieveUrlPropertyGivenAsStringUrl() throws Exception {
    URL root = ConfigurationPropertyReaderTest.class.getClassLoader().getResource( "." );
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "configuration_resource", root.toExternalForm() + "/configuration-test.properties" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    URL value = reader.property( "configuration_resource", URL.class ).getValue();
    assertThat( value ).isNotNull();

    Properties loadedProperties = loadPropertiesFromUrl( value );
    assertThat( loadedProperties.get( "hibernate.ogm.configuration.testproperty" ) ).isEqualTo( "foobar" );
  }

  @Test
  public void shouldRetrieveUrlPropertyGivenAsFileSystemPath() throws Exception {
    File root = new File( ConfigurationPropertyReaderTest.class.getClassLoader().getResource( "." ).toURI() );
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "configuration_resource", root + File.separator + "configuration-test.properties" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    URL value = reader.property( "configuration_resource", URL.class ).getValue();
    assertThat( value ).isNotNull();

    Properties loadedProperties = loadPropertiesFromUrl( value );
    assertThat( loadedProperties.get( "hibernate.ogm.configuration.testproperty" ) ).isEqualTo( "foobar" );
  }

  @Test
  public void shouldRetrieveUrlPropertyGivenAsUrl() throws Exception {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "configuration_resource", new URL( "file://foobar/" ) );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    URL value = reader.property( "configuration_resource", URL.class ).getValue();
    assertThat( value ).isEqualTo( new URL( "file://foobar/" ) );
  }

  @Test
  public void shouldRaiseExceptionDueToMissingRequiredProperty() {
    Map<String, Object> properties = new HashMap<String, Object>();

    thrown.expect( HibernateException.class );
    thrown.expectMessage( "OGM000052" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    reader.property( "foo", ElementType.class )
        .required()
        .getValue();
  }

  @Test
  public void shouldRaiseExceptionDueToInvalidPropertyValue() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put( "myPort", 98765 );

    thrown.expect( HibernateException.class );
    thrown.expectMessage( "OGM000049" );

    ConfigurationPropertyReader reader = new ConfigurationPropertyReader( properties );

    reader.property( "myPort", int.class )
        .withValidator( Validators.PORT )
        .getValue();
  }

  private Properties loadPropertiesFromUrl(URL value) throws IOException {
    Properties properties = new Properties();
    InputStream stream = null;

    try {
      stream = value.openStream();
      properties.load( stream );
    }
    finally {
      if ( stream != null ) {
        stream.close();
      }
    }
    return properties;
  }

  private interface MyService {
  }

  public static class MyServiceImpl implements MyService {
  }

  public static class MyOtherServiceImpl implements MyService {
  }

  public static class MyYetAnotherServiceImpl implements MyService {

    public MyYetAnotherServiceImpl(String name) {
    }
  }

  private static class MyShortNameResolver implements ShortNameResolver {

    @Override
    public boolean isShortName(String name) {
      return "other".equals( name );
    }

    @Override
    public String resolve(String shortName) {
      return MyOtherServiceImpl.class.getName();
    }
  }

  private static class MyInstantiator implements Instantiator<MyService> {

    @Override
    public MyService newInstance(Class<? extends MyService> clazz) {
      return new MyYetAnotherServiceImpl( "foo" );
    }
  }
}
TOP

Related Classes of org.hibernate.ogm.test.util.configurationreader.impl.ConfigurationPropertyReaderTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.