/* * Software Name : ATK * * Copyright (C) 2007 - 2012 France Télécom * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ------------------------------------------------------------------ * File Name : HopperStep.java * * Created : 23/05/2007 * Author(s) : Aurore PENAULT */ package com.orange.atk.atkUI.anaHopper; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.Calendar; import java.util.Enumeration; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.Map; import org.apache.log4j.Logger; import org.dom4j.Element; import com.orange.atk.atkUI.corecli.Alert; import com.orange.atk.atkUI.corecli.Campaign; import com.orange.atk.atkUI.corecli.Configuration; import com.orange.atk.atkUI.corecli.IAnalysisMonitor; import com.orange.atk.atkUI.corecli.Step; import com.orange.atk.atkUI.corecli.utils.Digest; import com.orange.atk.atkUI.corecli.utils.StringUtilities; import com.orange.atk.atkUI.corecli.utils.XMLOutput; import com.orange.atk.graphAnalyser.CreateGraph; import com.orange.atk.graphAnalyser.GraphMarker; import com.orange.atk.graphAnalyser.PerformanceGraph; import com.orange.atk.graphAnalyser.RealtimeGraph; import com.orange.atk.launcher.LaunchJATK; import com.orange.atk.phone.PhoneException; import com.orange.atk.phone.PhoneInterface; import com.orange.atk.phone.detection.AutomaticPhoneDetection; import com.orange.atk.platform.Platform; /** * * @author Aurore PENAULT * @since JDK5.0 */ public class HopperStep extends Step { /** * Path to the flash file to analyse. */ private String jatkFilePath; private File flashFile; private CreateGraph jatkCharts; private String jatkPath = Platform.getInstance().getJATKPath(); private RealtimeGraph realtime; private static PhoneInterface currentPhone = null; private Hashtable<String, String> hopperStepParam = new Hashtable<String, String>(); // do not change this name, for backward compatibility purpose public static final String PARAM_TIME = "hopperparam"; public static final String PARAM_NBEVENTS = "nbeventsparam"; public static final String PARAM_THROTTLE = "throttleparam"; public static final String TYPE = "hopper"; /** * Builds a hopper step with the path to the hopper file * * @param hopperFilePath * Path to the hopper file **/ public HopperStep(String hopperFilePath) { this.jatkFilePath = hopperFilePath; currentPhone = AutomaticPhoneDetection.getInstance().getDevice(); } public boolean isLocal() { return !jatkFilePath.startsWith("http"); } /* * (non-Javadoc) * * @see com.orange.atk.atkUI.corecli.Step#analyse() */ @Override // public Verdict analyse(StatusBar statusbar,String profileName, // IAnalysisMonitor monitor) public Verdict analyse(IAnalysisMonitor monitor) { try { check(); init(); } catch (Alert a) { this.outFilePath = null; this.verdict = Verdict.SKIPPED; this.skippedMessage = a.getMessage().trim(); newLastAnalysisResult(new HopperStepAnalysisResult(getFlashFileDigest(), outFilePath, getFlashFileName(), Calendar.getInstance(), verdictAsString.get(verdict), null, null, null, Configuration.getVersion())); return verdict; } String tempDir = Platform.TMP_DIR; XMLOutput jatkResults = new XMLOutput(tempDir, "jatkresults"); Element flashResultsElem = jatkResults.root(); flashResultsElem.addAttribute("flashfile", jatkFilePath); Calendar cal = new GregorianCalendar(); String currentDate = cal.get(Calendar.DAY_OF_MONTH) + "." + cal.get(Calendar.MONTH) + "." + cal.get(Calendar.YEAR); flashResultsElem.addAttribute("date", currentDate); flashResultsElem.addAttribute("matosversion", Configuration.getVersion()); try { // on lance le test { Thread.sleep(4000); launchtest(); } } catch (Exception e) { Logger.getLogger(this.getClass()).error( "Problem in analysis of the following hopper test: " + jatkFilePath, e); } String outFolder = this.outFilePath + File.separator + "report.html"; jatkResults.generate(); File reportFile = null; if (outFolder != null) { reportFile = new File(outFolder); } outFolder = reportFile.getAbsolutePath(); newLastAnalysisResult(new HopperStepAnalysisResult(getFlashFileDigest(), outFolder, getFlashFileName(), Calendar.getInstance(), verdictAsString.get(verdict), null, null, null, Configuration.getVersion())); return verdict; } private void displayRealTimeGraph() { boolean isrealtime = Boolean.valueOf(Configuration.getProperty(Configuration.REALTIMEGRAPH, "true")); if (!(AutomaticPhoneDetection.getInstance().isNokia()) && isrealtime) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { currentPhone.addTcpdumpLineListener(jatkCharts); realtime = new RealtimeGraph(jatkCharts); realtime.setVisible(true); if (currentPhone.isDeviceRooted() && Boolean.valueOf(Configuration.getProperty( Configuration.NETWORKMONITOR, "false"))) { realtime.addUrlMarkerCheckBox(); } } }); } return; } private void stopRealTimeGraph() { boolean isrealtime = Boolean.valueOf(Configuration.getProperty(Configuration.REALTIMEGRAPH, "true")); if (realtime != null && !AutomaticPhoneDetection.getInstance().isNokia() && isrealtime) { realtime.close(); } realtime = null; } private void runtest() { // get test filename String tstfile = jatkFilePath; // get UID and TestName PhoneInterface phone = AutomaticPhoneDetection.getInstance().getDevice(); if (phone.getType() == PhoneInterface.TYPE_ANDROID) { outFilePath = outFilePath + File.separator + tstfile; } outFilePath = outFilePath.replace(".", "_").replace(",", "_"); File outputdirF = new File(outFilePath); if (!outputdirF.exists() && !outputdirF.mkdir()) { Logger.getLogger(this.getClass()).debug("Can't Create dir " + outputdirF.getPath()); } verdict = Verdict.NONE; LaunchJATK exec = new LaunchJATK(outFilePath, jatkPath, tstfile, tstfile, LaunchJATK.PDF_TYPE); Campaign.setLaunchExec(exec); jatkCharts = new CreateGraph(); String xmlconfilepath = getXmlfilepath(); currentxmlfilepath = xmlconfilepath; boolean empty = jatkCharts.createPerfGraphsAndMarkers(xmlconfilepath); jatkCharts.createEmptyDataset(); jatkCharts.initializeTimeAxis(); Map<String, PerformanceGraph> mapPerfGraph = jatkCharts.getMapPerfGraph(); Map<String, GraphMarker> mapAction = jatkCharts.getMapAction(); exec.setMapPerfGraph(mapPerfGraph); exec.setMapAction(mapAction); try { if (!empty) { displayRealTimeGraph(); } if (exec.launchRandomTest(xmlconfilepath, hopperStepParam).equals( PhoneInterface.STATUS_PASSED)) { verdict = Verdict.PASSED; } else { verdict = Verdict.FAILED; } } catch (FileNotFoundException e) { Logger.getLogger(this.getClass()).error(e); } catch (PhoneException pe) { verdict = Verdict.TESTFAILED; } stopRealTimeGraph(); exec.stopExecution(); exec = null; Logger.getLogger(this.getClass()).debug("End of Thread Exec JATK"); } private void launchtest() { Logger.getLogger(this.getClass()).debug("outFilePath start" + outFilePath); Logger.getLogger(this.getClass()).debug("Random Test Paramaters:"); Enumeration<String> paramKeys = hopperStepParam.keys(); while (paramKeys.hasMoreElements()) { String key = paramKeys.nextElement(); Logger.getLogger(this.getClass()).debug( "\tParam " + key + " = " + hopperStepParam.get(key)); } Thread t = new Thread() { public void run() { runtest(); } }; t.setName("lanceJATK"); t.start(); try { t.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block Logger.getLogger(this.getClass()).error(e); } } public boolean copyfile(File newfile, File originalFile) { if (originalFile.exists()) { if (newfile.exists() && !newfile.delete()) { Logger.getLogger(this.getClass()).debug("Can't delete " + newfile.getPath()); } // copy file to output dir try { newfile.createNewFile(); } catch (IOException e1) { // TODO Auto-generated catch block Logger.getLogger(this.getClass()).error(e1); } FileChannel in = null; FileChannel out = null; try { // Init in = new FileInputStream(originalFile).getChannel(); out = new FileOutputStream(newfile).getChannel(); // Copie depuis le in vers le out in.transferTo(0, in.size(), out); } catch (Exception e) { Logger.getLogger(this.getClass()).error(e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } if (out != null) { try { out.close(); } catch (IOException e) { } } } } return true; } /** * Initialize this FlashStep so that it is ready to analyse. If it has * already been initialysed, nothing is done. */ public void init() { if (!initialized) { if (jatkFilePath != null && (flashFile == null || !flashFile.exists())) { String extension = ".tst"; if (jatkFilePath.endsWith(extension)) { flashFile = Configuration.fileResolver.getFile(jatkFilePath, "tmpjatk", extension, login, password, useragent); } } // TODO if .sis extract .swf initialized = true; } } /* * (non-Javadoc) * * @see com.orange.atk.atkUI.corecli.Step#getClone() */ @Override public Object getClone() { HopperStep newFlashStep = new HopperStep(jatkFilePath); clone(newFlashStep); if (flashFile != null) { newFlashStep.flashFile = new File(flashFile.getAbsolutePath()); } return newFlashStep; } /* * (non-Javadoc) * * @see com.orange.atk.atkUI.corecli.Step#completeExternalToolCommandLine * (java.lang.String) */ @Override public String completeExternalToolCommandLine(String cmdline) { String cmdToExecute = cmdline; String supCmdLine = super.completeExternalToolCommandLine(cmdToExecute); if (supCmdLine != null) { cmdToExecute = supCmdLine; } // replace %SWF% by coresponding if (cmdToExecute.indexOf("%SWF%") > 0) { // just to be sure that files are resolved init(); cmdToExecute = cmdToExecute.replaceAll("%SWF%", flashFile.getAbsolutePath()); } else { // not for this Step return null; } if (cmdToExecute.indexOf('%') > 0) { // unable to complet all... return null; } else { return cmdToExecute; } } /* * (non-Javadoc) * * @see com.orange.atk.atkUI.corecli.Step#getShortName() */ @Override public String getShortName() { String shortName = ""; if (jatkFilePath.endsWith("tst")) { shortName = StringUtilities.guessName(jatkFilePath, ".tst"); } else { shortName = StringUtilities.guessName(jatkFilePath, ".sis"); } if (shortName.lastIndexOf('.') != -1) { shortName = shortName.substring(0, shortName.lastIndexOf('.')); } return shortName; } /* * (non-Javadoc) * * @see com.orange.atk.atkUI.corecli.Step#save(org.dom4j.Element, int) */ @Override public void save(Element root, int stepNumber) { Element anaElem = root.addElement(TYPE); anaElem.addAttribute("name", "hopperstep_" + stepNumber); anaElem.addAttribute("file", getFlashFilePath()); if (getLogin() != null) { anaElem.addAttribute("login", getLogin()); anaElem.addAttribute("password", getPassword()); } if (getUseragent() != null) { anaElem.addAttribute("useragent", getUseragent()); } if (getXmlfilepath() != null) { anaElem.addAttribute("configfile", getXmlfilepath()); } Enumeration<String> paramKeys = hopperStepParam.keys(); while (paramKeys.hasMoreElements()) { String key = paramKeys.nextElement(); anaElem.addAttribute(key, hopperStepParam.get(key)); } } public Map<String, String> getParam() { return this.hopperStepParam; } /* * (non-Javadoc) * * @see com.orange.atk.atkUI.corecli.Step#writeInCampaign(org.dom4j.Element * ) */ @Override public void writeInCampaign(Element root) { save(root, (int) System.currentTimeMillis()); } public String getFlashFilePath() { return jatkFilePath; } public void setFlashFilePath(String flashFilePath) { this.jatkFilePath = flashFilePath; resetInitialysed(); } public String getFlashFileName() { if (jatkFilePath == null) { return null; } return jatkFilePath.substring(jatkFilePath.lastIndexOf(File.separator) + 1); } public File getFlashFile() { return flashFile; } /** * Computes a SHA-1 digest of the referenced flash file. * * @return a SHA-1 digest or null if no file found. */ public String getFlashFileDigest() { String digest = null; if (flashFile != null) { FileInputStream fis = null; try { fis = new FileInputStream(flashFile); digest = Digest.runSHA1(fis); } catch (FileNotFoundException e) { Logger.getLogger(this.getClass()).error(e); } } return digest; } }