test.describe('minimum e2e', function() {

  test.before(function() {
    var self = this;

    var capabilities = {
      'browserName' : 'firefox',
      'browserstack.user' : browserstackConf['browserstack.user'],
      'browserstack.key' : browserstackConf['browserstack.key'],
      'browserstack.debug' : 'true',
      'browserstack.local' : 'true'
    };
    this.driver = new webdriver.Builder()
      .usingServer('http://hub.browserstack.com/wd/hub')
      .withCapabilities(capabilities)
      .build();

    var d = webdriver.promise.defer();
    app.set('port', 3001);
    this.server = app.listen(app.get('port'), function(err) {
      if (err) { return d.reject(err); }
      console.log('Express server listening on port ' + self.server.address().port);
      self.driver.get('http://localhost:3001/');
      d.fulfill();
    });

    return d.promise;
  });

  test.it('should title be "Express"', function() {
    this.driver.getTitle().then(function(title) {
      assert.strictEqual(title, "Express");
    });
  });

  test.after(function() {
    var d = webdriver.promise.defer();
    this.server.close(function(err) {
      if (err) { return d.reject(err); }
      console.log('Close express server listening');
      d.fulfill();
    });
    return d.promise;
  });

  test.after(function() {
    this.driver.quit();
  });
});
  test.describe(_.compact([setup.device, setup.os_version, setup.browserName, setup.browser_version]).join(', '), function() {
    var driver;

    test.before(function() {
      driver = new webdriver.Builder()
        .usingServer('http://hub.browserstack.com/wd/hub')
        .withCapabilities(_.extend({}, browserStackConfig, setup))
        .build();
    });

    test.after(function() {
      driver.quit();
    });

    test.it('runs the mocha tests', function() {
      driver.get(config.host + '/test/browser/test.html');
      driver.wait(function() {
        return driver.executeScript('return mocha_finished;').then(function(finished) {
          if (!finished) return false;

          return driver.executeScript('return mocha_stats;').then(function(stats) {
            console.log('    Passes: ' + stats.passes + ', Failures: ' + stats.failures + ', Duration: ' + (stats.duration / 1000).toFixed(2) + 's');
            assert(stats.tests > 0, 'No mocha tests were run');
            if (!stats.failures) return true;

            return driver.executeScript('return mocha_failures;').then(function(failures) {
              for (var i = 0; i < failures.length; ++i) {
                var prefix = '    ' + (i + 1) + '. ';
                console.log(prefix + failures[i][0]);
                console.log(Array(prefix.length + 1).join(' ') + failures[i][1]);
              }
              return true;
            });
          });
        });
      });
    });
  });