/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * 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.drools.core.base.extractors; import java.util.Vector; import org.drools.core.common.ProjectClassLoader; import org.junit.Before; import org.junit.Test; import org.kie.internal.utils.ClassLoaderUtil; import static org.junit.Assert.*; import org.drools.core.base.ClassFieldAccessorCache; import org.drools.core.base.ClassFieldAccessorStore; import org.drools.core.test.model.Address; import org.drools.core.test.model.Person; import org.drools.core.rule.MVELDialectRuntimeData; public class MVELClassFieldExtractorTest { ClassFieldAccessorStore store = new ClassFieldAccessorStore(); MVELObjectClassFieldReader extractor; private final Person[] person = new Person[2]; private final Address[] business = new Address[2]; private final Address[] home = new Address[2]; @Before public void setUp() throws Exception { store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) ); store.setEagerWire( true ); extractor = ( MVELObjectClassFieldReader ) store.getMVELReader( Person.class.getPackage().getName(), Person.class.getName(), "addresses['home'].street", true, String.class ); MVELDialectRuntimeData data = new MVELDialectRuntimeData(); data.addImport( Person.class.getSimpleName(), Person.class ); data.onAdd( null, ProjectClassLoader.createProjectClassLoader() ); extractor.compile( data ); person[0] = new Person( "bob", 30 ); business[0] = new Address( "Business Street", "999", null ); home[0] = new Address( "Home Street", "555", "55555555" ); person[0].getAddresses().put( "business", business[0] ); person[0].getAddresses().put( "home", home[0] ); person[1] = new Person( "mark", 35 ); business[1] = new Address( "Another Business Street", "999", null ); home[1] = new Address( "Another Home Street", "555", "55555555" ); person[1].getAddresses().put( "business", business[1] ); person[1].getAddresses().put( "home", home[1] ); } @Test public void testGetBooleanValue() { try { this.extractor.getBooleanValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetByteValue() { try { this.extractor.getByteValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetCharValue() { try { this.extractor.getCharValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetDoubleValue() { try { this.extractor.getDoubleValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetFloatValue() { try { this.extractor.getFloatValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetIntValue() { try { this.extractor.getIntValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetLongValue() { try { this.extractor.getLongValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetShortValue() { try { this.extractor.getShortValue( null, this.person[0] ); fail( "Should have throw an exception" ); } catch ( final Exception e ) { // success } } @Test public void testGetValue() { try { assertEquals( home[0].getStreet(), this.extractor.getValue( null, this.person[0] ) ); assertTrue( this.extractor.getValue( null, this.person[0] ) instanceof String ); } catch ( final Exception e ) { fail( "Should not throw an exception" ); } } @Test public void testIsNullValue() { try { assertFalse( this.extractor.isNullValue( null, this.person[0] ) ); MVELObjectClassFieldReader nullExtractor = ( MVELObjectClassFieldReader ) store.getMVELReader( Person.class.getPackage().getName(), Person.class.getName(), "addresses['business'].phone", true, String.class ); MVELDialectRuntimeData data = new MVELDialectRuntimeData(); data.addImport( Person.class.getSimpleName(), Person.class ); data.onAdd( null, ProjectClassLoader.createProjectClassLoader() ); nullExtractor.compile( data ); // // InternalReadAccessor nullExtractor = store.getReader( Person.class, // "addresses['business'].phone", // getClass().getClassLoader() ); assertTrue( nullExtractor.isNullValue( null, this.person[0] ) ); } catch ( final Exception e ) { fail( "Should not throw an exception" ); } } @Test public void testMultithreads() { final int THREAD_COUNT = 30; try { final Vector errors = new Vector(); final Thread t[] = new Thread[THREAD_COUNT]; for ( int j = 0; j < 10; j++ ) { for ( int i = 0; i < t.length; i++ ) { final int ID = i; t[i] = new Thread() { public void run() { try { final int ITERATIONS = 300; for ( int k = 0; k < ITERATIONS; k++ ) { String value = (String) extractor.getValue( null, person[ID % 2] ); if ( !home[ID % 2].getStreet().equals( value ) ) { errors.add( "THREAD(" + ID + "): Wrong value at iteration " + k + ". Value='" + value + "'\n" ); } } } catch ( Exception ex ) { ex.printStackTrace(); errors.add( ex ); } } }; t[i].start(); } for ( int i = 0; i < t.length; i++ ) { t[i].join(); } } if ( !errors.isEmpty() ) { fail( " Errors occured during execution\n" + errors.toString() ); } } catch ( InterruptedException e ) { e.printStackTrace(); fail( "Unexpected exception running test: " + e.getMessage() ); } } }