Skip to content

Commit 0fb2141

Browse files
authored
Merge branch 'master' into ui-refresh
2 parents 2a60fea + 6fe554e commit 0fb2141

File tree

7 files changed

+148
-34
lines changed

7 files changed

+148
-34
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@
226226
wiremock-jre8 introduces many dependencies that interferes with jth and core functionality
227227
during testing, the standalone jar shades all those so it doesn't break other tests.
228228
-->
229-
<version>2.35.0</version>
229+
<version>2.35.1</version>
230230
<scope>test</scope>
231231
</dependency>
232232
<dependency>

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/GerritRebuildValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public class GerritRebuildValidator extends RebuildValidator {
4242

4343
@Override
4444
public boolean isApplicable(Run build) {
45-
return (build.getCause(GerritCause.class) != null);
45+
// Build#getActions is deprecated but the only way to prevent a stack overflow here
46+
return build.getActions().stream().anyMatch(it -> it instanceof GerritCause);
4647
}
4748

4849
}

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/EventListener.java

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,17 @@ public void gerritEvent(GerritEvent event) {
124124
}
125125
if (event instanceof GerritTriggeredEvent) {
126126
GerritTriggeredEvent triggeredEvent = (GerritTriggeredEvent)event;
127-
if (t.isInteresting(triggeredEvent)) {
128-
logger.trace("The event is interesting.");
129-
abortBuild(t, triggeredEvent);
130-
if (t.isOnlyAbortRunningBuild(triggeredEvent)) {
131-
logger.trace("Just aborting build based on event not scheduling new one.");
132-
return;
127+
synchronized (this) {
128+
if (t.isInteresting(triggeredEvent)) {
129+
logger.trace("The event is interesting.");
130+
abortBuild(t, triggeredEvent);
131+
if (t.isOnlyAbortRunningBuild(triggeredEvent)) {
132+
logger.trace("Just aborting build based on event not scheduling new one.");
133+
return;
134+
}
135+
notifyOnTriggered(t, triggeredEvent);
136+
schedule(t, new GerritCause(triggeredEvent, t.isSilentMode()), triggeredEvent);
133137
}
134-
notifyOnTriggered(t, triggeredEvent);
135-
schedule(t, new GerritCause(triggeredEvent, t.isSilentMode()), triggeredEvent);
136138
}
137139
}
138140
}
@@ -162,15 +164,17 @@ public void gerritEvent(ManualPatchsetCreated event) {
162164
// to just return now without processing the event.
163165
return;
164166
}
165-
if (t.isInteresting(event)) {
166-
logger.trace("The event is interesting.");
167-
abortBuild(t, event);
168-
if (t.isOnlyAbortRunningBuild(event)) {
169-
logger.trace("Just aborting build based on event not scheduling new one.");
170-
return;
167+
synchronized (this) {
168+
if (t.isInteresting(event)) {
169+
logger.trace("The event is interesting.");
170+
abortBuild(t, event);
171+
if (t.isOnlyAbortRunningBuild(event)) {
172+
logger.trace("Just aborting build based on event not scheduling new one.");
173+
return;
174+
}
175+
notifyOnTriggered(t, event);
176+
schedule(t, new GerritManualCause(event, t.isSilentMode()), event);
171177
}
172-
notifyOnTriggered(t, event);
173-
schedule(t, new GerritManualCause(event, t.isSilentMode()), event);
174178
}
175179
}
176180

@@ -206,15 +210,17 @@ public void gerritEvent(CommentAdded event) {
206210
// to just return now without processing the event.
207211
return;
208212
}
209-
if (t.isInteresting(event) && t.commentAddedMatch(event)) {
210-
logger.trace("The event is interesting.");
211-
abortBuild(t, event);
212-
if (t.isOnlyAbortRunningBuild(event)) {
213-
logger.trace("Just aborting build based on event not scheduling new one.");
214-
return;
213+
synchronized (this) {
214+
if (t.isInteresting(event) && t.commentAddedMatch(event)) {
215+
logger.trace("The event is interesting.");
216+
abortBuild(t, event);
217+
if (t.isOnlyAbortRunningBuild(event)) {
218+
logger.trace("Just aborting build based on event not scheduling new one.");
219+
return;
220+
}
221+
notifyOnTriggered(t, event);
222+
schedule(t, new GerritCause(event, t.isSilentMode()), event);
215223
}
216-
notifyOnTriggered(t, event);
217-
schedule(t, new GerritCause(event, t.isSilentMode()), event);
218224
}
219225
}
220226

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerParameters.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig;
3131
import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.parameters.Base64EncodedStringParameterValue;
3232
import com.sonyericsson.hudson.plugins.gerrit.trigger.utils.StringUtil;
33+
import com.sonymobile.tools.gerrit.gerritevents.dto.GerritEventKeys;
3334
import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Account;
35+
import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Approval;
3436
import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Provider;
3537
import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeAbandoned;
3638
import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeBasedEvent;
@@ -44,6 +46,7 @@
4446
import hudson.model.ParameterValue;
4547
import hudson.model.StringParameterValue;
4648
import hudson.model.TextParameterValue;
49+
import net.sf.json.JSONObject;
4750
import org.jvnet.localizer.Localizable;
4851
import org.slf4j.Logger;
4952
import org.slf4j.LoggerFactory;
@@ -246,7 +249,11 @@ public enum GerritTriggerParameters {
246249
/**
247250
* Comment posted to Gerrit in a comment-added event.
248251
*/
249-
GERRIT_EVENT_COMMENT_TEXT;
252+
GERRIT_EVENT_COMMENT_TEXT,
253+
/**
254+
* Updated approvals.
255+
*/
256+
GERRIT_EVENT_UPDATED_APPROVALS;
250257

251258
private static final Logger logger = LoggerFactory.getLogger(GerritTriggerParameters.class);
252259

@@ -490,6 +497,8 @@ public static void setOrCreateParameters(GerritTriggeredEvent gerritEvent, Job p
490497
commentTextMode.setOrCreateParameterValue(GERRIT_EVENT_COMMENT_TEXT,
491498
parameters, comment, ParameterMode.PlainMode.TEXT, escapeQuotes);
492499
}
500+
GERRIT_EVENT_UPDATED_APPROVALS.setOrCreateStringParameterValue(parameters,
501+
getUpdatedApprovals((CommentAdded)event), false);
493502
}
494503
} else if (gerritEvent instanceof RefUpdated) {
495504
RefUpdated event = (RefUpdated)gerritEvent;
@@ -526,6 +535,23 @@ public static void setOrCreateParameters(GerritTriggeredEvent gerritEvent, Job p
526535
}
527536
}
528537

538+
/**
539+
* Get the updated approvals as json string from a CommentAddedEvent.
540+
*
541+
* @param event the event
542+
* @return json string of updated approvals
543+
*/
544+
static String getUpdatedApprovals(CommentAdded event) {
545+
JSONObject updatedApprovals = event.getApprovals().stream()
546+
.filter(Approval::isUpdated).collect(JSONObject::new, (JSONObject json, Approval apr) -> {
547+
JSONObject j = new JSONObject();
548+
j.put(GerritEventKeys.VALUE, apr.getValue());
549+
j.put(GerritEventKeys.OLD_VALUE, apr.getOldValue());
550+
json.put(apr.getType(), j);
551+
}, (jsonObject, jsonObject2) -> { });
552+
return updatedApprovals.toString();
553+
}
554+
529555
/**
530556
* Get the front end url from a ChangeBasedEvent.
531557
*

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/RunningJobs.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import hudson.model.Computer;
1414
import hudson.model.Executor;
1515
import hudson.model.Item;
16+
import hudson.model.Job;
1617
import hudson.model.Queue;
1718
import hudson.model.Result;
1819
import hudson.model.Run;
@@ -242,7 +243,8 @@ private void cancelMatchingJobs(GerritTriggeredEvent event, String jobName, Caus
242243
List<Queue.Item> itemsInQueue = Queue.getInstance().getItems((Queue.Task)getJob());
243244
for (Queue.Item item : itemsInQueue) {
244245
if (checkCausedByGerrit(event, item.getCauses())) {
245-
if (jobName.equals(item.task.getName())) {
246+
Job tJob = (Job)item.task;
247+
if (jobName.equals(tJob.getFullName())) {
246248
Queue.getInstance().cancel(item);
247249
}
248250
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.sonyericsson.hudson.plugins.gerrit.trigger;
2+
3+
import static org.junit.Assert.assertNotNull;
4+
5+
import hudson.ExtensionList;
6+
import hudson.model.Action;
7+
import hudson.model.FreeStyleProject;
8+
import org.junit.Rule;
9+
import org.junit.Test;
10+
import org.jvnet.hudson.test.Issue;
11+
import org.jvnet.hudson.test.JenkinsRule;
12+
13+
/**
14+
* Tests for {@link GerritRebuildValidator}.
15+
*/
16+
public class GerritRebuildValidatorTest {
17+
18+
/**
19+
* An instance of {@link JenkinsRule}.
20+
*/
21+
// CS IGNORE VisibilityModifier FOR NEXT 2 LINES. REASON: JenkinsRule.
22+
@Rule
23+
public final JenkinsRule j = new JenkinsRule();
24+
25+
@Issue("JENKINS-72409")
26+
@Test
27+
public void testRebuildValidatorStackOverflow() throws Exception {
28+
assertNotNull(ExtensionList.lookupSingleton(GerritRebuildValidator.class));
29+
FreeStyleProject p = j.createFreeStyleProject();
30+
j.assertBuildStatusSuccess(p.scheduleBuild2(0, null, new Action[0]));
31+
}
32+
}

src/test/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerParametersTest.java

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,27 @@
2727
import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl;
2828
import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.MockGerritHudsonTriggerConfig;
2929
import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup;
30+
import com.sonymobile.tools.gerrit.gerritevents.dto.GerritEventKeys;
31+
import com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded;
3032
import com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated;
3133
import hudson.model.AbstractProject;
3234
import hudson.model.ParameterValue;
3335
import hudson.model.StringParameterValue;
36+
import net.sf.json.JSONArray;
37+
import net.sf.json.JSONObject;
3438
import org.junit.Before;
3539
import org.junit.Rule;
3640
import org.junit.Test;
3741
import org.jvnet.hudson.test.JenkinsRule;
42+
import org.jvnet.hudson.test.WithoutJenkins;
3843

3944
import java.util.Collections;
4045
import java.util.LinkedList;
4146
import java.util.List;
4247

48+
import static org.junit.Assert.assertEquals;
4349
import static org.junit.Assert.assertNotNull;
50+
import static org.junit.Assert.assertNull;
4451
import static org.junit.Assert.assertTrue;
4552

4653
/**
@@ -64,12 +71,14 @@ public class GerritTriggerParametersTest {
6471
*/
6572
@Before
6673
public void setup() {
67-
config = Setup.createConfig();
68-
GerritServer server = new GerritServer(PluginImpl.DEFAULT_SERVER_NAME);
69-
server.setConfig(config);
70-
PluginImpl plugin = PluginImpl.getInstance();
71-
assertNotNull(plugin);
72-
plugin.setServers(Collections.singletonList(server));
74+
if (j.jenkins != null) {
75+
config = Setup.createConfig();
76+
GerritServer server = new GerritServer(PluginImpl.DEFAULT_SERVER_NAME);
77+
server.setConfig(config);
78+
PluginImpl plugin = PluginImpl.getInstance();
79+
assertNotNull(plugin);
80+
plugin.setServers(Collections.singletonList(server));
81+
} //else running @WithoutJenkins
7382
}
7483

7584
// CS IGNORE LineLength FOR NEXT 3 LINES. REASON: JavaDoc.
@@ -131,6 +140,44 @@ public void setOrCreateParametersUrlNoProviderAnyServer() throws Exception {
131140
assertTrue(param.value.startsWith(config.getGerritFrontEndUrl()));
132141
}
133142

143+
@Test @WithoutJenkins
144+
public void testGetUpdatedApprovals() {
145+
JSONArray approvals = new JSONArray();
146+
JSONObject approval = new JSONObject();
147+
approval
148+
.accumulate(GerritEventKeys.TYPE, "CODE")
149+
.accumulate(GerritEventKeys.VALUE, "+1")
150+
.accumulate(GerritEventKeys.OLD_VALUE, "0");
151+
approvals.add(approval);
152+
approval = new JSONObject();
153+
approval
154+
.accumulate(GerritEventKeys.TYPE, "CI")
155+
.accumulate(GerritEventKeys.VALUE, "0")
156+
.accumulate(GerritEventKeys.OLD_VALUE, "-1");
157+
approvals.add(approval);
158+
approval = new JSONObject();
159+
approval
160+
.accumulate(GerritEventKeys.TYPE, "VRF")
161+
.accumulate(GerritEventKeys.VALUE, "0");
162+
approvals.add(approval);
163+
164+
JSONObject e = new JSONObject()
165+
.accumulate(GerritEventKeys.COMMENT, "Test")
166+
.accumulate(GerritEventKeys.APPROVALS, approvals);
167+
CommentAdded event = new CommentAdded();
168+
event.fromJson(e);
169+
String updatedApprovalsStr = GerritTriggerParameters.getUpdatedApprovals(event);
170+
JSONObject updatedApprovals = JSONObject.fromObject(updatedApprovalsStr);
171+
JSONObject code = updatedApprovals.getJSONObject("CODE");
172+
assertEquals("+1", code.optString(GerritEventKeys.VALUE));
173+
assertEquals("0", code.optString(GerritEventKeys.OLD_VALUE));
174+
JSONObject ci = updatedApprovals.getJSONObject("CI");
175+
assertEquals("0", ci.optString(GerritEventKeys.VALUE));
176+
assertEquals("-1", ci.optString(GerritEventKeys.OLD_VALUE));
177+
assertNull(updatedApprovals.optJSONObject("VRF"));
178+
179+
}
180+
134181
/**
135182
* Finds the given parameter in the list.
136183
*

0 commit comments

Comments
 (0)