Skip to content

Commit

Permalink
refactored options parsing to handle arbitrary options
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Early committed Mar 16, 2015
1 parent dc29955 commit f273622
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 55 deletions.
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -105,6 +105,8 @@ sauceConnectLauncher(options, function (err, sauceConnectProcess) {

```

Additional Sauce Connect options not specified above can still be passed. `additionalArg: "foo"` options will be converted to `--addtional-arg foo` args (camelCase to kebeb-case). Arrays will be `join()`ed (like `directDomains`) and boolean options will be passed as flags. See [Sauce Connect's docs](https://docs.saucelabs.com/reference/sauce-connect/) for a full list of arguments.

### Credentials

You can also pass the credentials as `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` environment variables. (reccommended)
Expand Down
58 changes: 6 additions & 52 deletions lib/sauce-connect-launcher.js
Expand Up @@ -9,6 +9,7 @@ var
AdmZip = require("adm-zip"),
spawn = require("child_process").spawn,
exec = require("child_process").exec,
processOptions = require("./process_options"),
archivefile,
scDir = path.normalize(__dirname + "/../sc"),
exists = fs.existsSync || path.existsSync,
Expand All @@ -17,7 +18,8 @@ var
cleanup_registered = false;

function getScVersion() {
return process.env.SAUCE_CONNECT_VERSION || require("../package.json").sauceConnectLauncher.scVersion;
return process.env.SAUCE_CONNECT_VERSION ||
require("../package.json").sauceConnectLauncher.scVersion;
}

function killProcesses(callback) {
Expand Down Expand Up @@ -212,10 +214,7 @@ function run(options, callback) {
watcher,
readyfile,
readyFileName = "sc-launcher-readyfile",
args = [
"-u", options.username || process.env.SAUCE_USERNAME,
"-k", options.accessKey || process.env.SAUCE_ACCESS_KEY
],
args = processOptions(options),
error,
handleError = function (data) {
if (data.indexOf("Not authorized") !== -1 && !error) {
Expand All @@ -242,52 +241,6 @@ function run(options, callback) {
}
};

if (options.port) {
args.push("-P", options.port);
}

if (options.proxy) {
args.push("--proxy", options.proxy);
}

if (options.directDomains) {
if (_.isArray(options.directDomains)) {
options.directDomains = options.directDomains.join(",");
}
args.push("--direct-domains", options.directDomains);
}

if (options.fastFailRegexps) {
if (_.isArray(options.fastFailRegexps)) {
options.fastFailRegexps = options.fastFailRegexps.join(",");
}
args.push("--fast-fail-regexps", options.fastFailRegexps);
}

if (options.verboseDebugging) {
args.push("--verbose");
}

if (options.logfile) {
args.push("-l", options.logfile);
}

if (options.logStats) {
args.push("--log-stats", options.logStats);
}

if (options.maxLogsize) {
args.push("--max-logsize", options.maxLogsize);
}

if (options.doctor) {
args.push("--doctor");
}

if (options.tunnelIdentifier) {
args.push("--tunnel-identifier", options.tunnelIdentifier);
}

if (options.readyFileId) {
readyFileName = readyFileName + "_" + options.readyFileId;
}
Expand Down Expand Up @@ -344,7 +297,8 @@ function run(options, callback) {

var message = "Closing Sauce Connect Tunnel";
if (code > 0) {
message = "Could not start Sauce Connect. Exit code " + code + " signal: " + signal;
message = "Could not start Sauce Connect. Exit code " + code +
" signal: " + signal;
callback(new Error(message));
}
logger(message);
Expand Down
6 changes: 3 additions & 3 deletions package.json
Expand Up @@ -21,10 +21,10 @@
"test": "make test"
},
"dependencies": {
"lodash": "2.4.1",
"async": "~0.9.0",
"lodash": "3.5.0",
"async": "0.9.0",
"adm-zip": "~0.4.3",
"rimraf": "~2.2.6"
"rimraf": "2.2.6"
},
"devDependencies": {
"colors": "~0.6.2",
Expand Down
71 changes: 71 additions & 0 deletions test/process_options.test.js
@@ -0,0 +1,71 @@
var processOptions = require("../lib/process_options.js");
var expect = require("expect.js");

describe("processOptions", function () {
var prevUser, prevKey;

before(function () {
prevUser = process.env.SAUCE_USERNAME;
prevKey = process.env.SAUCE_ACCESS_KEY;
delete process.env.SAUCE_USERNAME;
delete process.env.SAUCE_ACCESS_KEY;
});

after(function () {
process.env.SAUCE_USERNAME = prevUser;
process.env.SAUCE_ACCESS_KEY = prevKey;
});

it("should process user and password", function () {
var result = processOptions({username: "bermi", accessKey: "1234"});
expect(result).to.be.an(Array);
expect(result).to.eql([
"-u", "bermi",
"-k", "1234"
]);
});

it("should process user and password as env vars", function () {
process.env.SAUCE_USERNAME = "bermi";
process.env.SAUCE_ACCESS_KEY = "1234";
var result = processOptions({});
expect(result).to.be.an(Array);
expect(result).to.eql([
"-u", "bermi",
"-k", "1234"
]);
delete process.env.SAUCE_USERNAME;
delete process.env.SAUCE_ACCESS_KEY;
});

it("should handle proxy ports", function () {
expect(processOptions({port: 1234})).to.eql(["-P", 1234]);
});

it("should handle boolean flags", function () {
var result = processOptions({doctor: true});
expect(result).to.eql(["--doctor"]);
});

it("should handle array values", function () {
var result = processOptions({directDomains: ["google.com", "asdf.com"]});
expect(result).to.eql(["--direct-domains", "google.com,asdf.com"]);
});

it("should handle future options", function () {
var result = processOptions({
someFutureOption: "asdf",
futureBoolean: true
});
expect(result).to.eql(["--some-future-option", "asdf", "--future-boolean"]);
});

it("should omit special launcher flags", function () {
expect(processOptions({
readyFileId: "1",
verbose: true,
logger: function () {}
})).to.eql([]);
});

});

0 comments on commit f273622

Please sign in to comment.