/** * Copyright 2010 JBoss Inc * * 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.verifier; import java.io.IOException; import java.io.StringReader; import java.util.Collection; import java.util.jar.JarInputStream; import junit.framework.TestCase; import org.drools.builder.ResourceType; import org.drools.io.impl.ClassPathResource; import org.drools.io.impl.ReaderResource; import org.drools.verifier.builder.VerifierBuilder; import org.drools.verifier.builder.VerifierBuilderFactory; import org.drools.verifier.components.Field; import org.drools.verifier.components.ObjectType; import org.drools.verifier.components.VerifierComponentType; import org.drools.verifier.data.VerifierReport; import org.drools.verifier.report.components.Severity; import org.drools.verifier.report.components.VerifierMessageBase; public class VerifierTest extends TestCase { public void testVerifier() { VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); // Check that the builder works. assertFalse( vBuilder.hasErrors() ); assertEquals( 0, vBuilder.getErrors().size() ); Verifier verifier = vBuilder.newVerifier(); verifier.addResourcesToVerify( new ClassPathResource( "Misc3.drl", Verifier.class ), ResourceType.DRL ); assertFalse( verifier.hasErrors() ); assertEquals( 0, verifier.getErrors().size() ); boolean works = verifier.fireAnalysis(); assertTrue( works ); VerifierReport result = verifier.getResult(); assertNotNull( result ); assertEquals( 0, result.getBySeverity( Severity.ERROR ).size() ); assertEquals( 6, result.getBySeverity( Severity.WARNING ).size() ); assertEquals( 1, result.getBySeverity( Severity.NOTE ).size() ); } public void testVerifierInvalidDRLs() { VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); // Check that the builder works. assertFalse( vBuilder.hasErrors() ); assertEquals( 0, vBuilder.getErrors().size() ); Verifier verifier = vBuilder.newVerifier(); String drl = "This will not work"; verifier.addResourcesToVerify( new ReaderResource( new StringReader( drl ) ), ResourceType.DRL ); assertTrue( verifier.hasErrors() ); assertEquals( 2, verifier.getErrors().size() ); } public void testVerifierNullPackageDescr() { VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); // Check that the builder works. assertFalse( vBuilder.hasErrors() ); assertEquals( 0, vBuilder.getErrors().size() ); Verifier verifier = vBuilder.newVerifier(); String drl = "#This will not work"; verifier.addResourcesToVerify( new ReaderResource( new StringReader( drl ) ), ResourceType.DRL ); assertTrue( verifier.hasErrors() ); assertEquals( 1, verifier.getErrors().size() ); } public void testFactTypesFromJar() { VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); // Check that the builder works. assertFalse( vBuilder.hasErrors() ); assertEquals( 0, vBuilder.getErrors().size() ); Verifier verifier = vBuilder.newVerifier(); try { JarInputStream jar = new JarInputStream( this.getClass().getResourceAsStream( "model.jar" ) ); verifier.addObjectModel( jar ); } catch ( IOException e ) { fail( e.getMessage() ); } verifier.addResourcesToVerify( new ClassPathResource( "imports.drl", Verifier.class ), ResourceType.DRL ); assertFalse( verifier.hasErrors() ); assertEquals( 0, verifier.getErrors().size() ); boolean works = verifier.fireAnalysis(); assertTrue( works ); VerifierReport result = verifier.getResult(); Collection<ObjectType> objectTypes = result.getVerifierData().getAll( VerifierComponentType.OBJECT_TYPE ); assertNotNull( objectTypes ); assertEquals( 3, objectTypes.size() ); Collection<Field> fields = result.getVerifierData().getAll( VerifierComponentType.FIELD ); assertNotNull( fields ); assertEquals( 10, fields.size() ); } public void testFactTypesFromJarAndDeclarations() { VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); // Check that the builder works. assertFalse( vBuilder.hasErrors() ); assertEquals( 0, vBuilder.getErrors().size() ); Verifier verifier = vBuilder.newVerifier(); try { JarInputStream jar = new JarInputStream( this.getClass().getResourceAsStream( "model.jar" ) ); verifier.addObjectModel( jar ); } catch ( IOException e ) { fail( e.getMessage() ); } verifier.addResourcesToVerify( new ClassPathResource( "importsAndDeclarations.drl", Verifier.class ), ResourceType.DRL ); assertFalse( verifier.hasErrors() ); assertEquals( 0, verifier.getErrors().size() ); boolean works = verifier.fireAnalysis(); assertTrue( works ); VerifierReport result = verifier.getResult(); Collection<ObjectType> objectTypes = result.getVerifierData().getAll( VerifierComponentType.OBJECT_TYPE ); for ( ObjectType objectType : objectTypes ) { if ( objectType.getName().equals( "VoiceCall" ) ) { assertEquals( 4, objectType.getMetadata().keySet().size() ); } } assertNotNull( objectTypes ); assertEquals( 4, objectTypes.size() ); Collection<Field> fields = result.getVerifierData().getAll( VerifierComponentType.FIELD ); assertNotNull( fields ); assertEquals( 11, fields.size() ); } public void testCustomRule() { VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder(); VerifierConfiguration vConfiguration = vBuilder.newVerifierConfiguration(); // Check that the builder works. assertFalse( vBuilder.hasErrors() ); assertEquals( 0, vBuilder.getErrors().size() ); vConfiguration.getVerifyingResources().put( new ClassPathResource( "FindPatterns.drl", Verifier.class ), ResourceType.DRL ); Verifier verifier = vBuilder.newVerifier( vConfiguration ); verifier.addResourcesToVerify( new ClassPathResource( "Misc3.drl", Verifier.class ), ResourceType.DRL ); assertFalse( verifier.hasErrors() ); assertEquals( 0, verifier.getErrors().size() ); boolean works = verifier.fireAnalysis(); if ( !works ) { for ( VerifierError error : verifier.getErrors() ) { System.out.println( error.getMessage() ); } fail( "Could not run verifier" ); } assertTrue( works ); VerifierReport result = verifier.getResult(); assertNotNull( result ); assertEquals( 0, result.getBySeverity( Severity.ERROR ).size() ); assertEquals( 0, result.getBySeverity( Severity.WARNING ).size() ); assertEquals( 6, result.getBySeverity( Severity.NOTE ).size() ); for ( VerifierMessageBase m : result.getBySeverity( Severity.NOTE ) ) { assertEquals( "This pattern was found.", m.getMessage() ); } } }