Fix user extract pattern for maxStartForTaskForUserForQueue Fixes the user extract pattern in maxStartForTaskForUserForQueue quota to use the updated logic in I69d2b4a1d. Change-Id: Ifb0abb139e6dcd8d5c7424ffe709df33e4d4bbe4
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskParser.java b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskParser.java index 5944308..f70a34f 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskParser.java +++ b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskParser.java
@@ -20,10 +20,12 @@ import java.util.regex.Pattern; public class TaskParser { - public static final Pattern USER_EXTRACT_PATTERN = Pattern.compile("\\(([\\-_A-Za-z0-9]+)\\)$"); + public static final String USER_PATTERN = "([\\-_A-Za-z0-9]+)"; + public static final Pattern USER_EXTRACT_PATTERN_FROM_TASK_STRING = + Pattern.compile("\\(" + USER_PATTERN + "\\)$"); public static Optional<String> user(WorkQueue.Task<?> task) { - Matcher matcher = USER_EXTRACT_PATTERN.matcher(task.toString()); - return matcher.find() ? Optional.of(matcher.group()) : Optional.empty(); + Matcher matcher = USER_EXTRACT_PATTERN_FROM_TASK_STRING.matcher(task.toString()); + return matcher.find() ? Optional.of(matcher.group(1)) : Optional.empty(); } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaForTaskForQueueForUser.java b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaForTaskForQueueForUser.java index 751559e..01438ad 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaForTaskForQueueForUser.java +++ b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaForTaskForQueueForUser.java
@@ -28,9 +28,9 @@ Pattern.compile( "(\\d+)\\s+(" + String.join("|", SUPPORTED_TASKS_BY_GROUP.keySet()) - + ")\\s+([a-zA-Z0-9]+)" + + ")\\s+" + + TaskParser.USER_PATTERN + "\\s+(.+)"); - public static final Pattern USER_EXTRACT_PATTERN = Pattern.compile("\\(([a-z0-9]+)\\)$"); private final String user; public TaskQuotaForTaskForQueueForUser( @@ -41,8 +41,7 @@ @Override public boolean isApplicable(WorkQueue.Task<?> task) { - Matcher taskUser = USER_EXTRACT_PATTERN.matcher(task.toString()); - return taskUser.find() && user.equals(taskUser.group(1)) && super.isApplicable(task); + return TaskParser.user(task).map(user::equals).orElse(false) && super.isApplicable(task); } public static Optional<TaskQuota> build(QuotaSection qs, String config) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/quota/TaskQuotasTest.java b/src/test/java/com/googlesource/gerrit/plugins/quota/TaskQuotasTest.java index 61614c8..75fc8d8 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/quota/TaskQuotasTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/quota/TaskQuotasTest.java
@@ -33,7 +33,7 @@ @RunWith(MockitoJUnitRunner.class) public class TaskQuotasTest { private static final String PROJECT_X = "project-x"; - private static final String USER_A = "USER_A"; + private static final String USER_A = "USER-A"; private static final String USER_B = "USER_B"; @Test @@ -42,7 +42,7 @@ taskQuotas( 2, 2, - """ +""" [quota "%s"] maxStartForTaskForQueue = 1 uploadpack %s """ @@ -78,12 +78,44 @@ } @Test + public void testMaxStartForTaskForUserForQueue() throws ConfigInvalidException { + TaskQuotas taskQuotas = + taskQuotas( + 2, + 2, +""" +[quota "%s"] + maxStartForTaskForUserForQueue = 1 uploadpack %s %s +""" + .formatted(PROJECT_X, USER_A, INTERACTIVE.getName())); + + Task<?> u_x_a_1 = task(INTERACTIVE.getName(), uploadPackTask(PROJECT_X, USER_A)); + assertTrue(taskQuotas.isReadyToStart(u_x_a_1)); + startAndCompleteTask(taskQuotas, u_x_a_1); + + Task<?> u_x_a_2 = task(INTERACTIVE.getName(), uploadPackTask(PROJECT_X, USER_A)); + assertTrue(taskQuotas.isReadyToStart(u_x_a_2)); + taskQuotas.onStart(u_x_a_2); + + Task<?> u_x_a_3 = task(INTERACTIVE.getName(), uploadPackTask(PROJECT_X, USER_A)); + assertFalse(taskQuotas.isReadyToStart(u_x_a_3)); + + Task<?> u_x_b_1 = task(INTERACTIVE.getName(), uploadPackTask(PROJECT_X, USER_B)); + assertTrue(taskQuotas.isReadyToStart(u_x_b_1)); + startAndCompleteTask(taskQuotas, u_x_b_1); + + taskQuotas.onStop(u_x_a_2); + assertTrue(taskQuotas.isReadyToStart(u_x_a_3)); + startAndCompleteTask(taskQuotas, u_x_a_3); + } + + @Test public void testSoftMaxPerUserForQueue() throws ConfigInvalidException { TaskQuotas taskQuotas = taskQuotas( 5, 5, - """ +""" [quota "%s"] softMaxStartPerUserForQueue = 2 %s """