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