From cbae09b1ba3424ec7b2e88fd1734630893a1ccdd Mon Sep 17 00:00:00 2001 From: Brian Egizi Date: Thu, 9 Jan 2020 14:45:23 -0800 Subject: [PATCH] Update CommentValidator interface to include change context Include the project and change number when calling to validate comments so that validators can use that data to determine if they should run validation for that comment. Bug: Issue 12055 Change-Id: I99bb99350b08e9527e9e4b0da53eb8c8d14a3340 --- .../validators/CommentValidationContext.java | 49 +++++++++++++++++++ .../validators/CommentValidator.java | 2 +- .../gerrit/server/PublishCommentUtil.java | 7 ++- .../server/git/receive/ReceiveCommits.java | 11 ++++- .../validators/CommentLimitsValidator.java | 3 +- .../server/mail/receive/MailProcessor.java | 9 +++- .../server/restapi/change/PostReview.java | 22 +++++++-- .../acceptance/api/change/PostReviewIT.java | 44 +++++++++++++---- .../ReceiveCommitsCommentValidationIT.java | 30 +++++++++--- .../server/mail/MailProcessorIT.java | 16 ++++-- 10 files changed, 159 insertions(+), 34 deletions(-) create mode 100644 java/com/google/gerrit/extensions/validators/CommentValidationContext.java diff --git a/java/com/google/gerrit/extensions/validators/CommentValidationContext.java b/java/com/google/gerrit/extensions/validators/CommentValidationContext.java new file mode 100644 index 0000000000..1cb00e30ef --- /dev/null +++ b/java/com/google/gerrit/extensions/validators/CommentValidationContext.java @@ -0,0 +1,49 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// 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 com.google.gerrit.extensions.validators; + +import com.google.auto.value.AutoValue; + +/** + * Holds a comment validators context in order to pass it to a validation plugin. + * + *

This is used to provided additional context around that comment that can be used by the + * validator to determine what validations should be run. For example, a comment validator may only + * want to validate a comment if it's on a change in the project foo. + * + * @see CommentValidator + */ +@AutoValue +public abstract class CommentValidationContext { + + /** Returns the change id the comment is being added to. */ + public abstract int getChangeId(); + + /** Returns the project the comment is being added to. */ + public abstract String getProject(); + + public static Builder builder() { + return new AutoValue_CommentValidationContext.Builder(); + } + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder changeId(int value); + + public abstract Builder project(String value); + + public abstract CommentValidationContext build(); + } +} diff --git a/java/com/google/gerrit/extensions/validators/CommentValidator.java b/java/com/google/gerrit/extensions/validators/CommentValidator.java index cfefdefc8f..ba73e46f6d 100644 --- a/java/com/google/gerrit/extensions/validators/CommentValidator.java +++ b/java/com/google/gerrit/extensions/validators/CommentValidator.java @@ -30,5 +30,5 @@ public interface CommentValidator { * @return An empty list if all comments are valid, or else a list of validation failures. */ ImmutableList validateComments( - ImmutableList comments); + CommentValidationContext ctx, ImmutableList comments); } diff --git a/java/com/google/gerrit/server/PublishCommentUtil.java b/java/com/google/gerrit/server/PublishCommentUtil.java index 09042abefa..3d34d6b2b6 100644 --- a/java/com/google/gerrit/server/PublishCommentUtil.java +++ b/java/com/google/gerrit/server/PublishCommentUtil.java @@ -25,6 +25,7 @@ import com.google.gerrit.entities.Comment.Status; import com.google.gerrit.entities.PatchSet; import com.google.gerrit.exceptions.StorageException; import com.google.gerrit.extensions.validators.CommentForValidation; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidationFailure; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.server.notedb.ChangeNotes; @@ -118,16 +119,18 @@ public class PublishCommentUtil { /** * Helper to run the specified set of {@link CommentValidator}-s on the specified comments. * - * @return See {@link CommentValidator#validateComments(ImmutableList)}. + * @return See {@link CommentValidator#validateComments(CommentValidationContext,ImmutableList)}. */ public static ImmutableList findInvalidComments( + CommentValidationContext ctx, PluginSetContext commentValidators, ImmutableList commentsForValidation) { ImmutableList.Builder commentValidationFailures = new ImmutableList.Builder<>(); commentValidators.runEach( validator -> - commentValidationFailures.addAll(validator.validateComments(commentsForValidation))); + commentValidationFailures.addAll( + validator.validateComments(ctx, commentsForValidation))); return commentValidationFailures.build(); } } diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java index 3d531b2c5d..d8aa05456a 100644 --- a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java +++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java @@ -93,6 +93,7 @@ import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.validators.CommentForValidation; import com.google.gerrit.extensions.validators.CommentForValidation.CommentType; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidationFailure; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.server.ApprovalsUtil; @@ -2014,8 +2015,13 @@ class ReceiveCommits { : CommentType.FILE_COMMENT, comment.message)) .collect(toImmutableList()); + CommentValidationContext ctx = + CommentValidationContext.builder() + .changeId(change.getChangeId()) + .project(change.getProject().get()) + .build(); ImmutableList commentValidationFailures = - PublishCommentUtil.findInvalidComments(commentValidators, draftsForValidation); + PublishCommentUtil.findInvalidComments(ctx, commentValidators, draftsForValidation); magicBranch.setCommentsValid(commentValidationFailures.isEmpty()); commentValidationFailures.forEach( failure -> @@ -3337,7 +3343,8 @@ class ReceiveCommits { } logger.atFine().log( - "Auto-closing %d changes with existing patch sets and %d with new patch sets", + "Auto-closing %d changes with existing patch sets and %d with new patch" + + " sets", existingPatchSets, newPatchSets); bu.execute(); } catch (IOException | StorageException | PermissionBackendException e) { diff --git a/java/com/google/gerrit/server/git/validators/CommentLimitsValidator.java b/java/com/google/gerrit/server/git/validators/CommentLimitsValidator.java index 8237e69c36..3a8bcacceb 100644 --- a/java/com/google/gerrit/server/git/validators/CommentLimitsValidator.java +++ b/java/com/google/gerrit/server/git/validators/CommentLimitsValidator.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.git.validators; import com.google.common.collect.ImmutableList; import com.google.gerrit.extensions.validators.CommentForValidation; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidationFailure; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.server.config.GerritServerConfig; @@ -33,7 +34,7 @@ public class CommentLimitsValidator implements CommentValidator { @Override public ImmutableList validateComments( - ImmutableList comments) { + CommentValidationContext ctx, ImmutableList comments) { return comments.stream() .filter(c -> c.getText().length() > maxCommentLength) .map( diff --git a/java/com/google/gerrit/server/mail/receive/MailProcessor.java b/java/com/google/gerrit/server/mail/receive/MailProcessor.java index 71d8c15592..e79696a868 100644 --- a/java/com/google/gerrit/server/mail/receive/MailProcessor.java +++ b/java/com/google/gerrit/server/mail/receive/MailProcessor.java @@ -34,6 +34,7 @@ import com.google.gerrit.extensions.registration.Extension; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.validators.CommentForValidation; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidationFailure; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.mail.HtmlParser; @@ -287,8 +288,14 @@ public class MailProcessor { MAIL_COMMENT_TYPE_TO_VALIDATION_TYPE.get(comment.getType()), comment.getMessage())) .collect(ImmutableList.toImmutableList()); + CommentValidationContext commentValidationCtx = + CommentValidationContext.builder() + .changeId(cd.change().getChangeId()) + .project(cd.change().getProject().get()) + .build(); ImmutableList commentValidationFailures = - PublishCommentUtil.findInvalidComments(commentValidators, parsedCommentsForValidation); + PublishCommentUtil.findInvalidComments( + commentValidationCtx, commentValidators, parsedCommentsForValidation); if (!commentValidationFailures.isEmpty()) { sendRejectionEmail(message, InboundEmailRejectionSender.Error.COMMENT_REJECTED); return; diff --git a/java/com/google/gerrit/server/restapi/change/PostReview.java b/java/com/google/gerrit/server/restapi/change/PostReview.java index 03c2fc4672..324069d806 100644 --- a/java/com/google/gerrit/server/restapi/change/PostReview.java +++ b/java/com/google/gerrit/server/restapi/change/PostReview.java @@ -77,6 +77,7 @@ import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.extensions.validators.CommentForValidation; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidationFailure; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.json.OutputFormat; @@ -999,16 +1000,22 @@ public class PostReview implements RestModifyView } } + CommentValidationContext commentValidationCtx = + CommentValidationContext.builder() + .changeId(ctx.getChange().getChangeId()) + .project(ctx.getChange().getProject().get()) + .build(); switch (in.drafts) { case PUBLISH: case PUBLISH_ALL_REVISIONS: - validateComments(Streams.concat(drafts.values().stream(), toPublish.stream())); + validateComments( + commentValidationCtx, Streams.concat(drafts.values().stream(), toPublish.stream())); publishCommentUtil.publish(ctx, ctx.getUpdate(psId), drafts.values(), in.tag); comments.addAll(drafts.values()); break; case KEEP: default: - validateComments(toPublish.stream()); + validateComments(commentValidationCtx, toPublish.stream()); break; } ChangeUpdate changeUpdate = ctx.getUpdate(psId); @@ -1017,7 +1024,8 @@ public class PostReview implements RestModifyView return !toPublish.isEmpty(); } - private void validateComments(Stream comments) throws CommentsRejectedException { + private void validateComments(CommentValidationContext ctx, Stream comments) + throws CommentsRejectedException { ImmutableList draftsForValidation = comments .map( @@ -1029,7 +1037,7 @@ public class PostReview implements RestModifyView comment.message)) .collect(toImmutableList()); ImmutableList draftValidationFailures = - PublishCommentUtil.findInvalidComments(commentValidators, draftsForValidation); + PublishCommentUtil.findInvalidComments(ctx, commentValidators, draftsForValidation); if (!draftValidationFailures.isEmpty()) { throw new CommentsRejectedException(draftValidationFailures); } @@ -1415,8 +1423,14 @@ public class PostReview implements RestModifyView buf.append(String.format("\n\n(%d comments)", comments.size())); } if (!msg.isEmpty()) { + CommentValidationContext commentValidationCtx = + CommentValidationContext.builder() + .changeId(ctx.getChange().getChangeId()) + .project(ctx.getChange().getProject().get()) + .build(); ImmutableList messageValidationFailure = PublishCommentUtil.findInvalidComments( + commentValidationCtx, commentValidators, ImmutableList.of( CommentForValidation.create( diff --git a/javatests/com/google/gerrit/acceptance/api/change/PostReviewIT.java b/javatests/com/google/gerrit/acceptance/api/change/PostReviewIT.java index 7156c8d1b8..524a05e44f 100644 --- a/javatests/com/google/gerrit/acceptance/api/change/PostReviewIT.java +++ b/javatests/com/google/gerrit/acceptance/api/change/PostReviewIT.java @@ -16,6 +16,7 @@ package com.google.gerrit.acceptance.api.change; import static com.google.common.truth.Truth.assertThat; import static com.google.gerrit.testing.GerritJUnit.assertThrows; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -37,6 +38,7 @@ import com.google.gerrit.extensions.config.FactoryModule; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.validators.CommentForValidation; import com.google.gerrit.extensions.validators.CommentForValidation.CommentType; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.server.restapi.change.PostReview; import com.google.gerrit.server.update.CommentsRejectedException; @@ -80,14 +82,17 @@ public class PostReviewIT extends AbstractDaemonTest { @Test public void validateCommentsInInput_commentOK() throws Exception { + PushOneCommit.Result r = createChange(); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(r.getChange().getId().get()) + .project(r.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create( CommentForValidation.CommentType.FILE_COMMENT, COMMENT_TEXT)))) .thenReturn(ImmutableList.of()); - PushOneCommit.Result r = createChange(); - ReviewInput input = new ReviewInput(); CommentInput comment = newComment(r.getChange().currentFilePaths().get(0)); comment.updated = new Timestamp(0); @@ -101,14 +106,17 @@ public class PostReviewIT extends AbstractDaemonTest { @Test public void validateCommentsInInput_commentRejected() throws Exception { + PushOneCommit.Result r = createChange(); CommentForValidation commentForValidation = CommentForValidation.create(CommentType.FILE_COMMENT, COMMENT_TEXT); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(r.getChange().getId().get()) + .project(r.getChange().project().get()) + .build(), ImmutableList.of(CommentForValidation.create(CommentType.FILE_COMMENT, COMMENT_TEXT)))) .thenReturn(ImmutableList.of(commentForValidation.failValidation("Oh no!"))); - PushOneCommit.Result r = createChange(); - ReviewInput input = new ReviewInput(); CommentInput comment = newComment(r.getChange().currentFilePaths().get(0)); comment.updated = new Timestamp(0); @@ -151,14 +159,17 @@ public class PostReviewIT extends AbstractDaemonTest { @Test public void validateDrafts_draftOK() throws Exception { + PushOneCommit.Result r = createChange(); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(r.getChange().getId().get()) + .project(r.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create( CommentForValidation.CommentType.INLINE_COMMENT, COMMENT_TEXT)))) .thenReturn(ImmutableList.of()); - PushOneCommit.Result r = createChange(); - DraftInput draft = testCommentHelper.newDraft( r.getChange().currentFilePaths().get(0), Side.REVISION, 1, COMMENT_TEXT); @@ -174,14 +185,18 @@ public class PostReviewIT extends AbstractDaemonTest { @Test public void validateDrafts_draftRejected() throws Exception { + PushOneCommit.Result r = createChange(); CommentForValidation commentForValidation = CommentForValidation.create(CommentType.INLINE_COMMENT, COMMENT_TEXT); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(r.getChange().getId().get()) + .project(r.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create( CommentForValidation.CommentType.INLINE_COMMENT, COMMENT_TEXT)))) .thenReturn(ImmutableList.of(commentForValidation.failValidation("Oh no!"))); - PushOneCommit.Result r = createChange(); DraftInput draft = testCommentHelper.newDraft( @@ -218,7 +233,8 @@ public class PostReviewIT extends AbstractDaemonTest { testCommentHelper.addDraft(r.getChangeId(), r.getCommit().getName(), draftFile); assertThat(testCommentHelper.getPublishedComments(r.getChangeId())).isEmpty(); - when(mockCommentValidator.validateComments(capture.capture())).thenReturn(ImmutableList.of()); + when(mockCommentValidator.validateComments(any(), capture.capture())) + .thenReturn(ImmutableList.of()); ReviewInput input = new ReviewInput(); input.drafts = DraftHandling.PUBLISH; @@ -236,11 +252,15 @@ public class PostReviewIT extends AbstractDaemonTest { @Test public void validateCommentsInChangeMessage_messageOK() throws Exception { + PushOneCommit.Result r = createChange(); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(r.getChange().getId().get()) + .project(r.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create(CommentType.CHANGE_MESSAGE, COMMENT_TEXT)))) .thenReturn(ImmutableList.of()); - PushOneCommit.Result r = createChange(); ReviewInput input = new ReviewInput().message(COMMENT_TEXT); int numMessages = gApi.changes().id(r.getChangeId()).get().messages.size(); @@ -253,13 +273,17 @@ public class PostReviewIT extends AbstractDaemonTest { @Test public void validateCommentsInChangeMessage_messageRejected() throws Exception { + PushOneCommit.Result r = createChange(); CommentForValidation commentForValidation = CommentForValidation.create(CommentType.CHANGE_MESSAGE, COMMENT_TEXT); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(r.getChange().getId().get()) + .project(r.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create(CommentType.CHANGE_MESSAGE, COMMENT_TEXT)))) .thenReturn(ImmutableList.of(commentForValidation.failValidation("Oh no!"))); - PushOneCommit.Result r = createChange(); ReviewInput input = new ReviewInput().message(COMMENT_TEXT); assertThat(gApi.changes().id(r.getChangeId()).get().messages) diff --git a/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsCommentValidationIT.java b/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsCommentValidationIT.java index d8b65b701e..ccfe783e78 100644 --- a/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsCommentValidationIT.java +++ b/javatests/com/google/gerrit/acceptance/server/git/receive/ReceiveCommitsCommentValidationIT.java @@ -32,6 +32,7 @@ import com.google.gerrit.extensions.client.Side; import com.google.gerrit.extensions.config.FactoryModule; import com.google.gerrit.extensions.validators.CommentForValidation; import com.google.gerrit.extensions.validators.CommentForValidation.CommentType; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.testing.TestCommentHelper; import com.google.inject.Inject; @@ -53,6 +54,7 @@ public class ReceiveCommitsCommentValidationIT extends AbstractDaemonTest { private static final String COMMENT_TEXT = "The comment text"; @Captor private ArgumentCaptor> capture; + @Captor private ArgumentCaptor captureCtx; @Override public Module createModule() { @@ -76,14 +78,18 @@ public class ReceiveCommitsCommentValidationIT extends AbstractDaemonTest { @Test public void validateComments_commentOK() throws Exception { + PushOneCommit.Result result = createChange(); + String changeId = result.getChangeId(); + String revId = result.getCommit().getName(); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(result.getChange().getId().get()) + .project(result.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create( CommentForValidation.CommentType.FILE_COMMENT, COMMENT_TEXT)))) .thenReturn(ImmutableList.of()); - PushOneCommit.Result result = createChange(); - String changeId = result.getChangeId(); - String revId = result.getCommit().getName(); DraftInput comment = testCommentHelper.newDraft(COMMENT_TEXT); testCommentHelper.addDraft(changeId, revId, comment); assertThat(testCommentHelper.getPublishedComments(result.getChangeId())).isEmpty(); @@ -97,14 +103,18 @@ public class ReceiveCommitsCommentValidationIT extends AbstractDaemonTest { public void validateComments_commentRejected() throws Exception { CommentForValidation commentForValidation = CommentForValidation.create(CommentType.FILE_COMMENT, COMMENT_TEXT); + PushOneCommit.Result result = createChange(); + String changeId = result.getChangeId(); + String revId = result.getCommit().getName(); when(mockCommentValidator.validateComments( + CommentValidationContext.builder() + .changeId(result.getChange().getId().get()) + .project(result.getChange().project().get()) + .build(), ImmutableList.of( CommentForValidation.create( CommentForValidation.CommentType.FILE_COMMENT, COMMENT_TEXT)))) .thenReturn(ImmutableList.of(commentForValidation.failValidation("Oh no!"))); - PushOneCommit.Result result = createChange(); - String changeId = result.getChangeId(); - String revId = result.getCommit().getName(); DraftInput comment = testCommentHelper.newDraft(COMMENT_TEXT); testCommentHelper.addDraft(changeId, revId, comment); assertThat(testCommentHelper.getPublishedComments(result.getChangeId())).isEmpty(); @@ -116,7 +126,8 @@ public class ReceiveCommitsCommentValidationIT extends AbstractDaemonTest { @Test public void validateComments_inlineVsFileComments_allOK() throws Exception { - when(mockCommentValidator.validateComments(capture.capture())).thenReturn(ImmutableList.of()); + when(mockCommentValidator.validateComments(captureCtx.capture(), capture.capture())) + .thenReturn(ImmutableList.of()); PushOneCommit.Result result = createChange(); String changeId = result.getChangeId(); String revId = result.getCommit().getName(); @@ -132,6 +143,9 @@ public class ReceiveCommitsCommentValidationIT extends AbstractDaemonTest { assertThat(capture.getAllValues()).hasSize(1); + assertThat(captureCtx.getValue().getProject()).isEqualTo(result.getChange().project().get()); + assertThat(captureCtx.getValue().getChangeId()).isEqualTo(result.getChange().getId().get()); + assertThat(capture.getAllValues().get(0)) .containsExactly( CommentForValidation.create( @@ -143,7 +157,7 @@ public class ReceiveCommitsCommentValidationIT extends AbstractDaemonTest { @Test @GerritConfig(name = "change.maxCommentLength", value = "" + MAX_COMMENT_LENGTH) public void validateComments_enforceLimits_commentTooLarge() throws Exception { - when(mockCommentValidator.validateComments(any())).thenReturn(ImmutableList.of()); + when(mockCommentValidator.validateComments(any(), any())).thenReturn(ImmutableList.of()); PushOneCommit.Result result = createChange(); String changeId = result.getChangeId(); int commentLength = MAX_COMMENT_LENGTH + 1; diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java index 5531709f0b..2409f52536 100644 --- a/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java +++ b/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java @@ -29,6 +29,7 @@ import com.google.gerrit.extensions.common.ChangeMessageInfo; import com.google.gerrit.extensions.common.CommentInfo; import com.google.gerrit.extensions.config.FactoryModule; import com.google.gerrit.extensions.validators.CommentForValidation; +import com.google.gerrit.extensions.validators.CommentValidationContext; import com.google.gerrit.extensions.validators.CommentValidator; import com.google.gerrit.mail.MailMessage; import com.google.gerrit.mail.MailProcessingUtil; @@ -70,7 +71,7 @@ public class MailProcessorIT extends AbstractMailIT { @BeforeClass public static void setUpMock() { // Let the mock comment validator accept all comments during test setup. - when(mockCommentValidator.validateComments(any())).thenReturn(ImmutableList.of()); + when(mockCommentValidator.validateComments(any(), any())).thenReturn(ImmutableList.of()); } @Before @@ -274,7 +275,8 @@ public class MailProcessorIT extends AbstractMailIT { MailProcessingUtil.rfcDateformatter.format( ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); - setupFailValidation(CommentForValidation.CommentType.CHANGE_MESSAGE); + setupFailValidation( + CommentForValidation.CommentType.CHANGE_MESSAGE, changeInfo.project, changeInfo._number); MailMessage.Builder b = messageBuilderWithDefaultFields(); String txt = newPlaintextBody(getChangeUrl(changeInfo) + "/1", COMMENT_TEXT, null, null, null); @@ -298,7 +300,8 @@ public class MailProcessorIT extends AbstractMailIT { MailProcessingUtil.rfcDateformatter.format( ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); - setupFailValidation(CommentForValidation.CommentType.INLINE_COMMENT); + setupFailValidation( + CommentForValidation.CommentType.INLINE_COMMENT, changeInfo.project, changeInfo._number); MailMessage.Builder b = messageBuilderWithDefaultFields(); String txt = newPlaintextBody(getChangeUrl(changeInfo) + "/1", null, COMMENT_TEXT, null, null); @@ -322,7 +325,8 @@ public class MailProcessorIT extends AbstractMailIT { MailProcessingUtil.rfcDateformatter.format( ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); - setupFailValidation(CommentForValidation.CommentType.FILE_COMMENT); + setupFailValidation( + CommentForValidation.CommentType.FILE_COMMENT, changeInfo.project, changeInfo._number); MailMessage.Builder b = messageBuilderWithDefaultFields(); String txt = newPlaintextBody(getChangeUrl(changeInfo) + "/1", null, null, COMMENT_TEXT, null); @@ -341,10 +345,12 @@ public class MailProcessorIT extends AbstractMailIT { return canonicalWebUrl.get() + "c/" + changeInfo.project + "/+/" + changeInfo._number; } - private void setupFailValidation(CommentForValidation.CommentType type) { + private void setupFailValidation( + CommentForValidation.CommentType type, String failProject, int failChange) { CommentForValidation commentForValidation = CommentForValidation.create(type, COMMENT_TEXT); when(mockCommentValidator.validateComments( + CommentValidationContext.builder().changeId(failChange).project(failProject).build(), ImmutableList.of(CommentForValidation.create(type, COMMENT_TEXT)))) .thenReturn(ImmutableList.of(commentForValidation.failValidation("Oh no!"))); }