Skip to content

Commit

Permalink
Merge branch 'master' into sockjs
Browse files Browse the repository at this point in the history
Provides the ability to run `make test` offline.

Conflicts:
	.gitignore
	package.json
  • Loading branch information
reid committed May 31, 2012
2 parents ae508e7 + 524b97c commit a26d7c0
Show file tree
Hide file tree
Showing 9 changed files with 144 additions and 32 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/lib/hub/view/public/sockjs-*
/dep/
/doc/quick-start/index.mustache
/api/
/tools/
Expand Down
24 changes: 22 additions & 2 deletions lib/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"use strict";

var fs = require("graceful-fs");
var path = require("path");
var util = require("util");
var EventEmitter2 = require("eventemitter2").EventEmitter2;

Expand All @@ -27,6 +28,10 @@ function ClientBatch(session, basedir, tests, useProxy) {
throw new Error("Basedir required.");
}

if (basedir && (basedir !== path.resolve(basedir))) {
throw new Error("Basedir is not an absolute path!");
}

if (!Array.isArray(tests)) {
throw new Error("Array of tests required.");
}
Expand Down Expand Up @@ -130,8 +135,23 @@ ClientBatch.prototype.provideTests = function () {
var self = this;

self.batchSession.on("request.clientFile", function (file, reply) {
// TODO Basedir checks.
fs.readFile(self.basedir + "/" + file, reply);
if (!self.basedir) {
reply("Not permitted.");
return;
}

if (file[0] !== "/") {
// Path is relative, resolve it to an absolute path.
file = path.resolve(self.basedir, file);
}

// The file path must be inside the basedir.
if (file.indexOf(self.basedir) !== 0) {
reply("Filename provided is not in basedir!");
return;
}

fs.readFile(file, reply);
});

};
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"scripts": {
"test": "vows test/*.js",
"preinstall": "curl http://cdn.sockjs.org/sockjs-0.3.min.js > lib/hub/view/public/sockjs-0.3.min.js",
"postinstall": "./scripts/postinstall.sh"
"postinstall": "node scripts/postinstall.js"
},
"engines": {
"node": "~0.6.4"
Expand Down
91 changes: 91 additions & 0 deletions scripts/postinstall.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env node

"use strict";

var fs = require("fs"),
url = require("url"),
path = require("path"),
http = require("http");

var depDir = path.join(__dirname, "..", "dep");

var YUI_TEST_URL = "http://yui.yahooapis.com/combo?3.5.1/build/yui-base/yui-base-min.js&3.5.1/build/oop/oop-min.js&3.5.1/build/event-custom-base/event-custom-base-min.js&3.5.1/build/event-base/event-base-min.js&3.5.1/build/event-simulate/event-simulate-min.js&3.5.1/build/event-custom-complex/event-custom-complex-min.js&3.5.1/build/substitute/substitute-min.js&3.5.1/build/json-stringify/json-stringify-min.js&3.5.1/build/test/test-min.js";

function log() {
if (process.env.npm_config_loglevel !== "silent") {
console.log.apply(null, Array.prototype.slice.call(arguments));
}
}

function die(message) {
console.warn(message.message || message);
process.exit(1);
}

function saveURLToDep(sourceURL, filename, cb) {
filename = path.join(depDir, filename);

function done() {
log("Saved", sourceURL, "as", filename);
}

log("Saving", sourceURL, "as", filename);

http.get(url.parse(sourceURL), function onResponse(res) {
if (res.statusCode !== 200) {
die("Got status " + res.statusCode + " for URL " + sourceURL);
return;
}

var data;

res.setEncoding("utf8");

res.on("data", function (chunk) {
data += chunk;
});

res.on("end", function () {
fs.writeFile(filename, data, "utf8", done);
});
}).on("error", die);
}

function download(err) {
if (err) {
die(err);
}

[
[YUI_TEST_URL, "yui-test.js"]
// When SockJS lands, we'll be downloading it here:
// ["http://cdn.sockjs.org/sockjs-0.3.min.js", "sock.js"]
].forEach(function downloader(args) {
saveURLToDep.apply(null, args);
});
}

log("Downloading script dependencies...");

fs.readdir(depDir, function (err) {
if (err) {
log("Attempting to create directory", depDir);
fs.mkdir(depDir, download);
} else {
log("Found directory", depDir);
download();
}
});

var history;

fs.readFile(path.join(__dirname, "..", "HISTORY.md"), "utf8", function (err, data) {
history = data.split("\n").slice(2, 20).join("\n");
process.on("exit", function () {
log("\nThanks for installing Yeti", process.env.npm_package_version);
log("\nRecent changes in HISTORY.md:\n\n" + history);
});
});



13 changes: 0 additions & 13 deletions scripts/postinstall.sh

This file was deleted.

2 changes: 1 addition & 1 deletion test/fixture/attach-server.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<script src="{route}/socket.io/socket.io.js"></script>
<script src="{route}/public/inject.js"></script>

<script type="text/javascript" src="http://yui.yahooapis.com/combo?3.4.1/build/yui-base/yui-base-min.js&3.4.1/build/oop/oop-min.js&3.4.1/build/event-custom-base/event-custom-base-min.js&3.4.1/build/event-base/event-base-min.js&3.4.1/build/event-simulate/event-simulate-min.js&3.4.1/build/event-custom-complex/event-custom-complex-min.js&3.4.1/build/substitute/substitute-min.js&3.4.1/build/json-stringify/json-stringify-min.js&3.4.1/build/test/test-min.js"></script>
<script type="text/javascript" src="/yui"></script>

<script>
YUI().use("test", function (Y) {
Expand Down
2 changes: 1 addition & 1 deletion test/fixture/basic.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<!doctype html>
<title>Yeti Basic Test</title>
<script type="text/javascript" src="http://yui.yahooapis.com/combo?3.4.1/build/yui-base/yui-base-min.js&3.4.1/build/oop/oop-min.js&3.4.1/build/event-custom-base/event-custom-base-min.js&3.4.1/build/event-base/event-base-min.js&3.4.1/build/event-simulate/event-simulate-min.js&3.4.1/build/event-custom-complex/event-custom-complex-min.js&3.4.1/build/substitute/substitute-min.js&3.4.1/build/json-stringify/json-stringify-min.js&3.4.1/build/test/test-min.js"></script>
<script type="text/javascript" src="../../dep/yui-test.js"></script>
<script>
YUI().use("test", function (Y) {
var SimpleTestCase = new Y.Test.Case({
Expand Down
2 changes: 1 addition & 1 deletion test/fixture/local-js.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!doctype html>
<title>Yeti Local JS Test</title>
<p>This test requires external JavaScript that will be served by Yeti's server.</p>
<script type="text/javascript" src="http://yui.yahooapis.com/combo?3.4.1/build/yui-base/yui-base-min.js&3.4.1/build/oop/oop-min.js&3.4.1/build/event-custom-base/event-custom-base-min.js&3.4.1/build/event-base/event-base-min.js&3.4.1/build/event-simulate/event-simulate-min.js&3.4.1/build/event-custom-complex/event-custom-complex-min.js&3.4.1/build/substitute/substitute-min.js&3.4.1/build/json-stringify/json-stringify-min.js&3.4.1/build/test/test-min.js"></script>
<script type="text/javascript" src="../../dep/yui-test.js"></script>
<script src="local-js.js"></script>
39 changes: 26 additions & 13 deletions test/functional.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
var vows = require("vows");
var assert = require("assert");

var path = require("path");
var fs = require("graceful-fs");
var http = require("http");

Expand Down Expand Up @@ -210,7 +211,8 @@ function errorContext(createBatchConfiguration) {

var DUMMY_PROTOCOL = "YetiDummyProtocol/1.0";

var SERVER_TEST_FIXTURE = fs.readFileSync(__dirname + "/fixture/attach-server.html", "utf8");
var SERVER_TEST_FIXTURE = fs.readFileSync(path.join(__dirname, "fixture/attach-server.html"), "utf8");
var YUI_TEST_FIXTURE = fs.readFileSync(path.resolve(__dirname, "../dep/yui-test.js"), "utf8");

function attachServerContext(testContext, explicitRoute) {
var route, testFixture;
Expand All @@ -232,6 +234,11 @@ function attachServerContext(testContext, explicitRoute) {
"Content-Type": "text/html"
});
res.end(testFixture);
} else if (req.url === "/yui") {
res.writeHead(200, {
"Content-Type": "application/javascript"
});
res.end(YUI_TEST_FIXTURE);
} else {
res.writeHead(404, {
"Content-Type": "text/plain"
Expand Down Expand Up @@ -338,24 +345,30 @@ function attachServerBatch(definition) {
return batch;
}

var basedir = path.join(__dirname, "..");

function fixtures(basenames) {
return basenames.map(function (basename) {
return path.join(__dirname, "fixture", basename);
});
}

function withTests() {
return {
basedir: basedir,
tests: fixtures(Array.prototype.slice.call(arguments))
};
}

vows.describe("Yeti Functional")
.addBatch(hub.functionalContext({
"visits Yeti": visitorContext({
basedir: __dirname + "/fixture",
tests: ["basic.html", "local-js.html"]
})
"visits Yeti": visitorContext(withTests("basic.html", "local-js.html"))
}))
.addBatch(hub.functionalContext({
"visits Yeti with invalid files": errorContext({
basedir: __dirname + "/fixture",
tests: ["this-file-does-not-exist.html"]
})
"visits Yeti with invalid files": errorContext(withTests("this-file-does-not-exist.html"))
}))
.addBatch(attachServerBatch({
"A HTTP server with an upgrade listener (for Yeti files)": {
basedir: __dirname + "/fixture",
tests: ["basic.html", "local-js.html"]
},
"A HTTP server with an upgrade listener (for Yeti files)": withTests("basic.html", "local-js.html"),
"A HTTP server with an upgrade listener (for Yeti paths)": {
tests: ["/fixture"],
useProxy: false
Expand Down

0 comments on commit a26d7c0

Please sign in to comment.