19 package org.sleuthkit.autopsy.testing;
 
   21 import java.awt.AWTException;
 
   22 import java.awt.Rectangle;
 
   23 import java.awt.Robot;
 
   24 import java.awt.Toolkit;
 
   25 import java.awt.image.BufferedImage;
 
   27 import java.io.IOException;
 
   28 import java.nio.charset.StandardCharsets;
 
   29 import java.text.DateFormat;
 
   30 import java.text.MessageFormat;
 
   31 import java.text.SimpleDateFormat;
 
   32 import java.util.ArrayList;
 
   33 import java.util.Comparator;
 
   34 import java.util.Date;
 
   35 import java.util.HashMap;
 
   36 import java.util.List;
 
   38 import java.util.Random;
 
   40 import java.util.function.Function;
 
   41 import java.util.logging.Logger;
 
   42 import java.util.logging.Level;
 
   43 import java.util.regex.Matcher;
 
   44 import java.util.regex.Pattern;
 
   45 import java.util.stream.Collectors;
 
   46 import java.util.stream.Stream;
 
   47 import javax.imageio.ImageIO;
 
   48 import javax.swing.JDialog;
 
   49 import javax.swing.SwingUtilities;
 
   50 import javax.swing.text.JTextComponent;
 
   51 import javax.swing.tree.TreePath;
 
   52 import org.apache.commons.io.IOUtils;
 
   53 import org.apache.commons.lang3.StringUtils;
 
   54 import org.apache.commons.lang3.tuple.Pair;
 
   55 import org.apache.commons.lang3.tuple.Triple;
 
   56 import org.netbeans.jellytools.MainWindowOperator;
 
   57 import org.netbeans.jellytools.NbDialogOperator;
 
   58 import org.netbeans.jellytools.WizardOperator;
 
   59 import org.netbeans.jemmy.JemmyProperties;
 
   60 import org.netbeans.jemmy.Timeout;
 
   61 import org.netbeans.jemmy.TimeoutExpiredException;
 
   62 import org.netbeans.jemmy.Timeouts;
 
   63 import org.netbeans.jemmy.operators.JButtonOperator;
 
   64 import org.netbeans.jemmy.operators.JCheckBoxOperator;
 
   65 import org.netbeans.jemmy.operators.JComboBoxOperator;
 
   66 import org.netbeans.jemmy.operators.JDialogOperator;
 
   67 import org.netbeans.jemmy.operators.JFileChooserOperator;
 
   68 import org.netbeans.jemmy.operators.JListOperator;
 
   69 import org.netbeans.jemmy.operators.JTabbedPaneOperator;
 
   70 import org.netbeans.jemmy.operators.JTableOperator;
 
   71 import org.netbeans.jemmy.operators.JTextAreaOperator;
 
   72 import org.netbeans.jemmy.operators.JTextFieldOperator;
 
   73 import org.netbeans.jemmy.operators.JToggleButtonOperator;
 
   74 import org.netbeans.jemmy.operators.JTreeOperator;
 
   75 import org.netbeans.jemmy.operators.JTreeOperator.NoSuchPathException;
 
   93         Timeouts.setDefault(
"Waiter.WaitingTime", DIALOG_FIND_TIMEOUT_MINUTES * 60 * 1000);
 
  104         if (path.startsWith(
"\\\\")) { 
 
  107         if (path.startsWith(
"\\")) {
 
  125             logger.info(
"New Case");
 
  126             setTimeout(
"WindowWaiter.WaitWindowTimeout", 240000);
 
  127             NbDialogOperator nbdo = 
new NbDialogOperator(title);
 
  128             JButtonOperator jbo = 
new JButtonOperator(nbdo, 0); 
 
  130         } 
catch (TimeoutExpiredException ex) {
 
  131             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  139             logger.info(
"New Case Wizard");
 
  140             WizardOperator wo = 
new WizardOperator(
"New Case Information");
 
  141             JTextFieldOperator jtfo0 = 
new JTextFieldOperator(wo, 1);
 
  142             jtfo0.typeText(
"AutopsyTestCase"); 
 
  143             JTextFieldOperator jtfo1 = 
new JTextFieldOperator(wo, 2);
 
  145             wo.btNext().clickMouse();
 
  146             JTextFieldOperator jtfo2 = 
new JTextFieldOperator(wo, 0);
 
  147             jtfo2.typeText(
"000"); 
 
  148             JTextFieldOperator jtfo3 = 
new JTextFieldOperator(wo, 1);
 
  149             jtfo3.typeText(
"Examiner 1"); 
 
  150             start = System.currentTimeMillis();
 
  151             wo.btFinish().clickMouse();
 
  152         } 
catch (TimeoutExpiredException ex) {
 
  153             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  165             new Timeout(
"pausing", 120000).sleep();
 
  166             logger.info(
"Starting Add Image process");
 
  167             setTimeout(
"WindowWaiter.WaitWindowTimeOut", 240000);
 
  168             WizardOperator wo = 
new WizardOperator(
"Add Data Source");
 
  169             while (!wo.btNext().isEnabled()) {
 
  170                 new Timeout(
"pausing", 1000).sleep(); 
 
  174             wo.btNext().clickMouse();
 
  177             JToggleButtonOperator jtbo = 
new JToggleButtonOperator(wo, 0);
 
  179             wo.btNext().clickMouse();
 
  180             new Timeout(
"pausing", 5000).sleep();
 
  181             JTextFieldOperator jtfo0 = 
new JTextFieldOperator(wo, 0);
 
  183             String imageDir = img_path;
 
  184             logger.log(Level.INFO, 
"setting image path to " + imageDir);
 
  185             ((JTextComponent) jtfo0.getSource()).setText(imageDir);
 
  186             new Timeout(
"pausing", 5000).sleep();
 
  187             JComboBoxOperator comboBoxOperator = 
new JComboBoxOperator(wo, 0);
 
  188             logger.log(Level.INFO, 
"setting time zone");
 
  189             comboBoxOperator.setSelectedItem(
"(GMT-5:00) America/New_York");
 
  192                 new Timeout(
"pausing", 5000).sleep();
 
  193                 logger.log(Level.INFO, 
"clicking next button");
 
  194                 wo.btNext().clickMouse();
 
  196             new Timeout(
"pausing", 8000).sleep();
 
  197         } 
catch (TimeoutExpiredException ex) {
 
  198             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  210             new Timeout(
"pausing", 120000).sleep();
 
  211             logger.info(
"Starting Add Logical Files process");
 
  212             WizardOperator wo = 
new WizardOperator(
"Add Data Source");
 
  213             wo.setTimeouts(
setTimeout(
"WindowWaiter.WaitWindowTimeOut", 240000));
 
  214             while (!wo.btNext().isEnabled()) {
 
  215                 new Timeout(
"pausing", 1000).sleep(); 
 
  219             wo.btNext().clickMouse();
 
  222             JToggleButtonOperator jtbo = 
new JToggleButtonOperator(wo, 2);
 
  224             wo.btNext().clickMouse();
 
  225             JButtonOperator addButtonOperator = 
new JButtonOperator(wo, 
"Add");
 
  226             addButtonOperator.pushNoBlock();
 
  227             JFileChooserOperator fileChooserOperator = 
new JFileChooserOperator();
 
  228             fileChooserOperator.setCurrentDirectory(
new File(
getEscapedPath(System.getProperty(
"img_path"))));
 
  230             fileChooserOperator.goUpLevel();
 
  231             fileChooserOperator.chooseFile(
new File(
getEscapedPath(System.getProperty(
"img_path"))).getName());
 
  232             wo.btNext().clickMouse();
 
  233         } 
catch (TimeoutExpiredException ex) {
 
  234             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  242             WizardOperator wo = 
new WizardOperator(
"Add Data Source");
 
  243             while (!wo.btFinish().isEnabled()) {
 
  244                 new Timeout(
"pausing", 1000).sleep(); 
 
  246             logger.log(Level.INFO, 
"Add image took {0}ms", (System.currentTimeMillis() - 
start));
 
  247             wo.btFinish().clickMouse();
 
  248         } 
catch (TimeoutExpiredException ex) {
 
  249             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  261             new Timeout(
"pausing", 10000).sleep();
 
  263             logger.info(
"Looking for hash lookup module in ingest job settings panel");
 
  264             WizardOperator wo = 
new WizardOperator(
"Add Data Source");
 
  265             while (!wo.btNext().isEnabled()) {
 
  266                 new Timeout(
"pausing", 1000).sleep(); 
 
  268             JTableOperator jto = 
new JTableOperator(wo, 0);
 
  269             int row = jto.findCellRow(
"Hash Lookup", 2, 0);
 
  270             jto.clickOnCell(row, 1);
 
  271             logger.info(
"Selected hash lookup module in ingest job settings panel");
 
  272             JButtonOperator jbo1 = 
new JButtonOperator(wo, 
"Global Settings");
 
  274             logger.info(
"Pushed Global Settings button for hash lookup module in ingest job settings panel");
 
  275         } 
catch (TimeoutExpiredException ex) {
 
  276             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  284             logger.info(
"Hash Configure");
 
  285             JDialog hashMainDialog = JDialogOperator.waitJDialog(
"Global Hash Lookup Settings", 
false, 
false);
 
  286             JDialogOperator hashMainDialogOperator = 
new JDialogOperator(hashMainDialog);
 
  287             List<String> databases = 
new ArrayList<>();
 
  289             databases.add(
getEscapedPath(System.getProperty(
"known_bad_path")));
 
  290             databases.stream().map((database) -> {
 
  291                 JButtonOperator importButtonOperator = 
new JButtonOperator(hashMainDialogOperator, 
"Import");
 
  292                 importButtonOperator.pushNoBlock();
 
  293                 JDialog addDatabaseDialog = JDialogOperator.waitJDialog(
"Import Hash Set", 
false, 
false);
 
  294                 JDialogOperator addDatabaseDialogOperator = 
new JDialogOperator(addDatabaseDialog);
 
  295                 JButtonOperator browseButtonOperator = 
new JButtonOperator(addDatabaseDialogOperator, 
"Open...", 0);
 
  296                 browseButtonOperator.pushNoBlock();
 
  297                 JFileChooserOperator fileChooserOperator = 
new JFileChooserOperator();
 
  298                 fileChooserOperator.chooseFile(database);
 
  299                 JButtonOperator okButtonOperator = 
new JButtonOperator(addDatabaseDialogOperator, 
"OK", 0);
 
  300                 return okButtonOperator;
 
  301             }).map((okButtonOperator) -> {
 
  302                 okButtonOperator.pushNoBlock();
 
  303                 return okButtonOperator;
 
  304             }).forEach((_item) -> {
 
  305                 new Timeout(
"pausing", 1000).sleep(); 
 
  311             new Timeout(
"pausing", 1000).sleep(); 
 
  313             JButtonOperator jbo4 = 
new JButtonOperator(hashMainDialogOperator, 
"OK", 0);
 
  315         } 
catch (TimeoutExpiredException ex) {
 
  316             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  324             logger.info(
"Looking for keyword search module in ingest job settings panel");
 
  325             WizardOperator wo = 
new WizardOperator(
"Add Data Source");
 
  326             while (!wo.btNext().isEnabled()) {
 
  327                 new Timeout(
"pausing", 1000).sleep(); 
 
  329             JTableOperator jto = 
new JTableOperator(wo, 0);
 
  330             int row = jto.findCellRow(
"Keyword Search", 2, 0);
 
  331             jto.clickOnCell(row, 1);
 
  332             logger.info(
"Selected keyword search module in ingest job settings panel");
 
  333             JButtonOperator jbo1 = 
new JButtonOperator(wo, 
"Global Settings");
 
  335             logger.info(
"Pushed Global Settings button for keyword search module in ingest job settings panel");
 
  336         } 
catch (TimeoutExpiredException ex) {
 
  337             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  345             logger.info(
"Search Configure");
 
  346             JDialog jd = JDialogOperator.waitJDialog(
"Global Keyword Search Settings", 
false, 
false);
 
  347             JDialogOperator jdo = 
new JDialogOperator(jd);
 
  348             String words = 
getEscapedPath(System.getProperty(
"keyword_path"));
 
  349             JButtonOperator jbo0 = 
new JButtonOperator(jdo, 
"Import List", 0);
 
  351             JFileChooserOperator jfco0 = 
new JFileChooserOperator();
 
  352             jfco0.chooseFile(words);
 
  353             JTableOperator jto = 
new JTableOperator(jdo, 0);
 
  354             jto.clickOnCell(0, 0);
 
  355             new Timeout(
"pausing", 1000).sleep(); 
 
  356             if (Boolean.parseBoolean(System.getProperty(
"mugen_mode"))) {
 
  357                 JTabbedPaneOperator jtpo = 
new JTabbedPaneOperator(jdo);
 
  358                 jtpo.selectPage(
"String Extraction");
 
  359                 JCheckBoxOperator jcbo0 = 
new JCheckBoxOperator(jtpo, 
"Arabic (Arabic)");
 
  361                 JCheckBoxOperator jcbo1 = 
new JCheckBoxOperator(jtpo, 
"Han (Chinese, Japanese, Korean)");
 
  363                 new Timeout(
"pausing", 1000).sleep(); 
 
  365             JButtonOperator jbo2 = 
new JButtonOperator(jdo, 
"OK", 0);
 
  367             WizardOperator wo = 
new WizardOperator(
"Add Data Source");
 
  368             new Timeout(
"pausing", 10000).sleep(); 
 
  369             wo.btNext().clickMouse();
 
  370         } 
catch (TimeoutExpiredException ex) {
 
  371             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  379             logger.info(
"Ingest 3");
 
  380             new Timeout(
"pausing", 10000).sleep(); 
 
  381             long startIngest = System.currentTimeMillis();
 
  384                 new Timeout(
"pausing", 1000).sleep(); 
 
  386             logger.log(Level.INFO, 
"Ingest (including enqueue) took {0}ms", (System.currentTimeMillis() - startIngest));
 
  390             Random rand = 
new Random();
 
  391             new Timeout(
"pausing", 10000 + (rand.nextInt(15000) + 5000)).sleep();
 
  392         } 
catch (TimeoutExpiredException ex) {
 
  393             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  402             logger.info(
"Data Sources Node");
 
  403             MainWindowOperator mwo = MainWindowOperator.getDefault();
 
  404             JTreeOperator jto = 
new JTreeOperator(mwo, 
"Data Sources");
 
  405             String[] nodeNames = {
"Data Sources"};
 
  406             TreePath tp = jto.findPath(nodeNames);
 
  408         } 
catch (TimeoutExpiredException ex) {
 
  409             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  417             logger.info(
"Generate Report Toolbars");
 
  418             MainWindowOperator mwo = MainWindowOperator.getDefault();
 
  419             JButtonOperator jbo = 
new JButtonOperator(mwo, 
"Generate Report");
 
  421         } 
catch (TimeoutExpiredException ex) {
 
  422             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  430             logger.info(
"Generate Report Button");
 
  431             setTimeout(
"ComponentOperator.WaitComponentTimeout", 240000);
 
  432             JDialog reportDialog = JDialogOperator.waitJDialog(
"Generate Report", 
false, 
false);
 
  433             JDialogOperator reportDialogOperator = 
new JDialogOperator(reportDialog);
 
  434             JListOperator listOperator = 
new JListOperator(reportDialogOperator);
 
  435             JButtonOperator jbo0 = 
new JButtonOperator(reportDialogOperator, 
"Next");
 
  436             DateFormat dateFormat = 
new SimpleDateFormat(
"MM-dd-yyyy-HH-mm-ss");
 
  437             Date date = 
new Date();
 
  438             String datenotime = dateFormat.format(date);
 
  439             listOperator.clickOnItem(0, 1);
 
  441             new Timeout(
"pausing", 2000).sleep();
 
  444             JButtonOperator dataSourceSelectionPanelNext = 
new JButtonOperator(reportDialogOperator, 
"Next");
 
  445             dataSourceSelectionPanelNext.pushNoBlock();
 
  446             new Timeout(
"pausing", 2000).sleep();
 
  448             JButtonOperator jbo1 = 
new JButtonOperator(reportDialogOperator, 
"Finish");
 
  450             JDialog previewDialog = JDialogOperator.waitJDialog(
"Progress", 
false, 
false);
 
  451             JDialogOperator previewDialogOperator = 
new JDialogOperator(previewDialog);
 
  452             JTextAreaOperator.waitJTextArea(previewDialog, 
"Complete", 
false, 
false);
 
  453             JButtonOperator jbo2 = 
new JButtonOperator(previewDialogOperator, 
"Close");
 
  455             new Timeout(
"pausing", 10000).sleep();
 
  456             System.setProperty(
"ReportStr", datenotime);
 
  457         } 
catch (TimeoutExpiredException ex) {
 
  458             logger.log(Level.SEVERE, 
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
 
  466         File screenShotFile = 
new File(outPath + 
"\\" + name + 
".png");
 
  467         if (!screenShotFile.exists()) {
 
  468             logger.info(
"Taking screenshot.");
 
  470                 Rectangle screenRect = 
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
 
  471                 BufferedImage capture = 
new Robot().createScreenCapture(screenRect);
 
  472                 ImageIO.write(capture, 
"png", screenShotFile);
 
  473                 new Timeout(
"pausing", 1000).sleep(); 
 
  474             } 
catch (IOException ex) {
 
  475                 logger.log(Level.WARNING, 
"IOException taking screenshot.", ex);
 
  476             } 
catch (AWTException ex) {
 
  477                 logger.log(Level.WARNING, 
"AWTException taking screenshot.", ex);
 
  488         Timeouts timeouts = JemmyProperties.getCurrentTimeouts();
 
  489         timeouts.setTimeout(name, value);
 
  497                 System.getProperty(
"dbHost"),
 
  498                 System.getProperty(
"dbPort"),
 
  499                 System.getProperty(
"dbUserName"),
 
  500                 System.getProperty(
"dbPassword"),
 
  505             logger.log(Level.SEVERE, 
"Error saving case database connection info", ex); 
 
  513                 System.getProperty(
"messageServiceHost"),
 
  514                 Integer.parseInt(System.getProperty(
"messageServicePort")),
 
  520             logger.log(Level.SEVERE, 
"Error saving messaging service connection info", ex); 
 
  531             for (TreePath t : jto.getChildPaths(tp)) {
 
  534         } 
catch (NoSuchPathException ne) {
 
  535             logger.log(Level.SEVERE, 
"Error expanding tree path", ne);
 
  545     private static final String 
NEWLINE = System.lineSeparator();
 
  549     private static Set<String> 
IGNORED_PROCESSES = Stream.of(
"_Total", 
"Idle", 
"Memory Compression").collect(Collectors.toSet());
 
  561                 List<Map<String, String>> processPerformance = 
getWmicTable(
"wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime,IOReadBytesPerSec,IOWriteBytesPerSec,WorkingSetPeak").stream()
 
  562                         .filter(obj -> !IGNORED_PROCESSES.contains(obj.get(
"name")))
 
  563                         .collect(Collectors.toList());
 
  565                 List<Pair<String, Long>> cpuUsageProcesses = 
getKeyValLimited(processPerformance, 
"name", 
"percentprocessortime");
 
  566                 List<Pair<String, Long>> memUsageProcesses = 
getKeyValLimited(processPerformance, 
"name", 
"workingsetpeak");
 
  571                             String key = obj.get(
"name");
 
  577                                 return Triple.of(key, Long.parseLong(obj.get(
"ioreadbytespersec")), Long.parseLong(obj.get(
"iowritebytespersec")));
 
  578                             } 
catch (NumberFormatException | NullPointerException ex) {
 
  583                         Comparator.comparing(pr -> -(pr.getMiddle() + pr.getRight())));
 
  585                 String cpuLoad = 
getWmicString(
"wmic cpu get loadpercentage", 
"loadpercentage");
 
  586                 String cpuCores = 
getWmicString(
"wmic cpu get numberofcores", 
"numberofcores");
 
  587                 String freePhysicalMemory = 
getWmicString(
"wmic OS get FreeSpaceInPagingFiles", 
"freespaceinpagingfiles"); 
 
  588                 String totalPhysicalMemory = 
getWmicString(
"wmic ComputerSystem get TotalPhysicalMemory", 
"totalphysicalmemory"); 
 
  591                     double freeMemMb = Double.parseDouble(freePhysicalMemory) / 1000;
 
  592                     double totalMemMb = Double.parseDouble(totalPhysicalMemory) / 1000 / 1000;
 
  593                     memUsage = MessageFormat.format(
"Free Physical Memory: {0,number,#.##}MB and total physical: {1,number,#.##}MB", freeMemMb, totalMemMb);
 
  594                 } 
catch (NumberFormatException ex) {
 
  595                     memUsage = MessageFormat.format(
"Free Physical Memory: \"{0}\" and total physical: \"{1}\"", freePhysicalMemory, totalPhysicalMemory);
 
  599                         getWmicTable(
"wmic path win32_networkadapter where \"netconnectionstatus = 2 OR NOT errordescription IS NULL\" get netconnectionid, name, speed, maxspeed, errordescription"),
 
  600                         (Map<String, String> obj) -> {
 
  601                             String name = obj.get(
"netconnectionid");
 
  602                             if (StringUtils.isBlank(name)) {
 
  603                                 name = obj.get(
"name");
 
  606                             if (StringUtils.isBlank(name)) {
 
  610                             String errorDescription = obj.get(
"errordescription");
 
  614                                 speed = Long.parseLong(obj.get(
"speed"));
 
  615                             } 
catch (NumberFormatException | NullPointerException ex) {
 
  618                             return Triple.of(name, speed, errorDescription);
 
  620                         (a, b) -> StringUtils.compareIgnoreCase(a.getLeft(), b.getRight()));
 
  623                         getWmicTable(
"wmic path Win32_PerfFormattedData_PerfDisk_LogicalDisk get AvgDiskQueueLength,Name").stream()
 
  624                                 .filter(obj -> !IGNORED_PROCESSES.contains(obj.get(
"name")))
 
  625                                 .collect(Collectors.toList()),
 
  627                         "avgdiskqueuelength");
 
  629                 return "SYSTEM DIAGNOSTICS:" + NEWLINE
 
  630                         + MessageFormat.format(
"CPU Load Percentage: {0}% with {1} cores", cpuLoad, cpuCores) + NEWLINE
 
  631                         + MessageFormat.format(
"Memory Usage: {0}", memUsage) + NEWLINE
 
  632                         + 
"Disk Usage (disk to average disk queue length): " + NEWLINE
 
  633                         + diskStatus.stream().map(pr -> pr.getKey() + 
": " + pr.getValue()).collect(Collectors.joining(NEWLINE)) + NEWLINE
 
  635                         + 
"Network Status (of only connected or error): " + NEWLINE
 
  636                         + networkStatus.stream().map(obj -> {
 
  637                             String errorString = StringUtils.isBlank(obj.getRight()) ? 
"" : MessageFormat.format(
" (error: {0})", obj.getRight());
 
  638                             return MessageFormat.format(
"{0}: {1,number,#.##}MB/S possible {2}", obj.getLeft(), ((double) obj.getMiddle()) / 1000 / 1000, errorString);
 
  639                         }).collect(Collectors.joining(NEWLINE)) + NEWLINE
 
  641                         + 
"CPU consuming processes: " + NEWLINE
 
  642                         + cpuUsageProcesses.stream().map(pr -> MessageFormat.format(
"{0}: {1}%", pr.getKey(), pr.getValue())).collect(Collectors.joining(NEWLINE)) + NEWLINE
 
  644                         + 
"Memory consuming processes (working set peak): " + NEWLINE
 
  645                         + memUsageProcesses.stream()
 
  647                                         pr -> MessageFormat.format(
 
  648                                                 "{0}: {1,number,#.##}MB",
 
  650                                                 ((double) pr.getValue()) / 1000 / 1000
 
  653                                 .collect(Collectors.joining(NEWLINE)) + NEWLINE
 
  655                         + 
"I/O consuming processes (read/write): " + NEWLINE
 
  656                         + ioProcesses.stream()
 
  658                                         pr -> MessageFormat.format(
 
  659                                                 "{0}: {1,number,#.##}MB/{2,number,#.##}MB", pr.getLeft(),
 
  660                                                 ((double) pr.getMiddle()) / 1000 / 1000,
 
  661                                                 ((
double) pr.getRight()) / 1000 / 1000
 
  664                                 .collect(Collectors.joining(NEWLINE)) + NEWLINE;
 
  665             } 
catch (Throwable ex) {
 
  666                 return "SYSTEM DIAGNOSTICS:" + NEWLINE
 
  667                         + 
"Encountered IO exception: " + ex.getMessage() + 
NEWLINE;
 
  671             return "System diagnostics only implemented for windows at this time.";
 
  682     private static List<Pair<String, Long>> 
getKeyValLimited(List<Map<String, String>> objects, String keyId, String valId) {
 
  686                     String key = obj.get(keyId);
 
  692                         return Pair.of(key, Long.parseLong(obj.get(valId)));
 
  693                     } 
catch (NumberFormatException | NullPointerException ex) {
 
  697                 Comparator.comparing(pr -> -pr.getValue()));
 
  707     private static <T> List<T> 
getFilteredLimited(List<Map<String, String>> objects, Function<Map<String, String>, T> keyObjMapper, Comparator<T> comparator) {
 
  708         return objects.stream()
 
  710                 .filter(a -> a != null)
 
  713                 .collect(Collectors.toList());
 
  723         ProcessBuilder pb = 
new ProcessBuilder(cmd);
 
  724         String output = IOUtils.toString(pb.start().getInputStream(), StandardCharsets.UTF_8);
 
  741     private static List<Map<String, String>> 
getWmicTable(String cmd) 
throws IOException {
 
  742         String stdOut = 
getProcStdOut(
"cmd", 
"/c", cmd + 
" /format:list");
 
  744         List<Map<String, String>> rows = 
new ArrayList<>();
 
  745         Map<String, String> curObj = 
new HashMap<>();
 
  746         for (String line : stdOut.split(
"\\r?\\n")) {
 
  748             if (StringUtils.isNotBlank(line)) {
 
  749                 Matcher matcher = EQUALS_PATTERN.matcher(line);
 
  750                 if (matcher.find()) {
 
  751                     String key = matcher.group(1).trim().toLowerCase();
 
  752                     String value = matcher.group(2).trim();
 
  753                     curObj.put(key, value);
 
  756             } 
else if (!curObj.isEmpty()) {
 
  758                 curObj = 
new HashMap<>();
 
  762         if (!curObj.isEmpty()) {
 
  764             curObj = 
new HashMap<>();
 
  777     private static String 
getWmicString(String wmicQuery, String key) 
throws IOException {
 
  778         List<Map<String, String>> retVal = 
getWmicTable(wmicQuery);
 
  779         if (retVal != null && !retVal.isEmpty() && retVal.get(0) != null && retVal.get(0).get(key) != null) {
 
  780             return retVal.get(0).get(key);
 
static void setZkServerHost(String hostName)
void screenshot(String name)
static String getProcStdOut(String...cmd)
void testConfigureSearch()
static synchronized IngestManager getInstance()
void testGenerateReportToolbar()
static void setZkServerPort(String port)
void testStartAddLogicalFilesDataSource()
static final long DIALOG_FIND_TIMEOUT_MINUTES
void testConfigureIngest1()
void testAddSourceWizard1()
boolean isIngestRunning()
static List< Map< String, String > > getWmicTable(String cmd)
static List< Pair< String, Long > > getKeyValLimited(List< Map< String, String >> objects, String keyId, String valId)
static String getEscapedPath(String path)
Timeouts setTimeout(String name, int value)
static void setIsMultiUserModeEnabled(boolean enabled)
static void setMessageServiceConnectionInfo(MessageServiceConnectionInfo info)
void testExpandDataSourcesTree()
static< T > List< T > getFilteredLimited(List< Map< String, String >> objects, Function< Map< String, String >, T > keyObjMapper, Comparator< T > comparator)
void expandNodes(JTreeOperator jto, TreePath tp)
static String getSystemDiagnostics()
void setMultiUserPerferences()
static Set< String > IGNORED_PROCESSES
static void setDatabaseConnectionInfo(CaseDbConnectionInfo connectionInfo)
static String getWmicString(String wmicQuery, String key)
static void setIndexingServerHost(String hostName)
static void setIndexingServerPort(int port)
void testGenerateReportButton()
void logSystemDiagnostics()
void testNewCaseWizardOpen(String title)
AutopsyTestCases(boolean isMultiUser)
static final Logger logger
void testStartAddImageFileDataSource()
static final String NEWLINE
void testConfigureIngest2()
static final Pattern EQUALS_PATTERN