| // 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.acceptance.testsuite.change; | |
| import com.google.auto.value.AutoValue; | |
| import com.google.common.collect.ImmutableMap; | |
| import com.google.gerrit.acceptance.testsuite.ThrowingFunction; | |
| import com.google.gerrit.acceptance.testsuite.change.TestRange.Position; | |
| import com.google.gerrit.common.Nullable; | |
| import com.google.gerrit.entities.Account; | |
| import com.google.gerrit.entities.Patch; | |
| import java.util.Map; | |
| import java.util.Optional; | |
| /** | |
| * Attributes of the robot comment. If not provided, arbitrary values will be used. This class is | |
| * very similar to {@link TestCommentCreation} to allow separation between robot and human comments. | |
| */ | |
| @AutoValue | |
| public abstract class TestRobotCommentCreation { | |
| public abstract Optional<String> message(); | |
| public abstract Optional<String> file(); | |
| public abstract Optional<Integer> line(); | |
| public abstract Optional<TestRange> range(); | |
| public abstract Optional<CommentSide> side(); | |
| public abstract Optional<String> parentUuid(); | |
| public abstract Optional<String> tag(); | |
| public abstract Optional<Account.Id> author(); | |
| public abstract Optional<String> robotId(); | |
| public abstract Optional<String> robotRunId(); | |
| public abstract Optional<String> url(); | |
| public abstract ImmutableMap<String, String> properties(); | |
| abstract ThrowingFunction<TestRobotCommentCreation, String> commentCreator(); | |
| public static Builder builder(ThrowingFunction<TestRobotCommentCreation, String> commentCreator) { | |
| return new AutoValue_TestRobotCommentCreation.Builder().commentCreator(commentCreator); | |
| } | |
| @AutoValue.Builder | |
| public abstract static class Builder { | |
| public Builder noMessage() { | |
| return message(""); | |
| } | |
| /** Message text of the comment. */ | |
| public abstract Builder message(String message); | |
| /** Indicates a patchset-level comment. */ | |
| public Builder onPatchsetLevel() { | |
| return file(Patch.PATCHSET_LEVEL); | |
| } | |
| /** Indicates a file comment. The comment will be on the specified file. */ | |
| public Builder onFileLevelOf(String filePath) { | |
| return file(filePath).line(null).range(null); | |
| } | |
| /** | |
| * Starts the fluent change to create a line comment. The line comment will be at the indicated | |
| * line. Lines start with 1. | |
| */ | |
| public FileBuilder<Builder> onLine(int line) { | |
| return new FileBuilder<>(file -> file(file).line(line).range(null)); | |
| } | |
| /** | |
| * Starts the fluent chain to create a range comment. The range begins at the specified line. | |
| * Lines start at 1. The start position (line, charOffset) is inclusive, the end position (line, | |
| * charOffset) is exclusive. | |
| */ | |
| public PositionBuilder<StartAwarePositionBuilder<Builder>> fromLine(int startLine) { | |
| return new PositionBuilder<>( | |
| startCharOffset -> { | |
| Position start = Position.builder().line(startLine).charOffset(startCharOffset).build(); | |
| TestRange.Builder testRangeBuilder = TestRange.builder().setStart(start); | |
| return new StartAwarePositionBuilder<>(testRangeBuilder, this::range, this::file); | |
| }); | |
| } | |
| /** File on which the comment should be added. */ | |
| abstract Builder file(String filePath); | |
| /** Line on which the comment should be added. */ | |
| abstract Builder line(@Nullable Integer line); | |
| /** Range on which the comment should be added. */ | |
| abstract Builder range(@Nullable TestRange range); | |
| /** | |
| * Indicates that the comment refers to a file, line, range, ... in the commit of the patchset. | |
| * | |
| * <p>On the UI, such comments are shown on the right side of a diff view when a diff against | |
| * base is selected. See {@link #onParentCommit()} for comments shown on the left side. | |
| */ | |
| public Builder onPatchsetCommit() { | |
| return side(CommentSide.PATCHSET_COMMIT); | |
| } | |
| /** | |
| * Indicates that the comment refers to a file, line, range, ... in the parent commit of the | |
| * patchset. | |
| * | |
| * <p>On the UI, such comments are shown on the left side of a diff view when a diff against | |
| * base is selected. See {@link #onPatchsetCommit()} for comments shown on the right side. | |
| * | |
| * <p>For merge commits, this indicates the first parent commit. | |
| */ | |
| public Builder onParentCommit() { | |
| return side(CommentSide.PARENT_COMMIT); | |
| } | |
| /** Like {@link #onParentCommit()} but for the second parent of a merge commit. */ | |
| public Builder onSecondParentCommit() { | |
| return side(CommentSide.SECOND_PARENT_COMMIT); | |
| } | |
| /** | |
| * Like {@link #onParentCommit()} but for the AutoMerge commit created from the parents of a | |
| * merge commit. | |
| */ | |
| public Builder onAutoMergeCommit() { | |
| return side(CommentSide.AUTO_MERGE_COMMIT); | |
| } | |
| abstract Builder side(CommentSide side); | |
| /** | |
| * UUID of another comment to which this comment is a reply. This comment must have similar | |
| * attributes (e.g. file, line, side) as the parent comment. The parent comment must be a | |
| * published comment. | |
| */ | |
| public abstract Builder parentUuid(String parentUuid); | |
| /** Tag to attach to the comment. */ | |
| public abstract Builder tag(String value); | |
| /** Author of the comment. Must be an existing user account. */ | |
| public abstract Builder author(Account.Id accountId); | |
| /** Id of the robot that created the comment. */ | |
| public abstract Builder robotId(String robotId); | |
| /** An ID of the run of the robot that created the comment. */ | |
| public abstract Builder robotRunId(String robotRunId); | |
| /** Url for more information for the robot comment. */ | |
| public abstract Builder url(String url); | |
| /** Robot specific properties as map that maps arbitrary keys to values. */ | |
| public abstract Builder properties(Map<String, String> properties); | |
| abstract ImmutableMap.Builder<String, String> propertiesBuilder(); | |
| public Builder addProperty(String key, String value) { | |
| propertiesBuilder().put(key, value); | |
| return this; | |
| } | |
| abstract Builder commentCreator( | |
| ThrowingFunction<TestRobotCommentCreation, String> commentCreator); | |
| abstract TestRobotCommentCreation autoBuild(); | |
| /** | |
| * Creates the robot comment. | |
| * | |
| * @return the UUID of the created robot comment | |
| */ | |
| public String create() { | |
| TestRobotCommentCreation commentCreation = autoBuild(); | |
| return commentCreation.commentCreator().applyAndThrowSilently(commentCreation); | |
| } | |
| } | |
| } |