Autopsy  4.9.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
AutopsyTestCases.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2018 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.testing;
20 
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;
26 import java.io.File;
27 import java.io.IOException;
28 import java.text.DateFormat;
29 import java.text.SimpleDateFormat;
30 import java.util.ArrayList;
31 import java.util.Date;
32 import java.util.List;
33 import java.util.Random;
34 import java.util.logging.Level;
35 import java.util.logging.Logger;
36 import javax.imageio.ImageIO;
37 import javax.swing.JDialog;
38 import javax.swing.text.JTextComponent;
39 import javax.swing.tree.TreePath;
40 import org.netbeans.jellytools.MainWindowOperator;
41 import org.netbeans.jellytools.NbDialogOperator;
42 import org.netbeans.jellytools.WizardOperator;
43 import org.netbeans.jemmy.JemmyProperties;
44 import org.netbeans.jemmy.Timeout;
45 import org.netbeans.jemmy.Timeouts;
46 import org.netbeans.jemmy.operators.JButtonOperator;
47 import org.netbeans.jemmy.operators.JCheckBoxOperator;
48 import org.netbeans.jemmy.operators.JComboBoxOperator;
49 import org.netbeans.jemmy.operators.JDialogOperator;
50 import org.netbeans.jemmy.operators.JFileChooserOperator;
51 import org.netbeans.jemmy.operators.JLabelOperator;
52 import org.netbeans.jemmy.operators.JListOperator;
53 import org.netbeans.jemmy.operators.JTabbedPaneOperator;
54 import org.netbeans.jemmy.operators.JTableOperator;
55 import org.netbeans.jemmy.operators.JTextFieldOperator;
56 import org.netbeans.jemmy.operators.JToggleButtonOperator;
57 import org.netbeans.jemmy.operators.JTreeOperator;
58 import org.netbeans.jemmy.operators.JTreeOperator.NoSuchPathException;
63 import org.sleuthkit.datamodel.CaseDbConnectionInfo;
64 import org.sleuthkit.datamodel.TskData;
65 
66 public class AutopsyTestCases {
67 
68  private static final Logger logger = Logger.getLogger(AutopsyTestCases.class.getName());
69  private long start;
70 
78  public static String getEscapedPath(String path) {
79  if (path.startsWith("\\\\")) { //already has escaped to \\\\NetworkLocation
80  return path;
81  }
82  if (path.startsWith("\\")) {
83  return "\\" + path;
84  } else {
85  return path;
86  }
87  }
88 
89  public AutopsyTestCases(boolean isMultiUser) {
90  start = 0;
91  if (isMultiUser) {
93  } else {
95  }
96  }
97 
98  public void testNewCaseWizardOpen(String title) {
99  logger.info("New Case");
100  resetTimeouts("WindowWaiter.WaitWindowTimeout", 240000);
101  NbDialogOperator nbdo = new NbDialogOperator(title);
102  JButtonOperator jbo = new JButtonOperator(nbdo, 0); // the "New Case" button
103  jbo.pushNoBlock();
104  }
105 
106  public void testNewCaseWizard() {
107  logger.info("New Case Wizard");
108  WizardOperator wo = new WizardOperator("New Case Information");
109  JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 1);
110  jtfo0.typeText("AutopsyTestCase"); // Name the case "AutopsyTestCase"
111  JTextFieldOperator jtfo1 = new JTextFieldOperator(wo, 2);
112  jtfo1.typeText(getEscapedPath(System.getProperty("out_path")));
113  wo.btNext().clickMouse();
114  JTextFieldOperator jtfo2 = new JTextFieldOperator(wo, 0);
115  jtfo2.typeText("000"); // Set the case number
116  JTextFieldOperator jtfo3 = new JTextFieldOperator(wo, 1);
117  jtfo3.typeText("Examiner 1"); // Set the case examiner
118  start = System.currentTimeMillis();
119  wo.btFinish().clickMouse();
120  }
121 
123  /*
124  * This time out is to give time for creating case database and opening solr index
125  */
126  new Timeout("pausing", 120000).sleep();
127  logger.info("Starting Add Image process");
128  resetTimeouts("WindowWaiter.WaitWindowTimeOut", 240000);
129  WizardOperator wo = new WizardOperator("Add Data Source");
130  while(!wo.btNext().isEnabled()){
131  new Timeout("pausing", 1000).sleep(); // give it a second till the Add Data Source dialog enabled
132  }
133  //select the toggle button for Disk Image or VM File it will be the first button created and proceed to next panel
134  JToggleButtonOperator jtbo = new JToggleButtonOperator(wo, 0);
135  jtbo.clickMouse();
136  wo.btNext().clickMouse();
137  JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 0);
138  String img_path = getEscapedPath(System.getProperty("img_path"));
139  String imageDir = img_path;
140  ((JTextComponent) jtfo0.getSource()).setText(imageDir);
141  JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo, 0);
142  comboBoxOperator.setSelectedItem("(GMT-5:00) America/New_York");
143  wo.btNext().clickMouse();
144  }
145 
147  /*
148  * This time out is to give time for creating case database and opening solr index
149  */
150  new Timeout("pausing", 120000).sleep();
151  logger.info("Starting Add Logical Files process");
152  WizardOperator wo = new WizardOperator("Add Data Source");
153  wo.setTimeouts(resetTimeouts("WindowWaiter.WaitWindowTimeOut", 240000));
154  while(!wo.btNext().isEnabled()){
155  new Timeout("pausing", 1000).sleep(); // give it a second till the Add Data Source dialog enabled
156  }
157  //select the toggle button for Logical Files it will be the third button created and proceed to next panel
158  JToggleButtonOperator jtbo = new JToggleButtonOperator(wo, 2);
159  jtbo.clickMouse();
160  wo.btNext().clickMouse();
161  JButtonOperator addButtonOperator = new JButtonOperator(wo, "Add");
162  addButtonOperator.pushNoBlock();
163  JFileChooserOperator fileChooserOperator = new JFileChooserOperator();
164  fileChooserOperator.setCurrentDirectory(new File(getEscapedPath(System.getProperty("img_path"))));
165  // set the current directory one level above the directory containing logicalFileSet folder.
166  fileChooserOperator.goUpLevel();
167  fileChooserOperator.chooseFile(new File(getEscapedPath(System.getProperty("img_path"))).getName());
168  wo.btNext().clickMouse();
169  }
170 
171  public void testAddSourceWizard1() {
172  WizardOperator wo = new WizardOperator("Add Data Source");
173  while (!wo.btFinish().isEnabled()) {
174  new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
175  }
176  logger.log(Level.INFO, "Add image took {0}ms", (System.currentTimeMillis() - start));
177  wo.btFinish().clickMouse();
178  }
179 
180  public void testConfigureIngest1() {
181  /*
182  * This timeout is to allow the setup for the ingest job settings panel
183  * to complete.
184  */
185  new Timeout("pausing", 10000).sleep();
186 
187  logger.info("Looking for hash lookup module in ingest job settings panel");
188  WizardOperator wo = new WizardOperator("Add Data Source");
189  while(!wo.btNext().isEnabled()){
190  new Timeout("pausing", 1000).sleep(); // give it a second till the Add Data Source dialog enabled
191  }
192  JTableOperator jto = new JTableOperator(wo, 0);
193  int row = jto.findCellRow("Hash Lookup", 2, 0);
194  jto.clickOnCell(row, 1);
195  logger.info("Selected hash lookup module in ingest job settings panel");
196  JButtonOperator jbo1 = new JButtonOperator(wo, "Global Settings");
197  jbo1.pushNoBlock();
198  logger.info("Pushed Global Settings button for hash lookup module in ingest job settings panel");
199  }
200 
201  public void testConfigureHash() {
202  logger.info("Hash Configure");
203  JDialog hashMainDialog = JDialogOperator.waitJDialog("Global Hash Lookup Settings", false, false);
204  JDialogOperator hashMainDialogOperator = new JDialogOperator(hashMainDialog);
205  List<String> databases = new ArrayList<>();
206  databases.add(getEscapedPath(System.getProperty("nsrl_path")));
207  databases.add(getEscapedPath(System.getProperty("known_bad_path")));
208  databases.stream().map((database) -> {
209  JButtonOperator importButtonOperator = new JButtonOperator(hashMainDialogOperator, "Import");
210  importButtonOperator.pushNoBlock();
211  JDialog addDatabaseDialog = JDialogOperator.waitJDialog("Import Hash Set", false, false);
212  JDialogOperator addDatabaseDialogOperator = new JDialogOperator(addDatabaseDialog);
213  JButtonOperator browseButtonOperator = new JButtonOperator(addDatabaseDialogOperator, "Open...", 0);
214  browseButtonOperator.pushNoBlock();
215  JFileChooserOperator fileChooserOperator = new JFileChooserOperator();
216  fileChooserOperator.chooseFile(database);
217  JButtonOperator okButtonOperator = new JButtonOperator(addDatabaseDialogOperator, "OK", 0);
218  return okButtonOperator;
219  }).map((okButtonOperator) -> {
220  okButtonOperator.pushNoBlock();
221  return okButtonOperator;
222  }).forEach((_item) -> {
223  new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
224  });
225  // Used if the database has no index
226  //JDialog jd3 = JDialogOperator.waitJDialog("No Index Exists", false, false);
227  //JDialogOperator jdo3 = new JDialogOperator(jd3);
228  //JButtonOperator jbo3 = new JButtonOperator(jdo3, "Yes", 0);
229  new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
230  //jbo3.pushNoBlock();
231  JButtonOperator jbo4 = new JButtonOperator(hashMainDialogOperator, "OK", 0);
232  jbo4.pushNoBlock();
233  }
234 
235  public void testConfigureIngest2() {
236  logger.info("Looking for keyword search module in ingest job settings panel");
237  WizardOperator wo = new WizardOperator("Add Data Source");
238  while(!wo.btNext().isEnabled()){
239  new Timeout("pausing", 1000).sleep(); // give it a second till the Add Data Source dialog enabled
240  }
241  JTableOperator jto = new JTableOperator(wo, 0);
242  int row = jto.findCellRow("Keyword Search", 2, 0);
243  jto.clickOnCell(row, 1);
244  logger.info("Selected keyword search module in ingest job settings panel");
245  JButtonOperator jbo1 = new JButtonOperator(wo, "Global Settings");
246  jbo1.pushNoBlock();
247  logger.info("Pushed Global Settings button for keyword search module in ingest job settings panel");
248  }
249 
250  public void testConfigureSearch() {
251  logger.info("Search Configure");
252  JDialog jd = JDialogOperator.waitJDialog("Global Keyword Search Settings", false, false);
253  JDialogOperator jdo = new JDialogOperator(jd);
254  String words = getEscapedPath(System.getProperty("keyword_path"));
255  JButtonOperator jbo0 = new JButtonOperator(jdo, "Import List", 0);
256  jbo0.pushNoBlock();
257  JFileChooserOperator jfco0 = new JFileChooserOperator();
258  jfco0.chooseFile(words);
259  JTableOperator jto = new JTableOperator(jdo, 0);
260  jto.clickOnCell(0, 0);
261  new Timeout("pausing", 1000).sleep(); // give it a second to process
262  if (Boolean.parseBoolean(System.getProperty("mugen_mode"))) {
263  JTabbedPaneOperator jtpo = new JTabbedPaneOperator(jdo);
264  jtpo.selectPage("String Extraction");
265  JCheckBoxOperator jcbo0 = new JCheckBoxOperator(jtpo, "Arabic (Arabic)");
266  jcbo0.doClick();
267  JCheckBoxOperator jcbo1 = new JCheckBoxOperator(jtpo, "Han (Chinese, Japanese, Korean)");
268  jcbo1.doClick();
269  new Timeout("pausing", 1000).sleep(); // give it a second to process
270  }
271  JButtonOperator jbo2 = new JButtonOperator(jdo, "OK", 0);
272  jbo2.pushNoBlock();
273  WizardOperator wo = new WizardOperator("Add Data Source");
274  new Timeout("pausing", 10000).sleep(); // let things catch up
275  wo.btNext().clickMouse();
276  }
277 
278  public void testIngest() {
279  logger.info("Ingest 3");
280  new Timeout("pausing", 10000).sleep(); // wait for ingest to actually start
281  long startIngest = System.currentTimeMillis();
283  while (man.isIngestRunning()) {
284  new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
285  }
286  logger.log(Level.INFO, "Ingest (including enqueue) took {0}ms", (System.currentTimeMillis() - startIngest));
287  // allow keyword search to finish saving artifacts, just in case
288  // but randomize the timing so that we don't always get the same error
289  // consistently, making it seem like default behavior
290  Random rand = new Random();
291  new Timeout("pausing", 10000 + (rand.nextInt(15000) + 5000)).sleep();
292  screenshot("Finished Ingest");
293 
294  }
295 
297  logger.info("Data Sources Node");
298  MainWindowOperator mwo = MainWindowOperator.getDefault();
299  JTreeOperator jto = new JTreeOperator(mwo, "Data Sources");
300  String [] nodeNames = {"Data Sources"};
301  TreePath tp = jto.findPath(nodeNames);
302  expandNodes(jto, tp);
303  screenshot("Data Sources Tree");
304  }
305 
307  logger.info("Generate Report Toolbars");
308  MainWindowOperator mwo = MainWindowOperator.getDefault();
309  JButtonOperator jbo = new JButtonOperator(mwo, "Generate Report");
310  jbo.pushNoBlock();
311  new Timeout("pausing", 5000).sleep();
312  }
313 
314  public void testGenerateReportButton() throws IOException {
315  logger.info("Generate Report Button");
316  resetTimeouts("ComponentOperator.WaitComponentTimeout", 240000);
317  JDialog reportDialog = JDialogOperator.waitJDialog("Generate Report", false, false);
318  JDialogOperator reportDialogOperator = new JDialogOperator(reportDialog);
319  JListOperator listOperator = new JListOperator(reportDialogOperator);
320  JButtonOperator jbo0 = new JButtonOperator(reportDialogOperator, "Next");
321  DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss");
322  Date date = new Date();
323  String datenotime = dateFormat.format(date);
324  listOperator.clickOnItem(0, 1);
325  jbo0.pushNoBlock();
326  new Timeout("pausing", 2000).sleep();
327  JButtonOperator jbo1 = new JButtonOperator(reportDialogOperator, "Finish");
328  jbo1.pushNoBlock();
329  JDialog previewDialog = JDialogOperator.waitJDialog("Progress", false, false);
330  screenshot("Progress");
331  JDialogOperator previewDialogOperator = new JDialogOperator(previewDialog);
332  JLabelOperator.waitJLabel(previewDialog, "Complete", false, false);
333  JButtonOperator jbo2 = new JButtonOperator(previewDialogOperator, "Close");
334  jbo2.pushNoBlock();
335  new Timeout("pausing", 10000).sleep();
336  System.setProperty("ReportStr", datenotime);
337  screenshot("Done Testing");
338  }
339 
340  public void screenshot(String name) {
341  logger.info("Taking screenshot.");
342  try {
343  Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
344  BufferedImage capture = new Robot().createScreenCapture(screenRect);
345  String outPath = getEscapedPath(System.getProperty("out_path"));
346  ImageIO.write(capture, "png", new File(outPath + "\\" + name + ".png"));
347  new Timeout("pausing", 1000).sleep(); // give it a second to save
348  } catch (IOException ex) {
349  logger.log(Level.WARNING, "IOException taking screenshot.", ex);
350  } catch (AWTException ex) {
351  logger.log(Level.WARNING, "AWTException taking screenshot.", ex);
352 
353  }
354  }
355 
356  /*
357  * Nightly test failed at WindowWaiter.WaitWindowTimeOut because of TimeoutExpiredException. So we
358  * use this conveninent method to override the default Jemmy Timeouts value.
359  */
360 
361  private Timeouts resetTimeouts(String name, int value) {
362  Timeouts timeouts = JemmyProperties.getCurrentTimeouts();
363  timeouts.setTimeout(name, value);
364  return timeouts;
365  }
366 
367  private void setMultiUserPerferences() {
369  //PostgreSQL database settings
370  CaseDbConnectionInfo connectionInfo = new CaseDbConnectionInfo(
371  System.getProperty("dbHost"),
372  System.getProperty("dbPort"),
373  System.getProperty("dbUserName"),
374  System.getProperty("dbPassword"),
375  TskData.DbType.POSTGRESQL);
376  try {
378  } catch (UserPreferencesException ex) {
379  logger.log(Level.SEVERE, "Error saving case database connection info", ex); //NON-NLS
380  }
381  //Solr Index settings
382  UserPreferences.setIndexingServerHost(System.getProperty("solrHost"));
383  UserPreferences.setIndexingServerPort(Integer.parseInt(System.getProperty("solrPort")));
384  //ActiveMQ Message Service Setting, username and password field are empty
386  System.getProperty("messageServiceHost"),
387  Integer.parseInt(System.getProperty("messageServicePort")),
388  "",
389  "");
390  try {
392  } catch (UserPreferencesException ex) {
393  logger.log(Level.SEVERE, "Error saving messaging service connection info", ex); //NON-NLS
394  }
395  }
396 
397  private void expandNodes (JTreeOperator jto, TreePath tp) {
398  try {
399  jto.expandPath(tp);
400  for (TreePath t : jto.getChildPaths(tp)) {
401  expandNodes(jto, t);
402  }
403  } catch (NoSuchPathException ne) {
404  logger.log(Level.SEVERE, "Error expanding tree path", ne);
405  }
406  }
407 }
static synchronized IngestManager getInstance()
static void setIsMultiUserModeEnabled(boolean enabled)
static void setMessageServiceConnectionInfo(MessageServiceConnectionInfo info)
void expandNodes(JTreeOperator jto, TreePath tp)
static void setDatabaseConnectionInfo(CaseDbConnectionInfo connectionInfo)
Timeouts resetTimeouts(String name, int value)
static void setIndexingServerHost(String hostName)

Copyright © 2012-2018 Basis Technology. Generated on: Tue Dec 18 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.