Package org.pentaho.platform.osgi

Source Code of org.pentaho.platform.osgi.OSGIObjectFactoryTest

/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2013 Pentaho Corporation. All rights reserved.
*/

package org.pentaho.platform.osgi;

import org.junit.AfterClass;
import org.junit.Test;
import org.mockito.Mockito;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.pentaho.platform.api.engine.IPentahoInitializer;
import org.pentaho.platform.api.engine.IPentahoObjectReference;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.platform.engine.core.system.objfac.AggregateObjectFactory;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

import static junit.framework.Assert.*;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
* Unit test for {@link OSGIObjectFactory}.
*/
@SuppressWarnings( "unchecked" )
public class OSGIObjectFactoryTest {

  @Test
  public void testGet() throws Exception {

    StandaloneSession session = new StandaloneSession();
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    ServiceReference<String> ref = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReferences( String.class, null ) ).thenReturn( Collections.singletonList( ref ) );
    when( mockContext.getService( ref ) ).thenReturn( "SomeString" );

    when( mockContext.getServiceReferences( java.lang.Integer.class, null ) )
      .thenThrow( new InvalidSyntaxException( "bad", "call" ) );

    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    String actual = factory.get( String.class, session );
    Integer missing = factory.get( Integer.class, session );


    assertEquals( "SomeString", actual );
    assertNull( missing );

    Float missing2 = factory.get( Float.class, session );
    assertNull( missing2 );

    verify( mockContext ).getServiceReferences( String.class, null );

  }

  @Test
  public void testGetWInitializer() throws Exception {

    StandaloneSession session = new StandaloneSession();
    BundleContext mockContext = Mockito.mock( BundleContext.class );

    ServiceReference<IPentahoInitializer> ref = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReferences( IPentahoInitializer.class, null ) )
      .thenReturn( Collections.singletonList( ref ) );


    final AtomicBoolean initialized = new AtomicBoolean( false );
    IPentahoInitializer initializer = new IPentahoInitializer() {

      @Override
      public void init( IPentahoSession session ) {
        initialized.set( true );
      }
    };
    when( mockContext.getService( ref ) ).thenReturn( initializer );

    assertTrue( "initializer should be rested", initialized.get() == false );

    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    IPentahoInitializer actual = factory.get( IPentahoInitializer.class, session );

    assertSame( initializer, actual );
    assertTrue( "initializer not called", initialized.get() );

    verify( mockContext ).getServiceReferences( IPentahoInitializer.class, null );

    List<IPentahoInitializer> actuals = factory.getAll( IPentahoInitializer.class, session );

  }

  @Test
  public void testObjectDefined() throws Exception {
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    ServiceReference<String> ref = Mockito.mock( ServiceReference.class );

    ServiceReference ref2 = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReference( String.class ) ).thenReturn( ref );
    when( mockContext.getServiceReference( String.class.getName() ) ).thenReturn( ref2 );

    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );

    assertEquals( true, factory.objectDefined( String.class ) );
    assertEquals( false, factory.objectDefined( Integer.class ) );

    assertEquals( true, factory.objectDefined( String.class.getName() ) );
    assertEquals( false, factory.objectDefined( Integer.class.getName() ) );

    try {
      factory.objectDefined( (String) null );
      fail( "Should have thrown IllegalStateException" );
    } catch ( IllegalStateException e ) {
    }

    try {
      factory.objectDefined( (Class) null );
      fail( "Should have thrown IllegalStateException" );
    } catch ( IllegalStateException e ) {
    }

    verify( mockContext ).getServiceReference( String.class );
  }

  @Test
  public void testGetImplementingClass() throws Exception {
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    try {
      factory.getImplementingClass( "java.lang.String" );
      fail( "Should have thrown an exception" );
    } catch ( UnsupportedOperationException e ) {

    }
    assertTrue( true );
  }


  @Test
  public void testGetAll() throws Exception {

    StandaloneSession session = new StandaloneSession();
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    ServiceReference<String> ref = Mockito.mock( ServiceReference.class );
    ServiceReference<String> ref2 = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReferences( String.class, null ) ).thenReturn( Arrays.asList( ref, ref2 ) );
    when( mockContext.getServiceReferences( Integer.class, null ) )
      .thenThrow( new InvalidSyntaxException( "bad", "call" ) );
    when( mockContext.getService( ref ) ).thenReturn( "SomeString" );
    when( mockContext.getService( ref2 ) ).thenReturn( "SomeString2" );

    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    List<String> actual = factory.getAll( String.class, session );


    assertEquals( 2, actual.size() );
    assertEquals( "SomeString", actual.get( 0 ) );
    assertEquals( "SomeString2", actual.get( 1 ) );

    verify( mockContext ).getServiceReferences( String.class, null );

    List<Integer> madInts = factory.getAll( Integer.class, session );
    assertNotNull( madInts );
    assertEquals( 0, madInts.size() );
    List<Float> emptyFloats = factory.getAll( Float.class, session );
    assertNotNull( emptyFloats );
    assertEquals( 0, emptyFloats.size() );


  }

  @Test
  public void testGetObjectReference() throws Exception {

    StandaloneSession session = new StandaloneSession();
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    ServiceReference<String> ref = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReferences( String.class, null ) ).thenReturn( Collections.singletonList( ref ) );
    when( mockContext.getServiceReferences( Integer.class, null ) )
      .thenThrow( new InvalidSyntaxException( "bad", "call" ) );

    when( mockContext.getService( ref ) ).thenReturn( "SomeString" );

    // props
    when( ref.getPropertyKeys() ).thenReturn( new String[] { "prop1", "prop2" } );
    when( ref.getProperty( "prop1" ) ).thenReturn( "value1" );
    when( ref.getProperty( "prop2" ) ).thenReturn( "value2" );

    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    IPentahoObjectReference<String> objectReference = factory.getObjectReference( String.class, session );

    assertEquals( "SomeString", objectReference.getObject() );
    assertEquals( 2, objectReference.getAttributes().size() );
    assertTrue( objectReference.getAttributes().containsKey( "prop1" ) );

    IPentahoObjectReference<Integer> missing = factory.getObjectReference( Integer.class, session );
    assertNull( missing );

    verify( mockContext ).getServiceReferences( String.class, null );

  }

  @Test
  public void testGetObjectReferenceWithQuery() throws Exception {

    StandaloneSession session = new StandaloneSession();
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    ServiceReference<String> ref = Mockito.mock( ServiceReference.class );
    ServiceReference<String> ref2 = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReferences( String.class, "(&(name=foo))" ) )
      .thenReturn( Collections.singletonList( ref ) );
    when( mockContext.getServiceReferences( String.class, null ) ).thenReturn( Collections.singletonList( ref ) );
    when( mockContext.getServiceReferences( String.class, "(&(emptyPriority=true))" ) )
      .thenReturn( Collections.singletonList( ref2 ) );

    when( mockContext.getService( ref ) ).thenReturn( "SomeString" );

    // props
    when( ref.getPropertyKeys() ).thenReturn( new String[] { "name", "service.ranking" } );
    when( ref.getProperty( "name" ) ).thenReturn( "foo" );
    when( ref.getProperty( "service.ranking" ) ).thenReturn( 20 );
    when( ref2.getProperty( "service.ranking" ) ).thenReturn( null );


    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    IPentahoObjectReference<String> objectReference =
      factory.getObjectReference( String.class, session, Collections.singletonMap( "name", "foo" ) );

    assertNotNull( objectReference );
    assertEquals( "SomeString", objectReference.getObject() );
    assertEquals( 2, objectReference.getAttributes().size() );

    objectReference = factory.getObjectReference( String.class, session, Collections.singletonMap( "name", "foobar" ) );

    assertNull( objectReference );

    verify( mockContext ).getServiceReferences( String.class, "(&(name=foo))" );
    verify( mockContext ).getServiceReferences( String.class, "(&(name=foobar))" );

    objectReference = factory.getObjectReference( String.class, session, Collections.singletonMap( "name", "foo(" ) );
    assertNull( objectReference );

    objectReference = factory.getObjectReference( String.class, session, null );
    assertNotNull( objectReference );
    objectReference = factory.getObjectReference( String.class, session, Collections.<String, String>emptyMap() );
    assertNotNull( objectReference );


    IPentahoObjectReference<String> objectReference2 =
      factory.getObjectReference( String.class, session, Collections.singletonMap( "emptyPriority", "true" ) );

    assertEquals( 1, objectReference.compareTo( new IPentahoObjectReference<String>() {
      @Override
      public Map<String, Object> getAttributes() {
        return null;
      }

      @Override
      public String getObject() {
        return null;
      }

      @Override
      public int compareTo( IPentahoObjectReference<String> o ) {
        return 0;
      }

      @Override
      public Integer getRanking() {
        return 0;
      }

      @Override public Class<?> getObjectClass() {
        return String.class;
      }
    } ) );

    assertEquals( -1, objectReference.compareTo( new IPentahoObjectReference<String>() {
      @Override
      public Map<String, Object> getAttributes() {
        return null;
      }

      @Override
      public String getObject() {
        return null;
      }

      @Override
      public int compareTo( IPentahoObjectReference<String> o ) {
        return 0;
      }

      @Override
      public Integer getRanking() {
        return 30;
      }

      @Override public Class<?> getObjectClass() {
        return String.class;
      }
    } ) );

    assertEquals( 0, objectReference.compareTo( new IPentahoObjectReference<String>() {
      @Override
      public Map<String, Object> getAttributes() {
        return null;
      }

      @Override
      public String getObject() {
        return null;
      }

      @Override
      public int compareTo( IPentahoObjectReference<String> o ) {
        return 0;
      }

      @Override
      public Integer getRanking() {
        return 20;
      }

      @Override public Class<?> getObjectClass() {
        return String.class;
      }
    } ) );

    assertEquals( (Integer) 0, objectReference2.getRanking() );

    assertEquals( 1, objectReference.compareTo( null ) );

  }

  @Test
  public void testGetObjectReferencesWithQuery() throws Exception {

    StandaloneSession session = new StandaloneSession();
    BundleContext mockContext = Mockito.mock( BundleContext.class );

    ServiceReference<String> ref = (ServiceReference<String>) Mockito.mock( ServiceReference.class );
    ServiceReference<String> ref2 = Mockito.mock( ServiceReference.class );

    when( mockContext.getServiceReferences( String.class, "(&(name=foo))" ) ).thenReturn( Arrays.asList( ref, ref2 ) );
    when( mockContext.getServiceReferences( Integer.class, null ) )
      .thenThrow( new InvalidSyntaxException( "bad", "call" ) );

    when( mockContext.getService( ref ) ).thenReturn( "SomeString" );
    when( mockContext.getService( ref2 ) ).thenReturn( "SomeString2" );

    // props
    when( ref.getPropertyKeys() ).thenReturn( new String[] { "name" } );
    when( ref.getProperty( "name" ) ).thenReturn( "foo" );

    when( ref2.getPropertyKeys() ).thenReturn( new String[] { "name" } );
    when( ref2.getProperty( "name" ) ).thenReturn( "foo" );


    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    List<IPentahoObjectReference<String>> objectReferences =
      factory.getObjectReferences( String.class, session, Collections.singletonMap( "name", "foo" ) );

    assertNotNull( objectReferences );
    assertEquals( 2, objectReferences.size() );
    assertEquals( "SomeString", objectReferences.get( 0 ).getObject() );
    assertEquals( "SomeString2", objectReferences.get( 1 ).getObject() );

    objectReferences = factory.getObjectReferences( String.class, session, Collections.singletonMap( "name", "bar" ) );
    assertTrue( objectReferences.isEmpty() );

    verify( mockContext ).getServiceReferences( String.class, "(&(name=foo))" );


  }


  @Test
  public void testGetName() throws Exception {
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    assertEquals( "OSGIObjectFactory", factory.getName() );
  }

  @Test
  public void testInit() {
    BundleContext mockContext = Mockito.mock( BundleContext.class );
    OSGIObjectFactory factory = new OSGIObjectFactory( mockContext );
    factory.init( null, null );

  }


  @AfterClass
  public static void afterClass() {
    ( (AggregateObjectFactory) PentahoSystem.getObjectFactory() ).clear();
  }
}
TOP

Related Classes of org.pentaho.platform.osgi.OSGIObjectFactoryTest

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.