package hudson.model;
import hudson.model.DownloadService.Downloadable;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import hudson.tasks.Maven;
import hudson.tools.DownloadFromUrlInstaller;
import hudson.tools.JDKInstaller;
import hudson.tools.ToolInstallation;
import jenkins.model.DownloadSettings;
import net.sf.json.JSONObject;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.WithoutJenkins;
import org.kohsuke.stapler.StaplerResponse;
/**
* @author Kohsuke Kawaguchi
*/
public class DownloadServiceTest extends HudsonTestCase {
private Downloadable job;
/**
* Makes sure that JavaScript on the client side for handling submission works.
*/
@Override
protected void setUp() throws Exception {
super.setUp();
if (jenkins == null) {
return;
}
// this object receives the submission.
// to bypass the URL restriction, we'll trigger downloadService.download ourselves
job = new Downloadable("test", "UNUSED");
Downloadable.all().add(job);
DownloadSettings.get().setUseBrowser(true);
}
@Issue("JENKINS-5536")
public void testPost() throws Exception {
// we do not save with signature for toolInstallers,
//neither we check it in the getData method.
createWebClient().goTo("/self/testPost");
JSONObject d = job.getData();
assertEquals(hashCode(),d.getInt("hello"));
// TODO: test with a signature
}
/**
* This is where the browser should hit to retrieve data.
*/
public void doData(StaplerResponse rsp) throws IOException {
rsp.setContentType("application/javascript");
rsp.getWriter().println("downloadService.post('test',{'hello':"+hashCode()+"})");
}
@WithoutJenkins // could have been in core/src/test/ but update-center.json was already in test/src/test/ (used by UpdateSiteTest)
public void testLoadJSON() throws Exception {
assertRoots("[list]", "hudson.tasks.Maven.MavenInstaller.json"); // format used by most tools
assertRoots("[data, version]", "hudson.tools.JDKInstaller.json"); // anomalous format
assertRoots("[connectionCheckUrl, core, id, plugins, signature, updateCenterVersion]", "update-center.json");
}
private static void assertRoots(String expected, String file) throws Exception {
URL resource = DownloadServiceTest.class.getResource(file);
assertNotNull(file, resource);
JSONObject json = JSONObject.fromObject(DownloadService.loadJSON(resource));
@SuppressWarnings("unchecked") Set<String> keySet = json.keySet();
assertEquals(expected, new TreeSet<String>(keySet).toString());
}
public void testReduceFunctionWithMavenJsons() throws Exception {
URL resource1 = DownloadServiceTest.class.getResource("hudson.tasks.Maven.MavenInstaller1.json");
URL resource2 = DownloadServiceTest.class.getResource("hudson.tasks.Maven.MavenInstaller2.json");
URL resource3 = DownloadServiceTest.class.getResource("hudson.tasks.Maven.MavenInstaller3.json");
JSONObject json1 = JSONObject.fromObject(DownloadService.loadJSON(resource1));
JSONObject json2 = JSONObject.fromObject(DownloadService.loadJSON(resource2));
JSONObject json3 = JSONObject.fromObject(DownloadService.loadJSON(resource3));
List<JSONObject> jsonObjectList = new ArrayList<>();
jsonObjectList.add(json1);
jsonObjectList.add(json2);
jsonObjectList.add(json3);
Downloadable downloadable = new Maven.MavenInstaller.DescriptorImpl().createDownloadable();
JSONObject reducedJson = downloadable.reduce(jsonObjectList);
URL expectedResult = DownloadServiceTest.class.getResource("hudson.tasks.Maven.MavenInstallerResult.json");
JSONObject expectedResultJson = JSONObject.fromObject(DownloadService.loadJSON(expectedResult));
assertEquals(reducedJson, expectedResultJson);
}
public void testReduceFunctionWithAntJsons() throws Exception {
URL resource1 = DownloadServiceTest.class.getResource("hudson.tasks.Ant.AntInstaller1.json");
URL resource2 = DownloadServiceTest.class.getResource("hudson.tasks.Ant.AntInstaller2.json");
URL resource3 = DownloadServiceTest.class.getResource("hudson.tasks.Ant.AntInstaller3.json");
JSONObject json1 = JSONObject.fromObject(DownloadService.loadJSON(resource1));
JSONObject json2 = JSONObject.fromObject(DownloadService.loadJSON(resource2));
JSONObject json3 = JSONObject.fromObject(DownloadService.loadJSON(resource3));
List<JSONObject> jsonObjectList = new ArrayList<>();
jsonObjectList.add(json1);
jsonObjectList.add(json2);
jsonObjectList.add(json3);
Downloadable downloadable = new hudson.tasks.Ant.AntInstaller.DescriptorImpl().createDownloadable();
JSONObject reducedJson = downloadable.reduce(jsonObjectList);
URL expectedResult = DownloadServiceTest.class.getResource("hudson.tasks.Ant.AntInstallerResult.json");
JSONObject expectedResultJson = JSONObject.fromObject(DownloadService.loadJSON(expectedResult));
assertEquals(reducedJson, expectedResultJson);
}
public void testReduceFunctionWithJDKJsons() throws Exception {
URL resource1 = DownloadServiceTest.class.getResource("hudson.tools.JDKInstaller1.json");
URL resource2 = DownloadServiceTest.class.getResource("hudson.tools.JDKInstaller2.json");
URL resource3 = DownloadServiceTest.class.getResource("hudson.tools.JDKInstaller3.json");
JSONObject json1 = JSONObject.fromObject(DownloadService.loadJSON(resource1));
JSONObject json2 = JSONObject.fromObject(DownloadService.loadJSON(resource2));
JSONObject json3 = JSONObject.fromObject(DownloadService.loadJSON(resource3));
List<JSONObject> jsonObjectList = new ArrayList<>();
jsonObjectList.add(json1);
jsonObjectList.add(json2);
jsonObjectList.add(json3);
JDKInstaller.JDKList downloadable = new JDKInstaller.JDKList();
JSONObject reducedJson = downloadable.reduce(jsonObjectList);
URL expectedResult = DownloadServiceTest.class.getResource("hudson.tools.JDKInstallerResult.json");
JSONObject expectedResultJson = JSONObject.fromObject(DownloadService.loadJSON(expectedResult));
assertEquals(reducedJson, expectedResultJson);
}
public void testReduceFunctionWithNotDefaultSchemaJsons() throws Exception {
URL resource1 = DownloadServiceTest.class.getResource("hudson.plugins.cmake.CmakeInstaller1.json");
URL resource2 = DownloadServiceTest.class.getResource("hudson.plugins.cmake.CmakeInstaller2.json");
JSONObject json1 = JSONObject.fromObject(DownloadService.loadJSON(resource1));
JSONObject json2 = JSONObject.fromObject(DownloadService.loadJSON(resource2));
List<JSONObject> jsonObjectList = new ArrayList<>();
jsonObjectList.add(json1);
jsonObjectList.add(json2);
Downloadable downloadable = new GenericDownloadFromUrlInstaller.DescriptorImpl().createDownloadable();
JSONObject reducedJson = downloadable.reduce(jsonObjectList);
URL expectedResult = DownloadServiceTest.class.getResource("hudson.plugins.cmake.CmakeInstallerResult.json");
JSONObject expectedResultJson = JSONObject.fromObject(DownloadService.loadJSON(expectedResult));
assertEquals(reducedJson, expectedResultJson);
}
private static class GenericDownloadFromUrlInstaller extends DownloadFromUrlInstaller {
protected GenericDownloadFromUrlInstaller(String id) {
super(id);
}
public static final class DescriptorImpl extends DownloadFromUrlInstaller.DescriptorImpl<Maven.MavenInstaller> {
public String getDisplayName() {
return "";
}
@Override
public boolean isApplicable(Class<? extends ToolInstallation> toolType) {
return true;
}
}
}
}