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.text.JTextComponent;
50 import javax.swing.tree.TreePath;
51 import org.apache.commons.io.IOUtils;
52 import org.apache.commons.lang3.StringUtils;
53 import org.apache.commons.lang3.tuple.Pair;
54 import org.apache.commons.lang3.tuple.Triple;
55 import org.netbeans.jellytools.MainWindowOperator;
56 import org.netbeans.jellytools.NbDialogOperator;
57 import org.netbeans.jellytools.WizardOperator;
58 import org.netbeans.jemmy.JemmyProperties;
59 import org.netbeans.jemmy.Timeout;
60 import org.netbeans.jemmy.TimeoutExpiredException;
61 import org.netbeans.jemmy.Timeouts;
62 import org.netbeans.jemmy.operators.JButtonOperator;
63 import org.netbeans.jemmy.operators.JCheckBoxOperator;
64 import org.netbeans.jemmy.operators.JComboBoxOperator;
65 import org.netbeans.jemmy.operators.JDialogOperator;
66 import org.netbeans.jemmy.operators.JFileChooserOperator;
67 import org.netbeans.jemmy.operators.JLabelOperator;
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 JTextFieldOperator jtfo0 =
new JTextFieldOperator(wo, 0);
182 String imageDir = img_path;
183 ((JTextComponent) jtfo0.getSource()).setText(imageDir);
184 JComboBoxOperator comboBoxOperator =
new JComboBoxOperator(wo, 0);
185 comboBoxOperator.setSelectedItem(
"(GMT-5:00) America/New_York");
186 wo.btNext().clickMouse();
187 }
catch (TimeoutExpiredException ex) {
188 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
200 new Timeout(
"pausing", 120000).sleep();
201 logger.info(
"Starting Add Logical Files process");
202 WizardOperator wo =
new WizardOperator(
"Add Data Source");
203 wo.setTimeouts(
setTimeout(
"WindowWaiter.WaitWindowTimeOut", 240000));
204 while (!wo.btNext().isEnabled()) {
205 new Timeout(
"pausing", 1000).sleep();
209 wo.btNext().clickMouse();
212 JToggleButtonOperator jtbo =
new JToggleButtonOperator(wo, 2);
214 wo.btNext().clickMouse();
215 JButtonOperator addButtonOperator =
new JButtonOperator(wo,
"Add");
216 addButtonOperator.pushNoBlock();
217 JFileChooserOperator fileChooserOperator =
new JFileChooserOperator();
218 fileChooserOperator.setCurrentDirectory(
new File(
getEscapedPath(System.getProperty(
"img_path"))));
220 fileChooserOperator.goUpLevel();
221 fileChooserOperator.chooseFile(
new File(
getEscapedPath(System.getProperty(
"img_path"))).getName());
222 wo.btNext().clickMouse();
223 }
catch (TimeoutExpiredException ex) {
224 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
232 WizardOperator wo =
new WizardOperator(
"Add Data Source");
233 while (!wo.btFinish().isEnabled()) {
234 new Timeout(
"pausing", 1000).sleep();
236 logger.log(Level.INFO,
"Add image took {0}ms", (System.currentTimeMillis() -
start));
237 wo.btFinish().clickMouse();
238 }
catch (TimeoutExpiredException ex) {
239 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
251 new Timeout(
"pausing", 10000).sleep();
253 logger.info(
"Looking for hash lookup module in ingest job settings panel");
254 WizardOperator wo =
new WizardOperator(
"Add Data Source");
255 while (!wo.btNext().isEnabled()) {
256 new Timeout(
"pausing", 1000).sleep();
258 JTableOperator jto =
new JTableOperator(wo, 0);
259 int row = jto.findCellRow(
"Hash Lookup", 2, 0);
260 jto.clickOnCell(row, 1);
261 logger.info(
"Selected hash lookup module in ingest job settings panel");
262 JButtonOperator jbo1 =
new JButtonOperator(wo,
"Global Settings");
264 logger.info(
"Pushed Global Settings button for hash lookup module in ingest job settings panel");
265 }
catch (TimeoutExpiredException ex) {
266 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
274 logger.info(
"Hash Configure");
275 JDialog hashMainDialog = JDialogOperator.waitJDialog(
"Global Hash Lookup Settings",
false,
false);
276 JDialogOperator hashMainDialogOperator =
new JDialogOperator(hashMainDialog);
277 List<String> databases =
new ArrayList<>();
279 databases.add(
getEscapedPath(System.getProperty(
"known_bad_path")));
280 databases.stream().map((database) -> {
281 JButtonOperator importButtonOperator =
new JButtonOperator(hashMainDialogOperator,
"Import");
282 importButtonOperator.pushNoBlock();
283 JDialog addDatabaseDialog = JDialogOperator.waitJDialog(
"Import Hash Set",
false,
false);
284 JDialogOperator addDatabaseDialogOperator =
new JDialogOperator(addDatabaseDialog);
285 JButtonOperator browseButtonOperator =
new JButtonOperator(addDatabaseDialogOperator,
"Open...", 0);
286 browseButtonOperator.pushNoBlock();
287 JFileChooserOperator fileChooserOperator =
new JFileChooserOperator();
288 fileChooserOperator.chooseFile(database);
289 JButtonOperator okButtonOperator =
new JButtonOperator(addDatabaseDialogOperator,
"OK", 0);
290 return okButtonOperator;
291 }).map((okButtonOperator) -> {
292 okButtonOperator.pushNoBlock();
293 return okButtonOperator;
294 }).forEach((_item) -> {
295 new Timeout(
"pausing", 1000).sleep();
301 new Timeout(
"pausing", 1000).sleep();
303 JButtonOperator jbo4 =
new JButtonOperator(hashMainDialogOperator,
"OK", 0);
305 }
catch (TimeoutExpiredException ex) {
306 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
314 logger.info(
"Looking for keyword search module in ingest job settings panel");
315 WizardOperator wo =
new WizardOperator(
"Add Data Source");
316 while (!wo.btNext().isEnabled()) {
317 new Timeout(
"pausing", 1000).sleep();
319 JTableOperator jto =
new JTableOperator(wo, 0);
320 int row = jto.findCellRow(
"Keyword Search", 2, 0);
321 jto.clickOnCell(row, 1);
322 logger.info(
"Selected keyword search module in ingest job settings panel");
323 JButtonOperator jbo1 =
new JButtonOperator(wo,
"Global Settings");
325 logger.info(
"Pushed Global Settings button for keyword search module in ingest job settings panel");
326 }
catch (TimeoutExpiredException ex) {
327 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
335 logger.info(
"Search Configure");
336 JDialog jd = JDialogOperator.waitJDialog(
"Global Keyword Search Settings",
false,
false);
337 JDialogOperator jdo =
new JDialogOperator(jd);
338 String words =
getEscapedPath(System.getProperty(
"keyword_path"));
339 JButtonOperator jbo0 =
new JButtonOperator(jdo,
"Import List", 0);
341 JFileChooserOperator jfco0 =
new JFileChooserOperator();
342 jfco0.chooseFile(words);
343 JTableOperator jto =
new JTableOperator(jdo, 0);
344 jto.clickOnCell(0, 0);
345 new Timeout(
"pausing", 1000).sleep();
346 if (Boolean.parseBoolean(System.getProperty(
"mugen_mode"))) {
347 JTabbedPaneOperator jtpo =
new JTabbedPaneOperator(jdo);
348 jtpo.selectPage(
"String Extraction");
349 JCheckBoxOperator jcbo0 =
new JCheckBoxOperator(jtpo,
"Arabic (Arabic)");
351 JCheckBoxOperator jcbo1 =
new JCheckBoxOperator(jtpo,
"Han (Chinese, Japanese, Korean)");
353 new Timeout(
"pausing", 1000).sleep();
355 JButtonOperator jbo2 =
new JButtonOperator(jdo,
"OK", 0);
357 WizardOperator wo =
new WizardOperator(
"Add Data Source");
358 new Timeout(
"pausing", 10000).sleep();
359 wo.btNext().clickMouse();
360 }
catch (TimeoutExpiredException ex) {
361 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
369 logger.info(
"Ingest 3");
370 new Timeout(
"pausing", 10000).sleep();
371 long startIngest = System.currentTimeMillis();
374 new Timeout(
"pausing", 1000).sleep();
376 logger.log(Level.INFO,
"Ingest (including enqueue) took {0}ms", (System.currentTimeMillis() - startIngest));
380 Random rand =
new Random();
381 new Timeout(
"pausing", 10000 + (rand.nextInt(15000) + 5000)).sleep();
382 }
catch (TimeoutExpiredException ex) {
383 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
392 logger.info(
"Data Sources Node");
393 MainWindowOperator mwo = MainWindowOperator.getDefault();
394 JTreeOperator jto =
new JTreeOperator(mwo,
"Data Sources");
395 String[] nodeNames = {
"Data Sources"};
396 TreePath tp = jto.findPath(nodeNames);
398 }
catch (TimeoutExpiredException ex) {
399 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
407 logger.info(
"Generate Report Toolbars");
408 MainWindowOperator mwo = MainWindowOperator.getDefault();
409 JButtonOperator jbo =
new JButtonOperator(mwo,
"Generate Report");
411 }
catch (TimeoutExpiredException ex) {
412 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
420 logger.info(
"Generate Report Button");
421 setTimeout(
"ComponentOperator.WaitComponentTimeout", 240000);
422 JDialog reportDialog = JDialogOperator.waitJDialog(
"Generate Report",
false,
false);
423 JDialogOperator reportDialogOperator =
new JDialogOperator(reportDialog);
424 JListOperator listOperator =
new JListOperator(reportDialogOperator);
425 JButtonOperator jbo0 =
new JButtonOperator(reportDialogOperator,
"Next");
426 DateFormat dateFormat =
new SimpleDateFormat(
"MM-dd-yyyy-HH-mm-ss");
427 Date date =
new Date();
428 String datenotime = dateFormat.format(date);
429 listOperator.clickOnItem(0, 1);
431 new Timeout(
"pausing", 2000).sleep();
434 JButtonOperator dataSourceSelectionPanelNext =
new JButtonOperator(reportDialogOperator,
"Next");
435 dataSourceSelectionPanelNext.pushNoBlock();
436 new Timeout(
"pausing", 2000).sleep();
438 JButtonOperator jbo1 =
new JButtonOperator(reportDialogOperator,
"Finish");
440 JDialog previewDialog = JDialogOperator.waitJDialog(
"Progress",
false,
false);
441 JDialogOperator previewDialogOperator =
new JDialogOperator(previewDialog);
442 JTextAreaOperator.waitJTextArea(previewDialog,
"Complete",
false,
false);
443 JButtonOperator jbo2 =
new JButtonOperator(previewDialogOperator,
"Close");
445 new Timeout(
"pausing", 10000).sleep();
446 System.setProperty(
"ReportStr", datenotime);
447 }
catch (TimeoutExpiredException ex) {
448 logger.log(Level.SEVERE,
"AutopsyTestCases.testNewCaseWizard encountered timed out", ex);
456 File screenShotFile =
new File(outPath +
"\\" + name +
".png");
457 if (!screenShotFile.exists()) {
458 logger.info(
"Taking screenshot.");
460 Rectangle screenRect =
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
461 BufferedImage capture =
new Robot().createScreenCapture(screenRect);
462 ImageIO.write(capture,
"png", screenShotFile);
463 new Timeout(
"pausing", 1000).sleep();
464 }
catch (IOException ex) {
465 logger.log(Level.WARNING,
"IOException taking screenshot.", ex);
466 }
catch (AWTException ex) {
467 logger.log(Level.WARNING,
"AWTException taking screenshot.", ex);
478 Timeouts timeouts = JemmyProperties.getCurrentTimeouts();
479 timeouts.setTimeout(name, value);
486 CaseDbConnectionInfo connectionInfo =
new CaseDbConnectionInfo(
487 System.getProperty(
"dbHost"),
488 System.getProperty(
"dbPort"),
489 System.getProperty(
"dbUserName"),
490 System.getProperty(
"dbPassword"),
491 TskData.DbType.POSTGRESQL);
495 logger.log(Level.SEVERE,
"Error saving case database connection info", ex);
503 System.getProperty(
"messageServiceHost"),
504 Integer.parseInt(System.getProperty(
"messageServicePort")),
510 logger.log(Level.SEVERE,
"Error saving messaging service connection info", ex);
521 for (TreePath t : jto.getChildPaths(tp)) {
524 }
catch (NoSuchPathException ne) {
525 logger.log(Level.SEVERE,
"Error expanding tree path", ne);
535 private static final String
NEWLINE = System.lineSeparator();
539 private static Set<String>
IGNORED_PROCESSES = Stream.of(
"_Total",
"Idle",
"Memory Compression").collect(Collectors.toSet());
551 List<Map<String, String>> processPerformance =
getWmicTable(
"wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime,IOReadBytesPerSec,IOWriteBytesPerSec,WorkingSetPeak").stream()
552 .filter(obj -> !IGNORED_PROCESSES.contains(obj.get(
"name")))
553 .collect(Collectors.toList());
555 List<Pair<String, Long>> cpuUsageProcesses =
getKeyValLimited(processPerformance,
"name",
"percentprocessortime");
556 List<Pair<String, Long>> memUsageProcesses =
getKeyValLimited(processPerformance,
"name",
"workingsetpeak");
561 String key = obj.get(
"name");
567 return Triple.of(key, Long.parseLong(obj.get(
"ioreadbytespersec")), Long.parseLong(obj.get(
"iowritebytespersec")));
568 }
catch (NumberFormatException | NullPointerException ex) {
573 Comparator.comparing(pr -> -(pr.getMiddle() + pr.getRight())));
575 String cpuLoad =
getWmicString(
"wmic cpu get loadpercentage",
"loadpercentage");
576 String cpuCores =
getWmicString(
"wmic cpu get numberofcores",
"numberofcores");
577 String freePhysicalMemory =
getWmicString(
"wmic OS get FreeSpaceInPagingFiles",
"freespaceinpagingfiles");
578 String totalPhysicalMemory =
getWmicString(
"wmic ComputerSystem get TotalPhysicalMemory",
"totalphysicalmemory");
581 double freeMemMb = Double.parseDouble(freePhysicalMemory) / 1000;
582 double totalMemMb = Double.parseDouble(totalPhysicalMemory) / 1000 / 1000;
583 memUsage = MessageFormat.format(
"Free Physical Memory: {0,number,#.##}MB and total physical: {1,number,#.##}MB", freeMemMb, totalMemMb);
584 }
catch (NumberFormatException ex) {
585 memUsage = MessageFormat.format(
"Free Physical Memory: \"{0}\" and total physical: \"{1}\"", freePhysicalMemory, totalPhysicalMemory);
589 getWmicTable(
"wmic path win32_networkadapter where \"netconnectionstatus = 2 OR NOT errordescription IS NULL\" get netconnectionid, name, speed, maxspeed, errordescription"),
590 (Map<String, String> obj) -> {
591 String name = obj.get(
"netconnectionid");
592 if (StringUtils.isBlank(name)) {
593 name = obj.get(
"name");
596 if (StringUtils.isBlank(name)) {
600 String errorDescription = obj.get(
"errordescription");
604 speed = Long.parseLong(obj.get(
"speed"));
605 }
catch (NumberFormatException | NullPointerException ex) {
608 return Triple.of(name, speed, errorDescription);
610 (a, b) -> StringUtils.compareIgnoreCase(a.getLeft(), b.getRight()));
613 getWmicTable(
"wmic path Win32_PerfFormattedData_PerfDisk_LogicalDisk get AvgDiskQueueLength,Name").stream()
614 .filter(obj -> !IGNORED_PROCESSES.contains(obj.get(
"name")))
615 .collect(Collectors.toList()),
617 "avgdiskqueuelength");
619 return "SYSTEM DIAGNOSTICS:" + NEWLINE
620 + MessageFormat.format(
"CPU Load Percentage: {0}% with {1} cores", cpuLoad, cpuCores) + NEWLINE
621 + MessageFormat.format(
"Memory Usage: {0}", memUsage) + NEWLINE
622 +
"Disk Usage (disk to average disk queue length): " + NEWLINE
623 + diskStatus.stream().map(pr -> pr.getKey() +
": " + pr.getValue()).collect(Collectors.joining(NEWLINE)) + NEWLINE
625 +
"Network Status (of only connected or error): " + NEWLINE
626 + networkStatus.stream().map(obj -> {
627 String errorString = StringUtils.isBlank(obj.getRight()) ?
"" : MessageFormat.format(
" (error: {0})", obj.getRight());
628 return MessageFormat.format(
"{0}: {1,number,#.##}MB/S possible {2}", obj.getLeft(), ((double) obj.getMiddle()) / 1000 / 1000, errorString);
629 }).collect(Collectors.joining(NEWLINE)) + NEWLINE
631 +
"CPU consuming processes: " + NEWLINE
632 + cpuUsageProcesses.stream().map(pr -> MessageFormat.format(
"{0}: {1}%", pr.getKey(), pr.getValue())).collect(Collectors.joining(NEWLINE)) + NEWLINE
634 +
"Memory consuming processes (working set peak): " + NEWLINE
635 + memUsageProcesses.stream()
637 pr -> MessageFormat.format(
638 "{0}: {1,number,#.##}MB",
640 ((double) pr.getValue()) / 1000 / 1000
643 .collect(Collectors.joining(NEWLINE)) + NEWLINE
645 +
"I/O consuming processes (read/write): " + NEWLINE
646 + ioProcesses.stream()
648 pr -> MessageFormat.format(
649 "{0}: {1,number,#.##}MB/{2,number,#.##}MB", pr.getLeft(),
650 ((double) pr.getMiddle()) / 1000 / 1000,
651 ((
double) pr.getRight()) / 1000 / 1000
654 .collect(Collectors.joining(NEWLINE)) + NEWLINE;
655 }
catch (Throwable ex) {
656 return "SYSTEM DIAGNOSTICS:" + NEWLINE
657 +
"Encountered IO exception: " + ex.getMessage() +
NEWLINE;
661 return "System diagnostics only implemented for windows at this time.";
672 private static List<Pair<String, Long>>
getKeyValLimited(List<Map<String, String>> objects, String keyId, String valId) {
676 String key = obj.get(keyId);
682 return Pair.of(key, Long.parseLong(obj.get(valId)));
683 }
catch (NumberFormatException | NullPointerException ex) {
687 Comparator.comparing(pr -> -pr.getValue()));
697 private static <T> List<T>
getFilteredLimited(List<Map<String, String>> objects, Function<Map<String, String>, T> keyObjMapper, Comparator<T> comparator) {
698 return objects.stream()
700 .filter(a -> a != null)
703 .collect(Collectors.toList());
713 ProcessBuilder pb =
new ProcessBuilder(cmd);
714 String output = IOUtils.toString(pb.start().getInputStream(), StandardCharsets.UTF_8);
731 private static List<Map<String, String>>
getWmicTable(String cmd)
throws IOException {
732 String stdOut =
getProcStdOut(
"cmd",
"/c", cmd +
" /format:list");
734 List<Map<String, String>> rows =
new ArrayList<>();
735 Map<String, String> curObj =
new HashMap<>();
736 for (String line : stdOut.split(
"\\r?\\n")) {
738 if (StringUtils.isNotBlank(line)) {
739 Matcher matcher = EQUALS_PATTERN.matcher(line);
740 if (matcher.find()) {
741 String key = matcher.group(1).trim().toLowerCase();
742 String value = matcher.group(2).trim();
743 curObj.put(key, value);
746 }
else if (!curObj.isEmpty()) {
748 curObj =
new HashMap<>();
752 if (!curObj.isEmpty()) {
754 curObj =
new HashMap<>();
767 private static String
getWmicString(String wmicQuery, String key)
throws IOException {
768 List<Map<String, String>> retVal =
getWmicTable(wmicQuery);
769 if (retVal != null && !retVal.isEmpty() && retVal.get(0) != null && retVal.get(0).get(key) != null) {
770 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