Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/MemoryConsumptionTest.java')
-rw-r--r--org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/MemoryConsumptionTest.java108
1 files changed, 108 insertions, 0 deletions
diff --git a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/MemoryConsumptionTest.java b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/MemoryConsumptionTest.java
new file mode 100644
index 00000000..8d72a6d4
--- /dev/null
+++ b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/MemoryConsumptionTest.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * - Mickael Istria (Red Hat Inc.) - Initial implementation
+ *******************************************************************************/
+
+package org.eclipse.m2e.core.internal.project.registry;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+import java.nio.file.Files;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.utils.io.FileUtils;
+
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.internal.IMavenConstants;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
+import org.eclipse.m2e.core.project.MavenProjectInfo;
+import org.eclipse.m2e.core.project.ProjectImportConfiguration;
+import org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase;
+
+
+public class MemoryConsumptionTest extends AbstractMavenProjectTestCase {
+
+ @Test
+ public void testImportLongBuildChain() throws Exception {
+ int[] maxMavenProjectInstancesInContext = new int[] {0};
+ MavenPluginActivator.getDefault().getMavenProjectManagerImpl().addContextProjectListener = context -> {
+ Map<MavenProject, Object> allMavenProjects = new IdentityHashMap<>();
+ context.values().forEach(mavenProject -> {
+ while(mavenProject != null) {
+ allMavenProjects.put(mavenProject, new Object());
+ mavenProject = mavenProject.getParent();
+ }
+ });
+ maxMavenProjectInstancesInContext[0] = Math.max(maxMavenProjectInstancesInContext[0], allMavenProjects.size());
+ };
+ File tempDirectory = Files.createTempDirectory(getClass().getSimpleName()).toFile();
+ int nbProjects = 50;
+ Set<File> poms = buildLinearHierarchy(nbProjects, tempDirectory);
+ try {
+ List<MavenProjectInfo> toImport = poms.stream().map(pom -> new MavenProjectInfo("", pom, null, null))
+ .collect(Collectors.toList());
+ MavenPlugin.getProjectConfigurationManager().importProjects(toImport, new ProjectImportConfiguration(), null,
+ new NullProgressMonitor());
+ waitForJobsToComplete(monitor);
+ for(IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
+ if(p.hasNature(IMavenConstants.NATURE_ID)) {
+ poms.remove(p.getFile("pom.xml").getLocation().toFile());
+ }
+ }
+ Assert.assertEquals("Some poms were not imported as project", Collections.emptySet(), poms);
+ Assert.assertEquals(nbProjects, maxMavenProjectInstancesInContext[0]);
+ } finally {
+ MavenPluginActivator.getDefault().getMavenProjectManagerImpl().addContextProjectListener = null;
+ FileUtils.deleteDirectory(tempDirectory);
+ }
+ }
+
+ private Set<File> buildLinearHierarchy(int depth, File tempDirectory) throws FileNotFoundException {
+ Set<File> poms = new HashSet<>(depth, 1.f);
+ for(int i = 0; i < depth; i++ ) {
+ File projectDir = new File(tempDirectory, "p" + i);
+ projectDir.mkdirs();
+ File pom = new File(projectDir, "pom.xml");
+ poms.add(pom);
+ try (PrintStream content = new PrintStream(pom);) {
+ content.println("<project>");
+ content.println(" <modelVersion>4.0.0</modelVersion>");
+ content.println(" <groupId>org.eclipse.m2e.core.tests.hierarchy</groupId>");
+ content.println(" <artifactId>pNUMBER</artifactId>".replace("NUMBER", Integer.toString(i)));
+ content.println(" <version>1</version>");
+ content.println(" <packaging>pom</packaging>");
+ if(i > 1) {
+ content.println(" <parent>");
+ content.println(" <groupId>org.eclipse.m2e.core.tests.hierarchy</groupId>");
+ content.println(" <artifactId>pNUMBER</artifactId>".replace("NUMBER", Integer.toString(i - 1)));
+ content.println(" <version>1</version>");
+ content.println(" <relativePath>../pNUMBER</relativePath>".replace("NUMBER", Integer.toString(i - 1)));
+ content.println(" </parent>");
+ }
+ content.println("</project>");
+ }
+ }
+ return poms;
+ }
+}

Back to the top