package hudson.plugins.collabnet.pblupload; import com.collabnet.cubit.api.CubitConnector; import com.gargoylesoftware.htmlunit.Page; import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.TaskListener; import hudson.plugins.collabnet.util.CommonUtil; import hudson.plugins.collabnet.util.HudsonConstants; import hudson.plugins.collabnet.util.Util; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jvnet.hudson.test.HudsonTestCase; public class PblUploadTest extends HudsonTestCase { // ids and names for finding fields public static final String LABEL = "Lab Management Project Build " + "Library (PBL) Uploader"; public static final String URL_ID = "pblupload.hostURL"; public static final String URL_NAME = "pblupload.host_url"; public static final String USER_ID = "pblupload.user"; public static final String KEY_ID = "pblupload.key"; public static final String PROJECT_NAME = "pblupload.project"; public static final String PUB_OR_PRIV_NAME = "pblupload.pub_or_priv"; public static final String FILE_NAME = "pblupload.file"; public static final String PATH_NAME = "pblupload.path"; public static final String FORCE_NAME = "pblupload.force"; public static final String DESCRIPTION_NAME = "pblupload.description"; public static final String COMMENT_NAME = "pblupload.comment"; // values to set public static final String CUBIT_URL = System.getProperty("lm_url"); public static final String USERNAME = System.getProperty("lm_user"); public static final String KEY = System.getProperty("key"); public static final String PROJECT = System.getProperty("lm_project"); public static final String PUB_OR_PRIV = System.getProperty("pub_or_priv"); public static final String FILE = System.getProperty("pbl_filename"); public static final String PATH = System.getProperty("pbl_path"); public static final String FORCE = System.getProperty("pbl_force"); public static final String DESCRIPTION = "Here is ${BUILD_ID} test."; public static final String COMMENT = "Uploaded by hudson plugin for " + "${BUILD_ID} build."; public static final String FILE_CONTENT = "Test content for the pbl file."; private AbstractProject job = null; @Override public void setUp() throws Exception { super.setUp(); this.job = this.createFreeStyleProject(); HtmlPage configurePage = setupProjectForPblUpload(); this.submitForm(configurePage, HudsonConstants.CONFIGURE_FORM_NAME); } public String getUrlId(int unique_id) { return unique_id + "." + URL_ID; } public String getUserId(int unique_id) { return unique_id + "." + USER_ID; } public String getKeyId(int unique_id) { return unique_id + "." + KEY_ID; } public String getProjectName(int unique_id) { return unique_id + "." + PROJECT_NAME; } public String getPubOrPrivName(int unique_id) { return unique_id + "." + PUB_OR_PRIV_NAME; } public String getFileName(int unique_id) { return unique_id + "." + FILE_NAME; } public String getPathName(int unique_id) { return unique_id + "." + PATH_NAME; } public String getForceName(int unique_id) { return unique_id + "." + FORCE_NAME; } public String getDescriptionName(int unique_id) { return unique_id + "." + DESCRIPTION_NAME; } public String getCommentName(int unique_id) { return unique_id + "." + COMMENT_NAME; } public HtmlPage setupProjectForPblUpload() throws Exception { WebClient wc = new WebClient(); HtmlPage configurePage = (HtmlPage) wc.goTo(this.job.getShortUrl() + "configure"); HtmlCheckBoxInput pblCheck = (HtmlCheckBoxInput)Util .getFirstHtmlElementByName(configurePage, "hudson-plugins-collabnet-" + "pblupload-PblUploader"); pblCheck.click(); int unique_id = this.getUniqueId(configurePage); configurePage = (HtmlPage) Util.setText(configurePage, getUrlId(unique_id), CUBIT_URL); configurePage = (HtmlPage) Util.setText(configurePage, getUserId(unique_id), USERNAME); configurePage = (HtmlPage) Util.setPassword(configurePage, getKeyId(unique_id), KEY); configurePage = (HtmlPage) Util. setTextByName(configurePage, getProjectName(unique_id), PROJECT); Util.clickRadio(configurePage, getPubOrPrivName(unique_id), PUB_OR_PRIV); configurePage = (HtmlPage) Util.setTextByName(configurePage, getFileName(unique_id), FILE); configurePage = (HtmlPage) Util.setTextByName(configurePage, getPathName(unique_id), PATH); Util.clickRadio(configurePage, getForceName(unique_id), FORCE); configurePage = (HtmlPage) Util. setTextByName(configurePage, getDescriptionName(unique_id), DESCRIPTION); configurePage = (HtmlPage) Util. setTextByName(configurePage, getCommentName(unique_id), COMMENT); return configurePage; } public void testPblUploadSetup() throws Exception { WebClient wc = new WebClient(); HtmlPage configurePage = (HtmlPage) wc.goTo(this.job.getShortUrl() + "configure"); int unique_id = this.getUniqueId(configurePage); Util.checkText(configurePage, getUrlId(unique_id), CUBIT_URL); Util.checkText(configurePage, getUserId(unique_id), USERNAME); Util.checkPassword(configurePage, getKeyId(unique_id), KEY); Util.checkTextByName(configurePage, getProjectName(unique_id), PROJECT); Util.checkRadioSelected(configurePage, getPubOrPrivName(unique_id), PUB_OR_PRIV); Util.checkTextByName(configurePage, getFileName(unique_id), FILE); Util.checkTextByName(configurePage, getPathName(unique_id), PATH); Util.checkRadioSelected(configurePage, getForceName(unique_id), FORCE); Util.checkTextByName(configurePage, getDescriptionName(unique_id), DESCRIPTION); Util.checkTextByName(configurePage, getCommentName(unique_id), COMMENT); } public void testPblUpload() throws Exception { Util.createFileInWorkspace(this.job, FILE, FILE_CONTENT); AbstractBuild build = (AbstractBuild) this.job.scheduleBuild2(0).get(); this.verifyPblUpload(build); } /** * To verify that the upload succeeded, we'll attempt to change the * description. */ public void verifyPblUpload(AbstractBuild build) throws Exception { Map<String, String> args = new HashMap<String, String>(); args.put("userid", USERNAME); args.put("desc", "Changed desc for test"); args.put("comment", "Changing desc to test upload"); args.put("path", CommonUtil.getInterpreted(build.getEnvironment(TaskListener.NULL), PATH) + "/" + FILE); args.put("proj", PROJECT); args.put("sig", KEY); args.put("type", PUB_OR_PRIV); CubitConnector cubitConnector = new CubitConnector(CUBIT_URL, USERNAME, KEY); String xml = cubitConnector.callCubitApi("pbl_changedesc", args, true); String success = "<status>OK</status>"; assert(xml.indexOf(success) != -1); } public int getUniqueId(HtmlPage configurePage) { // the unique id we want is the last that's present on the page List<HtmlElement> elems = configurePage. getElementsByName(URL_NAME); int id = -1; int unique_id = -1; for (HtmlElement elem: elems) { System.out.println("id = " + elem.getId()); String[] parts = elem.getId().split("\\."); if (parts.length > 0 && !parts[0].equals("")) { id = Integer.parseInt(parts[0]); if (id > unique_id) { unique_id = id; } } } return unique_id; } /** * Handles submitting a form on a given page. */ public Page submitForm(HtmlPage page, String formName) throws Exception { HtmlForm form = page.getFormByName(formName); return this.submit(form); } }