aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java')
-rw-r--r--framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java167
1 files changed, 167 insertions, 0 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java b/framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java
new file mode 100644
index 00000000..dc75a947
--- /dev/null
+++ b/framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java
@@ -0,0 +1,167 @@
+package org.apache.maven.lifecycle.internal.builder.multithreaded;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you 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.
+ */
+
+import junit.framework.TestCase;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.lifecycle.LifecycleNotFoundException;
+import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
+import org.apache.maven.lifecycle.internal.ProjectBuildList;
+import org.apache.maven.lifecycle.internal.ProjectSegment;
+import org.apache.maven.lifecycle.internal.builder.multithreaded.ThreadOutputMuxer;
+import org.apache.maven.lifecycle.internal.stub.ProjectDependencyGraphStub;
+import org.apache.maven.plugin.InvalidPluginDescriptorException;
+import org.apache.maven.plugin.MojoNotFoundException;
+import org.apache.maven.plugin.PluginDescriptorParsingException;
+import org.apache.maven.plugin.PluginNotFoundException;
+import org.apache.maven.plugin.PluginResolutionException;
+import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
+import org.apache.maven.plugin.version.PluginVersionResolutionException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletionService;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class ThreadOutputMuxerTest
+ extends TestCase
+{
+
+ final String paid = "Paid";
+
+ final String in = "In";
+
+ final String full = "Full";
+
+ public void testSingleThreaded()
+ throws Exception
+ {
+ ProjectBuildList src = getProjectBuildList();
+ ProjectBuildList projectBuildList =
+ new ProjectBuildList( Arrays.asList( src.get( 0 ), src.get( 1 ), src.get( 2 ) ) );
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ PrintStream systemOut = new PrintStream( byteArrayOutputStream );
+ ThreadOutputMuxer threadOutputMuxer = new ThreadOutputMuxer( projectBuildList, systemOut );
+
+ threadOutputMuxer.associateThreadWithProjectSegment( projectBuildList.get( 0 ) );
+ System.out.print( paid ); // No, this does not print to system.out. It's part of the test
+ assertEquals( paid.length(), byteArrayOutputStream.size() );
+ threadOutputMuxer.associateThreadWithProjectSegment( projectBuildList.get( 1 ) );
+ System.out.print( in ); // No, this does not print to system.out. It's part of the test
+ assertEquals( paid.length(), byteArrayOutputStream.size() );
+ threadOutputMuxer.associateThreadWithProjectSegment( projectBuildList.get( 2 ) );
+ System.out.print( full ); // No, this does not print to system.out. It's part of the test
+ assertEquals( paid.length(), byteArrayOutputStream.size() );
+
+ threadOutputMuxer.setThisModuleComplete( projectBuildList.get( 0 ) );
+ threadOutputMuxer.setThisModuleComplete( projectBuildList.get( 1 ) );
+ threadOutputMuxer.setThisModuleComplete( projectBuildList.get( 2 ) );
+ threadOutputMuxer.close();
+ assertEquals( ( paid + in + full ).length(), byteArrayOutputStream.size() );
+ }
+
+ public void testMultiThreaded()
+ throws Exception
+ {
+ ProjectBuildList projectBuildList = getProjectBuildList();
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ PrintStream systemOut = new PrintStream( byteArrayOutputStream );
+ final ThreadOutputMuxer threadOutputMuxer = new ThreadOutputMuxer( projectBuildList, systemOut );
+
+ final List<String> stringList =
+ Arrays.asList( "Thinkin", "of", "a", "master", "plan", "Cuz", "ain’t", "nuthin", "but", "sweat", "inside",
+ "my", "hand" );
+ Iterator<String> lyrics = stringList.iterator();
+
+ ExecutorService executor = Executors.newFixedThreadPool( 10 );
+ CompletionService<ProjectSegment> service = new ExecutorCompletionService<ProjectSegment>( executor );
+
+ List<Future<ProjectSegment>> futures = new ArrayList<Future<ProjectSegment>>();
+ for ( ProjectSegment projectBuild : projectBuildList )
+ {
+ final Future<ProjectSegment> buildFuture =
+ service.submit( new Outputter( threadOutputMuxer, projectBuild, lyrics.next() ) );
+ futures.add( buildFuture );
+ }
+
+ for ( Future<ProjectSegment> future : futures )
+ {
+ future.get();
+ }
+ int expectedLength = 0;
+ for ( int i = 0; i < projectBuildList.size(); i++ )
+ {
+ expectedLength += stringList.get( i ).length();
+ }
+
+ threadOutputMuxer.close();
+ final byte[] bytes = byteArrayOutputStream.toByteArray();
+ String result = new String( bytes );
+ assertEquals( result, expectedLength, bytes.length );
+
+
+ }
+
+ class Outputter
+ implements Callable<ProjectSegment>
+ {
+ private final ThreadOutputMuxer threadOutputMuxer;
+
+ private final ProjectSegment item;
+
+ private final String response;
+
+ Outputter( ThreadOutputMuxer threadOutputMuxer, ProjectSegment item, String response )
+ {
+ this.threadOutputMuxer = threadOutputMuxer;
+ this.item = item;
+ this.response = response;
+ }
+
+ public ProjectSegment call()
+ throws Exception
+ {
+ threadOutputMuxer.associateThreadWithProjectSegment( item );
+ System.out.print( response );
+ threadOutputMuxer.setThisModuleComplete( item );
+ return item;
+ }
+ }
+
+
+ private ProjectBuildList getProjectBuildList()
+ throws InvalidPluginDescriptorException, PluginVersionResolutionException, PluginDescriptorParsingException,
+ NoPluginFoundForPrefixException, MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
+ LifecyclePhaseNotFoundException, LifecycleNotFoundException
+ {
+ final MavenSession session = ProjectDependencyGraphStub.getMavenSession();
+ return ProjectDependencyGraphStub.getProjectBuildList( session );
+ }
+}