/* * Copyright 2016 JBoss by Red Hat. * * 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.guvnor.ala.build.maven.executor; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.Properties; import org.apache.commons.io.FileUtils; import org.apache.maven.project.MavenProject; import org.guvnor.ala.build.Project; import org.guvnor.ala.build.maven.model.impl.MavenProjectImpl; import org.guvnor.ala.build.maven.util.MavenBuildExecutor; import org.guvnor.ala.build.maven.util.RepositoryVisitor; import org.guvnor.ala.registry.local.InMemorySourceRegistry; import org.guvnor.ala.source.Source; import org.guvnor.ala.source.git.GitHub; import org.guvnor.ala.source.git.config.impl.GitConfigImpl; import org.guvnor.ala.source.git.executor.GitConfigExecutor; import org.junit.After; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.kie.scanner.embedder.MavenProjectLoader; import org.uberfire.java.nio.file.InvalidPathException; /** * Maven Compilation output parsing to evaluate the process output */ public class MavenCliOutputTest { public MavenCliOutputTest() { } private File tempPath; @Before public void setUp() throws IOException { tempPath = Files.createTempDirectory( "zzz" ).toFile(); } @After public void tearDown() { FileUtils.deleteQuietly( tempPath ); } @Test public void buildAppAndWaitForMavenOutputTest() throws IOException { final GitHub gitHub = new GitHub(); gitHub.getRepository( "salaboy/drools-workshop", new HashMap<String, String>() { { put( "out-dir", tempPath.getAbsolutePath() ); } } ); final Optional<Source> _source = new GitConfigExecutor( new InMemorySourceRegistry() ).apply( new GitConfigImpl( tempPath.getAbsolutePath(), "master", "https://github.com/kiegroup/drools-workshop", "drools-workshop", "true" ) ); assertTrue( _source.isPresent() ); final Source source = _source.get(); boolean buildProcessReady = false; Throwable error = null; PipedOutputStream baosOut = new PipedOutputStream(); PipedOutputStream baosErr = new PipedOutputStream(); final PrintStream out = new PrintStream( baosOut, true ); final PrintStream err = new PrintStream( baosErr, true ); //Build the project in a different thread new Thread( () -> { buildMavenProject( source, out, err ); } ).start(); // Use the PipeOutputStream to read the execution output and validate that the application was built. StringBuilder sb = new StringBuilder(); BufferedReader bufferedReader; bufferedReader = new BufferedReader( new InputStreamReader( new PipedInputStream( baosOut ) ) ); String line; while ( !( buildProcessReady || error != null ) ) { if ( ( line = bufferedReader.readLine() ) != null ) { sb.append( line ).append( "\n" ); if ( line.contains( "Building war:" ) ) { buildProcessReady = true; out.close(); err.close(); baosOut.close(); baosErr.close(); } } } assertTrue( sb.toString().contains( "Building war:" ) ); assertTrue( buildProcessReady ); assertTrue( error == null ); } /* * Build Maven Project from Source using Out and Err PrintStreams for getting the output */ private void buildMavenProject( Source source, PrintStream out, PrintStream err ) throws org.uberfire.java.nio.IOException, InvalidPathException, SecurityException, UnsupportedOperationException, IllegalArgumentException { List<String> goals = new ArrayList<>(); goals.add( "package" ); Properties p = new Properties(); p.setProperty( "failIfNoTests", "false" ); final InputStream pomStream = org.uberfire.java.nio.file.Files.newInputStream( source.getPath().resolve( "drools-webapp-example" ).resolve( "pom.xml" ) ); MavenProject project = MavenProjectLoader.parseMavenPom( pomStream ); final String expectedBinary = project.getArtifact().getArtifactId() + "-" + project.getArtifact().getVersion() + "." + project.getArtifact().getType(); final org.guvnor.ala.build.maven.model.MavenProject mavenProject = new MavenProjectImpl( project.getId(), project.getArtifact().getType(), project.getName(), expectedBinary, source.getPath(), source.getPath().resolve( "drools-webapp-example" ), source.getPath().resolve( "target" ).resolve( expectedBinary ).toAbsolutePath(), null, null ); final File pom = new File( getRepositoryVisitor( mavenProject ).getRoot(), "pom.xml" ); MavenBuildExecutor.executeMaven( pom, out, err, p, goals.toArray( new String[0] ) ); } private RepositoryVisitor getRepositoryVisitor( final Project project ) { return new RepositoryVisitor( project.getPath(), project.getName() ); } }