171b49146fae442f11d76af035b279536e5c1d549Cédric Beustpackage org.testng.reporters.jq; 271b49146fae442f11d76af035b279536e5c1d549Cédric Beust 371b49146fae442f11d76af035b279536e5c1d549Cédric Beustimport org.testng.ISuite; 4d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport org.testng.ITestNGMethod; 5d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport org.testng.ITestResult; 69af501e464ae01b211983b8a4c9d058b051152d8Cédric Beustimport org.testng.collections.Maps; 771b49146fae442f11d76af035b279536e5c1d549Cédric Beustimport org.testng.reporters.XMLStringBuffer; 871b49146fae442f11d76af035b279536e5c1d549Cédric Beust 94ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beustimport java.util.Collections; 104ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beustimport java.util.Comparator; 11d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport java.util.List; 129af501e464ae01b211983b8a4c9d058b051152d8Cédric Beustimport java.util.Map; 13d03615c358dcaec441011112095750476a4c6b29Cédric Beust 1403932733f81c510b12e4b391eb249c713301a402Cédric Beustpublic class TimesPanel extends BaseMultiSuitePanel { 159af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust private Map<String, Long> m_totalTime = Maps.newHashMap(); 169af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust 1703932733f81c510b12e4b391eb249c713301a402Cédric Beust public TimesPanel(Model model) { 1871b49146fae442f11d76af035b279536e5c1d549Cédric Beust super(model); 1971b49146fae442f11d76af035b279536e5c1d549Cédric Beust } 2071b49146fae442f11d76af035b279536e5c1d549Cédric Beust 2171b49146fae442f11d76af035b279536e5c1d549Cédric Beust 2271b49146fae442f11d76af035b279536e5c1d549Cédric Beust @Override 23aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust public String getPrefix() { 24aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust return "times-"; 2571b49146fae442f11d76af035b279536e5c1d549Cédric Beust } 2671b49146fae442f11d76af035b279536e5c1d549Cédric Beust 2771b49146fae442f11d76af035b279536e5c1d549Cédric Beust @Override 28aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust public String getHeader(ISuite suite) { 29aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust return "Times for " + suite.getName(); 3071b49146fae442f11d76af035b279536e5c1d549Cédric Beust } 3171b49146fae442f11d76af035b279536e5c1d549Cédric Beust 32d03615c358dcaec441011112095750476a4c6b29Cédric Beust private String js(ISuite suite) { 3307d493d2ea08ee38c909057f28948e67919626d6Cédric Beust String functionName = "tableData_" + suiteToTag(suite); 34d03615c358dcaec441011112095750476a4c6b29Cédric Beust StringBuilder result = new StringBuilder( 3507d493d2ea08ee38c909057f28948e67919626d6Cédric Beust "suiteTableInitFunctions.push('" + functionName + "');\n" 3607d493d2ea08ee38c909057f28948e67919626d6Cédric Beust + "function " + functionName + "() {\n" 3707d493d2ea08ee38c909057f28948e67919626d6Cédric Beust + "var data = new google.visualization.DataTable();\n" 388501592fd1b782e77044153a612a51d362e0f594Cédric Beust + "data.addColumn('number', 'Number');\n" 3907d493d2ea08ee38c909057f28948e67919626d6Cédric Beust + "data.addColumn('string', 'Method');\n" 4007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust + "data.addColumn('string', 'Class');\n" 4107d493d2ea08ee38c909057f28948e67919626d6Cédric Beust + "data.addColumn('number', 'Time (ms)');\n"); 42d03615c358dcaec441011112095750476a4c6b29Cédric Beust 43d03615c358dcaec441011112095750476a4c6b29Cédric Beust List<ITestResult> allTestResults = getModel().getAllTestResults(suite); 44d03615c358dcaec441011112095750476a4c6b29Cédric Beust result.append( 45d03615c358dcaec441011112095750476a4c6b29Cédric Beust "data.addRows(" + allTestResults.size() + ");\n"); 46d03615c358dcaec441011112095750476a4c6b29Cédric Beust 474ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust Collections.sort(allTestResults, new Comparator<ITestResult>() { 484ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust @Override 494ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust public int compare(ITestResult o1, ITestResult o2) { 504ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust long t1 = o1.getEndMillis() - o1.getStartMillis(); 514ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust long t2 = o2.getEndMillis() - o2.getStartMillis(); 524ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust return (int) (t2 - t1); 534ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust } 544ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust }); 554ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust 56d03615c358dcaec441011112095750476a4c6b29Cédric Beust int index = 0; 57d03615c358dcaec441011112095750476a4c6b29Cédric Beust for (ITestResult tr : allTestResults) { 58d03615c358dcaec441011112095750476a4c6b29Cédric Beust ITestNGMethod m = tr.getMethod(); 59d03615c358dcaec441011112095750476a4c6b29Cédric Beust long time = tr.getEndMillis() - tr.getStartMillis(); 608501592fd1b782e77044153a612a51d362e0f594Cédric Beust result 61d03615c358dcaec441011112095750476a4c6b29Cédric Beust .append("data.setCell(" + index + ", " 628501592fd1b782e77044153a612a51d362e0f594Cédric Beust + "0, " + index + ")\n") 63d03615c358dcaec441011112095750476a4c6b29Cédric Beust .append("data.setCell(" + index + ", " 648501592fd1b782e77044153a612a51d362e0f594Cédric Beust + "1, '" + m.getMethodName() + "')\n") 658501592fd1b782e77044153a612a51d362e0f594Cédric Beust .append("data.setCell(" + index + ", " 668501592fd1b782e77044153a612a51d362e0f594Cédric Beust + "2, '" + m.getTestClass().getName() + "')\n") 678501592fd1b782e77044153a612a51d362e0f594Cédric Beust .append("data.setCell(" + index + ", " 688501592fd1b782e77044153a612a51d362e0f594Cédric Beust + "3, " + time + ");\n"); 699af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust Long total = m_totalTime.get(suite.getName()); 709af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust if (total == null) { 719af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust total = 0L; 729af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust } 739af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust m_totalTime.put(suite.getName(), total + time); 74d03615c358dcaec441011112095750476a4c6b29Cédric Beust index++; 75d03615c358dcaec441011112095750476a4c6b29Cédric Beust } 76d03615c358dcaec441011112095750476a4c6b29Cédric Beust 77d03615c358dcaec441011112095750476a4c6b29Cédric Beust result.append( 7807d493d2ea08ee38c909057f28948e67919626d6Cédric Beust "window.suiteTableData['" + suiteToTag(suite) + "']" + 7907d493d2ea08ee38c909057f28948e67919626d6Cédric Beust "= { tableData: data, tableDiv: 'times-div-" + suiteToTag(suite) + "'}\n" 8007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust + "return data;\n" + 8107d493d2ea08ee38c909057f28948e67919626d6Cédric Beust "}\n"); 82d03615c358dcaec441011112095750476a4c6b29Cédric Beust 83d03615c358dcaec441011112095750476a4c6b29Cédric Beust return result.toString(); 84d03615c358dcaec441011112095750476a4c6b29Cédric Beust } 85d03615c358dcaec441011112095750476a4c6b29Cédric Beust 8671b49146fae442f11d76af035b279536e5c1d549Cédric Beust @Override 8771b49146fae442f11d76af035b279536e5c1d549Cédric Beust public String getContent(ISuite suite, XMLStringBuffer main) { 88d03615c358dcaec441011112095750476a4c6b29Cédric Beust XMLStringBuffer xsb = new XMLStringBuffer(main.getCurrentIndent()); 899af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust xsb.push(D, C, "times-div"); 90d03615c358dcaec441011112095750476a4c6b29Cédric Beust xsb.push("script", "type", "text/javascript"); 91d03615c358dcaec441011112095750476a4c6b29Cédric Beust xsb.addString(js(suite)); 92d03615c358dcaec441011112095750476a4c6b29Cédric Beust xsb.pop("script"); 93927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust Long time = m_totalTime.get(suite.getName()); 94927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust if (time != null) { 95927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust xsb.addRequired(S, String.format("Total running time: %s", prettyDuration(time)), 96927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust C, "suite-total-time"); 97927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust } 9807d493d2ea08ee38c909057f28948e67919626d6Cédric Beust xsb.push(D, "id", "times-div-" + suiteToTag(suite)); 99d03615c358dcaec441011112095750476a4c6b29Cédric Beust xsb.pop(D); 1009af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust xsb.pop(D); 101d03615c358dcaec441011112095750476a4c6b29Cédric Beust return xsb.toXML(); 10271b49146fae442f11d76af035b279536e5c1d549Cédric Beust } 1039af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust 1049af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust private String prettyDuration(long totalTime) { 1059af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust String result; 1069af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust if (totalTime < 1000) { 1079af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust result = totalTime + " ms"; 1089af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust } else if (totalTime < 1000 * 60) { 1099af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust result = (totalTime / 1000) + " seconds"; 1109af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust } else if (totalTime < 1000 * 60 * 60) { 1119af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust result = (totalTime / 1000 / 60) + " minutes"; 1129af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust } else { 1139af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust result = (totalTime / 1000 / 60 / 60) + " hours"; 1149af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust } 1159af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust return result; 1169af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust } 117c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust 118c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust @Override 119c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust public String getNavigatorLink(ISuite suite) { 120c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust return "Times"; 121c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust } 12271b49146fae442f11d76af035b279536e5c1d549Cédric Beust} 123