Bug 471861 - The "eclipse.p2.max.threads" property has no effect for
values greater than four

Update SimpleArtifactRepositoryTest.testMaximumThreads() to test for the
modified expected behavior. I.e., that the repo can specify a maximum
that must be respected, the user can specify a maximum that is respected
if the repo doesn't specify a lower maximum, and if the user doesn't
specify a maximum, it behaves the same way as if the user specified a
maximum of 4.

Change-Id: I64b80d04b982ef37e60cf07312084ffaaab7b05a
Signed-off-by: Ed Merks <ed.merks@gmail.com>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
index 6143ba7..992beed 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
@@ -955,24 +955,26 @@
 	/**
 	 * Returns the maximum number of concurrent download threads.
 	 */
+
 	private int getMaximumThreads() {
-		int repoMaxThreads = DEFAULT_MAX_THREADS;
-		int userMaxThreads = DEFAULT_MAX_THREADS;
-		try {
-			String maxThreadString = getProperties().get(PROP_MAX_THREADS);
-			if (maxThreadString != null)
-				repoMaxThreads = Math.max(1, Integer.parseInt(maxThreadString));
-		} catch (NumberFormatException nfe) {
-			// default number of threads
-		}
+		int maxThreads = DEFAULT_MAX_THREADS;
 		try {
 			String maxThreadString = Activator.getContext().getProperty(PROP_MAX_THREADS);
 			if (maxThreadString != null)
-				userMaxThreads = Math.max(1, Integer.parseInt(maxThreadString));
+				maxThreads = Math.max(1, Integer.parseInt(maxThreadString));
 		} catch (NumberFormatException nfe) {
 			// default number of threads
 		}
-		return Math.min(repoMaxThreads, userMaxThreads);
+		try {
+			String maxThreadString = getProperties().get(PROP_MAX_THREADS);
+			if (maxThreadString != null) {
+				int repoMaxThreads = Math.max(1, Integer.parseInt(maxThreadString));
+				maxThreads = Math.min(maxThreads, repoMaxThreads);
+			}
+		} catch (NumberFormatException nfe) {
+			// ignore repoMaxThreads
+		}
+		return maxThreads;
 	}
 
 	@Override
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java
index f3bd0ee..e8eaee4 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java
@@ -474,24 +474,39 @@
 		System.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "2");
 		assertEquals("Valid User setting", 2, getIntVal(getMaximumThreads, repo));
 
-		// User value is too high
+		// User value is high, but repo specifies no limit, so user value is used
+		// directly.
 		System.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "22");
-		assertEquals("Invalid User setting", defaultMaxThreads, getIntVal(getMaximumThreads, repo));
+		assertEquals("Invalid User setting", 22, getIntVal(getMaximumThreads, repo));
 		System.clearProperty(SimpleArtifactRepository.PROP_MAX_THREADS);
 
 		// Legitimate repo value
 		repo.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "4");
 		assertEquals("Valid repository specified setting", 4, getIntVal(getMaximumThreads, repo));
 
+		// Legitimate big repo value, but user default when not specified at all is 4.
+		repo.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "8");
+		assertEquals("Valid repository specified setting", 4, getIntVal(getMaximumThreads, repo));
+
 		// User value is lower should take precedence
 		repo.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "3");
 		System.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "2");
 		assertEquals("User setting should take precedence", 2, getIntVal(getMaximumThreads, repo));
 
-		// User value is lower should take precedence
+		// User value is big but lower should take precedence
+		repo.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "10");
+		System.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "8");
+		assertEquals("User setting should take precedence", 8, getIntVal(getMaximumThreads, repo));
+
+		// Repo value is lower should take precedence
 		repo.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "2");
 		System.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "3");
 		assertEquals("User setting should take precedence", 2, getIntVal(getMaximumThreads, repo));
+
+		// Repo value is big but lower should take precedence
+		repo.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "8");
+		System.setProperty(SimpleArtifactRepository.PROP_MAX_THREADS, "10");
+		assertEquals("User setting should take precedence", 8, getIntVal(getMaximumThreads, repo));
 	}
 
 	private int getIntVal(Method m, Object repo) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {