package hudson.plugins.seleniumaes; import hudson.Extension; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Descriptor; import hudson.model.Result; import hudson.plugins.seleniumaes.SeleniumAutoExecResult.Suite; import hudson.tasks.Builder; import java.io.IOException; import java.io.PrintStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.kohsuke.stapler.StaplerRequest; import com.enjoyxstudy.selenium.autoexec.client.RemoteControlClient; /** * @author onozaty */ public class SeleniumAutoExecBuilder extends Builder { /** server url */ private final String serverUrl; /** base url */ private final String baseUrl; /** * @param serverUrl * @throws MalformedURLException */ SeleniumAutoExecBuilder(String serverUrl) throws MalformedURLException { this.serverUrl = serverUrl; URL url = new URL(serverUrl); baseUrl = url.getProtocol() + "://" + url.getHost() + ((url.getPort() != -1) ? ":" + String.valueOf(url.getPort()) : ""); } /** * @return serverUrl */ public String getServerUrl() { return serverUrl; } /** * @see hudson.tasks.BuildStepCompatibilityLayer#perform(hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener) */ @Override public boolean perform(AbstractBuild<?, ?> build, @SuppressWarnings("unused") Launcher launcher, BuildListener listener) throws IOException { PrintStream logger = listener.getLogger(); logger.println("Test Selenium Auto Exec Server(" + serverUrl + ")."); String resultString; try { resultString = new RemoteControlClient(serverUrl.replaceAll("/$", "") + "/command/").runString(RemoteControlClient.TYPE_JSON); } catch (IOException e) { logger.println("Error return from Selenium Auto Exec Server(" + serverUrl + ")."); throw e; } SeleniumAutoExecResult result = parseResult(resultString); logger.println("result: " + (result.isPassed() ? "passed" : "failed")); logger.println("number of cases: passed: " + result.getPassedCount() + " / failed: " + result.getFailedCount() + " / total: " + result.getTotalCount()); if (!result.isPassed()) { build.setResult(Result.UNSTABLE); } SeleniumAutoExecAction action = build .getAction(SeleniumAutoExecAction.class); if (action == null) { action = new SeleniumAutoExecAction(build); build.addAction(action); } action.getResultList().add(result); return true; } /** * @param resultString * @return result */ private SeleniumAutoExecResult parseResult(String resultString) { JSONObject resultJson = JSONObject.fromObject(resultString); SeleniumAutoExecResult result = new SeleniumAutoExecResult(); result.setServerUrl(serverUrl); result.setPassed(resultJson.get("result").equals( RemoteControlClient.PASSED)); result.setTotalCount(resultJson.getInt("totalCount")); result.setPassedCount(resultJson.getInt("passedCount")); result.setFailedCount(resultJson.getInt("failedCount")); result.setStartTime(resultJson.getString("startTime")); result.setEndTime(resultJson.getString("endTime")); JSONArray suitesJson = resultJson.getJSONArray("suites"); ArrayList<Suite> suites = new ArrayList<Suite>(); for (Iterator<?> iterator = suitesJson.iterator(); iterator.hasNext();) { JSONObject suiteJson = (JSONObject) iterator.next(); Suite suite = result.new Suite(); suite.setSuiteName(suiteJson.getString("suiteName")); suite.setBrowser(suiteJson.getString("browser")); suite.setStatus(suiteJson.getString("status")); suite.setResultPath(baseUrl + suiteJson.getString("resultPath")); suites.add(suite); } result.setSuites(suites); return result; } /** * @author onozaty */ @Extension public static final class DescriptorImpl extends Descriptor<Builder> { /** * constructor. */ public DescriptorImpl() { super(SeleniumAutoExecBuilder.class); } /** * This human readable name is used in the configuration screen. * @return display name */ @Override public String getDisplayName() { return "Selenium Auto Exec Server"; } /** * @throws FormException * @see hudson.model.Descriptor#newInstance(org.kohsuke.stapler.StaplerRequest, net.sf.json.JSONObject) */ @Override public Builder newInstance(StaplerRequest req, @SuppressWarnings("unused") JSONObject formData) throws FormException { try { return new SeleniumAutoExecBuilder(req .getParameter("selenium_autoexec.serverUrl")); } catch (MalformedURLException e) { throw new FormException(e, "illegal url"); } } } }