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!"))); }