/**
   * This is the generic test setup function
   *
   * @param relaunch - true if this is an app relaunch
   * @param clearAppData - true if you want app data cleared, false otherwise
   */
  public static void setUp(String testName, Boolean relaunch, Boolean clearAppData)
      throws Exception {
    if (!relaunch) {
      logger.info("Starting test {}", testName);
      Utils.setTestName(testName);
      Device.setupLogDirectories();

      // create adb tunnel
      DebugBridge.get().createTunnel(8080, 8080);
    }

    // see if a server is already listening
    boolean clientWasListening = false;
    if (Client.isListening()) {
      clientWasListening = true;
    }

    if (clearAppData) {
      // clear app data - this has the side effect of killing a running app
      // TODO: this only works on 2.3+.. need a solution for 2.1+
      Device.clearAppData();
    }

    // wait for the client to stop listening if it was previously listening
    if (clientWasListening) {
      // wait for the server to be dead
      for (int x = 0; x < 10; x++) {
        // try to make a query.. if it doesnt work then sleep
        TestLogger.get().info("Trying to see if server is still available..");

        if (!Client.isListening()) break;

        if (x == 9) throw new Exception("Server is still available, but should not be");

        Thread.sleep(2000);
      }
    }

    if (!relaunch) {
      // start log listener
      TestLogger.get().info("Clearing logcat");
      DebugBridge.get().clearLogCat();

      TestLogger.get().info("Starting logcat");
      DebugBridge.get().startLogListener("/tmp/adb_robo.log");

      // set up logger
      EmSingleton.intialize();

      EmSingleton.get().clearEvents();
    }

    // starting test runner
    TestLogger.get().info("Starting RC Runner");

    // start app
    Device.startApp();
  }
  // This is called in the failure method override above
  public void tearDown() throws Exception {
    try {
      EmSingleton.get().close();
      Device.killApp();

      // stop logcat
      TestLogger.get().info("Stopping logcat");
      DebugBridge.get().stopLogListener();

      // store logs
      Device.storeLogs();
    } catch (Exception e) {

    } finally {
      DebugBridge.get().close();
    }
  }