Here is the solution I ended up using
const gulp = require('gulp');
const cucumber = require('gulp-cucumber')
const BrowserStackTunnel = require('browserstacktunnel-wrapper');
var tunnel;
function startTunnel(options) {
return new Promise((resolve, reject) => {
tunnel = new BrowserStackTunnel(options);
tunnel.start(function(error) {
error ? reject(error) : resolve();
});
});
}
function stopTunnel(error) {
return new Promise((resolve, reject) => {
function resolveOrReject() {
error ? reject(error) : resolve();
}
tunnel ? tunnel.stop(resolveOrReject) : resolveOrReject();
});
};
function createCucumberPromise(src, options) {
return function() {
return new Promise((resolve, reject) => {
gulp.src(src)
.pipe(cucumber(options))
.on('end', resolve)
.on('error', reject);
});
}
};
gulp.task('cucumber', () => {
return startTunnel({
key: '<stillasecret>'
})
.then(createCucumberPromise('features/my_feature.feature', {
// format: 'json:output.json'
// tags: '@wip'
}))
.then(stopTunnel, stopTunnel);
});