code: function runTenonIO(context) {
  
    return browser.driver.getPageSource().then(function(source) {
  
      var options = _.assign(context.config.tenonIO.options, {src: source});
  
      // setup response as a deferred promise
      var deferred = q.defer();
      request.post({
        url: TENON_URL,
        form: options
      },
      function(err, httpResponse, body) {
        if (err) { return resolve.reject(new Error(err)); }
        else { return deferred.resolve(JSON.parse(body)); }
      });
  
      return deferred.promise.then(function(response) {
        return processTenonResults(response);
      });
    });
  
    function processTenonResults(response) {
  
      var testHeader = 'Tenon.io - ';
  
      if (!response.resultSet) {
        if (response.code === 'daily_limit_reached') {
          console.log(testHeader, 'Daily limit reached');
          console.log(response.moreInfo);
        }
        else {
          console.log('Tenon.io error');
        }
        return;
      }
  
      var numResults = response.resultSet.length;
  
      if (numResults === 0) {
        context.addSuccess();
        return;
      }
  
      if (context.config.tenonIO.printAll) {
        console.log('\x1b[32m', testHeader + 'API response', '\x1b[39m');
        console.log(response);
      }
  
      return response.resultSet.forEach(function(result) {
        var ref = (result.ref === null) ? '' : result.ref;
  
        context.addFailure(result.errorDescription + '\n\n' +
            '\t\t' +entities.decode(result.errorSnippet) +
            '\n\n\t\t' + ref, {specName: testHeader + result.errorTitle});
      });
    }
  }
docs: Audits page source against the Tenon API, if configured. Requires an API key:
  more information about licensing and configuration available at
  http://tenon.io/documentation/overview.php.
  
  @param {Object} context The plugin context object
  @return {q.Promise} A promise which resolves when the audit is finished
  @private