/* * Copyright 2016 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.kie.workbench.common.services.backend.builder.core; import java.io.File; import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.function.Predicate; import com.google.common.io.Resources; import org.drools.core.rule.TypeMetaInfo; import org.guvnor.common.services.project.builder.model.BuildMessage; import org.guvnor.common.services.project.builder.model.BuildResults; import org.guvnor.common.services.project.builder.service.BuildService; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.project.model.Project; import org.guvnor.common.services.shared.validation.model.ValidationMessage; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.scanner.KieModuleMetaData; import org.kie.workbench.common.services.backend.validation.asset.DefaultGenericKieValidator; import org.kie.workbench.common.services.backend.whitelist.PackageNameSearchProvider; import org.kie.workbench.common.services.backend.whitelist.PackageNameWhiteListLoader; import org.kie.workbench.common.services.backend.whitelist.PackageNameWhiteListSaver; import org.kie.workbench.common.services.backend.whitelist.PackageNameWhiteListServiceImpl; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.kie.workbench.common.services.shared.project.ProjectImportsService; import org.kie.workbench.common.services.shared.whitelist.PackageNameWhiteListService; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.uberfire.backend.server.util.Paths; import org.uberfire.io.IOService; import org.uberfire.java.nio.fs.file.SimpleFileSystemProvider; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class BuilderTest extends BuilderTestBase { private static final Logger logger = LoggerFactory.getLogger( BuilderTest.class ); private final Predicate<String> alwaysTrue = o -> true; @Mock private PackageNameSearchProvider packageNameSearchProvider; private IOService ioService; private KieProjectService projectService; private ProjectImportsService importsService; private LRUProjectDependenciesClassLoaderCache dependenciesClassLoaderCache; private LRUPomModelCache pomModelCache; private BuildService buildService; private DefaultGenericKieValidator validator; @Before public void setUp() throws Exception { PackageNameSearchProvider.PackageNameSearch nameSearch = mock( PackageNameSearchProvider.PackageNameSearch.class ); when( nameSearch.search() ).thenReturn( new HashSet<String>() ); when( packageNameSearchProvider.newTopLevelPackageNamesSearch( any( POM.class ) ) ).thenReturn( nameSearch ); super.startWeld(); setUpGuvnorM2Repo(); ioService = getReference( IOService.class ); projectService = getReference( KieProjectService.class ); importsService = getReference( ProjectImportsService.class ); dependenciesClassLoaderCache = getReference( LRUProjectDependenciesClassLoaderCache.class ); pomModelCache = getReference( LRUPomModelCache.class ); buildService = getReference( BuildService.class ); validator = getReference( DefaultGenericKieValidator.class ); } @After public void cleanUp() { super.stopWeld(); } @Test public void testBuilderSimpleKProject() throws Exception { LRUPomModelCache pomModelCache = getReference( LRUPomModelCache.class ); URL url = this.getClass().getResource( "/GuvnorM2RepoDependencyExample1" ); SimpleFileSystemProvider p = new SimpleFileSystemProvider(); org.uberfire.java.nio.file.Path path = p.getPath( url.toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, getPackageNameWhiteListService(), alwaysTrue ); assertNotNull( builder.getKieContainer() ); } @Test public void testBuilderKProjectHasDependency() throws Exception { URL url = this.getClass().getResource( "/GuvnorM2RepoDependencyExample2" ); SimpleFileSystemProvider p = new SimpleFileSystemProvider(); org.uberfire.java.nio.file.Path path = p.getPath( url.toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, getPackageNameWhiteListService(), alwaysTrue ); final BuildResults results = builder.build(); //Debug output if ( !results.getMessages().isEmpty() ) { for ( BuildMessage m : results.getMessages() ) { logger.debug( m.getText() ); } } assertTrue( results.getMessages().isEmpty() ); } @Test public void testBuilderKProjectHasSnapshotDependency() throws Exception { URL url = this.getClass().getResource( "/GuvnorM2RepoDependencyExample2Snapshot" ); SimpleFileSystemProvider p = new SimpleFileSystemProvider(); org.uberfire.java.nio.file.Path path = p.getPath( url.toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, getPackageNameWhiteListService(), alwaysTrue ); final BuildResults results = builder.build(); //Debug output if ( !results.getMessages().isEmpty() ) { for ( BuildMessage m : results.getMessages() ) { logger.debug( m.getText() ); } } assertTrue( results.getMessages().isEmpty() ); } @Test public void testBuilderKProjectHasDependencyMetaData() throws Exception { URL url = this.getClass().getResource( "/GuvnorM2RepoDependencyExample2" ); SimpleFileSystemProvider p = new SimpleFileSystemProvider(); org.uberfire.java.nio.file.Path path = p.getPath( url.toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, getPackageNameWhiteListService(), alwaysTrue ); final BuildResults results = builder.build(); //Debug output if ( !results.getMessages().isEmpty() ) { for ( BuildMessage m : results.getMessages() ) { logger.debug( m.getText() ); } } assertTrue( results.getMessages().isEmpty() ); final KieModuleMetaData metaData = KieModuleMetaData.Factory.newKieModuleMetaData( builder.getKieModule() ); //Check packages final Set<String> packageNames = new HashSet<>(); final Iterator<String> packageNameIterator = metaData.getPackages().iterator(); while ( packageNameIterator.hasNext() ) { packageNames.add( packageNameIterator.next() ); } assertEquals( 2, packageNames.size() ); assertTrue( packageNames.contains( "defaultpkg" ) ); assertTrue( packageNames.contains( "org.kie.workbench.common.services.builder.tests.test1" ) ); //Check classes final String packageName = "org.kie.workbench.common.services.builder.tests.test1"; assertEquals( 1, metaData.getClasses( packageName ).size() ); final String className = metaData.getClasses( packageName ).iterator().next(); assertEquals( "Bean", className ); //Check metadata final Class clazz = metaData.getClass( packageName, className ); final TypeMetaInfo typeMetaInfo = metaData.getTypeMetaInfo( clazz ); assertNotNull( typeMetaInfo ); assertFalse( typeMetaInfo.isEvent() ); } @Test public void testKProjectContainsXLS() throws Exception { URL url = this.getClass().getResource( "/ExampleWithExcel" ); SimpleFileSystemProvider p = new SimpleFileSystemProvider(); org.uberfire.java.nio.file.Path path = p.getPath( url.toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, getPackageNameWhiteListService(), alwaysTrue ); final BuildResults results = builder.build(); //Debug output if ( !results.getMessages().isEmpty() ) { for ( BuildMessage m : results.getMessages() ) { logger.debug( m.getText() ); } } assertTrue( results.getMessages().isEmpty() ); } @Test public void testBuilderFixForBrokenKProject() throws Exception { LRUPomModelCache pomModelCache = getReference( LRUPomModelCache.class ); SimpleFileSystemProvider provider = new SimpleFileSystemProvider(); org.uberfire.java.nio.file.Path path = provider.getPath( this.getClass().getResource( "/BuilderExampleBrokenSyntax" ).toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, mock( PackageNameWhiteListService.class ), alwaysTrue ); assertNull( builder.getKieContainer() ); builder.deleteResource( provider.getPath( this.getClass().getResource( File.separatorChar + "BuilderExampleBrokenSyntax" + File.separatorChar + "src" + File.separatorChar + "main" + File.separatorChar + "resources" + File.separatorChar + "rule1.drl" ).toURI() ) ); assertNotNull( builder.getKieContainer() ); } @Test public void testBuilderKieContainerInstantiation() throws Exception { final URL url = this.getClass().getResource( "/GuvnorM2RepoDependencyExample1" ); final SimpleFileSystemProvider p = new SimpleFileSystemProvider(); final org.uberfire.java.nio.file.Path path = p.getPath( url.toURI() ); final Project project = projectService.resolveProject( Paths.convert( path ) ); //Build Project, including Rules and Global definition final Builder builder = new Builder( project, ioService, projectService, importsService, new ArrayList<>(), dependenciesClassLoaderCache, pomModelCache, getPackageNameWhiteListService(), alwaysTrue ); assertNotNull( builder.getKieContainer() ); //Validate Rule excluding Global definition final URL urlToValidate = this.getClass().getResource( "/GuvnorM2RepoDependencyExample1/src/main/resources/rule2.drl" ); final org.uberfire.java.nio.file.Path pathToValidate = p.getPath( urlToValidate.toURI() ); final List<ValidationMessage> validationMessages = validator.validate( Paths.convert( pathToValidate ), Resources.toString( urlToValidate, Charset.forName( "UTF-8" ) ) ); assertNotNull( validationMessages ); assertEquals( 0, validationMessages.size() ); // Retrieve a KieSession for the Project and set the Global. This should not fail as the // KieContainer is retrieved direct from the KieBuilder and not KieRepository (as was the // case before BZ1202551 was fixed. final KieContainer kieContainer1 = builder.getKieContainer(); final KieSession kieSession1 = kieContainer1.newKieSession(); kieSession1.setGlobal( "list", new ArrayList<String>() ); } private PackageNameWhiteListService getPackageNameWhiteListService() { return new PackageNameWhiteListServiceImpl( ioService, mock( KieProjectService.class ), new PackageNameWhiteListLoader( packageNameSearchProvider, ioService ), mock( PackageNameWhiteListSaver.class ) ); } }