Skip to content

Commit 7eaca3a

Browse files
erik-edlinge-pettersson-ericsson
authored andcommitted
Add check if the systemtest was a success. (#180)
* Add check if the systemtest was a success. * Systemtests now use jenkins xml data object from eiffel-commons instead of xml file. * Change jenkins job step so that it can take parameters and set them up with different amount of parameters.
1 parent 5b8400b commit 7eaca3a

File tree

12 files changed

+158
-98
lines changed

12 files changed

+158
-98
lines changed

pom.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,20 @@
7474
<version>${springBootVersion}</version>
7575
<scope>compile</scope>
7676
</dependency>
77+
7778
<dependency>
7879
<groupId>org.springframework.boot</groupId>
7980
<artifactId>spring-boot-starter-test</artifactId>
8081
<version>${springBootVersion}</version>
8182
<scope>test</scope>
83+
<exclusions>
84+
<exclusion>
85+
<groupId>com.vaadin.external.google</groupId>
86+
<artifactId>android-json</artifactId>
87+
</exclusion>
88+
</exclusions>
8289
</dependency>
90+
8391
<dependency>
8492
<groupId>org.apache.httpcomponents</groupId>
8593
<artifactId>httpclient</artifactId>
@@ -125,6 +133,12 @@
125133
<groupId>org.mock-server</groupId>
126134
<artifactId>mockserver-client-java</artifactId>
127135
<version>5.4.1</version>
136+
<exclusions>
137+
<exclusion>
138+
<groupId>com.vaadin.external.google</groupId>
139+
<artifactId>android-json</artifactId>
140+
</exclusion>
141+
</exclusions>
128142
</dependency>
129143
<!-- https://mvnrepository.com/artifact/org.mock-server/mockserver-netty -->
130144
<dependency>
@@ -170,8 +184,15 @@
170184
<artifactId>eiffel-commons</artifactId>
171185
<version>0.0.6</version>
172186
</dependency>
187+
<dependency>
188+
<groupId>org.json</groupId>
189+
<artifactId>json</artifactId>
190+
<version>20180130</version>
191+
</dependency>
173192
</dependencies>
174193

194+
<dependencyManagement>
195+
</dependencyManagement>
175196
<repositories>
176197
<repository>
177198
<id>jitpack.io</id>

src/systemtest/java/com/ericsson/ei/systemtest/artifactflow/ArtifactFlowSteps.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.junit.Assert.assertTrue;
55

66
import java.util.ArrayList;
7+
import java.util.List;
78

89
import org.junit.Ignore;
910
import org.slf4j.Logger;
@@ -35,17 +36,17 @@ public void configurations_are_provided() {
3536
config.initRemRemConfig();
3637
}
3738

38-
@Given("^a jenkins job '\\\"([^\\\"]*)\\\"' from '\"([^\"]*)\"' is created$")
39-
public void a_jenkins_job_from_is_created(String jenkinsJobName, String scriptFileName) throws Throwable {
39+
@Given("^a jenkins job '\\\"([^\\\"]*)\\\"' from '\"([^\"]*)\"' is created with parameters: (.*)$")
40+
public void a_jenkins_job_from_is_created(String jenkinsJobName, String scriptFileName, List<String> parameters) throws Throwable {
4041
boolean success = StepsUtils.createJenkinsJob(
4142
jenkinsJobName,
4243
scriptFileName,
4344
config.getJenkinsBaseUrl(),
4445
config.getJenkinsUsername(),
4546
config.getJenkinsPassword(),
47+
config.getRemremBaseUrl(),
4648
JENKINS_TOKEN,
47-
JENKINS_JOB_XML,
48-
config.getRemremBaseUrl()
49+
parameters
4950
);
5051

5152
if (success) {
@@ -55,11 +56,6 @@ public void a_jenkins_job_from_is_created(String jenkinsJobName, String scriptFi
5556
assertTrue("Failed to create jenkins job.", success);
5657
}
5758

58-
@Then("^we continue with the next step$")
59-
public void we_continue_with_the_next_step() {
60-
//Just for cucumber to make sense
61-
}
62-
6359
@Then("^subscriptions and jenkins jobs should be removed$")
6460
public void subscriptions_and_jenkins_jobs_should_be_removed() throws Throwable {
6561
StepsUtils.deleteJenkinsJobs(jenkinsJobNames);
@@ -88,18 +84,13 @@ public void we_send_the_to_eiffel_intelligence_for_creation(String subscriptionN
8884
assertEquals("Failed to create subscription. Response: " + response.getBody(), 200, response.getStatusCode());
8985
}
9086

91-
@Given("^all previous tests passes\\.$")
92-
public void all_previous_tests_passes() {
93-
//Just for cucumber to make sense
94-
}
95-
96-
@When("^future story is done\\.$")
97-
public void future_story_is_done() {
98-
87+
@Given("^the jenkins job \"([^\"]*)\" is triggered$")
88+
public void the_jenkins_job_is_triggered(String jenkinsJobToTrigger) throws Throwable {
89+
StepsUtils.triggerJenkinsJob(jenkinsJobToTrigger, JENKINS_TOKEN);
9990
}
10091

101-
@Then("^everything should be fine\\.$")
102-
public void everything_should_be_fine() {
103-
92+
@When("^all jenkins jobs has been triggered$")
93+
public void the_jenkins_job_has_been_triggered() throws Throwable {
94+
StepsUtils.hasJenkinsJobsBeenTriggered(jenkinsJobNames, config.getJobTimeoutMilliseconds());
10495
}
10596
}

src/systemtest/java/com/ericsson/ei/systemtest/testexecutionflow/TestExecutionFlowSteps.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.junit.Assert.assertTrue;
55

66
import java.util.ArrayList;
7+
import java.util.List;
78

89
import org.junit.Ignore;
910
import org.slf4j.Logger;
@@ -35,17 +36,17 @@ public void configurations_are_provided() {
3536
config.initRemRemConfig();
3637
}
3738

38-
@Given("^a jenkins job '\\\"([^\\\"]*)\\\"' from '\"([^\"]*)\"' is created$")
39-
public void a_jenkins_job_from_is_created(String jenkinsJobName, String scriptFileName) throws Throwable {
39+
@Given("^a jenkins job '\\\"([^\\\"]*)\\\"' from '\"([^\"]*)\"' is created with parameters: (.*)$")
40+
public void a_jenkins_job_from_is_created(String jenkinsJobName, String scriptFileName, List<String> parameters) throws Throwable {
4041
boolean success = StepsUtils.createJenkinsJob(
4142
jenkinsJobName,
4243
scriptFileName,
4344
config.getJenkinsBaseUrl(),
4445
config.getJenkinsUsername(),
4546
config.getJenkinsPassword(),
47+
config.getRemremBaseUrl(),
4648
JENKINS_TOKEN,
47-
JENKINS_JOB_XML,
48-
config.getRemremBaseUrl()
49+
parameters
4950
);
5051

5152
if (success) {

src/systemtest/java/com/ericsson/ei/systemtest/utils/Config.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,21 @@ public class Config {
1515

1616
private String eiFrontendBaseUrl;
1717
private String eiBackendBaseUrl;
18+
19+
private int jobTimeoutMilliseconds = 60000;
20+
21+
/**
22+
* Initializes the configuration. Some configurations are set to default and some are mendatory.
23+
* These are the current default configuration values:
24+
* int jobTimeoutMilliseconds = 60000
25+
*/
26+
public Config() {
27+
String jobTimeoutMilliseconds = System.getProperty("job.timeout.milliseconds");
28+
if(jobTimeoutMilliseconds != null) {
29+
this.jobTimeoutMilliseconds = Integer.parseInt(jobTimeoutMilliseconds);
30+
}
31+
}
32+
1833
/**
1934
*
2035
* This method retrieves the jenkins properties from the system properties.

src/systemtest/java/com/ericsson/ei/systemtest/utils/StepsUtils.java

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
package com.ericsson.ei.systemtest.utils;
22

3+
import static org.junit.Assert.assertEquals;
4+
35
import java.io.IOException;
46
import java.net.URISyntaxException;
57
import java.nio.file.Files;
68
import java.nio.file.Paths;
79
import java.util.ArrayList;
810
import java.util.Iterator;
11+
import java.util.List;
12+
import java.util.concurrent.TimeUnit;
913

1014
import org.apache.http.client.ClientProtocolException;
15+
import org.json.JSONArray;
1116
import org.json.JSONException;
1217
import org.json.JSONObject;
1318
import org.slf4j.Logger;
1419
import org.slf4j.LoggerFactory;
1520

1621
import com.ericsson.eiffelcommons.JenkinsManager;
22+
import com.ericsson.eiffelcommons.helpers.JenkinsXmlData;
1723
import com.ericsson.eiffelcommons.subscriptionobject.RestPostSubscriptionObject;
1824
import com.ericsson.eiffelcommons.utils.HttpRequest;
1925
import com.ericsson.eiffelcommons.utils.HttpRequest.HttpMethod;
2026
import com.ericsson.eiffelcommons.utils.ResponseEntity;
21-
import com.ericsson.eiffelcommons.utils.Utils;
2227

2328
public class StepsUtils {
2429
private static final Logger LOGGER = LoggerFactory.getLogger(StepsUtils.class);
@@ -39,19 +44,29 @@ public class StepsUtils {
3944
* @return boolean - If the creation was a success or not
4045
* @throws Exception
4146
*/
42-
public static boolean createJenkinsJob(String jenkinsJobName, String scriptFileName, String jenkinsBaseUrl, String jenkinsUsername, String jenkinsPassword, String jenkinsToken, String jenkinsJobXml, String remremBaseUrl) throws Exception {
47+
public static boolean createJenkinsJob(String jenkinsJobName, String scriptFileName, String jenkinsBaseUrl, String jenkinsUsername, String jenkinsPassword, String remremBaseUrl, String jenkinsToken, List<String> parameters) throws Exception {
48+
String script = new String(Files.readAllBytes(Paths.get(scriptFileName)));
49+
script = script.replace("REMREM_BASE_URL_TO_BE_REPLACED", remremBaseUrl);
50+
51+
JenkinsXmlData jenkinsXmlData = new JenkinsXmlData()
52+
.addJobToken(jenkinsToken)
53+
.addSystemGrovyScript(script, false);
54+
55+
56+
for (String parameter: parameters) {
57+
jenkinsXmlData.addBuildParameter(parameter);
58+
}
59+
60+
String jenkinsXmlAsString = jenkinsXmlData.getXmlAsString();
61+
4362
jenkinsManager = new JenkinsManager(jenkinsBaseUrl, jenkinsUsername, jenkinsPassword);
4463

4564
if(!jenkinsManager.pluginExists("Groovy")) {
4665
jenkinsManager.installPlugin("Groovy", "2.1");
4766
jenkinsManager.restartJenkins();
4867
}
49-
String script = new String(Files.readAllBytes(Paths.get(scriptFileName)));
50-
script = script.replace("REMREM_BASE_URL_TO_BE_REPLACED", remremBaseUrl);
5168

52-
String xmlJobData = Utils.getResourceFileAsString(jenkinsJobXml);
53-
xmlJobData = xmlJobData.replace("SCRIPT_TO_BE_REPLACED", script);
54-
return jenkinsManager.forceCreateJob(jenkinsJobName, xmlJobData);
69+
return jenkinsManager.forceCreateJob(jenkinsJobName, jenkinsXmlAsString);
5570
}
5671

5772
/**
@@ -169,6 +184,69 @@ public static void deleteSubscriptions(String frontendBaseUrl, String backendBas
169184
}
170185
}
171186

187+
/**
188+
* Triggers a jenkins job with parameters.
189+
*
190+
* @param jenkinsJobToTrigger
191+
* @param jenkinsToken
192+
* @throws Exception
193+
*/
194+
public static void triggerJenkinsJob(String jenkinsJobToTrigger, String jenkinsToken) throws Exception {
195+
boolean success = jenkinsManager.buildJob(jenkinsJobToTrigger, jenkinsToken);
196+
assertEquals("Was not able to trigger jenkins job", true, success);
197+
}
198+
199+
/**
200+
* Check if all jenkins jobs in a list of jenkins job names has been triggered
201+
*
202+
* @param jenkinsJobNames
203+
* @throws Exception
204+
*/
205+
public static void hasJenkinsJobsBeenTriggered(ArrayList<String> jenkinsJobNames, int timeoutMilliseconds) throws Exception {
206+
for(int i=0; i<jenkinsJobNames.size(); i++) {
207+
hasJenkinsJobBeenTriggered(jenkinsJobNames.get(i), timeoutMilliseconds);
208+
}
209+
}
210+
211+
/**
212+
* Check if a single jenkins job has been triggered
213+
*
214+
* @param jenkinsJob
215+
* @throws Exception
216+
*/
217+
public static void hasJenkinsJobBeenTriggered(String jenkinsJob, int timeoutMilliseconds) throws Exception {
218+
long maxTime = System.currentTimeMillis() + timeoutMilliseconds;
219+
220+
while(System.currentTimeMillis() < maxTime) {
221+
try {
222+
JSONObject status = jenkinsManager.getJenkinsBuildStatusData(jenkinsJob);
223+
int duration = status.getInt("duration");
224+
String result = status.getString("result");
225+
226+
if(result.equals("null")) {
227+
LOGGER.info(jenkinsJob + " triggered but not finished yet. Rechecking...");
228+
continue;
229+
}
230+
231+
String infoMessage = jenkinsJob + " was triggered. Duration(ms): " + duration + ". Result: " + result;
232+
233+
boolean statusContainsParameters = status.has("actions") && status.getJSONArray("actions").length() != 0 && status.getJSONArray("actions").getJSONObject(0).has("parameters");
234+
if (statusContainsParameters) {
235+
JSONArray parameters = status.getJSONArray("actions").getJSONObject(0).getJSONArray("parameters");
236+
infoMessage += " Parameters: " + parameters;
237+
}
238+
239+
LOGGER.info(infoMessage);
240+
return;
241+
} catch (Exception e) {
242+
TimeUnit.SECONDS.sleep(1);
243+
continue;
244+
}
245+
}
246+
247+
throw new Exception("Jenkins job \"" + jenkinsJob + "\" was never triggered successfully.");
248+
}
249+
172250
/**
173251
* Deletes a subscription from eiffel intelligence
174252
*

src/systemtest/resources/JenkinsShellScripts/ArtC2Script.txt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def baseUrl = "REMREM_BASE_URL_TO_BE_REPLACED";
55
///////////////////////////////////////SCC2/////////////////////////////////////////////
66
////////////////////////////////////////////////////////////////////////////////////////
77

8-
def uriPathSCC2 = baseUrl + "/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelSourceChangeCreatedEvent";
8+
def uriPathSCC2 = baseUrl + "/generateAndPublish?mp=eiffelsemantics&msgType=EiffelSourceChangeCreatedEvent";
99
def jsonSCC2 = """{
1010
"msgParams": {
1111
"meta": {
@@ -63,7 +63,7 @@ SCC2ID = generateEiffelEventAndPublish(uriPathSCC2, jsonSCC2);
6363
///////////////////////////////////////SCC1/////////////////////////////////////////////
6464
////////////////////////////////////////////////////////////////////////////////////////
6565

66-
def uriPathSCC1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelSourceChangeCreatedEvent';
66+
def uriPathSCC1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelSourceChangeCreatedEvent';
6767
def jsonSCC1 = """
6868
{
6969
"msgParams": {
@@ -122,7 +122,7 @@ SCC1ID = generateEiffelEventAndPublish(uriPathSCC1, jsonSCC1);
122122
///////////////////////////////////////SCS1/////////////////////////////////////////////
123123
////////////////////////////////////////////////////////////////////////////////////////
124124

125-
def uriPathSCS1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelSourceChangeSubmittedEvent';
125+
def uriPathSCS1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelSourceChangeSubmittedEvent';
126126
def jsonSCS1 = """
127127
{
128128
"msgParams": {
@@ -181,7 +181,7 @@ SCS1ID = generateEiffelEventAndPublish(uriPathSCS1, jsonSCS1);
181181
///////////////////////////////////////CDef1/////////////////////////////////////////////
182182
////////////////////////////////////////////////////////////////////////////////////////
183183

184-
def uriPathCDef1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelCompositionDefinedEvent';
184+
def uriPathCDef1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelCompositionDefinedEvent';
185185
def jsonCDef1 = """
186186
{
187187
"msgParams": {
@@ -218,7 +218,7 @@ CDef1ID = generateEiffelEventAndPublish(uriPathCDef1, jsonCDef1);
218218
///////////////////////////////////////ArtC1/////////////////////////////////////////////
219219
////////////////////////////////////////////////////////////////////////////////////////
220220

221-
def uriPathArtC1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelArtifactCreatedEvent';
221+
def uriPathArtC1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelArtifactCreatedEvent';
222222
def jsonArtC1 = """
223223
{
224224
"msgParams": {
@@ -260,7 +260,7 @@ ArtC1ID = generateEiffelEventAndPublish(uriPathArtC1, jsonArtC1);
260260
///////////////////////////////////////CDef2/////////////////////////////////////////////
261261
////////////////////////////////////////////////////////////////////////////////////////
262262

263-
def uriPathCDef2 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelCompositionDefinedEvent';
263+
def uriPathCDef2 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelCompositionDefinedEvent';
264264
def jsonCDef2 = """
265265
{
266266
"msgParams": {
@@ -297,7 +297,7 @@ CDef2ID = generateEiffelEventAndPublish(uriPathCDef2, jsonCDef2);
297297
///////////////////////////////////////ArtC2/////////////////////////////////////////////
298298
////////////////////////////////////////////////////////////////////////////////////////
299299

300-
def uriPathArtC2 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelArtifactCreatedEvent';
300+
def uriPathArtC2 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelArtifactCreatedEvent';
301301
def jsonArtC2 = """
302302
{
303303
"msgParams": {

src/systemtest/resources/JenkinsShellScripts/ArtPScript.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def baseUrl = "REMREM_BASE_URL_TO_BE_REPLACED";
55
///////////////////////////////////////CLM1/////////////////////////////////////////////
66
////////////////////////////////////////////////////////////////////////////////////////
77

8-
def uriPathArtP1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelArtifactPublishedEvent';
8+
def uriPathArtP1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelArtifactPublishedEvent';
99
def jsonArtP1 = """
1010
{
1111
"msgParams": {

src/systemtest/resources/JenkinsShellScripts/CLMScript.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def baseUrl = "REMREM_BASE_URL_TO_BE_REPLACED";
55
///////////////////////////////////////CLM1/////////////////////////////////////////////
66
////////////////////////////////////////////////////////////////////////////////////////
77

8-
def uriPathCLM1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&amp;msgType=EiffelConfidenceLevelModifiedEvent';
8+
def uriPathCLM1 = baseUrl + '/generateAndPublish?mp=eiffelsemantics&msgType=EiffelConfidenceLevelModifiedEvent';
99
def jsonCLM1 = """
1010
{
1111
"msgParams": {

0 commit comments

Comments
 (0)