Skip to content

Commit aea003b

Browse files
author
gdy
committed
continue
1 parent 0f440a0 commit aea003b

File tree

8 files changed

+165
-38
lines changed

8 files changed

+165
-38
lines changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ repositories {
1616
dependencies {
1717
testCompile 'junit:junit:4.12'
1818
testCompile 'org.mockito:mockito-core:2.0.62-beta'
19+
testCompile 'xmlunit:xmlunit:1.6'
20+
1921

2022
compile 'commons-io:commons-io:2.4'
2123
compile 'com.google.code.gson:gson:2.8.0'

src/main/java/com/projectkaiser/scm/jenkins/api/IJenkinsApi.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ public interface IJenkinsApi {
1010

1111
JobDetailed getJobDetailed(String jobName);
1212

13-
void runJob(String jobName);
13+
Long runJob(String jobName);
1414

15-
void updateJobConfigXml(String jobName, String jobConfigXML);
15+
void updateJob(String jobName, String jobConfigXML);
1616

1717
void copyJob(String srcName, String dstName);
1818

1919
List<String> getJobsList();
2020

2121
String getJobConfigXml(String jobName);
2222

23+
void deleteJob(String jobName);
24+
2325
}

src/main/java/com/projectkaiser/scm/jenkins/api/JenkinsApi.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@
88
import java.util.List;
99
import java.util.Map;
1010

11+
import org.apache.http.Header;
12+
import org.apache.http.HttpResponse;
13+
1114
import com.google.gson.Gson;
1215
import com.google.gson.GsonBuilder;
1316
import com.google.gson.reflect.TypeToken;
1417
import com.projectkaiser.scm.jenkins.api.facade.IJenkinsApiFacade;
1518
import com.projectkaiser.scm.jenkins.api.facade.JenkinsApiHttpFacade;
1619
import com.projectkaiser.scm.jenkins.data.JobDetailed;
20+
import com.projectkaiser.scm.jenkins.data.JobListElement;
1721

1822
/*
1923
http://localhost:8080/hudson/job/toolkit/api/json
@@ -30,9 +34,16 @@ public JenkinsApi(String baseAddress, String user, String password) {
3034
}
3135

3236
@Override
33-
public void runJob(String jobName) {
37+
public Long runJob(String jobName) {
3438
String url = "job/" + encodeUrl(jobName) + "/build";
35-
facade.getResponsePOST(url, null);
39+
HttpResponse resp = facade.getResponsePOST(url, null);
40+
Header[] headers = resp.getHeaders("Location");
41+
if (headers == null || headers.length == 0) {
42+
return -1L;
43+
}
44+
45+
String[] strs = headers[0].getValue().split("/");
46+
return Long.parseLong(strs[strs.length - 1]);
3647
}
3748

3849
@Override
@@ -52,12 +63,12 @@ public void createJob(String jobName, String jobConfigXML) {
5263
Map<String, String> q = new HashMap<String, String>();
5364
q.put("name", jobName);
5465
url = appendQuery(url, q);
55-
facade.getResponsePOST(url, null);
66+
facade.getResponsePOST(url, jobConfigXML);
5667
}
5768

5869
private static String encodeUrl(String str) {
5970
try {
60-
return URLEncoder.encode(str, "UTF-8");
71+
return URLEncoder.encode(str, "UTF-8").replace("+", "%20");
6172
} catch (UnsupportedEncodingException e) {
6273
throw new RuntimeException(e);
6374
}
@@ -81,19 +92,24 @@ public List<String> getJobsList() {
8192
Map<String, String> q = new HashMap<String, String>();
8293
q.put("tree", "jobs[name]");
8394
url = appendQuery(url, q);
84-
String json = facade.getResponseGET(url);
95+
String json = facade.getResponseContentGET(url);
8596
Gson gson = new GsonBuilder().create();
86-
Type type = new TypeToken<Map<String, Map<String, String>>>() {
97+
Type type = new TypeToken<Map<String, List<JobListElement>>>() {
8798
}.getType();
8899

89-
Map<String, Map<String, String>> res = gson.fromJson(json, type);
90-
return new ArrayList(res.get("jobs").values());
100+
Map<String, List<JobListElement>> jobsMap = gson.fromJson(json, type);
101+
List<JobListElement> jobs = jobsMap.get("jobs");
102+
List<String> res = new ArrayList<>();
103+
for (JobListElement job : jobs) {
104+
res.add(job.getName());
105+
}
106+
return res;
91107
}
92108

93109
@Override
94110
public String getJobConfigXml(String jobName) {
95111
String url = "job/" + encodeUrl(jobName) + "/config.xml";
96-
return facade.getResponseGET(url);
112+
return facade.getResponseContentGET(url);
97113
}
98114

99115
@Override
@@ -105,9 +121,15 @@ public void updateJobConfigXml(String jobName, String jobConfigXML) {
105121
@Override
106122
public JobDetailed getJobDetailed(String jobName) {
107123
String url = "job/" + encodeUrl(jobName) + "/api/json?pretty=true";
108-
String json = facade.getResponseGET(url);
124+
String json = facade.getResponseContentGET(url);
109125
Gson gson = new GsonBuilder().setPrettyPrinting().create();
110126
JobDetailed job = gson.fromJson(json, JobDetailed.class);
111127
return job;
112128
}
129+
130+
@Override
131+
public void deleteJob(String jobName) {
132+
String url = "job/" + encodeUrl(jobName) + "/doDelete";
133+
facade.getResponsePOST(url, null);
134+
}
113135
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.projectkaiser.scm.jenkins.api.facade;
22

3+
import org.apache.http.HttpResponse;
4+
35
public interface IJenkinsApiFacade {
4-
String getResponseGET(String url);
6+
HttpResponse getResponseGET(String url);
7+
8+
String getResponseContentGET(String url);
59

6-
String getResponsePOST(String url, String entity);
10+
HttpResponse getResponsePOST(String url, String entity);
711
}

src/main/java/com/projectkaiser/scm/jenkins/api/facade/JenkinsApiHttpFacade.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ public static boolean isEmptyString(String s) {
7373
return false;
7474
}
7575

76-
private String getResponse(HttpRequestBase request) {
77-
76+
private HttpResponse getResponse (HttpRequestBase request) {
7877
if (!isEmptyString(user) && !isEmptyString(password)) {
7978
String userpass = user + ":" + password;
8079
String basicAuth = "Basic " + new String(Base64.encodeBase64(userpass.getBytes()));
@@ -85,7 +84,7 @@ private String getResponse(HttpRequestBase request) {
8584
HttpResponse response = client.execute(request);
8685
try {
8786
processResponse(response);
88-
return IOUtils.toString(response.getEntity().getContent());
87+
return response;
8988
} finally {
9089
EntityUtils.consume(response.getEntity());
9190
request.releaseConnection();
@@ -94,15 +93,28 @@ private String getResponse(HttpRequestBase request) {
9493
throw new RuntimeException(e);
9594
}
9695
}
96+
97+
private String responseToString(HttpResponse response) {
98+
try {
99+
return IOUtils.toString(response.getEntity().getContent());
100+
} catch (Exception e) {
101+
throw new RuntimeException(e);
102+
}
103+
}
97104

98105
@Override
99-
public String getResponseGET(String url) {
106+
public String getResponseContentGET(String url) {
107+
return responseToString(getResponseGET(url));
108+
}
109+
110+
@Override
111+
public HttpResponse getResponseGET(String url) {
100112
HttpGet request = new HttpGet(getBaseAddress() + url);
101113
return getResponse(request);
102114
}
103115

104116
@Override
105-
public String getResponsePOST(String url, String entity) {
117+
public HttpResponse getResponsePOST(String url, String entity) {
106118
HttpPost request = new HttpPost(getBaseAddress() + url);
107119
if (entity != null) {
108120
request.setEntity(new StringEntity(entity, ContentType.create("text/xml", "utf-8")));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.projectkaiser.scm.jenkins.data;
2+
3+
public class JobListElement {
4+
private String name;
5+
6+
public String getName() {
7+
return name;
8+
}
9+
10+
public void setName(String name) {
11+
this.name = name;
12+
}
13+
14+
public JobListElement() {
15+
super();
16+
}
17+
}
Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.projectkaiser.scm.jenkins.api;
22

3-
import static org.junit.Assert.assertTrue;
3+
import static org.junit.Assert.*;
44

5+
import java.io.BufferedReader;
56
import java.io.IOException;
7+
import java.io.InputStream;
8+
import java.io.InputStreamReader;
69
import java.io.StringReader;
710
import java.io.StringWriter;
811
import java.util.List;
@@ -11,15 +14,21 @@
1114
import javax.xml.parsers.DocumentBuilderFactory;
1215
import javax.xml.parsers.ParserConfigurationException;
1316

17+
import org.custommonkey.xmlunit.XMLUnit;
18+
import org.junit.After;
1419
import org.junit.Before;
1520
import org.junit.BeforeClass;
21+
import org.junit.Test;
1622
import org.w3c.dom.Document;
1723
import org.w3c.dom.NodeList;
1824
import org.xml.sax.InputSource;
1925
import org.xml.sax.SAXException;
2026

27+
import com.projectkaiser.scm.jenkins.data.JobDetailed;
28+
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
2129
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
2230
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
31+
import com.sun.xml.internal.ws.util.xml.XmlUtil;
2332

2433
public class JenkinsApiTest {
2534

@@ -31,37 +40,55 @@ public class JenkinsApiTest {
3140
System.getenv("PK_TEST_JENKINS_USER") : System.getProperty("PK_TEST_JENKINS_USER");
3241
private static final String TEST_JENKINS_PASS = System.getProperty("PK_TEST_JENKINS_PASS") == null ?
3342
System.getenv("PK_TEST_JENKINS_PASS") : System.getProperty("PK_TEST_JENKINS_PASS");
43+
44+
private static final String TEST_JOB_XML_FN = "TestJob.xml";
45+
46+
private static final String TEST_JOB_NAME = "pk_jenkins_test_job";
47+
48+
private String ethalonJobXML = readResource(this.getClass(), TEST_JOB_XML_FN);
3449

3550
@BeforeClass
3651
public static void setUpClass() {
3752
assertTrue("Set PK_TEST_JENKINS_URL enviroment variable as url to test Jenkins server to execute tests",
3853
TEST_JENKINS_URL != null);
39-
assertTrue("Set TEST_JENKINS_USER enviroment variable as test Jenkins server user name",
40-
TEST_JENKINS_USER != null);
41-
assertTrue("Set TEST_JENKINS_PASS enviroment variable as test Jenkins server user password",
42-
TEST_JENKINS_PASS != null);
4354
}
4455

4556
@Before
4657
public void setUp() {
4758
api = new JenkinsApi(TEST_JENKINS_URL, TEST_JENKINS_USER, TEST_JENKINS_PASS);
59+
api.createJob(TEST_JOB_NAME, ethalonJobXML);
4860
}
4961

50-
public void JenkinsAPITest() throws ParserConfigurationException, SAXException, IOException {
51-
String config = api.getJobConfigXml("test job");
52-
api.createJob("newe4job", config);
62+
@After
63+
public void tearDown() {
64+
api.deleteJob(TEST_JOB_NAME);
5365
}
5466

67+
@Test
68+
public void testCreateJob() throws Exception {
69+
assertTrue(api.getJobsList().contains(TEST_JOB_NAME));
70+
String actualJobXML = api.getJobConfigXml(TEST_JOB_NAME);
71+
assertTrue(XMLUnit.compareXML(actualJobXML, ethalonJobXML).identical());
72+
}
5573

56-
private void doRunJob(String jobName) {
57-
api.runJob(jobName);
74+
@Test
75+
public void testRunJob() throws ParserConfigurationException, SAXException, IOException {
76+
Long jobId = api.runJob(TEST_JOB_NAME);
77+
assertTrue(jobId > 0);
78+
5879
}
5980

60-
61-
private void doChangeJob() throws ParserConfigurationException, SAXException, IOException {
62-
List<String> list = api.getJobsList();
63-
String jobName = list.get(0);
64-
Document doc = getJobDocument(jobName);
81+
82+
public void JenkinsAPITest() throws ParserConfigurationException, SAXException, IOException {
83+
String config = api.getJobConfigXml("test job");
84+
api.createJob("newe4job", config);
85+
}
86+
87+
@Test
88+
public void testChangeJob() throws ParserConfigurationException, SAXException, IOException {
89+
api.getJobDetailed(jobName)
90+
api.up
91+
Document doc = getJobDocument(TEST_JOB_NAME);
6592
NodeList nodes = doc.getElementsByTagName("disabled");
6693
nodes.item(0).setNodeValue("true");
6794
updateJob(jobName, doc);
@@ -76,10 +103,6 @@ private void updateJob(String jobName, Document doc) throws IOException {
76103
api.updateJobConfigXml(jobName, stringOut.toString());
77104
}
78105

79-
private void doCreateJob() throws IOException {
80-
81-
}
82-
83106
private Document getJobDocument(String jobName) throws ParserConfigurationException, SAXException, IOException {
84107

85108
String xml = api.getJobConfigXml(jobName);
@@ -93,4 +116,21 @@ private Document getJobDocument(String jobName) throws ParserConfigurationExcept
93116
Document doc = db.parse(is);
94117
return doc;
95118
}
119+
120+
public static String readResource(Class<?> cls, String resourceName) {
121+
StringBuffer res = new StringBuffer();
122+
char buf[] = new char[256];
123+
try {
124+
InputStream is = cls.getResourceAsStream(resourceName);
125+
InputStreamReader iReader = new InputStreamReader(is, "utf-8");
126+
BufferedReader br = new BufferedReader(iReader);
127+
int nRead;
128+
while ((nRead = br.read(buf)) > 0) {
129+
res.append(buf, 0, nRead);
130+
}
131+
} catch (IOException e) {
132+
throw new RuntimeException(e);
133+
}
134+
return res.toString();
135+
}
96136
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8"?><project>
2+
<actions/>
3+
<description/>
4+
<keepDependencies>false</keepDependencies>
5+
<properties/>
6+
<scm class="hudson.scm.NullSCM"/>
7+
<canRoam>true</canRoam>
8+
<disabled>false</disabled>
9+
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
10+
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
11+
<jdk>JDK7</jdk>
12+
<triggers>
13+
<hudson.triggers.SCMTrigger>
14+
<spec>*/2 * * * *</spec>
15+
<ignorePostCommitHooks>false</ignorePostCommitHooks>
16+
</hudson.triggers.SCMTrigger>
17+
</triggers>
18+
<concurrentBuild>false</concurrentBuild>
19+
<builders/>
20+
<publishers>
21+
<hudson.tasks.Mailer plugin="[email protected]">
22+
<recipients>[email protected]</recipients>
23+
<dontNotifyEveryUnstableBuild>false</dontNotifyEveryUnstableBuild>
24+
<sendToIndividuals>true</sendToIndividuals>
25+
</hudson.tasks.Mailer>
26+
</publishers>
27+
<buildWrappers/>
28+
</project>

0 commit comments

Comments
 (0)