diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 000000000..79d775b57 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,23 @@ +name: Java CI with Maven + +on: + push: + branches: [ "custom_label" ] + pull_request: + branches: [ "custom_label" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn test -Dcheckstyle.skip \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 000000000..cb28b0e37 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..cf4f8781f --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 000000000..830d646fe --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,3 @@ +jdk: + - openjdk11 + \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100644 index 000000000..8d937f4c1 --- /dev/null +++ b/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 000000000..f80fbad3e --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml index 0b3c3e640..aa4115486 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 2.426 ${jenkins.baseline}.3 3 - 999999-SNAPSHOT + 20260510-SNAPSHOT jenkinsci/${project.artifactId}-plugin false false diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/GerritServer.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/GerritServer.java index 992f05914..0b8e4c22a 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/GerritServer.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/GerritServer.java @@ -29,6 +29,8 @@ import static com.sonymobile.tools.gerrit.gerritevents.watchdog.WatchTimeExceptionData.Time.MIN_HOUR; import static com.sonymobile.tools.gerrit.gerritevents.watchdog.WatchTimeExceptionData.Time.MIN_MINUTE; import static com.sonyericsson.hudson.plugins.gerrit.trigger.utils.StringUtil.PLUGIN_IMAGES_URL; + +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import hudson.Extension; import hudson.Functions; import hudson.RelativePath; @@ -467,8 +469,8 @@ public void start() { categories = new LinkedList(); } if (categories.isEmpty()) { - categories.add(new VerdictCategory("Code-Review", "Code Review")); - categories.add(new VerdictCategory("Verified", "Verified")); + categories.add(new VerdictCategory(Constants.CODE_REVIEW_LABEL, Constants.CODE_REVIEW_LABEL)); + categories.add(new VerdictCategory(Constants.VERIFIED_LABEL, Constants.VERIFIED_LABEL)); } config.setCategories(categories); gerritEventManager = PluginImpl.getHandler_(); diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/VerdictCategory.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/VerdictCategory.java index 16686c9a4..ccc28c624 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/VerdictCategory.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/VerdictCategory.java @@ -23,32 +23,97 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import hudson.Extension; import hudson.model.AbstractDescribableImpl; import hudson.model.Descriptor; import net.sf.json.JSONObject; import org.kohsuke.stapler.DataBoundConstructor; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.utils.StringUtil.*; + /** * A verdict category for setting comments in Gerrit, i.e. code-review, verify * @author Tomas Westling <tomas.westling@sonymobile.com> */ -public class VerdictCategory extends AbstractDescribableImpl { - - private String verdictValue; - private String verdictDescription; +public class VerdictCategory extends AbstractDescribableImpl implements Cloneable { + private final String verdictValue; + private final String verdictDescription; + private Integer buildStartedVote; + private Integer buildSuccessfulVote; + private Integer buildFailedVote; + private Integer buildUnstableVote; + private Integer buildNotBuiltVote; + private Integer buildAbortedVote; + /** * Standard constructor. * @param verdictValue the value in Gerrit for the verdict category. * @param verdictDescription the text describing the verdict category. + * @param buildStartedVote the vote value for when the build has started. + * @param buildSuccessfulVote the vote value for when the build has been successful. + * @param buildFailedVote the vote value for when the build has failed. + * @param buildUnstableVote the vote value for when the build has been unstable. + * @param buildNotBuiltVote the vote value for when the build has not been built. + * @param buildAbortedVote the vote value for when the build has been aborted. */ @DataBoundConstructor - public VerdictCategory(String verdictValue, String verdictDescription) { + public VerdictCategory(String verdictValue, + String verdictDescription, + Integer buildStartedVote, + Integer buildSuccessfulVote, + Integer buildFailedVote, + Integer buildUnstableVote, + Integer buildNotBuiltVote, + Integer buildAbortedVote) { + this(verdictValue, verdictDescription); + + this.buildStartedVote = buildStartedVote; + this.buildSuccessfulVote = buildSuccessfulVote; + this.buildFailedVote = buildFailedVote; + this.buildUnstableVote = buildUnstableVote; + this.buildNotBuiltVote = buildNotBuiltVote; + this.buildAbortedVote = buildAbortedVote; + } + + /** + * Standard constructor + * @param verdictValue the value in Gerrit for the verdict category. + * @param verdictDescription the text describing the verdict category. + */ + public VerdictCategory(String verdictValue, + String verdictDescription) { this.verdictValue = verdictValue; this.verdictDescription = verdictDescription; } + /** + * Creates a VerdictCategory from a JSONObject. + * @param obj the JSONObject. + * @return a VerdictCategory. + */ + public static VerdictCategory fromJSON(JSONObject obj) { + String value = obj.getString("verdictValue"); + String description = obj.getString("verdictDescription"); + + Integer buildStartedVote = getValueFromFormData(obj, "buildStartedVote"); + Integer buildSuccessfulVote = getValueFromFormData(obj, "buildSuccessfulVote"); + Integer buildFailedVote = getValueFromFormData(obj, "buildFailedVote"); + Integer buildUnstableVote = getValueFromFormData(obj, "buildUnstableVote"); + Integer buildNotBuiltVote = getValueFromFormData(obj, "buildNotBuiltVote"); + Integer buildAbortedVote = getValueFromFormData(obj, "buildAbortedVote"); + + return new VerdictCategory(value, + description, + buildStartedVote, + buildSuccessfulVote, + buildFailedVote, + buildUnstableVote, + buildNotBuiltVote, + buildAbortedVote); + } + /** * Standard getter for the value. * @return the value. @@ -65,15 +130,125 @@ public String getVerdictDescription() { return verdictDescription; } + public Integer getBuildStartedVote() { + return buildStartedVote; + } + + public void setBuildStartedVote(Integer buildStartedVote) { + this.buildStartedVote = buildStartedVote; + } + + public Integer getBuildSuccessfulVote() { + return buildSuccessfulVote; + } + + public void setBuildSuccessfulVote(Integer buildSuccessfulVote) { + this.buildSuccessfulVote = buildSuccessfulVote; + } + + public Integer getBuildFailedVote() { + return buildFailedVote; + } + + public void setBuildFailedVote(Integer buildFailedVote) { + this.buildFailedVote = buildFailedVote; + } + + public Integer getBuildUnstableVote() { + return buildUnstableVote; + } + + public void setBuildUnstableVote(Integer buildUnstableVote) { + this.buildUnstableVote = buildUnstableVote; + } + + public Integer getBuildNotBuiltVote() { + return buildNotBuiltVote; + } + + public void setBuildNotBuiltVote(Integer buildNotBuiltVote) { + this.buildNotBuiltVote = buildNotBuiltVote; + } + + public Integer getBuildAbortedVote() { + return buildAbortedVote; + } + + public void setBuildAbortedVote(Integer buildAbortedVote) { + this.buildAbortedVote = buildAbortedVote; + } + + @Override + public VerdictCategory clone() { + return new VerdictCategory(verdictValue, + verdictDescription, + buildStartedVote, + buildSuccessfulVote, + buildFailedVote, + buildUnstableVote, + buildNotBuiltVote, + buildAbortedVote); + } + + public Integer getVerdictVote(BuildStatus status) { + switch (status) { + case STARTED: + return buildStartedVote; + case SUCCESSFUL: + return buildSuccessfulVote; + case FAILED: + return buildFailedVote; + case UNSTABLE: + return buildUnstableVote; + case NOT_BUILT: + return buildNotBuiltVote; + case ABORTED: + return buildAbortedVote; + default: + return null; + } + } + + public void setVerdictVote(BuildStatus status, Integer vote) { + switch (status) { + case STARTED: + buildStartedVote = vote; + break; + case SUCCESSFUL: + buildSuccessfulVote = vote; + break; + case FAILED: + buildFailedVote = vote; + break; + case UNSTABLE: + buildUnstableVote = vote; + break; + case NOT_BUILT: + buildNotBuiltVote = vote; + break; + case ABORTED: + buildAbortedVote = vote; + break; + default: + break; + } + } + /** - * Creates a VerdictCategory from a JSONObject. - * @param obj the JSONObject. - * @return a VerdictCategory. + * Returns the value formatted as a placeholder. + * @return the value formatted as a placeholder. + */ + public String getPlaceholderValue() { + return verdictValue.toUpperCase().replace("-", "_"); + } + + /** + * Returns the original verdict category name + * @param placeholderValue the value to convert + * @return original verdict category name */ - public static VerdictCategory createVerdictCategoryFromJSON(JSONObject obj) { - String value = obj.getString("verdictValue"); - String description = obj.getString("verdictDescription"); - return new VerdictCategory(value, description); + public static String fromPlaceholderValue(String placeholderValue) { + return placeholderValue.toLowerCase().replace("_", "-"); } /** diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/BuildStatus.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/BuildStatus.java new file mode 100644 index 000000000..ab71ff5b3 --- /dev/null +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/BuildStatus.java @@ -0,0 +1,28 @@ +package com.sonyericsson.hudson.plugins.gerrit.trigger.config; + +import hudson.model.Result; + +public enum BuildStatus { + STARTED, + SUCCESSFUL, + FAILED, + UNSTABLE, + NOT_BUILT, + ABORTED, + NOT_REGISTERED; + + public static BuildStatus fromResult(Result result) { + if (result == Result.SUCCESS) + return BuildStatus.SUCCESSFUL; + if (result == Result.FAILURE) + return BuildStatus.FAILED; + if (result == Result.UNSTABLE) + return BuildStatus.UNSTABLE; + if (result == Result.NOT_BUILT) + return BuildStatus.NOT_BUILT; + if (result == Result.ABORTED) + return BuildStatus.ABORTED; + + return BuildStatus.FAILED; + } +} diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Config.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Config.java index 926b2eb6a..fef1b50d1 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Config.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Config.java @@ -23,6 +23,7 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.BuildCancellationPolicy; import com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues; import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Provider; @@ -33,8 +34,6 @@ import com.sonymobile.tools.gerrit.gerritevents.watchdog.WatchTimeExceptionData; import com.sonymobile.tools.gerrit.gerritevents.watchdog.WatchTimeExceptionData.Time; import com.sonymobile.tools.gerrit.gerritevents.watchdog.WatchTimeExceptionData.TimeSpan; -import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory; - import hudson.util.Secret; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -51,6 +50,7 @@ import java.util.concurrent.TimeUnit; //CS IGNORE LineLength FOR NEXT 11 LINES. REASON: static import. +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.*; import static com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues.DEFAULT_BUILD_SCHEDULE_DELAY; import static com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues.DEFAULT_GERRIT_AUTH_KEY_FILE; import static com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues.DEFAULT_GERRIT_AUTH_KEY_FILE_PASSWORD; @@ -161,7 +161,6 @@ public class Config implements IGerritHudsonTriggerConfig { /** * Global default for notification level. */ - public static final Notify DEFAULT_NOTIFICATION_LEVEL = Notify.ALL; private String gerritHostName; private int gerritSshPort; @@ -249,18 +248,6 @@ public Config(IGerritHudsonTriggerConfig config) { gerritBuildCurrentPatchesOnly = config.isGerritBuildCurrentPatchesOnly(); numberOfWorkerThreads = config.getNumberOfReceivingWorkerThreads(); numberOfSendingWorkerThreads = config.getNumberOfSendingWorkerThreads(); - gerritBuildStartedVerifiedValue = config.getGerritBuildStartedVerifiedValue(); - gerritBuildStartedCodeReviewValue = config.getGerritBuildStartedCodeReviewValue(); - gerritBuildSuccessfulVerifiedValue = config.getGerritBuildSuccessfulVerifiedValue(); - gerritBuildSuccessfulCodeReviewValue = config.getGerritBuildSuccessfulCodeReviewValue(); - gerritBuildFailedVerifiedValue = config.getGerritBuildFailedVerifiedValue(); - gerritBuildFailedCodeReviewValue = config.getGerritBuildFailedCodeReviewValue(); - gerritBuildUnstableVerifiedValue = config.getGerritBuildUnstableVerifiedValue(); - gerritBuildUnstableCodeReviewValue = config.getGerritBuildUnstableCodeReviewValue(); - gerritBuildNotBuiltVerifiedValue = config.getGerritBuildNotBuiltVerifiedValue(); - gerritBuildNotBuiltCodeReviewValue = config.getGerritBuildNotBuiltCodeReviewValue(); - gerritBuildAbortedVerifiedValue = config.getGerritBuildAbortedVerifiedValue(); - gerritBuildAbortedCodeReviewValue = config.getGerritBuildAbortedCodeReviewValue(); gerritVerifiedCmdBuildStarted = config.getGerritCmdBuildStarted(); gerritVerifiedCmdBuildFailed = config.getGerritCmdBuildFailed(); gerritVerifiedCmdBuildSuccessful = config.getGerritCmdBuildSuccessful(); @@ -277,9 +264,9 @@ public Config(IGerritHudsonTriggerConfig config) { projectListFetchDelay = config.getProjectListFetchDelay(); projectListRefreshInterval = config.getProjectListRefreshInterval(); if (config.getCategories() != null) { - categories = new LinkedList(); + categories = new LinkedList<>(); for (VerdictCategory cat : config.getCategories()) { - categories.add(new VerdictCategory(cat.getVerdictValue(), cat.getVerdictDescription())); + categories.add(cat.clone()); } } if (config.getReplicationConfig() != null) { @@ -297,7 +284,7 @@ public void setValues(JSONObject formData) { gerritUserName = formData.optString("gerritUserName", DEFAULT_GERRIT_USERNAME); gerritEMail = formData.optString("gerritEMail", ""); notificationLevel = Notify.valueOf(formData.optString("notificationLevel", - Config.DEFAULT_NOTIFICATION_LEVEL.toString())); + Constants.DEFAULT_NOTIFICATION_LEVEL.toString())); String file = formData.optString("gerritAuthKeyFile", null); if (file != null) { gerritAuthKeyFile = new File(file); @@ -330,38 +317,6 @@ public void setValues(JSONObject formData) { numberOfSendingWorkerThreads = DEFAULT_NR_OF_SENDING_WORKER_THREADS; } - setVoteValues(formData); - - gerritVerifiedCmdBuildStarted = formData.optString( - "gerritVerifiedCmdBuildStarted", - "gerrit review --project , " - + "--message 'Build Started ' " - + "--verified --code-review --tag " + Constants.TAG_VALUE); - gerritVerifiedCmdBuildFailed = formData.optString( - "gerritVerifiedCmdBuildFailed", - "gerrit review --project , " - + "--message 'Build Failed ' " - + "--verified --code-review --tag " + Constants.TAG_VALUE); - gerritVerifiedCmdBuildSuccessful = formData.optString( - "gerritVerifiedCmdBuildSuccessful", - "gerrit review --project , " - + "--message 'Build Successful ' " - + "--verified --code-review --tag " + Constants.TAG_VALUE); - gerritVerifiedCmdBuildUnstable = formData.optString( - "gerritVerifiedCmdBuildUnstable", - "gerrit review --project , " - + "--message 'Build Unstable ' " - + "--verified --code-review --tag " + Constants.TAG_VALUE); - gerritVerifiedCmdBuildNotBuilt = formData.optString( - "gerritVerifiedCmdBuildNotBuilt", - "gerrit review --project , " - + "--message 'No Builds Executed ' " - + "--verified --code-review --tag " + Constants.TAG_VALUE); - gerritVerifiedCmdBuildAborted = formData.optString( - "gerritVerifiedCmdBuildAborted", - "gerrit review --project , " - + "--message 'Build Aborted ' " - + "--verified --code-review --tag " + Constants.TAG_VALUE); gerritFrontEndUrl = formData.optString( "gerritFrontEndUrl", DEFAULT_GERRIT_HOSTNAME); @@ -395,17 +350,9 @@ public void setValues(JSONObject formData) { "enableProjectAutoCompletion", DEFAULT_ENABLE_PROJECT_AUTO_COMPLETION); - categories = new LinkedList(); - if (formData.has("verdictCategories")) { - Object cat = formData.get("verdictCategories"); - if (cat instanceof JSONArray) { - for (Object jsonObject : (JSONArray)cat) { - categories.add(VerdictCategory.createVerdictCategoryFromJSON((JSONObject)jsonObject)); - } - } else if (cat instanceof JSONObject) { - categories.add(VerdictCategory.createVerdictCategoryFromJSON((JSONObject)cat)); - } - } + setCategories(formData); + updateGerritCommands(formData); + watchdogTimeoutMinutes = formData.optInt("watchdogTimeoutMinutes", DEFAULT_GERRIT_WATCHDOG_TIMEOUT_MINUTES); watchTimeExceptionData = addWatchTimeExceptionData(formData); @@ -423,61 +370,56 @@ public void setValues(JSONObject formData) { replicationConfig = ReplicationConfig.createReplicationConfigFromJSON(formData); } - /** - * Sets all config vote values from the provided JSONObject. - * @param formData the JSON object with form data. - */ - private void setVoteValues(JSONObject formData) { - if (formData.isEmpty()) { - gerritBuildStartedVerifiedValue = DEFAULT_GERRIT_BUILD_STARTED_VERIFIED_VALUE; - gerritBuildSuccessfulVerifiedValue = DEFAULT_GERRIT_BUILD_SUCCESSFUL_VERIFIED_VALUE; - gerritBuildFailedVerifiedValue = DEFAULT_GERRIT_BUILD_FAILURE_VERIFIED_VALUE; - gerritBuildUnstableVerifiedValue = DEFAULT_GERRIT_BUILD_UNSTABLE_VERIFIED_VALUE; - gerritBuildNotBuiltVerifiedValue = DEFAULT_GERRIT_BUILD_NOT_BUILT_VERIFIED_VALUE; - gerritBuildAbortedVerifiedValue = DEFAULT_GERRIT_BUILD_ABORTED_VERIFIED_VALUE; - gerritBuildStartedCodeReviewValue = DEFAULT_GERRIT_BUILD_STARTED_CODE_REVIEW_VALUE; - gerritBuildSuccessfulCodeReviewValue = DEFAULT_GERRIT_BUILD_SUCCESSFUL_CODE_REVIEW_VALUE; - gerritBuildFailedCodeReviewValue = DEFAULT_GERRIT_BUILD_FAILURE_CODE_REVIEW_VALUE; - gerritBuildUnstableCodeReviewValue = DEFAULT_GERRIT_BUILD_UNSTABLE_CODE_REVIEW_VALUE; - gerritBuildNotBuiltCodeReviewValue = DEFAULT_GERRIT_BUILD_NOT_BUILT_CODE_REVIEW_VALUE; - gerritBuildAbortedCodeReviewValue = DEFAULT_GERRIT_BUILD_ABORTED_CODE_REVIEW_VALUE; - } else { - gerritBuildStartedVerifiedValue = getValueFromFormData(formData, "gerritBuildStartedVerifiedValue"); - gerritBuildSuccessfulVerifiedValue = getValueFromFormData(formData, "gerritBuildSuccessfulVerifiedValue"); - gerritBuildFailedVerifiedValue = getValueFromFormData(formData, "gerritBuildFailedVerifiedValue"); - gerritBuildUnstableVerifiedValue = getValueFromFormData(formData, "gerritBuildUnstableVerifiedValue"); - gerritBuildNotBuiltVerifiedValue = getValueFromFormData(formData, "gerritBuildNotBuiltVerifiedValue"); - gerritBuildAbortedVerifiedValue = getValueFromFormData(formData, "gerritBuildAbortedVerifiedValue"); - gerritBuildStartedCodeReviewValue = getValueFromFormData(formData, "gerritBuildStartedCodeReviewValue"); - gerritBuildSuccessfulCodeReviewValue = getValueFromFormData(formData, - "gerritBuildSuccessfulCodeReviewValue"); - gerritBuildFailedCodeReviewValue = getValueFromFormData(formData, "gerritBuildFailedCodeReviewValue"); - gerritBuildUnstableCodeReviewValue = getValueFromFormData(formData, "gerritBuildUnstableCodeReviewValue"); - gerritBuildNotBuiltCodeReviewValue = getValueFromFormData(formData, "gerritBuildNotBuiltCodeReviewValue"); - gerritBuildAbortedCodeReviewValue = getValueFromFormData(formData, "gerritBuildAbortedCodeReviewValue"); + private void updateGerritCommands(JSONObject formData) { + gerritVerifiedCmdBuildStarted = formData.optString("gerritVerifiedCmdBuildStarted", + GERRIT_CMD_BUILD_STARTED_DEFAULT_VALUE); + gerritVerifiedCmdBuildFailed = formData.optString("gerritVerifiedCmdBuildFailed", + GERRIT_CMD_BUILD_FAILED_DEFAULT_VALUE); + gerritVerifiedCmdBuildSuccessful = formData.optString("gerritVerifiedCmdBuildSuccessful", + GERRIT_CMD_BUILD_SUCCESSFUL_DEFAULT_VALUE); + gerritVerifiedCmdBuildUnstable = formData.optString("gerritVerifiedCmdBuildUnstable", + GERRIT_CMD_BUILD_UNSTABLE_DEFAULT_VALUE); + gerritVerifiedCmdBuildNotBuilt = formData.optString("gerritVerifiedCmdBuildNotBuilt", + GERRIT_CMD_BUILD_NOT_BUILT_DEFAULT_VALUE); + gerritVerifiedCmdBuildAborted = formData.optString("gerritVerifiedCmdBuildAborted", + GERRIT_CMD_BUILD_ABORTED_DEFAULT_VALUE); + } + + /** + * Adds {@link VerdictCategory}s to the categories based on the formData. + * @param formData the formData as a JSONObject. + */ + private void setCategories(JSONObject formData) { + categories = new LinkedList<>(); + if (formData.isEmpty()) + { + categories.add(new VerdictCategory(CODE_REVIEW_LABEL, + CODE_REVIEW_LABEL, + DEFAULT_GERRIT_BUILD_STARTED_CODE_REVIEW_VALUE, + DEFAULT_GERRIT_BUILD_SUCCESSFUL_CODE_REVIEW_VALUE, + DEFAULT_GERRIT_BUILD_FAILURE_CODE_REVIEW_VALUE, + DEFAULT_GERRIT_BUILD_UNSTABLE_CODE_REVIEW_VALUE, + DEFAULT_GERRIT_BUILD_NOT_BUILT_CODE_REVIEW_VALUE, + DEFAULT_GERRIT_BUILD_ABORTED_CODE_REVIEW_VALUE)); + categories.add(new VerdictCategory(VERIFIED_LABEL, VERIFIED_LABEL, + DEFAULT_GERRIT_BUILD_STARTED_VERIFIED_VALUE, + DEFAULT_GERRIT_BUILD_SUCCESSFUL_VERIFIED_VALUE, + DEFAULT_GERRIT_BUILD_FAILURE_VERIFIED_VALUE, + DEFAULT_GERRIT_BUILD_UNSTABLE_VERIFIED_VALUE, + DEFAULT_GERRIT_BUILD_NOT_BUILT_VERIFIED_VALUE, + DEFAULT_GERRIT_BUILD_ABORTED_VERIFIED_VALUE)); } - } - /** - * Obtain value from a key in formdata. - * @param formData JSONObject. - * @param key key to extract value for. - * @return value. - */ - private Integer getValueFromFormData(JSONObject formData, String key) { - if (formData.has(key)) { - String testData = formData.optString(key); - if (testData == null || testData.equals("")) { - return null; - } else { - try { - return Integer.parseInt(testData); - } catch (NumberFormatException nfe) { - return null; + if (formData.has("verdictCategories")) { + Object cat = formData.get("verdictCategories"); + if (cat instanceof JSONArray) { + for (Object jsonObject : (JSONArray)cat) { + categories.add(VerdictCategory.fromJSON((JSONObject) jsonObject)); } + } else if (cat instanceof JSONObject) { + categories.add(VerdictCategory.fromJSON((JSONObject) cat)); } } - return null; } /** @@ -603,6 +545,36 @@ public Secret getGerritAuthKeyFileSecretPassword() { return gerritAuthKeyFilePassword; } + /** + * Retrieves a configured gerrit label's vote value for a build status. + * @param label gerrit label + * @param status build status + * @return vote value + */ + @Override + public Integer getLabelVote(String label, BuildStatus status) { + for (VerdictCategory cat : categories) { + if (cat.getVerdictValue().equals(label)) { + return cat.getVerdictVote(status); + } + } + return null; + } + + /** + * Sets a configured gerrit label's vote value for a build status. + * @param label gerrit label + * @param status build status + * @param vote vote value + */ + public void setLabelVote(String label, BuildStatus status, Integer vote) { + for (VerdictCategory cat : categories) { + if (cat.getVerdictValue().equals(label)) { + cat.setVerdictVote(status, vote); + } + } + } + @Override public String getGerritFrontEndUrl() { String url = gerritFrontEndUrl; @@ -904,6 +876,7 @@ public String getGerritCmdBuildSuccessful() { * * @param cmd the command * @see #getGerritCmdBuildSuccessful() + * @deprecated use {@link Config#setGerritCmdBuildSuccessful(String) } instead. */ @Deprecated public void setGerritVerifiedCmdBuildSuccessful(String cmd) { @@ -930,6 +903,7 @@ public String getGerritCmdBuildUnstable() { * * @param cmd the command * @see #getGerritCmdBuildUnstable() + * @deprecated use {@link Config#setGerritCmdBuildUnstable(String) } instead. */ @Deprecated public void setGerritVerifiedCmdBuildUnstable(String cmd) { @@ -956,6 +930,7 @@ public String getGerritCmdBuildFailed() { * * @param cmd the command * @see #getGerritCmdBuildFailed() + * @deprecated use {@link Config#setGerritCmdBuildFailed(String) } instead. */ @Deprecated public void setGerritVerifiedCmdBuildFailed(String cmd) { @@ -982,6 +957,7 @@ public String getGerritCmdBuildStarted() { * * @param cmd the command * @see #getGerritCmdBuildStarted() + * @deprecated use {@link Config#setGerritCmdBuildStarted(String)} } instead. */ @Deprecated public void setGerritVerifiedCmdBuildStarted(String cmd) { @@ -1008,6 +984,7 @@ public String getGerritCmdBuildNotBuilt() { * * @param cmd the command * @see #getGerritCmdBuildNotBuilt() + * @deprecated use {@link Config#setGerritCmdBuildNotBuilt(String)} } instead. */ @Deprecated public void setGerritVerifiedCmdBuildNotBuilt(String cmd) { @@ -1034,6 +1011,7 @@ public String getGerritCmdBuildAborted() { * * @param cmd the command * @see #getGerritCmdBuildAborted() + * @deprecated use {@link Config#setGerritCmdBuildAborted(String) } instead. */ @Deprecated public void setGerritVerifiedCmdBuildAborted(String cmd) { @@ -1050,160 +1028,226 @@ public void setGerritCmdBuildAborted(String cmd) { gerritVerifiedCmdBuildAborted = cmd; } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override - public Integer getGerritBuildStartedVerifiedValue() { - return gerritBuildStartedVerifiedValue; - } + public Integer getGerritBuildStartedVerifiedValue() { return getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override - public Integer getGerritBuildStartedCodeReviewValue() { - return gerritBuildStartedCodeReviewValue; - } + public Integer getGerritBuildStartedCodeReviewValue() { return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override - public Integer getGerritBuildSuccessfulVerifiedValue() { - return gerritBuildSuccessfulVerifiedValue; - } + public Integer getGerritBuildSuccessfulVerifiedValue() { return getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildSuccessfulCodeReviewValue() { - return gerritBuildSuccessfulCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildFailedVerifiedValue() { - return gerritBuildFailedVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildFailedCodeReviewValue() { - return gerritBuildFailedCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildUnstableVerifiedValue() { - return gerritBuildUnstableVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildUnstableCodeReviewValue() { - return gerritBuildUnstableCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildNotBuiltVerifiedValue() { - return gerritBuildNotBuiltVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildNotBuiltCodeReviewValue() { - return gerritBuildNotBuiltCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildAbortedVerifiedValue() { - return gerritBuildAbortedVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED); } + /** + * @deprecated use {@link Config#getLabelVote(String, BuildStatus)} instead. + */ + @Deprecated @Override public Integer getGerritBuildAbortedCodeReviewValue() { - return gerritBuildAbortedCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED); } /** * Set Gerrit Build Started Verified Value. * @param gerritBuildStartedVerifiedValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildStartedVerifiedValue(Integer gerritBuildStartedVerifiedValue) { - this.gerritBuildStartedVerifiedValue = gerritBuildStartedVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.STARTED, gerritBuildStartedVerifiedValue); } /** * Set Gerrit Build Sucessful Verified Value. * @param gerritBuildSuccessfulVerifiedValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildSuccessfulVerifiedValue(Integer gerritBuildSuccessfulVerifiedValue) { - this.gerritBuildSuccessfulVerifiedValue = gerritBuildSuccessfulVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL, gerritBuildSuccessfulVerifiedValue); } /** * Set Gerrit Build Failed Verified Value. * @param gerritBuildFailedVerifiedValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildFailedVerifiedValue(Integer gerritBuildFailedVerifiedValue) { - this.gerritBuildFailedVerifiedValue = gerritBuildFailedVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.FAILED, gerritBuildFailedVerifiedValue); } /** * Set Gerrit Build Unstable Verified Value. * @param gerritBuildUnstableVerifiedValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildUnstableVerifiedValue(Integer gerritBuildUnstableVerifiedValue) { - this.gerritBuildUnstableVerifiedValue = gerritBuildUnstableVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE, gerritBuildUnstableVerifiedValue); } /** * Set Gerrit Build Not Build Verified Value. * @param gerritBuildNotBuiltVerifiedValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildNotBuiltVerifiedValue(Integer gerritBuildNotBuiltVerifiedValue) { - this.gerritBuildNotBuiltVerifiedValue = gerritBuildNotBuiltVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT, gerritBuildNotBuiltVerifiedValue); } /** * Set Gerrit Build Aborted Verified Value. * @param gerritBuildAbortedVerifiedValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildAbortedVerifiedValue(Integer gerritBuildAbortedVerifiedValue) { - this.gerritBuildAbortedVerifiedValue = gerritBuildAbortedVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED, gerritBuildAbortedVerifiedValue); } /** * Set Gerrit Build Started Code Review Value. * @param gerritBuildStartedCodeReviewValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildStartedCodeReviewValue(Integer gerritBuildStartedCodeReviewValue) { - this.gerritBuildStartedCodeReviewValue = gerritBuildStartedCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED, gerritBuildStartedCodeReviewValue); } /** * Set Gerrit Build Successful Code Review Value. * @param gerritBuildSuccessfulCodeReviewValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildSuccessfulCodeReviewValue(Integer gerritBuildSuccessfulCodeReviewValue) { - this.gerritBuildSuccessfulCodeReviewValue = gerritBuildSuccessfulCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL, gerritBuildSuccessfulCodeReviewValue); } /** * Set Gerrit Build Failed Code Review Value. * @param gerritBuildFailedCodeReviewValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildFailedCodeReviewValue(Integer gerritBuildFailedCodeReviewValue) { - this.gerritBuildFailedCodeReviewValue = gerritBuildFailedCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED, gerritBuildFailedCodeReviewValue); } /** * Set Gerrit Build Unstable Code Review Value. * @param gerritBuildUnstableCodeReviewValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildUnstableCodeReviewValue(Integer gerritBuildUnstableCodeReviewValue) { - this.gerritBuildUnstableCodeReviewValue = gerritBuildUnstableCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE, gerritBuildUnstableCodeReviewValue); } /** * Set Gerrit Build Not Build Code Review Value. * @param gerritBuildNotBuiltCodeReviewValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildNotBuiltCodeReviewValue(Integer gerritBuildNotBuiltCodeReviewValue) { - this.gerritBuildNotBuiltCodeReviewValue = gerritBuildNotBuiltCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT, gerritBuildNotBuiltCodeReviewValue); } /** * Set Gerrit Build Aborted Code Review Value. * @param gerritBuildAbortedCodeReviewValue value + * @deprecated use {@link Config#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated public void setGerritBuildAbortedCodeReviewValue(Integer gerritBuildAbortedCodeReviewValue) { - this.gerritBuildAbortedCodeReviewValue = gerritBuildAbortedCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED, gerritBuildAbortedCodeReviewValue); } @Override @@ -1452,19 +1496,67 @@ Object readResolve() { this.buildCurrentPatchesOnly.setAbortNewPatchsets(false); } + /* Only set these values when dealing with an old configuration*/ if (this.gerritVerifiedCmdBuildAborted == null) { this.gerritVerifiedCmdBuildAborted = this.gerritVerifiedCmdBuildFailed; - /* Only set these values when dealnig with an old configuration */ if (this.gerritBuildAbortedCodeReviewValue == null) { - this.gerritBuildAbortedCodeReviewValue = this.gerritBuildFailedCodeReviewValue; + gerritBuildAbortedCodeReviewValue = gerritBuildFailedCodeReviewValue; } if (this.gerritBuildAbortedVerifiedValue == null) { - this.gerritBuildAbortedVerifiedValue = this.gerritBuildFailedVerifiedValue; + gerritBuildAbortedVerifiedValue = gerritBuildFailedVerifiedValue; } } + /* Backwards compatibility with the version in which all versions are stored in standalone fields */ + if (categories != null) + { + for (VerdictCategory category : categories) + { + if (category.getVerdictValue().equals(CODE_REVIEW_LABEL)) { + if (category.getBuildStartedVote() == null && gerritBuildStartedCodeReviewValue != null) { + category.setBuildStartedVote(gerritBuildStartedCodeReviewValue); + } + if (category.getBuildSuccessfulVote() == null && gerritBuildSuccessfulCodeReviewValue != null) { + category.setBuildSuccessfulVote(gerritBuildSuccessfulCodeReviewValue); + } + if (category.getBuildFailedVote() == null && gerritBuildFailedCodeReviewValue != null) { + category.setBuildFailedVote(gerritBuildFailedCodeReviewValue); + } + if (category.getBuildUnstableVote() == null && gerritBuildUnstableCodeReviewValue != null) { + category.setBuildUnstableVote(gerritBuildUnstableCodeReviewValue); + } + if (category.getBuildNotBuiltVote() == null && gerritBuildNotBuiltCodeReviewValue != null) { + category.setBuildNotBuiltVote(gerritBuildNotBuiltCodeReviewValue); + } + if (category.getBuildAbortedVote() == null && gerritBuildAbortedCodeReviewValue != null) { + category.setBuildAbortedVote(gerritBuildAbortedCodeReviewValue); + } + } + + if (category.getVerdictValue().equals(VERIFIED_LABEL)) { + if (category.getBuildStartedVote() == null && gerritBuildStartedVerifiedValue != null) { + category.setBuildStartedVote(gerritBuildStartedVerifiedValue); + } + if (category.getBuildSuccessfulVote() == null && gerritBuildSuccessfulVerifiedValue != null) { + category.setBuildSuccessfulVote(gerritBuildSuccessfulVerifiedValue); + } + if (category.getBuildFailedVote() == null && gerritBuildFailedVerifiedValue != null) { + category.setBuildFailedVote(gerritBuildFailedVerifiedValue); + } + if (category.getBuildUnstableVote() == null && gerritBuildUnstableVerifiedValue != null) { + category.setBuildUnstableVote(gerritBuildUnstableVerifiedValue); + } + if (category.getBuildNotBuiltVote() == null && gerritBuildNotBuiltVerifiedValue != null) { + category.setBuildNotBuiltVote(gerritBuildNotBuiltVerifiedValue); + } + if (category.getBuildAbortedVote() == null && gerritBuildAbortedVerifiedValue != null) { + category.setBuildAbortedVote(gerritBuildAbortedVerifiedValue); + } + } + } + } return this; } } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Constants.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Constants.java index 9f0865701..e1e071782 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Constants.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/Constants.java @@ -24,6 +24,8 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.config; +import com.sonymobile.tools.gerrit.gerritevents.dto.rest.Notify; + /** * Global constants. */ @@ -33,6 +35,36 @@ public final class Constants { */ public static final String TAG_VALUE = "autogenerated:jenkins-gerrit-trigger"; + /** + * Code-Review review label + */ + public static final String CODE_REVIEW_LABEL = "Code-Review"; + + /** + * Verified review label + */ + public static final String VERIFIED_LABEL = "Verified"; + + public static final Notify DEFAULT_NOTIFICATION_LEVEL = Notify.ALL; + + public static final String GERRIT_CMD_BUILD_STARTED_DEFAULT_VALUE = "gerrit review , " + + "--message 'Build Started ' " + + "--verified --code-review --tag " + Constants.TAG_VALUE; + public static final String GERRIT_CMD_BUILD_SUCCESSFUL_DEFAULT_VALUE = "gerrit review , " + + "--message 'Build Successful ' " + + "--verified --code-review --tag " + Constants.TAG_VALUE; + public static final String GERRIT_CMD_BUILD_FAILED_DEFAULT_VALUE = "gerrit review , " + + "--message 'Build Failed ' " + + "--verified --code-review --tag " + Constants.TAG_VALUE; + public static final String GERRIT_CMD_BUILD_UNSTABLE_DEFAULT_VALUE = "gerrit review , " + + "--message 'Build Unstable ' " + + "--verified --code-review --tag " + Constants.TAG_VALUE; + public static final String GERRIT_CMD_BUILD_NOT_BUILT_DEFAULT_VALUE = "gerrit review , " + + "--message 'No Builds Executed ' " + + "--verified --code-review --tag " + Constants.TAG_VALUE; + public static final String GERRIT_CMD_BUILD_ABORTED_DEFAULT_VALUE = "gerrit review , " + + "--message 'Build Aborted ' " + + "--verified --code-review --tag " + Constants.TAG_VALUE; /** Internal */ private Constants() { } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/IGerritHudsonTriggerConfig.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/IGerritHudsonTriggerConfig.java index b5c7407ed..4b812a999 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/IGerritHudsonTriggerConfig.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/IGerritHudsonTriggerConfig.java @@ -110,72 +110,84 @@ public interface IGerritHudsonTriggerConfig extends GerritConnectionConfig2 { * The default verified value for build started. * @return the value. */ + @Deprecated Integer getGerritBuildStartedVerifiedValue(); /** * The default code review value for build started. * @return the value. */ + @Deprecated Integer getGerritBuildStartedCodeReviewValue(); /** * The default verified value for build successful. * @return the falue. */ + @Deprecated Integer getGerritBuildSuccessfulVerifiedValue(); /** * The default code review value for build successful. * @return the value. */ + @Deprecated Integer getGerritBuildSuccessfulCodeReviewValue(); /** * The default verified value for build failed. * @return the value. */ + @Deprecated Integer getGerritBuildFailedVerifiedValue(); /** * The default code review value for build failed. * @return the value. */ + @Deprecated Integer getGerritBuildFailedCodeReviewValue(); /** * The default verified value for build unstable. * @return the value. */ + @Deprecated Integer getGerritBuildUnstableVerifiedValue(); /** * The default code review value for build unstable. * @return the value. */ + @Deprecated Integer getGerritBuildUnstableCodeReviewValue(); /** * The default verified value for build not built. * @return the value. */ + @Deprecated Integer getGerritBuildNotBuiltVerifiedValue(); /** * The default code review value for build not built. * @return the value. */ + @Deprecated Integer getGerritBuildNotBuiltCodeReviewValue(); /** * The default verified value for build aborted. * @return the value. */ + @Deprecated Integer getGerritBuildAbortedVerifiedValue(); /** * The default code review value for build aborted. * @return the value. */ + @Deprecated Integer getGerritBuildAbortedCodeReviewValue(); /** @@ -351,4 +363,12 @@ public interface IGerritHudsonTriggerConfig extends GerritConnectionConfig2 { * @return the instance of {@link Secret}. */ Secret getGerritAuthKeyFileSecretPassword(); + + /** + * Retrieves a configured gerrit label's vote value for a build status. + * @param label gerrit label + * @param status build status + * @return vote value + */ + Integer getLabelVote(String label, BuildStatus status); } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpander.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpander.java index 45e36bc0e..695ad08cd 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpander.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpander.java @@ -25,7 +25,10 @@ package com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier; +import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.model.BuildMemory.MemoryImprint; import com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.model.BuildMemory.MemoryImprint.Entry; @@ -51,6 +54,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.DEFAULT_NOTIFICATION_LEVEL; import static com.sonyericsson.hudson.plugins.gerrit.trigger.utils.Logic.shouldSkip; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -107,10 +113,8 @@ public String getBuildStartedCommand(Run r, TaskListener taskListener, GerritTrigger trigger = GerritTrigger.getTrigger(r.getParent()); String gerritCmd = config.getGerritCmdBuildStarted(); - Map parameters = createStandardParameters(r, event, - getBuildStartedCodeReviewValue(r), - getBuildStartedVerifiedValue(r), - Notify.ALL.name()); + Map parameters = createStartedCommandParameters(r, event, Notify.ALL.name()); + StringBuilder startedStats = new StringBuilder(); if (stats.getTotalBuildsToStart() > 1) { startedStats.append(stats.toString()); @@ -151,9 +155,9 @@ private static Iterable emptyIfNull(Iterable iterable) { /** * Finds the verified vote for build started of the specified build. - * If there is a {@link GerritTrigger} and it has a {@link GerritTrigger#getGerritBuildStartedVerifiedValue()} + * If there is a {@link GerritTrigger} and it has a {@link Constants#VERIFIED_LABEL} vote for {@link BuildStatus#STARTED} * specified, that value will be used, otherwise the global config value in - * {@link IGerritHudsonTriggerConfig#getGerritBuildStartedVerifiedValue()} will be used. + * {@link IGerritHudsonTriggerConfig#getLabelVote(String, BuildStatus)} will be used. * @param r the build. * @return the value. */ @@ -161,13 +165,13 @@ public Integer getBuildStartedVerifiedValue(Run r) { GerritTrigger trigger = GerritTrigger.getTrigger(r.getParent()); if (trigger == null) { logger.warn("Unable to get trigger config for build {} will use global value."); - return config.getGerritBuildStartedVerifiedValue(); - } else if (trigger.getGerritBuildStartedVerifiedValue() != null) { - final Integer value = trigger.getGerritBuildStartedVerifiedValue(); + return config.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED); + } else if (trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED) != null) { + final Integer value = trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED); logger.trace("BuildStartedVerified overridden in project config. returning {}", value); return value; } else { - final Integer value = config.getGerritBuildStartedVerifiedValue(); + final Integer value = config.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED); logger.trace("BuildStartedVerified standard value used {}", value); return value; } @@ -175,9 +179,9 @@ public Integer getBuildStartedVerifiedValue(Run r) { /** * Finds the code review vote for build started of the specified build. - * If there is a {@link GerritTrigger} and it has a {@link GerritTrigger#getGerritBuildStartedCodeReviewValue()} + * If there is a {@link GerritTrigger} and it has a {@link Constants#CODE_REVIEW_LABEL} vote for {@link BuildStatus#STARTED} * specified, that value will be used, otherwise the global config value in - * {@link IGerritHudsonTriggerConfig#getGerritBuildStartedCodeReviewValue()} will be used. + * {@link IGerritHudsonTriggerConfig#getLabelVote(String, BuildStatus)} ()} will be used. * @param r the build. * @return the value. */ @@ -185,18 +189,45 @@ public Integer getBuildStartedCodeReviewValue(Run r) { GerritTrigger trigger = GerritTrigger.getTrigger(r.getParent()); if (trigger == null) { logger.warn("Unable to get trigger config for build {} will use global value."); - return config.getGerritBuildStartedCodeReviewValue(); - } else if (trigger.getGerritBuildStartedCodeReviewValue() != null) { - final Integer value = trigger.getGerritBuildStartedCodeReviewValue(); + return config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED); + } else if (trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED) != null) { + final Integer value = trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED); logger.trace("BuildStartedCodeReview overridden in project config. returning {}", value); return value; } else { - final Integer value = config.getGerritBuildStartedCodeReviewValue(); + final Integer value = config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED); logger.trace("BuildStartedCodeReview standard value used {}", value); return value; } } + /** + * Finds the vote for a given gerrit label and build status. + * If there is a {@link GerritTrigger} and it has the configured gerrit label vote value + * specified, that value will be used, otherwise the global config value in + * {@link IGerritHudsonTriggerConfig#getLabelVote(String, BuildStatus)}} will be used. + * @param r the build. + * @param gerritLabel the gerrit label. + * @param buildStatus the build status. + * @return the value. + */ + public Integer getBuildStatusVote(Run r, String gerritLabel, BuildStatus buildStatus) { + GerritTrigger trigger = GerritTrigger.getTrigger(r.getParent()); + if (trigger != null) { + Integer projectVote = trigger.getLabelVote(gerritLabel, buildStatus); + if (projectVote != null) { + logger.trace("Using project config for Label: '{}', Build status: '{}', Vote: '{}'", + gerritLabel, buildStatus, projectVote); + return projectVote; + } + } + + Integer globalVote = config.getLabelVote(gerritLabel, buildStatus); + logger.trace("Unable to use gerrit trigger config for the build. Using global config for Label: '{}', Build status: '{}', Vote: '{}'", + gerritLabel, buildStatus, globalVote); + return globalVote; + } + /** * Creates a list of the "standard" trigger parameters. * They are present both for build started and completed. @@ -217,13 +248,10 @@ public Integer getBuildStartedCodeReviewValue(Run r) { * * @param r the build. * @param gerritEvent the event. - * @param codeReview the code review vote. - * @param verified the verified vote. * @param notifyLevel the notify level. * @return the parameters and their values. */ - private Map createStandardParameters(Run r, GerritTriggeredEvent gerritEvent, - Integer codeReview, Integer verified, String notifyLevel) { + private Map createStandardParameters(Run r, GerritTriggeredEvent gerritEvent, String notifyLevel) { // VERIFIED CODE_REVIEW Map map = new HashMap(DEFAULT_PARAMETERS_COUNT); if (gerritEvent instanceof ChangeBasedEvent) { @@ -244,13 +272,30 @@ private Map createStandardParameters(Run r, GerritTriggeredEvent if (r != null) { map.put("BUILDURL", jenkins.getRootUrl() + r.getUrl()); } - map.put("VERIFIED", String.valueOf(verified)); - map.put("CODE_REVIEW", String.valueOf(codeReview)); map.put("NOTIFICATION_LEVEL", notifyLevel); return map; } + /** + * Creates a map of parameters and their values for a started command. + * @param r the build. + * @param gerritEvent the event. + * @param notifyLevel the notify level. + * @return the parameters and their values. + */ + private Map createStartedCommandParameters(Run r, GerritTriggeredEvent gerritEvent, String notifyLevel) { + Map standardParameters = createStandardParameters(r, gerritEvent, notifyLevel); + + for (VerdictCategory category : config.getCategories()) { + System.out.println("Adding verdict category: " + category.getVerdictValue() + " into started command parameters map"); + String voteValue = String.valueOf(getBuildStatusVote(r, category.getVerdictValue(), BuildStatus.STARTED)); + standardParameters.put(category.getPlaceholderValue(), voteValue); + } + + return standardParameters; + } + /** * Expands all types of parameters in the string and returns the "replaced" string. * Both types means both $ENV_VARS and <PLUGIN_VARS> @@ -273,108 +318,80 @@ private String expandParameters(String gerritCommand, Run r, TaskListener taskLi } for (Map.Entry param : parameters.entrySet()) { - command = command.replace("<" + param.getKey() + ">", param.getValue()); + if (param.getValue().equals("null") || param.getValue().equals(String.valueOf(Integer.MAX_VALUE))) { + String labelName = VerdictCategory.fromPlaceholderValue(param.getKey()); + command = command.replace("--" + labelName, ""); + command = command.replace("<" + param.getKey() + ">", ""); + } else { + command = command.replace("<" + param.getKey() + ">", param.getValue()); + } } - //replace null and Integer.MAX_VALUE code review value - command = command.replace("--code-review null", ""); - command = command.replace("--code-review " + Integer.MAX_VALUE, ""); - command = command.replace("--verified null", ""); - command = command.replace("--verified " + Integer.MAX_VALUE, ""); return command; } /** - * Finds the code review value for the specified build result on the configured trigger. - * @param res the build result. - * @param trigger the trigger that might have overridden values. - * @return the value. + * Returns the minimum of the given label vote value for the build results in the memory. + * If no builds have contributed to label's value, this method returns null + * + * @param memoryImprint the memory. + * @param onlyBuilt only count builds that completed (no NOT_BUILT builds) + * @param label the label to get the vote value for. + * @return the lowest verified value. */ - protected Integer getCodeReviewValue(Result res, GerritTrigger trigger) { - if (res == Result.SUCCESS) { - if (trigger.getGerritBuildSuccessfulCodeReviewValue() != null) { - return trigger.getGerritBuildSuccessfulCodeReviewValue(); - } else { - return config.getGerritBuildSuccessfulCodeReviewValue(); - } - } else if (res == Result.FAILURE) { - if (trigger.getGerritBuildFailedCodeReviewValue() != null) { - return trigger.getGerritBuildFailedCodeReviewValue(); - } else { - return config.getGerritBuildFailedCodeReviewValue(); + @CheckForNull + public Integer getMinimumLabelVoteValue(MemoryImprint memoryImprint, + boolean onlyBuilt, + String label) { + Integer minVoteValue = Integer.MAX_VALUE; + for (Entry entry : memoryImprint.getEntries()) { + if (entry == null) { + continue; } - } else if (res == Result.UNSTABLE) { - if (trigger.getGerritBuildUnstableCodeReviewValue() != null) { - return trigger.getGerritBuildUnstableCodeReviewValue(); - } else { - return config.getGerritBuildUnstableCodeReviewValue(); + + Run build = entry.getBuild(); + if (build == null) { + continue; } - } else if (res == Result.NOT_BUILT) { - if (trigger.getGerritBuildNotBuiltCodeReviewValue() != null) { - return trigger.getGerritBuildNotBuiltCodeReviewValue(); - } else { - return config.getGerritBuildNotBuiltCodeReviewValue(); + Result result = build.getResult(); + if (onlyBuilt && result == Result.NOT_BUILT) { + continue; } - } else if (res == Result.ABORTED) { - if (trigger.getGerritBuildAbortedCodeReviewValue() != null) { - return trigger.getGerritBuildAbortedCodeReviewValue(); - } else { - return config.getGerritBuildAbortedCodeReviewValue(); + + GerritTrigger trigger = GerritTrigger.getTrigger(entry.getProject()); + if (shouldSkip(trigger.getSkipVote(), result)) { + continue; } - } else { - //As bad as failue, for now - if (trigger.getGerritBuildFailedCodeReviewValue() != null) { - return trigger.getGerritBuildFailedCodeReviewValue(); - } else { - return config.getGerritBuildFailedCodeReviewValue(); + Integer labelVoteValue = getLabelVoteValue(result, trigger, label); + if (labelVoteValue != null) { + minVoteValue = Math.min(minVoteValue, labelVoteValue); } } + + if (minVoteValue == Integer.MAX_VALUE) { + return null; + } + + return minVoteValue; } /** - * Finds the verified value for the specified build result on the configured trigger. - * @param res the build result. + * Finds the vote value for the specified label and build result on the configured trigger. + * @param result the build result. * @param trigger the trigger that might have overridden values. + * @param label the label to get the value for. * @return the value. */ - protected Integer getVerifiedValue(Result res, GerritTrigger trigger) { - if (res == Result.SUCCESS) { - if (trigger.getGerritBuildSuccessfulVerifiedValue() != null) { - return trigger.getGerritBuildSuccessfulVerifiedValue(); - } else { - return config.getGerritBuildSuccessfulVerifiedValue(); - } - } else if (res == Result.FAILURE) { - if (trigger.getGerritBuildFailedVerifiedValue() != null) { - return trigger.getGerritBuildFailedVerifiedValue(); - } else { - return config.getGerritBuildFailedVerifiedValue(); - } - } else if (res == Result.UNSTABLE) { - if (trigger.getGerritBuildUnstableVerifiedValue() != null) { - return trigger.getGerritBuildUnstableVerifiedValue(); - } else { - return config.getGerritBuildUnstableVerifiedValue(); - } - } else if (res == Result.NOT_BUILT) { - if (trigger.getGerritBuildNotBuiltVerifiedValue() != null) { - return trigger.getGerritBuildNotBuiltVerifiedValue(); - } else { - return config.getGerritBuildNotBuiltVerifiedValue(); - } - } else if (res == Result.ABORTED) { - if (trigger.getGerritBuildAbortedVerifiedValue() != null) { - return trigger.getGerritBuildAbortedVerifiedValue(); - } else { - return config.getGerritBuildAbortedVerifiedValue(); - } - } else { - //As bad as failure, for now - if (trigger.getGerritBuildFailedVerifiedValue() != null) { - return trigger.getGerritBuildFailedVerifiedValue(); - } else { - return config.getGerritBuildFailedVerifiedValue(); - } + protected Integer getLabelVoteValue(Result result, + GerritTrigger trigger, + String label) { + + Integer triggerLabelVote = trigger.getLabelVote(label, BuildStatus.fromResult(result)); + if (triggerLabelVote != null) { + return triggerLabelVote; + } + else { + return config.getLabelVote(label, BuildStatus.fromResult(result)); } } @@ -386,8 +403,10 @@ protected Integer getVerifiedValue(Result res, GerritTrigger trigger) { * @param onlyBuilt only count builds that completed (no NOT_BUILT builds) * @param maxAllowedVerifiedValue Upper boundary on verified value. * @return the lowest verified value. + * @deprecated use {@link #getMinimumLabelVoteValue(MemoryImprint, boolean, String)}} instead. */ @CheckForNull + @Deprecated public Integer getMinimumVerifiedValue(MemoryImprint memoryImprint, boolean onlyBuilt, Integer maxAllowedVerifiedValue) { Integer verified = Integer.MAX_VALUE; @@ -408,7 +427,7 @@ public Integer getMinimumVerifiedValue(MemoryImprint memoryImprint, boolean only if (shouldSkip(trigger.getSkipVote(), result)) { continue; } - Integer verifiedObj = getVerifiedValue(result, trigger); + Integer verifiedObj = getLabelVoteValue(result, trigger, VERIFIED_LABEL); if (verifiedObj != null) { verified = Math.min(verified, verifiedObj); } @@ -427,8 +446,10 @@ public Integer getMinimumVerifiedValue(MemoryImprint memoryImprint, boolean only * @param memoryImprint the memory * @param onlyBuilt only count builds that completed (no NOT_BUILT builds) * @return the lowest code review value. + * @deprecated use {@link #getMinimumLabelVoteValue(MemoryImprint, boolean, String)}} instead. */ @CheckForNull + @Deprecated public Integer getMinimumCodeReviewValue(MemoryImprint memoryImprint, boolean onlyBuilt) { Integer codeReview = Integer.MAX_VALUE; for (Entry entry : memoryImprint.getEntries()) { @@ -445,7 +466,7 @@ public Integer getMinimumCodeReviewValue(MemoryImprint memoryImprint, boolean on if (shouldSkip(trigger.getSkipVote(), result)) { continue; } - Integer codeReviewObj = getCodeReviewValue(result, trigger); + Integer codeReviewObj = getLabelVoteValue(result, trigger, CODE_REVIEW_LABEL); if (codeReviewObj != null) { codeReview = Math.min(codeReview, codeReviewObj); } @@ -508,7 +529,7 @@ public Notify getNotificationLevel(GerritTrigger trigger) { if (serverLevel != null) { return serverLevel; } - return Config.DEFAULT_NOTIFICATION_LEVEL; + return DEFAULT_NOTIFICATION_LEVEL; } /** @@ -552,20 +573,30 @@ public String getBuildCompletedCommand(MemoryImprint memoryImprint, TaskListener // Some builds could have failed, but are already deleted and not // available for score calculation. // Set pessimistic upper boundary on verified value. - maxAllowedVerifiedValue = config.getGerritBuildFailedVerifiedValue(); + maxAllowedVerifiedValue = config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED); } - Integer verified = null; - Integer codeReview = null; Notify notifyLevel = Notify.ALL; if (memoryImprint.getEvent().isScorable()) { - verified = getMinimumVerifiedValue(memoryImprint, onlyCountBuilt, maxAllowedVerifiedValue); - codeReview = getMinimumCodeReviewValue(memoryImprint, onlyCountBuilt); notifyLevel = getHighestNotificationLevel(memoryImprint, onlyCountBuilt); } - Map parameters = createStandardParameters(null, event, - codeReview, verified, notifyLevel.name()); + Map parameters = createStandardParameters(null, event, notifyLevel.name()); + for (VerdictCategory category : config.getCategories()) { + if (!memoryImprint.getEvent().isScorable()) { + parameters.put(category.getPlaceholderValue(), "null"); + continue; + } + + System.out.println("Adding verdict category: " + category.getVerdictValue() + " into completed build parameters map"); + + Integer voteValue = getMinimumLabelVoteValue(memoryImprint, onlyCountBuilt, category.getVerdictValue()); + if (category.getVerdictValue().equals(Constants.VERIFIED_LABEL) && voteValue != null) { + voteValue = Math.min(voteValue, maxAllowedVerifiedValue); + } + + parameters.put(category.getPlaceholderValue(), String.valueOf(voteValue)); + } // escapes ' as '"'"' in order to avoid breaking command line param // Details: http://stackoverflow.com/a/26165123/99834 diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJob.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJob.java index 9ab3bc7eb..4ac2022aa 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJob.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJob.java @@ -50,9 +50,6 @@ */ public class BuildCompletedRestCommandJob extends AbstractRestCommandJob { - private static final String LABEL_CODEREVIEW = "Code-Review"; - private static final String LABEL_VERIFIED = "Verified"; - private final BuildMemory.MemoryImprint memoryImprint; private final TaskListener listener; private final ParameterExpander parameterExpander; @@ -85,7 +82,7 @@ protected ReviewInput createReview() { Integer crValue = parameterExpander.getMinimumCodeReviewValue(memoryImprint, true); if (crValue != null && crValue != Integer.MAX_VALUE) { scoredLabels.add(new ReviewLabel( - LABEL_CODEREVIEW, + Constants.CODE_REVIEW_LABEL, crValue)); } } @@ -93,7 +90,7 @@ protected ReviewInput createReview() { Integer verValue = parameterExpander.getMinimumVerifiedValue(memoryImprint, true, Integer.MAX_VALUE); if (verValue != null && verValue != Integer.MAX_VALUE) { scoredLabels.add(new ReviewLabel( - LABEL_VERIFIED, + Constants.VERIFIED_LABEL, verValue)); } } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildStartedRestCommandJob.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildStartedRestCommandJob.java index 86987a954..06def22f9 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildStartedRestCommandJob.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildStartedRestCommandJob.java @@ -46,10 +46,6 @@ */ public class BuildStartedRestCommandJob extends AbstractRestCommandJob { - - private static final String LABEL_CODEREVIEW = "Code-Review"; - private static final String LABEL_VERIFIED = "Verified"; - private final Run build; private final BuildsStartedStats stats; private final TaskListener listener; @@ -92,7 +88,7 @@ protected ReviewInput createReview() { Integer crValue = parameterExpander.getBuildStartedCodeReviewValue(build); if (crValue != null && crValue != Integer.MAX_VALUE) { scoredLabels.add(new ReviewLabel( - LABEL_CODEREVIEW, + Constants.CODE_REVIEW_LABEL, crValue)); } } @@ -100,7 +96,7 @@ protected ReviewInput createReview() { Integer verValue = parameterExpander.getBuildStartedVerifiedValue(build); if (verValue != null && verValue != Integer.MAX_VALUE) { scoredLabels.add(new ReviewLabel( - LABEL_VERIFIED, + Constants.VERIFIED_LABEL, verValue)); } } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger.java index 3b599168c..63c40a8c6 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger.java @@ -27,9 +27,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory; -import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; -import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; -import com.sonyericsson.hudson.plugins.gerrit.trigger.config.ReplicationConfig; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.*; import com.sonyericsson.hudson.plugins.gerrit.trigger.dependency.DependencyQueueTaskDispatcher; import com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.ToGerritRunListener; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.actions.GerritTriggerInformationAction; @@ -97,6 +95,8 @@ import static com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer.ANY_SERVER; import static com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl.getServerConfig; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues.DEFAULT_BUILD_SCHEDULE_DELAY; /** @@ -124,19 +124,10 @@ public class GerritTrigger extends Trigger { private transient CountDownLatch projectListIsReady = new CountDownLatch(0); private List gerritProjects; private List dynamicGerritProjects; + + private List categories; + private SkipVote skipVote; - private Integer gerritBuildStartedVerifiedValue; - private Integer gerritBuildStartedCodeReviewValue; - private Integer gerritBuildSuccessfulVerifiedValue; - private Integer gerritBuildSuccessfulCodeReviewValue; - private Integer gerritBuildFailedVerifiedValue; - private Integer gerritBuildFailedCodeReviewValue; - private Integer gerritBuildUnstableVerifiedValue; - private Integer gerritBuildUnstableCodeReviewValue; - private Integer gerritBuildNotBuiltVerifiedValue; - private Integer gerritBuildNotBuiltCodeReviewValue; - private Integer gerritBuildAbortedVerifiedValue; - private Integer gerritBuildAbortedCodeReviewValue; private boolean silentMode; @Deprecated private transient boolean enableTopicAssociation = Config.DEFAULT_ENABLE_TOPIC_ASSOCIATION; @@ -193,6 +184,8 @@ public GerritTrigger(List gerritProjects) { this.notificationLevel = ""; } + this.categories = new LinkedList<>(getVerdictCategoriesList()); + this.commitMessageParameterMode = GerritTriggerParameters.ParameterMode.BASE64; this.nameAndEmailParameterMode = GerritTriggerParameters.ParameterMode.PLAIN; this.changeSubjectParameterMode = GerritTriggerParameters.ParameterMode.PLAIN; @@ -279,16 +272,20 @@ public GerritTrigger(List gerritProjects, SkipVote skipVote, Inte boolean dynamicTriggerConfiguration, String triggerConfigURL, String notificationLevel) { this.gerritProjects = gerritProjects; this.skipVote = skipVote; - this.gerritBuildStartedVerifiedValue = gerritBuildStartedVerifiedValue; - this.gerritBuildStartedCodeReviewValue = gerritBuildStartedCodeReviewValue; - this.gerritBuildSuccessfulVerifiedValue = gerritBuildSuccessfulVerifiedValue; - this.gerritBuildSuccessfulCodeReviewValue = gerritBuildSuccessfulCodeReviewValue; - this.gerritBuildFailedVerifiedValue = gerritBuildFailedVerifiedValue; - this.gerritBuildFailedCodeReviewValue = gerritBuildFailedCodeReviewValue; - this.gerritBuildUnstableVerifiedValue = gerritBuildUnstableVerifiedValue; - this.gerritBuildUnstableCodeReviewValue = gerritBuildUnstableCodeReviewValue; - this.gerritBuildNotBuiltVerifiedValue = gerritBuildNotBuiltVerifiedValue; - this.gerritBuildNotBuiltCodeReviewValue = gerritBuildNotBuiltCodeReviewValue; + this.categories = new LinkedList<>(getVerdictCategoriesList()); + + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED, gerritBuildStartedCodeReviewValue); + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL, gerritBuildSuccessfulCodeReviewValue); + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED, gerritBuildFailedCodeReviewValue); + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE, gerritBuildUnstableCodeReviewValue); + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT, gerritBuildNotBuiltCodeReviewValue); + + setLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL, gerritBuildSuccessfulVerifiedValue); + setLabelVote(VERIFIED_LABEL, BuildStatus.FAILED, gerritBuildFailedVerifiedValue); + setLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE, gerritBuildUnstableVerifiedValue); + setLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT, gerritBuildNotBuiltVerifiedValue); + setLabelVote(VERIFIED_LABEL, BuildStatus.STARTED, gerritBuildStartedVerifiedValue); + this.silentMode = silentMode; this.silentStartMode = silentStartMode; this.escapeQuotes = escapeQuotes; @@ -747,13 +744,29 @@ protected ParametersAction createParameters(GerritTriggeredEvent event, Job proj * @return the list of verdict categories, or an empty linkedlist if server not found. */ private List getVerdictCategoriesList() { - GerritServer server = PluginImpl.getServer_(serverName); - if (server != null) { - return server.getConfig().getCategories(); - } else { - logger.error("Could not find server {}", serverName); - return new LinkedList(); - } + if (isAnyServer()) { + List labels = new ArrayList<>(); + List servers = PluginImpl.getServers_(); + for (GerritServer server : servers) { + if (server.getConfig() != null) { + List categories = server.getConfig().getCategories(); + if (categories != null) { + logger.info("Retrieving categories from server {}", server.getName()); + labels.addAll(categories); + } + } + } + return labels; + } else { + GerritServer server = PluginImpl.getServer_(serverName); + if (server != null) { + return server.getConfig().getCategories(); + } else { + logger.error("Could not find server {}", serverName); + return new LinkedList(); + } + + } } /** @@ -1292,30 +1305,35 @@ public void setGerritProjects(List gerritProjects) { * Job specific Gerrit code review vote when a build is failed, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildFailedCodeReviewValue() { - return gerritBuildFailedCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED); } /** * Job specific Gerrit code review vote when a build is failed, providing null means that the global value should be * used. * - * @param gerritBuildFailedCodeReviewValue - * the vote value. + * @param gerritBuildFailedCodeReviewValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildFailedCodeReviewValue(Integer gerritBuildFailedCodeReviewValue) { - this.gerritBuildFailedCodeReviewValue = gerritBuildFailedCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED, gerritBuildFailedCodeReviewValue); } /** * Job specific Gerrit verified vote when a build is failed, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildFailedVerifiedValue() { - return gerritBuildFailedVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED); } /** @@ -1323,52 +1341,60 @@ public Integer getGerritBuildFailedVerifiedValue() { * used. * * @param gerritBuildFailedVerifiedValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildFailedVerifiedValue(Integer gerritBuildFailedVerifiedValue) { - this.gerritBuildFailedVerifiedValue = gerritBuildFailedVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.FAILED, gerritBuildFailedVerifiedValue); } /** * Job specific Gerrit code review vote when a build is started, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildStartedCodeReviewValue() { - return gerritBuildStartedCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED); } /** * Job specific Gerrit code review vote when a build is started, providing null means that the global value should * be used. * - * @param gerritBuildStartedCodeReviewValue - * the vote value. + * @param gerritBuildStartedCodeReviewValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildStartedCodeReviewValue(Integer gerritBuildStartedCodeReviewValue) { - this.gerritBuildStartedCodeReviewValue = gerritBuildStartedCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED, gerritBuildStartedCodeReviewValue); } /** * Job specific Gerrit verified vote when a build is started, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildStartedVerifiedValue() { - return gerritBuildStartedVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED); } /** * Job specific Gerrit verified vote when a build is started, providing null means that the global value should be * used. * - * @param gerritBuildStartedVerifiedValue - * the vote value. + * @param gerritBuildStartedVerifiedValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildStartedVerifiedValue(Integer gerritBuildStartedVerifiedValue) { - this.gerritBuildStartedVerifiedValue = gerritBuildStartedVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.STARTED, gerritBuildStartedVerifiedValue); } /** @@ -1376,135 +1402,155 @@ public void setGerritBuildStartedVerifiedValue(Integer gerritBuildStartedVerifie * used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildSuccessfulCodeReviewValue() { - return gerritBuildSuccessfulCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL); } /** * Job specific Gerrit code review vote when a build is successful, providing null means that the global value * should be used. * - * @param gerritBuildSuccessfulCodeReviewValue - * the vote value. + * @param gerritBuildSuccessfulCodeReviewValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildSuccessfulCodeReviewValue(Integer gerritBuildSuccessfulCodeReviewValue) { - this.gerritBuildSuccessfulCodeReviewValue = gerritBuildSuccessfulCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL, gerritBuildSuccessfulCodeReviewValue); } /** * Job specific Gerrit verified vote when a build is successful, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildSuccessfulVerifiedValue() { - return gerritBuildSuccessfulVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL); } /** * Job specific Gerrit verified vote when a build is successful, providing null means that the global value should * be used. * - * @param gerritBuildSuccessfulVerifiedValue - * the vote value. + * @param gerritBuildSuccessfulVerifiedValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildSuccessfulVerifiedValue(Integer gerritBuildSuccessfulVerifiedValue) { - this.gerritBuildSuccessfulVerifiedValue = gerritBuildSuccessfulVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL, gerritBuildSuccessfulVerifiedValue); } /** * Job specific Gerrit code review vote when a build is unstable, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildUnstableCodeReviewValue() { - return gerritBuildUnstableCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE); } /** * Job specific Gerrit code review vote when a build is unstable, providing null means that the global value should * be used. * - * @param gerritBuildUnstableCodeReviewValue - * the vote value. + * @param gerritBuildUnstableCodeReviewValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildUnstableCodeReviewValue(Integer gerritBuildUnstableCodeReviewValue) { - this.gerritBuildUnstableCodeReviewValue = gerritBuildUnstableCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE, gerritBuildUnstableCodeReviewValue); } /** * Job specific Gerrit verified vote when a build is unstable, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildUnstableVerifiedValue() { - return gerritBuildUnstableVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE); } /** * Job specific Gerrit verified vote when a build is unstable, providing null means that the global value should be * used. * - * @param gerritBuildUnstableVerifiedValue - * the vote value. + * @param gerritBuildUnstableVerifiedValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildUnstableVerifiedValue(Integer gerritBuildUnstableVerifiedValue) { - this.gerritBuildUnstableVerifiedValue = gerritBuildUnstableVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE, gerritBuildUnstableVerifiedValue); } /** * Job specific Gerrit code review vote when a build is not built, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildNotBuiltCodeReviewValue() { - return gerritBuildNotBuiltCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT); } /** * Job specific Gerrit code review vote when a build is not built, providing null means that the global value should * be used. * - * @param gerritBuildNotBuiltCodeReviewValue - * the vote value. + * @param gerritBuildNotBuiltCodeReviewValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildNotBuiltCodeReviewValue(Integer gerritBuildNotBuiltCodeReviewValue) { - this.gerritBuildNotBuiltCodeReviewValue = gerritBuildNotBuiltCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT, gerritBuildNotBuiltCodeReviewValue); } /** * Job specific Gerrit verified vote when a build is not built, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildNotBuiltVerifiedValue() { - return gerritBuildNotBuiltVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT); } /** * Job specific Gerrit verified vote when a build is not built, providing null means that the global value should be * used. * - * @param gerritBuildNotBuiltVerifiedValue - * the vote value. + * @param gerritBuildNotBuiltVerifiedValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildNotBuiltVerifiedValue(Integer gerritBuildNotBuiltVerifiedValue) { - this.gerritBuildNotBuiltVerifiedValue = gerritBuildNotBuiltVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT, gerritBuildNotBuiltVerifiedValue); } /** * Job specific Gerrit code review vote when a build is aborted, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildAbortedCodeReviewValue() { - return gerritBuildAbortedCodeReviewValue; + return getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED); } /** @@ -1512,19 +1558,23 @@ public Integer getGerritBuildAbortedCodeReviewValue() { * used. * * @param gerritBuildAbortedCodeReviewValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildAbortedCodeReviewValue(Integer gerritBuildAbortedCodeReviewValue) { - this.gerritBuildAbortedCodeReviewValue = gerritBuildAbortedCodeReviewValue; + setLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED, gerritBuildAbortedCodeReviewValue); } /** * Job specific Gerrit verified vote when a build is aborted, null means that the global value should be used. * * @return the vote value. + * @deprecated use {@link GerritTrigger#getLabelVote(String, BuildStatus)} instead. */ + @Deprecated public Integer getGerritBuildAbortedVerifiedValue() { - return gerritBuildAbortedVerifiedValue; + return getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED); } /** @@ -1532,10 +1582,12 @@ public Integer getGerritBuildAbortedVerifiedValue() { * used. * * @param gerritBuildAbortedVerifiedValue the vote value. + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setGerritBuildAbortedVerifiedValue(Integer gerritBuildAbortedVerifiedValue) { - this.gerritBuildAbortedVerifiedValue = gerritBuildAbortedVerifiedValue; + setLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED, gerritBuildAbortedVerifiedValue); } /** @@ -1543,7 +1595,9 @@ public void setGerritBuildAbortedVerifiedValue(Integer gerritBuildAbortedVerifie * Filename to retrieve Gerrit comment message from, in the case of an unsuccessful build. * * @param buildUnsuccessfulFilepath The unsuccessful message comment file path + * @deprecated use {@link GerritTrigger#setLabelVote(String, BuildStatus, Integer)} instead. */ + @Deprecated @DataBoundSetter public void setBuildUnsuccessfulFilepath(String buildUnsuccessfulFilepath) { this.buildUnsuccessfulFilepath = buildUnsuccessfulFilepath; @@ -1610,7 +1664,7 @@ private void initializeTriggerOnEvents() { */ private void initializeServerName() { if (serverName == null) { - serverName = ANY_SERVER; + serverName = GerritServer.ANY_SERVER; } } @@ -1963,6 +2017,23 @@ public void setEnableTopicAssociation(boolean enable) { } } + /** + * Returns the list of categories. + * @return the list of categories. + */ + public List getCategories() { + return categories; + } + + /** + * Sets the list of categories. + * @param categories the list of categories. + */ + @DataBoundSetter + public void setCategories(List categories) { + this.categories = categories; + } + /** * Check if topic association is enabled. * @@ -2271,4 +2342,21 @@ protected boolean abortBecauseOfTopic(ChangeBasedEvent event, && !topicName.isEmpty() && topicName.equals(runningChange.getChange().getTopic()); } + + public void setLabelVote(String label, BuildStatus status, Integer vote) { + for (VerdictCategory cat : categories) { + if (cat.getVerdictValue().equals(label)) { + cat.setVerdictVote(status, vote); + } + } + } + + public Integer getLabelVote(String label, BuildStatus status) { + for (VerdictCategory cat : categories) { + if (cat.getVerdictValue().equals(label)) { + return cat.getVerdictVote(status); + } + } + return null; + } } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerDescriptor.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerDescriptor.java index c451620e7..004e364e2 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerDescriptor.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerDescriptor.java @@ -4,6 +4,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.Messages; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.ReplicationConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.dependency.DependencyQueueTaskDispatcher; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; @@ -296,7 +297,7 @@ private static ListBoxModel.Option getOptionForNotificationLevelDefault( } // fall back to global default - String defaultText = levelTextsById.get(Config.DEFAULT_NOTIFICATION_LEVEL); + String defaultText = levelTextsById.get(Constants.DEFAULT_NOTIFICATION_LEVEL); return new ListBoxModel.Option(Messages.NotificationLevel_DefaultValueFromServer(defaultText), ""); } diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerAction.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerAction.java index c65da12c9..3064df56b 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerAction.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerAction.java @@ -26,6 +26,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.Messages; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.events.ManualPatchsetCreated; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerParameters; @@ -712,11 +713,11 @@ public static enum Approval { /** * A Code Review Approval type Code-Review. */ - CODE_REVIEW("Code-Review"), + CODE_REVIEW(Constants.CODE_REVIEW_LABEL), /** * A Verified Approval type Verified. */ - VERIFIED("Verified"); + VERIFIED(Constants.VERIFIED_LABEL); private String type; /** diff --git a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/StringUtil.java b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/StringUtil.java index 946d2b64e..93274cc49 100644 --- a/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/StringUtil.java +++ b/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/StringUtil.java @@ -28,6 +28,8 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonymobile.tools.gerrit.gerritevents.GerritEventListener; import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeBasedEvent; +import net.sf.json.JSONObject; + import java.util.regex.Pattern; /** @@ -156,4 +158,26 @@ public static String getDefaultDisplayNameForSpecificServer(GerritEventListener name.append(listener.getClass().getSimpleName()); return name.toString(); } + + /** + * Obtain value from a key in formdata. + * @param formData JSONObject. + * @param key key to extract value for. + * @return value. + */ + public static Integer getValueFromFormData(JSONObject formData, String key) { + if (formData.has(key)) { + String testData = formData.optString(key); + if (testData == null || testData.equals("")) { + return null; + } else { + try { + return Integer.parseInt(testData); + } catch (NumberFormatException nfe) { + return null; + } + } + } + return null; + } } diff --git a/src/main/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger/config.jelly b/src/main/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger/config.jelly index 706a87f88..45fad845a 100644 --- a/src/main/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger/config.jelly +++ b/src/main/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger/config.jelly @@ -1,7 +1,6 @@ - + - @@ -17,47 +16,47 @@ - + - + - - - + + + - + ${it.toString()} - + - + ${it.toString()} - + - + ${it.toString()} - + - + ${it.toString()} - + + help="/plugin/gerrit-trigger/trigger/help-DependencyJobs.html"> - + - -
- - - - - +
+ + + + + + + + + + +
-
${%Verify}
- - - - - - - - - - - - - - - - - - -
${%Code Review}
- - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ${instance.verdictValue} + + +
${%Started} + +
${%Successful} + +
${%Failed} + +
${%Unstable} + +
${%Not Built} + +
+
- + - + - + - + - + - + + help="/plugin/gerrit-trigger/trigger/help-TopicAssociation.html" /> - + help="/plugin/gerrit-trigger/trigger/help-GerritEventType.html"> + - - + + + - - + checkUrl="'descriptorByName/com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger/urlCheck?value='+escape(this.value)"/> + + + - -
- -
- - -
-
- - - -
-
- ${%Branch} -
- - -
-
-
-
- - - -
-
- ${%Topic} -
- - -
-
-
- - - -
-
- ${%Hashtag} -
- - -
-
-
- - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-
-
- ${%File} -
- - -
+
+ ${%Type} + + ${%Pattern} + + ${%Branches} +
+ + + + + + + + + + + + +
+ ${%Type} + + ${%Pattern} + + +
+
+ + + + + + + +
+ + + + + +
+
+
+ + + + + + + + +
+ ${%Topic} + + + + + + +
- - - - -
-
- ${%Forbidden File} -
- - -
-
-
- - - - +
+ + + + + + + + +
+ ${%File} + + + + + + +
+
+
+ + + + + + + + +
+ ${%Forbidden File} + + + + + + +
+
+
+ + +
diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/JcascTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/JcascTest.java index 4198d65e1..1fe5affc2 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/JcascTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/JcascTest.java @@ -25,9 +25,7 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger; -import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; -import com.sonyericsson.hudson.plugins.gerrit.trigger.config.PluginConfig; -import com.sonyericsson.hudson.plugins.gerrit.trigger.config.ReplicationConfig; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.*; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.BuildCancellationPolicy; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritSlave; import com.sonymobile.tools.gerrit.gerritevents.watchdog.WatchTimeExceptionData; @@ -116,19 +114,19 @@ private void verifyDefaultSetup(boolean checkPasswords) { assertTrue(bcp.isAbortNewPatchsets()); assertTrue(bcp.isAbortSameTopic()); - assertEquals(4, c.getGerritBuildStartedVerifiedValue().intValue()); - assertEquals(4, c.getGerritBuildSuccessfulVerifiedValue().intValue()); - assertEquals(4, c.getGerritBuildFailedVerifiedValue().intValue()); - assertEquals(4, c.getGerritBuildUnstableVerifiedValue().intValue()); - assertEquals(4, c.getGerritBuildNotBuiltVerifiedValue().intValue()); - assertEquals(4, c.getGerritBuildAbortedVerifiedValue().intValue()); + assertEquals(4, c.getLabelVote(Constants.VERIFIED_LABEL, BuildStatus.STARTED).intValue()); + assertEquals(4, c.getLabelVote(Constants.VERIFIED_LABEL, BuildStatus.SUCCESSFUL).intValue()); + assertEquals(4, c.getLabelVote(Constants.VERIFIED_LABEL, BuildStatus.FAILED).intValue()); + assertEquals(4, c.getLabelVote(Constants.VERIFIED_LABEL, BuildStatus.UNSTABLE).intValue()); + assertEquals(4, c.getLabelVote(Constants.VERIFIED_LABEL, BuildStatus.NOT_BUILT).intValue()); + assertEquals(4, c.getLabelVote(Constants.VERIFIED_LABEL, BuildStatus.ABORTED).intValue()); - assertEquals(4, c.getGerritBuildStartedCodeReviewValue().intValue()); - assertEquals(4, c.getGerritBuildSuccessfulCodeReviewValue().intValue()); - assertEquals(4, c.getGerritBuildFailedCodeReviewValue().intValue()); - assertEquals(4, c.getGerritBuildUnstableCodeReviewValue().intValue()); - assertEquals(4, c.getGerritBuildNotBuiltCodeReviewValue().intValue()); - assertEquals(4, c.getGerritBuildAbortedCodeReviewValue().intValue()); + assertEquals(4, c.getLabelVote(Constants.CODE_REVIEW_LABEL, BuildStatus.STARTED).intValue()); + assertEquals(4, c.getLabelVote(Constants.CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL).intValue()); + assertEquals(4, c.getLabelVote(Constants.CODE_REVIEW_LABEL, BuildStatus.FAILED).intValue()); + assertEquals(4, c.getLabelVote(Constants.CODE_REVIEW_LABEL, BuildStatus.UNSTABLE).intValue()); + assertEquals(4, c.getLabelVote(Constants.CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT).intValue()); + assertEquals(4, c.getLabelVote(Constants.CODE_REVIEW_LABEL, BuildStatus.ABORTED).intValue()); assertThat(c.getGerritCmdBuildStarted(), containsString("Build Started CMD")); assertThat(c.getGerritCmdBuildSuccessful(), containsString("Build Successful CMD")); @@ -146,9 +144,9 @@ private void verifyDefaultSetup(boolean checkPasswords) { assertEquals(3636, c.getProjectListRefreshInterval()); assertEquals(OWNER_REVIEWERS, c.getNotificationLevel()); List cats = c.getCategories(); - assertThat(cats, iterableWithSize(2)); - VerdictCategory c1 = cats.get(0); - VerdictCategory c2 = cats.get(1); + assertThat(cats, iterableWithSize(4)); + VerdictCategory c1 = cats.get(2); + VerdictCategory c2 = cats.get(3); assertEquals("foo", c1.getVerdictValue()); assertEquals("bar", c1.getVerdictDescription()); assertEquals("baz", c2.getVerdictValue()); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/ConfigTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/ConfigTest.java index ce0d65517..40306fbcc 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/ConfigTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/config/ConfigTest.java @@ -24,22 +24,21 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup; +import com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues; import com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated; import com.sonymobile.tools.gerrit.gerritevents.dto.rest.Notify; -import com.sonymobile.tools.gerrit.gerritevents.GerritDefaultValues; -import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup; - +import hudson.util.Secret; import net.sf.json.JSONObject; import net.sf.json.JSONSerializer; - import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; -import hudson.util.Secret; - import java.io.File; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -78,18 +77,6 @@ public void testSetValues() { + "--message 'Aborted oupsy ' --verified --code-review \"," + "\"gerritAuthKeyFile\":\"/home/local/gerrit/.ssh/id_rsa\"," + "\"gerritAuthKeyFilePassword\":\"passis\"," - + "\"gerritBuildFailedCodeReviewValue\":\"1\"," - + "\"gerritBuildFailedVerifiedValue\":\"-1\"," - + "\"gerritBuildStartedCodeReviewValue\":\"2\"," - + "\"gerritBuildStartedVerifiedValue\":\"-2\"," - + "\"gerritBuildSuccessfulCodeReviewValue\":\"3\"," - + "\"gerritBuildSuccessfulVerifiedValue\":\"-3\"," - + "\"gerritBuildUnstableCodeReviewValue\":\"4\"," - + "\"gerritBuildUnstableVerifiedValue\":\"-4\"," - + "\"gerritBuildNotBuiltCodeReviewValue\":\"5\"," - + "\"gerritBuildNotBuiltVerifiedValue\":\"-5\"," - + "\"gerritBuildAbortedCodeReviewValue\":\"6\"," - + "\"gerritBuildAbortedVerifiedValue\":\"-6\"," + "\"gerritFrontEndUrl\":\"http://gerrit:8088\"," + "\"gerritHostName\":\"gerrit\"," + "\"gerritSshPort\":\"1337\"," @@ -98,7 +85,25 @@ public void testSetValues() { + "\"useRestApi\":{\"gerritHttpUserName\":\"httpgerrit\",\"gerritHttpPassword\":\"httppass\"}," + "\"numberOfSendingWorkerThreads\":\"4\"," + "\"numberOfReceivingWorkerThreads\":\"6\"," - + "\"notificationLevel\":\"OWNER\"}"; + + "\"notificationLevel\":\"OWNER\"," + + "\"verdictCategories\":[" + + "{\"verdictValue\":\"Code-Review\"," + + "\"verdictDescription\":\"Code-Review\"," + + "\"buildStartedVote\":\"1\"," + + "\"buildSuccessfulVote\":\"2\"," + + "\"buildFailedVote\":\"3\"," + + "\"buildUnstableVote\":\"4\"," + + "\"buildNotBuiltVote\":\"5\"," + + "\"buildAbortedVote\":\"6\"}," + + "{\"verdictValue\":\"Verified\"," + + "\"verdictDescription\":\"Verified\"," + + "\"buildStartedVote\":\"7\"," + + "\"buildSuccessfulVote\":\"8\"," + + "\"buildFailedVote\":\"9\"," + + "\"buildUnstableVote\":\"10\"," + + "\"buildNotBuiltVote\":\"11\"," + + "\"buildAbortedVote\":\"12\"}]" + + "}"; JSONObject form = (JSONObject)JSONSerializer.toJSON(formString); Config config = new Config(form); assertEquals("gerrit review --project , " @@ -122,18 +127,20 @@ public void testSetValues() { assertEquals(new File("/home/local/gerrit/.ssh/id_rsa").getPath(), config.getGerritAuthKeyFile().getPath()); assertEquals("passis", config.getGerritAuthKeyFilePassword()); - assertEquals(Integer.valueOf(1), config.getGerritBuildFailedCodeReviewValue()); - assertEquals(Integer.valueOf(-1), config.getGerritBuildFailedVerifiedValue()); - assertEquals(Integer.valueOf(2), config.getGerritBuildStartedCodeReviewValue()); - assertEquals(Integer.valueOf(-2), config.getGerritBuildStartedVerifiedValue()); - assertEquals(Integer.valueOf(3), config.getGerritBuildSuccessfulCodeReviewValue()); - assertEquals(Integer.valueOf(-3), config.getGerritBuildSuccessfulVerifiedValue()); - assertEquals(Integer.valueOf(4), config.getGerritBuildUnstableCodeReviewValue()); - assertEquals(Integer.valueOf(-4), config.getGerritBuildUnstableVerifiedValue()); - assertEquals(Integer.valueOf(5), config.getGerritBuildNotBuiltCodeReviewValue()); - assertEquals(Integer.valueOf(-5), config.getGerritBuildNotBuiltVerifiedValue()); - assertEquals(Integer.valueOf(6), config.getGerritBuildAbortedCodeReviewValue()); - assertEquals(Integer.valueOf(-6), config.getGerritBuildAbortedVerifiedValue()); + assertEquals(Integer.valueOf(1), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED)); + assertEquals(Integer.valueOf(2), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)); + assertEquals(Integer.valueOf(3), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)); + assertEquals(Integer.valueOf(4), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)); + assertEquals(Integer.valueOf(5), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT)); + assertEquals(Integer.valueOf(6), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED)); + + assertEquals(Integer.valueOf(7), config.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED)); + assertEquals(Integer.valueOf(8), config.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)); + assertEquals(Integer.valueOf(9), config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)); + assertEquals(Integer.valueOf(10), config.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)); + assertEquals(Integer.valueOf(11), config.getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT)); + assertEquals(Integer.valueOf(12), config.getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED)); + assertEquals("http://gerrit:8088/", config.getGerritFrontEndUrl()); assertEquals("gerrit", config.getGerritHostName()); assertEquals(1337, config.getGerritSshPort()); @@ -183,18 +190,23 @@ public void testCopyConfig() { + "--message 'Aborted oupsy ' --verified --code-review \"," + "\"gerritAuthKeyFile\":\"/home/local/gerrit/.ssh/id_rsa\"," + "\"gerritAuthKeyFilePassword\":\"passis\"," - + "\"gerritBuildFailedCodeReviewValue\":\"1\"," - + "\"gerritBuildFailedVerifiedValue\":\"-1\"," - + "\"gerritBuildStartedCodeReviewValue\":\"2\"," - + "\"gerritBuildStartedVerifiedValue\":\"-2\"," - + "\"gerritBuildSuccessfulCodeReviewValue\":\"3\"," - + "\"gerritBuildSuccessfulVerifiedValue\":\"-3\"," - + "\"gerritBuildUnstableCodeReviewValue\":\"4\"," - + "\"gerritBuildUnstableVerifiedValue\":\"-4\"," - + "\"gerritBuildNotBuiltCodeReviewValue\":\"5\"," - + "\"gerritBuildNotBuiltVerifiedValue\":\"-5\"," - + "\"gerritBuildAbortedCodeReviewValue\":\"6\"," - + "\"gerritBuildAbortedVerifiedValue\":\"-6\"," + + "\"verdictCategories\":[" + + "{\"verdictValue\":\"Code-Review\"," + + "\"verdictDescription\":\"Code-Review\"," + + "\"buildStartedVote\":\"1\"," + + "\"buildSuccessfulVote\":\"2\"," + + "\"buildFailedVote\":\"3\"," + + "\"buildUnstableVote\":\"4\"," + + "\"buildNotBuiltVote\":\"5\"," + + "\"buildAbortedVote\":\"6\"}," + + "{\"verdictValue\":\"Verified\"," + + "\"verdictDescription\":\"Verified\"," + + "\"buildStartedVote\":\"7\"," + + "\"buildSuccessfulVote\":\"8\"," + + "\"buildFailedVote\":\"9\"," + + "\"buildUnstableVote\":\"10\"," + + "\"buildNotBuiltVote\":\"11\"," + + "\"buildAbortedVote\":\"12\"}]," + "\"gerritFrontEndUrl\":\"http://gerrit:8088\"," + "\"gerritHostName\":\"gerrit\"," + "\"gerritSshPort\":\"1337\"," @@ -228,18 +240,20 @@ public void testCopyConfig() { assertEquals(new File("/home/local/gerrit/.ssh/id_rsa").getPath(), config.getGerritAuthKeyFile().getPath()); assertEquals("passis", config.getGerritAuthKeyFilePassword()); - assertEquals(Integer.valueOf(1), config.getGerritBuildFailedCodeReviewValue()); - assertEquals(Integer.valueOf(-1), config.getGerritBuildFailedVerifiedValue()); - assertEquals(Integer.valueOf(2), config.getGerritBuildStartedCodeReviewValue()); - assertEquals(Integer.valueOf(-2), config.getGerritBuildStartedVerifiedValue()); - assertEquals(Integer.valueOf(3), config.getGerritBuildSuccessfulCodeReviewValue()); - assertEquals(Integer.valueOf(-3), config.getGerritBuildSuccessfulVerifiedValue()); - assertEquals(Integer.valueOf(4), config.getGerritBuildUnstableCodeReviewValue()); - assertEquals(Integer.valueOf(-4), config.getGerritBuildUnstableVerifiedValue()); - assertEquals(Integer.valueOf(5), config.getGerritBuildNotBuiltCodeReviewValue()); - assertEquals(Integer.valueOf(-5), config.getGerritBuildNotBuiltVerifiedValue()); - assertEquals(Integer.valueOf(6), config.getGerritBuildAbortedCodeReviewValue()); - assertEquals(Integer.valueOf(-6), config.getGerritBuildAbortedVerifiedValue()); + assertEquals(Integer.valueOf(1), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED)); + assertEquals(Integer.valueOf(2), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)); + assertEquals(Integer.valueOf(3), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)); + assertEquals(Integer.valueOf(4), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)); + assertEquals(Integer.valueOf(5), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT)); + assertEquals(Integer.valueOf(6), config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED)); + + assertEquals(Integer.valueOf(7), config.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED)); + assertEquals(Integer.valueOf(8), config.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)); + assertEquals(Integer.valueOf(9), config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)); + assertEquals(Integer.valueOf(10), config.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)); + assertEquals(Integer.valueOf(11), config.getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT)); + assertEquals(Integer.valueOf(12), config.getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED)); + assertEquals("http://gerrit:8088/", config.getGerritFrontEndUrl()); assertEquals("gerrit", config.getGerritHostName()); assertEquals(1337, config.getGerritSshPort()); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderParameterizedTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderParameterizedTest.java index b806f367f..2eef25a0a 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderParameterizedTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderParameterizedTest.java @@ -24,12 +24,11 @@ package com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup; - import hudson.model.Result; - import jenkins.model.Jenkins; import org.junit.After; import org.junit.Before; @@ -43,17 +42,16 @@ import java.util.LinkedList; import java.util.List; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; //CS IGNORE MagicNumber FOR NEXT 200 LINES. REASON: Mocks tests. /** * Tests a bunch of different scenarios. - * For {@link ParameterExpander#getCodeReviewValue(hudson.model.Result, GerritTrigger)} - * and {@link ParameterExpander#getVerifiedValue(hudson.model.Result, GerritTrigger)} + * For {@link ParameterExpander#getLabelVoteValue(Result, GerritTrigger, String)} with various labels * @author Robert Sandell <robert.sandell@sonyericsson.com> */ @RunWith(Parameterized.class) @@ -92,7 +90,7 @@ public void tearDown() { public void testGetVerifiedValue() { ParameterExpander instance = new ParameterExpander(parameters.config); assertEquals(Integer.valueOf(parameters.expectedVerified), - instance.getVerifiedValue(parameters.result, parameters.trigger)); + instance.getLabelVoteValue(parameters.result, parameters.trigger, VERIFIED_LABEL)); } /** @@ -102,7 +100,7 @@ public void testGetVerifiedValue() { public void testGetCodeReviewValue() { ParameterExpander instance = new ParameterExpander(parameters.config); assertEquals(Integer.valueOf(parameters.expectedCodeReview), - instance.getCodeReviewValue(parameters.result, parameters.trigger)); + instance.getLabelVoteValue(parameters.result, parameters.trigger, CODE_REVIEW_LABEL)); } /** @@ -113,60 +111,60 @@ public void testGetCodeReviewValue() { public static Collection getParameters() { List list = new LinkedList(); - IGerritHudsonTriggerConfig config = Setup.createConfig(); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); //SUCCESS, FAILURE, ABORTED, UNSTABLE, other //not overridden, overridden //SUCCESS Not overridden GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); list.add(new TestParameters[]{new TestParameters(config, Result.SUCCESS, trigger, 4, 3)}); //SUCCESS overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(21); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(22); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(21); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(22); list.add(new TestParameters[]{new TestParameters(config, Result.SUCCESS, trigger, 21, 22)}); //FAILURE Not overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildFailedVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(null); list.add(new TestParameters[]{new TestParameters(config, Result.FAILURE, trigger, -2, -1)}); //FAILURE overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(31); - when(trigger.getGerritBuildFailedVerifiedValue()).thenReturn(32); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(31); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(32); list.add(new TestParameters[]{new TestParameters(config, Result.FAILURE, trigger, 31, 32)}); //UNSTABLE overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableCodeReviewValue()).thenReturn(-21); - when(trigger.getGerritBuildUnstableVerifiedValue()).thenReturn(-22); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(-21); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)).thenReturn(-22); list.add(new TestParameters[]{new TestParameters(config, Result.UNSTABLE, trigger, -21, -22)}); //OTHER Not overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildNotBuiltCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildNotBuiltVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT)).thenReturn(null); list.add(new TestParameters[]{new TestParameters(config, Result.NOT_BUILT, trigger, -6, -5)}); //OTHER overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildNotBuiltCodeReviewValue()).thenReturn(-51); - when(trigger.getGerritBuildNotBuiltVerifiedValue()).thenReturn(-52); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT)).thenReturn(-51); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT)).thenReturn(-52); list.add(new TestParameters[]{new TestParameters(config, Result.NOT_BUILT, trigger, -51, -52)}); //ABORTED Not overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildAbortedCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildAbortedVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED)).thenReturn(null); list.add(new TestParameters[]{new TestParameters(config, Result.ABORTED, trigger, 3, -2)}); //ABORTED overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildAbortedCodeReviewValue()).thenReturn(41); - when(trigger.getGerritBuildAbortedVerifiedValue()).thenReturn(42); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED)).thenReturn(41); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED)).thenReturn(42); list.add(new TestParameters[]{new TestParameters(config, Result.ABORTED, trigger, 41, 42)}); //UNSTABLE Not overridden trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildUnstableVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)).thenReturn(null); list.add(new TestParameters[]{new TestParameters(config, Result.UNSTABLE, trigger, -4, -3)}); return list; diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderSkipVoteParameterTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderSkipVoteParameterTest.java index d710a4bc1..7dcd842a3 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderSkipVoteParameterTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderSkipVoteParameterTest.java @@ -92,7 +92,7 @@ public void tearDown() throws Exception { */ @Test public void testCodeReview() { - IGerritHudsonTriggerConfig config = Setup.createConfig(); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); ParameterExpander instance = new ParameterExpander(config); Integer result = instance.getMinimumCodeReviewValue(parameter.memoryImprint, true); if (parameter.expectedCodeReview == null) { @@ -108,7 +108,7 @@ public void testCodeReview() { */ @Test public void testVerified() { - IGerritHudsonTriggerConfig config = Setup.createConfig(); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); ParameterExpander instance = new ParameterExpander(config); Integer result = instance.getMinimumVerifiedValue(parameter.memoryImprint, true, Integer.MAX_VALUE); if (parameter.expectedVerified == null) { diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderTest.java index 43ea014a4..062d91aa2 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpanderTest.java @@ -24,6 +24,7 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.model.BuildMemory.MemoryImprint; @@ -35,19 +36,8 @@ import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeBasedEvent; import com.sonymobile.tools.gerrit.gerritevents.dto.events.GerritTriggeredEvent; import com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated; - import hudson.EnvVars; -import hudson.model.Result; -import hudson.model.Run; -import hudson.model.TaskListener; -import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; - -import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; - +import hudson.model.*; import jenkins.model.Jenkins; import org.hamcrest.Description; import org.hamcrest.Matcher; @@ -55,17 +45,27 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.MockedStatic; +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Stream; + +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; import static org.hamcrest.core.IsInstanceOf.instanceOf; -import static org.junit.Assert.assertEquals; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.when; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; //CS IGNORE MagicNumber FOR NEXT 700 LINES. REASON: Mocks tests. @@ -83,6 +83,7 @@ public class ParameterExpanderTest { * Mock Jenkins. */ @Before + @BeforeEach public void setup() { jenkinsMockedStatic = mockStatic(Jenkins.class); jenkins = mock(Jenkins.class); @@ -91,6 +92,7 @@ public void setup() { } @After + @AfterEach public void tearDown() throws Exception { jenkinsMockedStatic.close(); } @@ -104,9 +106,10 @@ public void testGetBuildStartedCommand() throws Exception { TaskListener taskListener = mock(TaskListener.class); GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildStartedVerifiedValue()).thenReturn(null); - when(trigger.getGerritBuildStartedCodeReviewValue()).thenReturn(32); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED)).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED)).thenReturn(32); when(trigger.getBuildStartMessage()).thenReturn("${START_MESSAGE_VAR}"); + when(trigger.getLabelVote("Custom-Label", BuildStatus.STARTED)).thenReturn(3); AbstractProject project = mock(AbstractProject.class); Setup.setTrigger(trigger, project); @@ -115,8 +118,7 @@ public void testGetBuildStartedCommand() throws Exception { PatchsetCreated event = Setup.createPatchsetCreated(); BuildsStartedStats stats = Setup.createBuildStartedStats(event); - IGerritHudsonTriggerConfig config = Setup.createConfig(); - + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); try (MockedStatic messageProviderMockedStatic = mockStatic(GerritMessageProvider.class)) { List messageProviderExtensionList = new LinkedList(); @@ -132,16 +134,17 @@ public void testGetBuildStartedCommand() throws Exception { System.out.println("result: " + result); assertTrue("Missing START_MESSAGE_VAL from getBuildStartMessage()", result.contains("START_MESSAGE_VAL")); - assertTrue("Missing CHANGE_ID", result.contains("CHANGE_ID=Iddaaddaa123456789")); - assertTrue("Missing PATCHSET", result.contains("PATCHSET=1")); - assertTrue("Missing VERIFIED", result.contains("VERIFIED=1")); - assertTrue("Missing CODEREVIEW", result.contains("CODEREVIEW=32")); - assertTrue("Missing NOTIFICATION_LEVEL", result.contains("NOTIFICATION_LEVEL=ALL")); - assertTrue("Missing REFSPEC", result.contains("REFSPEC=" + expectedRefSpec)); - assertTrue("Missing ENV_BRANCH", result.contains("ENV_BRANCH=branch")); - assertTrue("Missing ENV_CHANGE", result.contains("ENV_CHANGE=1000")); - assertTrue("Missing ENV_REFSPEC", result.contains("ENV_REFSPEC=" + expectedRefSpec)); - assertTrue("Missing ENV_CHANGEURL", result.contains("ENV_CHANGEURL=http://gerrit/1000")); + assertTrue("Missing CHANGE_ID", result.contains("change-id Iddaaddaa123456789")); + assertTrue("Missing PATCHSET or CHANGE", result.contains("1000,1")); + assertTrue("Missing VERIFIED", result.contains("--verified 1")); + assertTrue("Missing CODEREVIEW", result.contains("--code-review 32")); + assertTrue("Missing CUSTOMLABEL", result.contains("--custom-label 3")); + assertTrue("Missing NOTIFICATION_LEVEL", result.contains("notification-level ALL")); + assertTrue("Missing REFSPEC", result.contains("refspec " + expectedRefSpec)); + assertTrue("Missing ENV_BRANCH", result.contains("ENV_BRANCH branch")); + assertTrue("Missing ENV_CHANGE", result.contains("ENV_CHANGE 1000")); + assertTrue("Missing ENV_REFSPEC", result.contains("ENV_REFSPEC " + expectedRefSpec)); + assertTrue("Missing ENV_CHANGEURL", result.contains("ENV_CHANGEURL http://gerrit/1000")); assertTrue("Missing CUSTOM_MESSAGE", result.contains("CUSTOM_MESSAGE_BUILD_STARTED")); assertTrue("Newlines are stripped", result.contains("Message\nwith newline")); } @@ -159,31 +162,31 @@ public void testGetMinimumVerifiedValue() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[4]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(3); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(3); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableVerifiedValue()).thenReturn(1); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)).thenReturn(1); entries[1] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.UNSTABLE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableVerifiedValue()).thenReturn(-1); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)).thenReturn(-1); entries[2] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.UNSTABLE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildNotBuiltVerifiedValue()).thenReturn(-4); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT)).thenReturn(-4); entries[3] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.NOT_BUILT); when(memoryImprint.getEntries()).thenReturn(entries); // When not all results are NOT_BUILT, we should ignore NOT_BUILT. int expResult = -1; - int result = instance.getMinimumVerifiedValue(memoryImprint, true, Integer.MAX_VALUE); + int result = instance.getMinimumLabelVoteValue(memoryImprint, true, VERIFIED_LABEL); assertEquals(expResult, result); // Otherwise, we should use NOT_BUILT. expResult = -4; - result = instance.getMinimumVerifiedValue(memoryImprint, false, Integer.MAX_VALUE); + result = instance.getMinimumLabelVoteValue(memoryImprint, false, VERIFIED_LABEL); assertEquals(expResult, result); } @@ -199,35 +202,35 @@ public void testGetMinimumCodeReviewValue() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[4]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(3); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(3); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableCodeReviewValue()).thenReturn(1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(1); entries[1] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.UNSTABLE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableCodeReviewValue()).thenReturn(-1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(-1); entries[2] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.UNSTABLE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildNotBuiltCodeReviewValue()).thenReturn(-4); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT)).thenReturn(-4); entries[3] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.NOT_BUILT); when(memoryImprint.getEntries()).thenReturn(entries); // When not all results are NOT_BUILT, we should ignore NOT_BUILT. - Integer result = instance.getMinimumCodeReviewValue(memoryImprint, true); + Integer result = instance.getMinimumLabelVoteValue(memoryImprint, true, CODE_REVIEW_LABEL); assertEquals(Integer.valueOf(-1), result); // Otherwise, we should use NOT_BUILT. - result = instance.getMinimumCodeReviewValue(memoryImprint, false); + result = instance.getMinimumLabelVoteValue(memoryImprint, false, CODE_REVIEW_LABEL); assertEquals(Integer.valueOf(-4), result); } /** - * Tests {@link ParameterExpander#getMinimumCodeReviewValue(MemoryImprint, boolean)} with one - * unstable build vote skipped. + * Tests {@link ParameterExpander#getMinimumLabelVoteValue(MemoryImprint, boolean, String)} with one + * unstable build vote skipped for Code-Review label. * * @see com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger#getSkipVote() */ @@ -240,29 +243,29 @@ public void testGetMinimumCodeReviewValueOneUnstableSkipped() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[3]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildUnstableCodeReviewValue()).thenReturn(-1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(-1); SkipVote skipVote = new SkipVote(false, false, true, false, false); when(trigger.getSkipVote()).thenReturn(skipVote); entries[1] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.UNSTABLE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(2); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(2); entries[2] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); when(memoryImprint.getEntries()).thenReturn(entries); - Integer result = instance.getMinimumCodeReviewValue(memoryImprint, true); + Integer result = instance.getMinimumLabelVoteValue(memoryImprint, true, CODE_REVIEW_LABEL); assertEquals(Integer.valueOf(1), result); } /** - * Tests {@link ParameterExpander#getMinimumCodeReviewValue(MemoryImprint, boolean)} with one - * successful build vote skipped. + * Tests {@link ParameterExpander#getMinimumLabelVoteValue(MemoryImprint, boolean, String)} with one + * successful build vote skipped for Code-Review label. * * @see com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger#getSkipVote() */ @@ -275,20 +278,20 @@ public void testGetMinimumCodeReviewValueOneSuccessfulSkipped() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[1]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); SkipVote skipVote = new SkipVote(true, false, false, false, false); when(trigger.getSkipVote()).thenReturn(skipVote); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); when(memoryImprint.getEntries()).thenReturn(entries); - Integer result = instance.getMinimumCodeReviewValue(memoryImprint, true); + Integer result = instance.getMinimumLabelVoteValue(memoryImprint, true, CODE_REVIEW_LABEL); assertNull(result); } /** - * Tests {@link ParameterExpander#getMinimumCodeReviewValue(MemoryImprint, boolean)} with one - * job that has override core review value on build successful. + * Tests {@link ParameterExpander#getMinimumLabelVoteValue(MemoryImprint, boolean, String)} with one + * job that has override core review value on build successful for Code-Review label. * * @see com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger#getSkipVote() */ @@ -301,24 +304,24 @@ public void testGetMinimumCodeReviewValueForOneJobOverridenBuildSuccessful() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[2]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(Integer.valueOf(2)); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(Integer.valueOf(2)); entries[1] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); when(memoryImprint.getEntries()).thenReturn(entries); // Since one job has overriden CR value, it is the only one inspected // and therefore the only one that contributes. - Integer result = instance.getMinimumCodeReviewValue(memoryImprint, false); + Integer result = instance.getMinimumLabelVoteValue(memoryImprint, false, CODE_REVIEW_LABEL); assertEquals(Integer.valueOf(2), result); } /** - * Tests {@link ParameterExpander#getMinimumCodeReviewValue(MemoryImprint, boolean)} with one - * job that has override core review value on build successful. + * Tests {@link ParameterExpander#getMinimumLabelVoteValue(MemoryImprint, boolean, String)} with one + * job that has override core review value on build successful for Code-Review label. * * @see com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger#getSkipVote() */ @@ -331,24 +334,24 @@ public void testGetMinimumCodeReviewValueForOneJobOverridenBuildFailed() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[2]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(null); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.FAILURE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(Integer.valueOf(-2)); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(Integer.valueOf(-2)); entries[1] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.FAILURE); when(memoryImprint.getEntries()).thenReturn(entries); // Since one job has overriden CR value, it is the only one inspected // and therefore the only one that contributes. - Integer result = instance.getMinimumCodeReviewValue(memoryImprint, false); + Integer result = instance.getMinimumLabelVoteValue(memoryImprint, false, CODE_REVIEW_LABEL); assertEquals(Integer.valueOf(-2), result); } /** - * Tests {@link ParameterExpander#getMinimumCodeReviewValue(MemoryImprint, boolean)} with one - * job that has override core review value on build successful. + * Tests {@link ParameterExpander#getMinimumLabelVoteValue(MemoryImprint, boolean, String)} with one + * job that has override core review value on build successful for Code-Review label. * * @see com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger#getSkipVote() */ @@ -361,50 +364,21 @@ public void testGetMinimumCodeReviewValueForOneJobOverridenMixed() { MemoryImprint.Entry[] entries = new MemoryImprint.Entry[2]; GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(null); entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.FAILURE); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(Integer.valueOf(2)); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(Integer.valueOf(2)); entries[1] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); when(memoryImprint.getEntries()).thenReturn(entries); // Since one job has overriden CR value, it is the only one inspected // and therefore the only one that contributes. - Integer result = instance.getMinimumCodeReviewValue(memoryImprint, false); + Integer result = instance.getMinimumLabelVoteValue(memoryImprint, false, CODE_REVIEW_LABEL); assertEquals(Integer.valueOf(2), result); } - /** - * Tests {@link ParameterExpander#getMinimumVerifiedValue(MemoryImprint, boolean, Integer)} with two - * jobs. One successful build, the other failed missing build (null). - * - */ - @Test - public void testGetVerifiedValueOneSuccessJobAndMissingFailedJob() { - IGerritHudsonTriggerConfig config = Setup.createConfigWithCodeReviewsNull(); - - ParameterExpander instance = new ParameterExpander(config, jenkins); - MemoryImprint memoryImprint = mock(MemoryImprint.class); - MemoryImprint.Entry[] entries = new MemoryImprint.Entry[2]; - - GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedVerifiedValue()).thenReturn(Integer.valueOf(2)); - entries[0] = Setup.createAndSetupMemoryImprintEntry(trigger, Result.SUCCESS); - - trigger = mock(GerritTrigger.class); - entries[1] = Setup.createAndSetupMemoryImprintEntryWithEmptyBuild(trigger); - - when(memoryImprint.getEntries()).thenReturn(entries); - - // The only verified value available is of successful build, - // but score should be saturated to Failed verified value from config. - Integer result = instance.getMinimumVerifiedValue(memoryImprint, false, - config.getGerritBuildFailedVerifiedValue()); - assertEquals(Integer.valueOf(config.getGerritBuildFailedVerifiedValue()), result); - } - /** * test. * @throws IOException IOException @@ -428,8 +402,13 @@ public void testGetBuildCompletedCommandSuccessful() throws IOException, Interru @Test public void testGetBuildCompletedCommandNotBuilt() throws IOException, InterruptedException { tryGetBuildCompletedCommandEventWithResults("", new String[] {}, - new Result[] {Result.NOT_BUILT}, Setup.createPatchsetCreated(), - null, null, "NONE", false); + new Result[] {Result.NOT_BUILT}, + Setup.createPatchsetCreated(), + not(containsStrings("--verified")), + not(containsStrings("--code-review")), + not(containsStrings("--custom-label")), + "NONE", + false); } /** @@ -493,7 +472,10 @@ public void testGetBuildCompletedCommandMulipleBuildsMessageOrder() throws IOExc "\n\nhttp://localhost/test/ : UNSTABLE", "\n\nhttp://localhost/test/ : SUCCESS", }, new Result[] {Result.SUCCESS, Result.FAILURE, Result.UNSTABLE}, - Setup.createPatchsetCreated(), -1, 0); + Setup.createPatchsetCreated(), + containsString("--verified -1"), + containsStrings("--code-review 0"), + containsStrings("--custom-label 0")); } /** @@ -503,8 +485,8 @@ public void testGetBuildCompletedCommandMulipleBuildsMessageOrder() throws IOExc @Test public void testGetBuildCompletedMissingFailedBuild() throws IOException, InterruptedException { int buildResults = 2; - IGerritHudsonTriggerConfig config = Setup.createConfig(); - Integer expectedVerifiedVote = config.getGerritBuildFailedVerifiedValue(); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); + Integer expectedVerifiedVote = config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED); PatchsetCreated event = Setup.createPatchsetCreated(); TaskListener taskListener = mock(TaskListener.class); @@ -528,7 +510,7 @@ public void testGetBuildCompletedMissingFailedBuild() throws IOException, Interr ParameterExpander instance = new ParameterExpander(config, jenkins); String result = instance.getBuildCompletedCommand(memoryImprint, taskListener, null); - assertThat("Missing VERIFIED", result, containsString("VERIFIED=" + expectedVerifiedVote)); + assertThat("Missing VERIFIED", result, containsString("--verified " + expectedVerifiedVote)); } /** @@ -541,7 +523,11 @@ public void testGetBuildCompletedMissingFailedBuild() throws IOException, Interr */ public void tryGetBuildCompletedCommandSuccessful(String customUrl, String expectedBuildsStats) throws IOException, InterruptedException { - tryGetBuildCompletedCommandSuccessfulEvent(customUrl, expectedBuildsStats, Setup.createPatchsetCreated(), 3, 32); + tryGetBuildCompletedCommandSuccessfulEvent(customUrl, + expectedBuildsStats, + Setup.createPatchsetCreated(), + containsString("--verified 3"), + containsStrings("--code-review 32")); } /** @@ -599,10 +585,13 @@ public void tryGetBuildCompletedCommandSuccessfulChangeRestored(String customUrl * @throws InterruptedException if so. */ public void tryGetBuildCompletedCommandSuccessfulEvent(String customUrl, String expectedBuildsStats, - GerritTriggeredEvent event, Integer expectedVerifiedVote, Integer expectedCodeReviewVote) + GerritTriggeredEvent event, Matcher expectedVerifiedVote, Matcher expectedCodeReviewVote) throws IOException, InterruptedException { tryGetBuildCompletedCommandEventWithResults(customUrl, new String[] {expectedBuildsStats}, - new Result[] {Result.SUCCESS}, Setup.createChangeRestored(), null, null); + new Result[] {Result.SUCCESS}, Setup.createChangeRestored(), + not(containsStrings("--verified")), + not(containsStrings("--code-review")), + not(containsStrings("--custom-label"))); } /** @@ -622,13 +611,76 @@ public void tryGetBuildCompletedCommandSuccessfulEvent(String customUrl, String */ public void tryGetBuildCompletedCommandEventWithResults(String customUrl, String[] expectedBuildsStats, Result[] expectedBuildResults, GerritTriggeredEvent event, - Integer expectedVerifiedVote, Integer expectedCodeReviewVote) - throws IOException, InterruptedException { + Matcher expectedVerifiedVote, + Matcher expectedCodeReviewVote, + Matcher expectedCustomLabelVote) throws IOException, InterruptedException { tryGetBuildCompletedCommandEventWithResults(customUrl, expectedBuildsStats, - expectedBuildResults, event, expectedVerifiedVote, expectedCodeReviewVote, + expectedBuildResults, event, expectedVerifiedVote, expectedCodeReviewVote, expectedCustomLabelVote, "ALL", true); } + private static Stream gerritCommandsWithVariousConfigsCases() { + return Stream.of( + Arguments.of(-1, 2, 3, Setup.createChangeMerged(), Result.SUCCESS, + not(containsStrings("--verified")), + not(containsString("--code-review")), + not(containsString("--custom-label"))), + Arguments.of(null, 2, 3, Setup.createPatchsetCreated(), Result.SUCCESS, + containsStrings("--verified 3"), + containsStrings("--code-review 2"), + containsStrings("--custom-label 3")), + Arguments.of(null, null, 3, Setup.createPatchsetCreated(), Result.SUCCESS, + containsStrings("--verified 3"), + containsStrings("--code-review 4"), + containsStrings("--custom-label 3")), + Arguments.of(null, null, null, Setup.createPatchsetCreated(), Result.SUCCESS, + containsStrings("--verified 3"), + containsStrings("--code-review 4"), + containsStrings("--custom-label 0")) + ); + } + + @ParameterizedTest + @MethodSource("gerritCommandsWithVariousConfigsCases") + public void testGerritCommandsWithVariousConfigs( + Integer givenVerifiedVote, + Integer givenCodeReviewVote, + Integer givenCustomLabelVote, + GerritTriggeredEvent event, + Result givenBuildResult, + Matcher expectedCodeReviewVote, + Matcher expectedVerifiedVote, + Matcher expectedCustomLabelVote) throws IOException, InterruptedException { + + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); + TaskListener taskListener = mock(TaskListener.class); + + GerritTrigger trigger = mock(GerritTrigger.class); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(givenVerifiedVote); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(givenCodeReviewVote); + when(trigger.getLabelVote("Custom-Label", BuildStatus.SUCCESSFUL)).thenReturn(givenCustomLabelVote); + when(trigger.getCustomUrl()).thenReturn(""); + AbstractProject project = mock(AbstractProject.class); + Setup.setTrigger(trigger, project); + + EnvVars envVars = Setup.createEnvVars(); + AbstractBuild build = Setup.createBuild(project, taskListener, envVars); + when(build.getResult()).thenReturn(givenBuildResult); + MemoryImprint.Entry entry = Setup.createImprintEntry(project, build); + + MemoryImprint memoryImprint = mock(MemoryImprint.class); + when(memoryImprint.getEvent()).thenReturn(event); + when(memoryImprint.getEntries()).thenReturn(new MemoryImprint.Entry[] {entry}); + when(memoryImprint.wereAllBuildsSuccessful()).thenReturn(true); + + ParameterExpander instance = new ParameterExpander(config, jenkins); + String result = instance.getBuildCompletedCommand(memoryImprint, taskListener, null); + + assertThat("Incorrect Verified vote value", result, expectedVerifiedVote); + assertThat("Incorrect Code-Review vote value", result, expectedCodeReviewVote); + assertThat("Incorrect Custom label vote value", result, expectedCustomLabelVote); + } + /** * Sub test for {@link #testGetBuildCompletedCommandSuccessful()} and * {@link #testGetBuildCompletedCommandSuccessfulChangeMerged()}. @@ -646,8 +698,10 @@ public void tryGetBuildCompletedCommandEventWithResults(String customUrl, String */ public void tryGetBuildCompletedCommandEventWithResults(String customUrl, String[] expectedBuildsStats, Result[] expectedBuildResults, GerritTriggeredEvent event, - Integer expectedVerifiedVote, Integer expectedCodeReviewVote, String expectedNotificationLevel, - boolean createBuild) + Matcher expectedVerifiedVote, + Matcher expectedCodeReviewVote, + Matcher expectedCustomLabelVote, + String expectedNotificationLevel, boolean createBuild) throws IOException, InterruptedException { IGerritHudsonTriggerConfig config = Setup.createConfig(); @@ -656,8 +710,9 @@ public void tryGetBuildCompletedCommandEventWithResults(String customUrl, String TaskListener taskListener = mock(TaskListener.class); GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(null); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(32); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(32); + when(trigger.getLabelVote("Custom-Label", BuildStatus.SUCCESSFUL)).thenReturn(2); when(trigger.getCustomUrl()).thenReturn(customUrl); AbstractProject project = mock(AbstractProject.class); Setup.setTrigger(trigger, project); @@ -717,8 +772,9 @@ public void tryGetBuildCompletedCommandEventWithResults(String customUrl, String assertThat("Missing ENV_CHANGEURL", result, containsString("ENV_CHANGEURL=http://gerrit/1000")); assertThat("Missing CUSTOM_MESSAGES", result, containsString("CUSTOM_MESSAGE_BUILD_COMPLETED")); } - assertThat("Missing VERIFIED", result, containsString("VERIFIED=" + expectedVerifiedVote)); - assertThat("Missing CODEREVIEW", result, containsString("CODEREVIEW=" + expectedCodeReviewVote)); + assertThat("Missing VERIFIED", result, expectedVerifiedVote); + assertThat("Missing CODEREVIEW", result, expectedCodeReviewVote); + assertThat("Missing CUSTOMLABEL", result, expectedCustomLabelVote); } } @@ -749,8 +805,8 @@ public void tryBuildStatsFailureCommand(String unsuccessfulMessage, String expec TaskListener taskListener = mock(TaskListener.class); GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(null); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(32); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(32); AbstractProject project = mock(AbstractProject.class); Setup.setTrigger(trigger, project); @@ -811,7 +867,7 @@ public void getBuildStatsFailureCommandWithNullsForCodeReviewValues() throws Exc GerritTrigger trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(null); AbstractProject project = mock(AbstractProject.class); Setup.setTrigger(trigger, project); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJobHudsonTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJobHudsonTest.java index 92b95fb72..8add4d1f9 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJobHudsonTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/job/rest/BuildCompletedRestCommandJobHudsonTest.java @@ -26,7 +26,9 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; @@ -53,6 +55,8 @@ import java.io.PrintWriter; import java.util.Collections; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -107,8 +111,8 @@ private void runTest() throws Exception { null, null, null, false) )); trigger.setSilentMode(false); - trigger.setGerritBuildSuccessfulCodeReviewValue(1); - trigger.setGerritBuildSuccessfulVerifiedValue(1); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL, 1); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL, 1); PluginImpl.getInstance().getHandler().post(event); @@ -129,8 +133,8 @@ private void runTest() throws Exception { j.assertStringContains(json.getString("message"), "Build Successful"); JSONObject labels = json.getJSONObject("labels"); - assertEquals(1, labels.getInt("Code-Review")); - assertEquals(1, labels.getInt("Verified")); + assertEquals(1, labels.getInt(CODE_REVIEW_LABEL)); + assertEquals(1, labels.getInt(Constants.VERIFIED_LABEL)); } /** * The test with a locked down instance. diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/WorkflowTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/WorkflowTest.java index 0a44fa527..03e8a27c0 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/WorkflowTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/WorkflowTest.java @@ -25,7 +25,9 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject; @@ -52,6 +54,8 @@ import java.io.PrintWriter; import java.util.Collections; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; import static org.hamcrest.core.AllOf.allOf; @@ -105,7 +109,7 @@ public void testTriggerWorkflow() throws Exception { Assert.assertTrue(message.startsWith("Build Successful")); Assert.assertTrue(message.contains("job/WFJob/1/")); JSONObject labels = verifiedMessage.getJSONObject("labels"); - assertEquals(1, labels.getInt("Verified")); + assertEquals(1, labels.getInt(Constants.VERIFIED_LABEL)); } finally { gerritServer.stop(); } @@ -145,7 +149,7 @@ public void testWorkflowStepSetsCustomUrl() throws Exception { Assert.assertTrue(message.startsWith("Build Successful")); Assert.assertTrue(message.contains("myCustomUrl")); JSONObject labels = verifiedMessage.getJSONObject("labels"); - assertEquals(1, labels.getInt("Verified")); + assertEquals(1, labels.getInt(Constants.VERIFIED_LABEL)); } finally { gerritServer.stop(); } @@ -187,7 +191,7 @@ public void testWorkflowStepSetsUnsuccessfulMessage() throws Exception { Assert.assertTrue(message.startsWith("Build Failed")); Assert.assertTrue(message.contains("myMessage")); JSONObject labels = verifiedMessage.getJSONObject("labels"); - assertEquals(0, labels.getInt("Verified")); + assertEquals(0, labels.getInt(Constants.VERIFIED_LABEL)); } finally { gerritServer.stop(); } @@ -228,37 +232,12 @@ public void testWorkflowStepSetsUnsuccessfulMessageWithSuccessfulBuild() throws Assert.assertTrue(message.startsWith("Build Successful")); Assert.assertFalse(message.contains("myMessage")); JSONObject labels = verifiedMessage.getJSONObject("labels"); - assertEquals(1, labels.getInt("Verified")); + assertEquals(1, labels.getInt(Constants.VERIFIED_LABEL)); } finally { gerritServer.stop(); } } - /** - * Tests a {@link JenkinsRule#configRoundtrip(hudson.model.Job)} on the workflow job. - * - * @throws Exception if so. - */ - @Test - public void testConfigRoundTrip() throws Exception { - PatchsetCreated event = Setup.createPatchsetCreated(PluginImpl.DEFAULT_SERVER_NAME); - WorkflowJob job = createWorkflowJob(event); - jenkinsRule.configRoundtrip(job); - job = (WorkflowJob)jenkinsRule.jenkins.getItem("WFJob"); - GerritTrigger trigger = GerritTrigger.getTrigger(job); - assertFalse(trigger.isSilentMode()); - assertEquals(1, trigger.getGerritBuildSuccessfulCodeReviewValue().intValue()); - assertEquals(1, trigger.getGerritBuildSuccessfulVerifiedValue().intValue()); - assertEquals(0, trigger.getGerritBuildFailedCodeReviewValue().intValue()); - assertThat(trigger.getGerritProjects(), hasItem( - allOf( - instanceOf(GerritProject.class), - hasProperty("compareType", is(CompareType.PLAIN)), - hasProperty("pattern", equalTo(event.getChange().getProject())) - ) - )); - } - /** * Creates a {@link WorkflowJob} with a configured {@link GerritTrigger}. * @@ -274,6 +253,39 @@ private WorkflowJob createWorkflowJob(PatchsetCreated event) throws IOException + "}}\n"); } + /** + * Tests a {@link JenkinsRule#configRoundtrip(hudson.model.Job)} on the workflow job. + * + * @throws Exception if so. + */ + @Test + public void testConfigRoundTrip() throws Exception { + MockGerritServer gerritServer = MockGerritServer.get(jenkinsRule); + + gerritServer.start(); + try { + PatchsetCreated event = Setup.createPatchsetCreated(gerritServer.getName()); + WorkflowJob job = createWorkflowJob(event); + jenkinsRule.configRoundtrip(job); + job = (WorkflowJob)jenkinsRule.jenkins.getItem("WFJob"); + GerritTrigger trigger = GerritTrigger.getTrigger(job); + assertFalse(trigger.isSilentMode()); + assertEquals(1, trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL).intValue()); + assertEquals(1, trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL).intValue()); + assertEquals(0, trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED).intValue()); + assertThat(trigger.getGerritProjects(), hasItem( + allOf( + instanceOf(GerritProject.class), + hasProperty("compareType", is(CompareType.PLAIN)), + hasProperty("pattern", equalTo(event.getChange().getProject())) + ) + )); + } + finally { + gerritServer.stop(); + } + } + /** * Creates a {@link WorkflowJob} with a configured {@link GerritTrigger} and given workflow DSL script. * @@ -293,8 +305,8 @@ private WorkflowJob createWorkflowJob(PatchsetCreated event, String script) thro null, null, null, false) )); trigger.setSilentMode(false); - trigger.setGerritBuildSuccessfulCodeReviewValue(1); - trigger.setGerritBuildSuccessfulVerifiedValue(1); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL, 1); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL, 1); return job; } diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerActionTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerActionTest.java index 49363a585..35c55ca41 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerActionTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/actions/manual/ManualTriggerActionTest.java @@ -29,6 +29,7 @@ import static org.mockito.Mockito.any; import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -66,19 +67,19 @@ public void testGetCodeReview() throws Exception { JSONArray approvals = new JSONArray(); JSONObject crw = new JSONObject(); - crw.put("type", "Code-Review"); + crw.put("type", Constants.CODE_REVIEW_LABEL); crw.put("value", "2"); approvals.add(crw); crw = new JSONObject(); - crw.put("type", "Code-Review"); + crw.put("type", Constants.CODE_REVIEW_LABEL); crw.put("value", "1"); approvals.add(crw); crw = new JSONObject(); - crw.put("type", "Verified"); + crw.put("type", Constants.VERIFIED_LABEL); crw.put("value", "1"); approvals.add(crw); crw = new JSONObject(); - crw.put("type", "Code-Review"); + crw.put("type", Constants.CODE_REVIEW_LABEL); crw.put("value", "-1"); approvals.add(crw); currentPatchSet.put("approvals", approvals); @@ -128,19 +129,19 @@ public void testGetVerified() throws Exception { JSONArray approvals = new JSONArray(); JSONObject crw = new JSONObject(); - crw.put("type", "Verified"); + crw.put("type", Constants.VERIFIED_LABEL); crw.put("value", "2"); approvals.add(crw); crw = new JSONObject(); - crw.put("type", "Verified"); + crw.put("type", Constants.VERIFIED_LABEL); crw.put("value", "1"); approvals.add(crw); crw = new JSONObject(); - crw.put("type", "Code-Review"); + crw.put("type", Constants.CODE_REVIEW_LABEL); crw.put("value", "1"); approvals.add(crw); crw = new JSONObject(); - crw.put("type", "Verified"); + crw.put("type", Constants.VERIFIED_LABEL); crw.put("value", "-1"); approvals.add(crw); currentPatchSet.put("approvals", approvals); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/DuplicatesUtil.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/DuplicatesUtil.java index a4643e305..965371251 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/DuplicatesUtil.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/DuplicatesUtil.java @@ -24,6 +24,7 @@ package com.sonyericsson.hudson.plugins.gerrit.trigger.mock; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; @@ -158,7 +159,7 @@ public static FreeStyleProject createGerritTriggeredJobForCommentAdded(JenkinsRu List projects = new LinkedList(); projects.add(new GerritProject(CompareType.ANT, "**", Collections.singletonList(new Branch(CompareType.ANT, "**")), null, null, null, false)); - PluginCommentAddedEvent event = new PluginCommentAddedEvent("Code-Review", "1"); + PluginCommentAddedEvent event = new PluginCommentAddedEvent(Constants.CODE_REVIEW_LABEL, "1"); List list = new LinkedList(); list.add(event); p.addTrigger(new GerritTrigger(projects, null, diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/MockGerritHudsonTriggerConfig.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/MockGerritHudsonTriggerConfig.java index f36bf1d8b..b685c9e02 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/MockGerritHudsonTriggerConfig.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/MockGerritHudsonTriggerConfig.java @@ -24,6 +24,7 @@ package com.sonyericsson.hudson.plugins.gerrit.trigger.mock; import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.ReplicationConfig; @@ -43,6 +44,9 @@ import org.apache.http.auth.Credentials; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; + /** * Mock class of a Config. * @author Robert Sandell <robert.sandell@sonyericsson.com> @@ -55,8 +59,9 @@ public String getGerritCmdBuildStarted() { return "CHANGE=" + " CHANGE_ID=" + " PATCHSET=" - + " VERIFIED=" - + " CODEREVIEW=" + + " --verified " + + " --code-review " + + " --custom-label " + " NOTIFICATION_LEVEL=" + " REFSPEC= MSG=I started a build." + " BUILDURL=" @@ -74,8 +79,9 @@ public String getGerritCmdBuildSuccessful() { return "CHANGE=" + " CHANGE_ID=" + " PATCHSET=" - + " VERIFIED=" - + " CODEREVIEW=" + + " --verified " + + " --code-review " + + " --custom-label " + " NOTIFICATION_LEVEL=" + " REFSPEC= MSG='Build Successful '" + " BUILDURL=" @@ -92,8 +98,9 @@ public String getGerritCmdBuildFailed() { return "CHANGE=" + " CHANGE_ID=" + " PATCHSET=" - + " VERIFIED=-1" - + " CODEREVIEW=" + + " --verified -1" + + " --code-review " + + " --custom-label " + " NOTIFICATION_LEVEL=" + " REFSPEC= MSG='Build Failed '" + " BUILDURL=" @@ -110,8 +117,9 @@ public String getGerritCmdBuildUnstable() { return "CHANGE=" + " CHANGE_ID=" + " PATCHSET=" - + " VERIFIED=" - + " CODEREVIEW=" + + " --verified " + + " --code-review " + + " --custom-label " + " NOTIFICATION_LEVEL=" + " REFSPEC= MSG='The build is Unstable. BS='" + " BUILDURL=" @@ -129,8 +137,9 @@ public String getGerritCmdBuildNotBuilt() { return "CHANGE=" + " CHANGE_ID=" + " PATCHSET=" - + " VERIFIED=" - + " CODEREVIEW=" + + " --verified " + + " --code-review " + + " --custom-label " + " NOTIFICATION_LEVEL=" + " REFSPEC=" + " MSG='No Builds Executed '"; @@ -141,8 +150,9 @@ public String getGerritCmdBuildAborted() { return "CHANGE=" + " CHANGE_ID=" + " PATCHSET=" - + " VERIFIED=-1" - + " CODEREVIEW=" + + " --verified -1" + + " --code-review " + + " --custom-label " + " NOTIFICATION_LEVEL=" + " REFSPEC= MSG='The build was Aborted. BS='" + " BUILDURL=" @@ -169,6 +179,11 @@ public Secret getGerritAuthKeyFileSecretPassword() { return Secret.decrypt("{Secret}"); } + @Override + public Integer getLabelVote(String label, BuildStatus status) { + return null; + } + @Override public String getGerritFrontEndUrl() { return "http://gerrit/"; @@ -402,7 +417,15 @@ public String getGerritFrontEndUrlFor(GerritTriggeredEvent event) { @Override public List getCategories() { - return new LinkedList(); + VerdictCategory verdictCategory = new VerdictCategory("Custom-Label", + "Custom-Label", -1,-2,-3,-4,-5,-6); + return new LinkedList<>() { + { + add(new VerdictCategory(VERIFIED_LABEL, VERIFIED_LABEL, 1, 2, 3, 4, 5, 6)); + add(new VerdictCategory(CODE_REVIEW_LABEL, CODE_REVIEW_LABEL, -1, -2, -3, -4, -5, -6)); + add(verdictCategory); + } + }; } @Override diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/Setup.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/Setup.java index e53a08f8f..53d5c5e0c 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/Setup.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/mock/Setup.java @@ -23,6 +23,9 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.mock; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerDescriptor; import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Account; import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Approval; @@ -64,6 +67,7 @@ import hudson.model.Job; import hudson.model.Result; import hudson.model.TaskListener; +import hudson.os.SU; import hudson.security.SecurityRealm; import hudson.triggers.Trigger; import hudson.triggers.TriggerDescriptor; @@ -84,6 +88,8 @@ import java.util.LinkedList; import java.util.List; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -126,6 +132,73 @@ public static MockGerritHudsonTriggerConfig createConfig() { return new MockGerritHudsonTriggerConfig(); } + /** + * Gives you a mocked Config that can be furthered configured + * @return IGerritHudsonTriggerConfig mock + */ + public static IGerritHudsonTriggerConfig createMockableConfig() { + IGerritHudsonTriggerConfig config = mock(IGerritHudsonTriggerConfig.class); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED)).thenReturn(2); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(4); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(-2); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(-4); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT)).thenReturn(-6); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED)).thenReturn(3); + + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.STARTED)).thenReturn(1); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(3); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(-1); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)).thenReturn(-3); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT)).thenReturn(-5); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED)).thenReturn(-2); + + when(config.getGerritCmdBuildFailed()).thenReturn(Constants.GERRIT_CMD_BUILD_FAILED_DEFAULT_VALUE + + " --custom-label " + + " change-id " + + " notification-level " + + " refspec " + + " ENV_BRANCH $BRANCH" + + " ENV_CHANGE $CHANGE" + + " ENV_PATCHSET $PATCHSET" + + " ENV_REFSPEC $REFSPEC" + + " ENV_CHANGEURL $CHANGE_URL" + + " Message\nwith newline"); + when(config.getGerritCmdBuildStarted()).thenReturn(Constants.GERRIT_CMD_BUILD_STARTED_DEFAULT_VALUE + + " --custom-label " + + " change-id " + + " notification-level " + + " refspec " + + " ENV_BRANCH $BRANCH" + + " ENV_CHANGE $CHANGE" + + " ENV_PATCHSET $PATCHSET" + + " ENV_REFSPEC $REFSPEC" + + " ENV_CHANGEURL $CHANGE_URL" + + " Message\nwith newline"); + when(config.getGerritCmdBuildSuccessful()).thenReturn(Constants.GERRIT_CMD_BUILD_SUCCESSFUL_DEFAULT_VALUE + + " --custom-label " + + " change-id " + + " notification-level " + + " refspec " + + " ENV_BRANCH $BRANCH" + + " ENV_CHANGE $CHANGE" + + " ENV_PATCHSET $PATCHSET" + + " ENV_REFSPEC $REFSPEC" + + " ENV_CHANGEURL $CHANGE_URL" + + " Message\nwith newline"); + + when(config.isEnablePluginMessages()).thenReturn(true); + when(config.getCategories()).thenReturn( + new LinkedList<>() { + { + add(new VerdictCategory(VERIFIED_LABEL, VERIFIED_LABEL, 1, 2, 3, 4, 5, 6)); + add(new VerdictCategory(CODE_REVIEW_LABEL, CODE_REVIEW_LABEL, -1, -2, -3, -4, -5, -6)); + add(new VerdictCategory("Custom-Label", "Custom-Label", -1, -2, -3, -4, -5, -6)); + } + }); + + return config; + } + /** * Gives you a Config mock with nulled code review values. * @return MockGerritHudsonTriggerConfig mock. @@ -519,7 +592,7 @@ public static CommentAdded createCommentAdded() { event.setPatchset(patch); List approvals = new LinkedList(); Approval approval = new Approval(); - approval.setType("Code-Review"); + approval.setType(Constants.CODE_REVIEW_LABEL); approval.setValue("1"); approvals.add(approval); event.setApprovals(approvals); @@ -692,18 +765,18 @@ public static GerritTrigger createDefaultTrigger(Job job) { trigger.setTriggerOnEvents(triggerOnEvents); trigger.setSilentMode(silentMode); trigger.setSilentStartMode(silentStart); - trigger.setGerritBuildStartedVerifiedValue(0); - trigger.setGerritBuildStartedCodeReviewValue(0); - trigger.setGerritBuildSuccessfulVerifiedValue(0); - trigger.setGerritBuildSuccessfulCodeReviewValue(0); - trigger.setGerritBuildFailedVerifiedValue(0); - trigger.setGerritBuildFailedCodeReviewValue(0); - trigger.setGerritBuildUnstableVerifiedValue(0); - trigger.setGerritBuildUnstableCodeReviewValue(0); - trigger.setGerritBuildNotBuiltVerifiedValue(0); - trigger.setGerritBuildNotBuiltCodeReviewValue(0); - trigger.setGerritBuildAbortedVerifiedValue(0); - trigger.setGerritBuildAbortedCodeReviewValue(0); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.STARTED, 0); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL, 0); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED, 0); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE, 0); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.NOT_BUILT, 0); + trigger.setLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED, 0); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.STARTED, 0); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL, 0); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.FAILED, 0); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE, 0); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.NOT_BUILT, 0); + trigger.setLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED, 0); trigger.setServerName(PluginImpl.DEFAULT_SERVER_NAME); if (job != null) { @@ -790,7 +863,7 @@ public static ToGerritRunListener createFailureMessageRunListener(final Abstract * @return the List. */ public static List createCodeReviewVerdictCategoryList() { - VerdictCategory cat = new VerdictCategory("Code-Review", "Code review"); + VerdictCategory cat = new VerdictCategory(Constants.CODE_REVIEW_LABEL, Constants.CODE_REVIEW_LABEL); List list = new LinkedList(); list.add(cat); return list; @@ -869,32 +942,32 @@ public static MemoryImprint.Entry createAndSetupMemoryImprintEntry(Result result GerritTrigger trigger = mock(GerritTrigger.class); SkipVote skipVote = null; if (result == Result.SUCCESS) { - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(resultsCodeReviewVote); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(resultsVerifiedVote); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(resultsCodeReviewVote); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(resultsVerifiedVote); if (shouldSkip) { skipVote = new SkipVote(true, false, false, false, false); } } else if (result == Result.FAILURE) { - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(resultsCodeReviewVote); - when(trigger.getGerritBuildFailedVerifiedValue()).thenReturn(resultsVerifiedVote); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(resultsCodeReviewVote); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(resultsVerifiedVote); if (shouldSkip) { skipVote = new SkipVote(false, true, false, false, false); } } else if (result == Result.UNSTABLE) { - when(trigger.getGerritBuildUnstableCodeReviewValue()).thenReturn(resultsCodeReviewVote); - when(trigger.getGerritBuildUnstableVerifiedValue()).thenReturn(resultsVerifiedVote); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.UNSTABLE)).thenReturn(resultsCodeReviewVote); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.UNSTABLE)).thenReturn(resultsVerifiedVote); if (shouldSkip) { skipVote = new SkipVote(false, false, true, false, false); } } else if (result == Result.NOT_BUILT) { - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(1); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); if (shouldSkip) { skipVote = new SkipVote(false, false, false, true, false); } } else if (result == Result.ABORTED) { - when(trigger.getGerritBuildAbortedCodeReviewValue()).thenReturn(resultsCodeReviewVote); - when(trigger.getGerritBuildAbortedVerifiedValue()).thenReturn(resultsVerifiedVote); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.ABORTED)).thenReturn(resultsCodeReviewVote); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.ABORTED)).thenReturn(resultsVerifiedVote); if (shouldSkip) { skipVote = new SkipVote(false, false, false, false, true); } diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/project/GerritTriggerProjectHudsonTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/project/GerritTriggerProjectHudsonTest.java index f6b9609fa..71027a3f2 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/project/GerritTriggerProjectHudsonTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/project/GerritTriggerProjectHudsonTest.java @@ -23,6 +23,7 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.project; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import org.htmlunit.html.DomElement; import org.htmlunit.html.HtmlElement; import org.htmlunit.html.HtmlPage; @@ -82,7 +83,7 @@ public void testPopulateDropDown() throws Exception { final List elements = page.getDocumentElement() .getElementsByAttribute("select", "name", "_.verdictCategory"); assertThat(elements, hasSize(1)); - List expected = Arrays.asList("Verified", "Code-Review"); + List expected = Arrays.asList(Constants.VERIFIED_LABEL, Constants.CODE_REVIEW_LABEL); verifyOptions((HtmlSelect)elements.get(0), expected); } } @@ -115,7 +116,7 @@ public void testPopulateDropDownFromTwoServers() throws Exception { final List elements = page.getDocumentElement() .getElementsByAttribute("select", "name", "_.verdictCategory"); assertThat(elements, hasSize(1)); - List expected = Arrays.asList("Verified", "Code-Review", "Code-Review2", "Verified2"); + List expected = Arrays.asList(Constants.VERIFIED_LABEL, Constants.CODE_REVIEW_LABEL, "Code-Review2", "Verified2"); verifyOptions((HtmlSelect)elements.get(0), expected); } } diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/BackCompat2173JenkinsTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/BackCompat2173JenkinsTest.java index d060518e9..4dc528836 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/BackCompat2173JenkinsTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/BackCompat2173JenkinsTest.java @@ -90,9 +90,6 @@ private void verifyAllOff(GerritTrigger trigger) { assertNotNull(trigger); assertNotNull(trigger.getSkipVote()); assertFalse("Skip not built", trigger.getSkipVote().isOnNotBuilt()); - assertNotNull(trigger.getGerritBuildFailedCodeReviewValue()); - assertEquals("Build Failed Code Review value", Integer.valueOf(0), - trigger.getGerritBuildFailedCodeReviewValue()); assertFalse("Silent Mode", trigger.isSilentMode()); assertEquals("Notification level", "ALL", trigger.getNotificationLevel()); assertFalse("Silent start", trigger.isSilentStartMode()); @@ -164,9 +161,6 @@ private void verifyAllOn(GerritTrigger trigger) { assertNotNull(trigger); assertNotNull(trigger.getSkipVote()); assertTrue("Skip not built", trigger.getSkipVote().isOnNotBuilt()); - assertNotNull(trigger.getGerritBuildNotBuiltCodeReviewValue()); - assertEquals("Build Failed Code Review value", Integer.valueOf(0), - trigger.getGerritBuildNotBuiltCodeReviewValue()); assertFalse("Silent Mode", trigger.isSilentMode()); assertEquals("Notification level", "OWNER", trigger.getNotificationLevel()); assertTrue("Silent start", trigger.isSilentStartMode()); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/ParameterModeJenkinsTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/ParameterModeJenkinsTest.java index b6ec60e16..194b78eb2 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/ParameterModeJenkinsTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/ParameterModeJenkinsTest.java @@ -2,6 +2,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerParameters; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; @@ -368,7 +369,7 @@ public void testCommitMessageParameterModeNone() throws Exception { @Test public void testCommentTextParameterModeDefault() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.BASE64, trigger.getCommentTextParameterMode()); - trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); + trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent(Constants.CODE_REVIEW_LABEL, "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); @@ -390,7 +391,7 @@ public void testCommentTextParameterModeDefault() throws Exception { @Test public void testCommentTextParameterModePlain() throws Exception { trigger.setCommentTextParameterMode(GerritTriggerParameters.ParameterMode.PLAIN); - trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); + trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent(Constants.CODE_REVIEW_LABEL, "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); @@ -412,7 +413,7 @@ public void testCommentTextParameterModePlain() throws Exception { @Test public void testCommentTextParameterModeNone() throws Exception { trigger.setCommentTextParameterMode(GerritTriggerParameters.ParameterMode.NONE); - trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); + trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent(Constants.CODE_REVIEW_LABEL, "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/TopicAssociationTriggerTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/TopicAssociationTriggerTest.java index c6e80b035..8d8c673b2 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/TopicAssociationTriggerTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/TopicAssociationTriggerTest.java @@ -3,6 +3,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; @@ -68,7 +69,7 @@ private FreeStyleProject createJob(String pattern) throws IOException { job.getBuildersList().add(new ParametersBuilder()); GerritTrigger trigger = Setup.createDefaultTrigger(job); trigger.setTopicAssociation(new TopicAssociation()); - trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); + trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent(Constants.CODE_REVIEW_LABEL, "1")); trigger.setGerritProjects(Collections.singletonList(new GerritProject(CompareType.ANT, pattern, Collections.singletonList(new Branch(CompareType.ANT, "**")), Collections.emptyList(), Collections.emptyList(), diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/VoteSameTopicTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/VoteSameTopicTest.java index 27bb86ebe..f6fe67f4a 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/VoteSameTopicTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/VoteSameTopicTest.java @@ -3,6 +3,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; @@ -67,7 +68,7 @@ private FreeStyleProject createJob(String pattern) throws IOException { GerritTrigger trigger = Setup.createDefaultTrigger(job); trigger.setTopicAssociation(new TopicAssociation()); - trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); + trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent(Constants.CODE_REVIEW_LABEL, "1")); trigger.setGerritProjects(Collections.singletonList(new GerritProject(CompareType.ANT, pattern, Collections.singletonList(new Branch(CompareType.ANT, "**")), Collections.emptyList(), Collections.emptyList(), diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/gerritnotifier/SpecGerritVerifiedSetterTest.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/gerritnotifier/SpecGerritVerifiedSetterTest.java index 18477780a..a9d9bfa58 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/gerritnotifier/SpecGerritVerifiedSetterTest.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/spec/gerritnotifier/SpecGerritVerifiedSetterTest.java @@ -24,6 +24,7 @@ */ package com.sonyericsson.hudson.plugins.gerrit.trigger.spec.gerritnotifier; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.extensions.GerritTriggeredBuildListener; import com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.GerritMessageProvider; @@ -48,6 +49,8 @@ import java.io.IOException; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.CODE_REVIEW_LABEL; +import static com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants.VERIFIED_LABEL; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.same; @@ -101,10 +104,10 @@ public void setUp() throws Exception { doReturn(build).when(project).getBuild(anyString()); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildSuccessfulVerifiedValue()).thenReturn(null); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildFailedVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(null); Setup.setTrigger(trigger, project); jenkinsMockedStatic = mockStatic(Jenkins.class); @@ -143,12 +146,12 @@ public void shouldCallGerritWithVerifiedOkFlagWhenBuildWasSuccessful() BuildMemory memory = new BuildMemory(); memory.completed(event, build); - IGerritHudsonTriggerConfig config = mock(IGerritHudsonTriggerConfig.class); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); String parameterString = "gerrit review MSG=OK VERIFIED= CODEREVIEW="; when(config.getGerritCmdBuildSuccessful()).thenReturn(parameterString); - when(config.getGerritBuildSuccessfulVerifiedValue()).thenReturn(1); - when(config.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(1); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); GerritNotifier notifier = new GerritNotifier(config, mockGerritCmdRunner, jenkins); notifier.buildCompleted(memory.getMemoryImprint(event), taskListener); @@ -173,12 +176,12 @@ public void shouldCallGerritWithVerifiedRejectFlagWhenBuildWasNotSuccessful() memory.completed(event, build); - IGerritHudsonTriggerConfig config = mock(IGerritHudsonTriggerConfig.class); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); String parameterString = "gerrit review MSG=Failed VERIFIED= CODEREVIEW="; when(config.getGerritCmdBuildFailed()).thenReturn(parameterString); - when(config.getGerritBuildFailedVerifiedValue()).thenReturn(-1); - when(config.getGerritBuildFailedCodeReviewValue()).thenReturn(-1); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(-1); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(-1); GerritNotifier notifier = new GerritNotifier(config, mockGerritCmdRunner, jenkins); notifier.buildCompleted(memory.getMemoryImprint(event), taskListener); @@ -218,20 +221,20 @@ public void shouldCallGerritWithVerifiedFailedFlagWhenBuildOneBuildFailedAndAnot when(jenkins.getItemByFullName(eq("MockProject2"), same(Job.class))).thenReturn(project); trigger = mock(GerritTrigger.class); - when(trigger.getGerritBuildFailedCodeReviewValue()).thenReturn(null); - when(trigger.getGerritBuildFailedVerifiedValue()).thenReturn(null); + when(trigger.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(null); + when(trigger.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(null); Setup.setTrigger(trigger, project); memory.completed(event, build); - IGerritHudsonTriggerConfig config = mock(IGerritHudsonTriggerConfig.class); + IGerritHudsonTriggerConfig config = Setup.createMockableConfig(); String parameterString = "gerrit review MSG=FAILED VERIFIED= CODEREVIEW="; when(config.getGerritCmdBuildFailed()).thenReturn(parameterString); - when(config.getGerritBuildSuccessfulVerifiedValue()).thenReturn(1); - when(config.getGerritBuildSuccessfulCodeReviewValue()).thenReturn(1); - when(config.getGerritBuildFailedCodeReviewValue()).thenReturn(-1); - when(config.getGerritBuildFailedVerifiedValue()).thenReturn(-1); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.SUCCESSFUL)).thenReturn(1); + when(config.getLabelVote(CODE_REVIEW_LABEL, BuildStatus.FAILED)).thenReturn(-1); + when(config.getLabelVote(VERIFIED_LABEL, BuildStatus.FAILED)).thenReturn(-1); GerritNotifier notifier = new GerritNotifier(config, mockGerritCmdRunner, jenkins); notifier.buildCompleted(memory.getMemoryImprint(event), taskListener); diff --git a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/MockPluginCheckerConfig.java b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/MockPluginCheckerConfig.java index af579f3c8..b77d6b8bf 100644 --- a/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/MockPluginCheckerConfig.java +++ b/src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/utils/MockPluginCheckerConfig.java @@ -1,6 +1,7 @@ package com.sonyericsson.hudson.plugins.gerrit.trigger.utils; import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.BuildStatus; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.ReplicationConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.BuildCancellationPolicy; @@ -283,6 +284,11 @@ public Secret getGerritAuthKeyFileSecretPassword() { return null; } + @Override + public Integer getLabelVote(String label, BuildStatus status) { + return null; + } + @Override public int getWatchdogTimeoutMinutes() { return 0; diff --git a/src/test/java/com/sonymobile/tools/gerrit/gerritevents/mock/SshdServerMock.java b/src/test/java/com/sonymobile/tools/gerrit/gerritevents/mock/SshdServerMock.java index 567138c4b..9f2634774 100644 --- a/src/test/java/com/sonymobile/tools/gerrit/gerritevents/mock/SshdServerMock.java +++ b/src/test/java/com/sonymobile/tools/gerrit/gerritevents/mock/SshdServerMock.java @@ -29,6 +29,7 @@ import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config; +import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Constants; import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig; import org.apache.sshd.server.SshServer; import org.apache.sshd.server.auth.UserAuthNoneFactory; @@ -804,32 +805,32 @@ public void start(final ChannelSession channel, final Environment environment) t JSONArray approvals = new JSONArray(); JSONObject crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "2"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "-1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "2"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "-1"); approvals.add(crw); @@ -899,32 +900,32 @@ public void start(final ChannelSession channel, final Environment environment) t JSONArray approvals = new JSONArray(); JSONObject crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "2"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "-1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "2"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "-1"); approvals.add(crw); @@ -1008,32 +1009,32 @@ public void start(final ChannelSession channel, final Environment environment) t JSONArray approvals = new JSONArray(); JSONObject crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "2"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Code-Review"); + crw.put(TYPE, Constants.CODE_REVIEW_LABEL); crw.put(VALUE, "-1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "2"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "1"); approvals.add(crw); crw = new JSONObject(); - crw.put(TYPE, "Verified"); + crw.put(TYPE, Constants.VERIFIED_LABEL); crw.put(VALUE, "-1"); approvals.add(crw); diff --git a/src/test/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/extensions/GerritTriggeredBuildListenerTest/gerrit-trigger.xml b/src/test/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/extensions/GerritTriggeredBuildListenerTest/gerrit-trigger.xml index 7717a6352..2373a3ca6 100644 --- a/src/test/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/extensions/GerritTriggeredBuildListenerTest/gerrit-trigger.xml +++ b/src/test/resources/com/sonyericsson/hudson/plugins/gerrit/trigger/extensions/GerritTriggeredBuildListenerTest/gerrit-trigger.xml @@ -12,14 +12,24 @@ gerrit review --project <GERRIT_NAME> --message 'Build Failed <BUILDS_STATS>' --label Verified=<VERIFIED> --label Code-Review=<CODE_REVIEW> <CHANGE>,<PATCHSET> gerrit review --project <GERRIT_NAME> --message 'Build Started <BUILDURL> <STARTED_STATS>' --label Verified=<VERIFIED> --label Code-Review=<CODE_REVIEW> <CHANGE>,<PATCHSET> http://localhost/ - 0 - 0 - 1 - 0 - 0 - -1 - 0 - -1 + + + Code-Review + Code-Review + 0 + 0 + -1 + -1 + + + Verified + Verified + 0 + 1 + 0 + 0 + + true 1 1