mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.1 KiB
142 lines
4.1 KiB
process.mixin(require("./common"));
|
|
|
|
var http = require("http"),
|
|
multipart = require("multipart"),
|
|
sys = require("sys"),
|
|
PORT = 8222,
|
|
fixture = require("./fixtures/multipart"),
|
|
events = require("events"),
|
|
testPart = function (expect, part) {
|
|
if (!expect) {
|
|
throw new Error("Got more parts than expected: "+
|
|
JSON.stringify(part.headers));
|
|
}
|
|
for (var i in expect) {
|
|
assert.equal(expect[i], part[i]);
|
|
}
|
|
};
|
|
|
|
var emails = fixture.messages.slice(0),
|
|
chunkSize = 1, // set to minimum to forcibly expose boundary conditions.
|
|
// in a real scenario, this would be much much bigger.
|
|
firstPart = new (events.Promise);
|
|
|
|
// test streaming messages through directly, as if they were in a file or something.
|
|
sys.puts("test "+emails.length+" emails");
|
|
(function testEmails () {
|
|
|
|
var email = emails.pop(),
|
|
curr = 0;
|
|
|
|
if (!email) {
|
|
sys.puts("done testing emails");
|
|
firstPart.emitSuccess();
|
|
return;
|
|
}
|
|
sys.puts("testing email "+emails.length);
|
|
var expect = email.expect;
|
|
|
|
var message = new (events.EventEmitter);
|
|
message.headers = email.headers;
|
|
|
|
var mp = multipart.parse(message);
|
|
mp.addListener("partBegin", function (part) {
|
|
sys.puts(">> testing part #"+curr);
|
|
testPart(email.expect[curr ++], part);
|
|
});
|
|
mp.addListener("complete", function () {
|
|
sys.puts("done with email "+emails.length);
|
|
process.nextTick(testEmails);
|
|
});
|
|
// stream it through in chunks.
|
|
var emailBody = email.body;
|
|
process.nextTick(function s () {
|
|
if (emailBody) {
|
|
message.emit("data", emailBody.substr(0, chunkSize));
|
|
emailBody = emailBody.substr(chunkSize);
|
|
process.nextTick(s);
|
|
} else {
|
|
message.emit("end");
|
|
}
|
|
});
|
|
})();
|
|
|
|
// run good HTTP messages test after previous test ends.
|
|
var secondPart = new (events.Promise),
|
|
server = http.createServer(function (req, res) {
|
|
sys.puts("HTTP mp request");
|
|
var mp = multipart.parse(req),
|
|
curr = 0;
|
|
req.setBodyEncoding("binary");
|
|
if (req.url !== "/bad") {
|
|
sys.puts("expected to be good");
|
|
mp.addListener("partBegin", function (part) {
|
|
sys.puts(">> testing part #"+curr);
|
|
testPart(message.expect[curr ++], part);
|
|
});
|
|
} else {
|
|
sys.puts("expected to be bad");
|
|
}
|
|
mp.addListener("error", function (er) {
|
|
sys.puts("!! error occurred");
|
|
res.sendHeader(400, {});
|
|
res.write("bad");
|
|
res.close();
|
|
});
|
|
mp.addListener("complete", function () {
|
|
res.sendHeader(200, {});
|
|
res.write("ok");
|
|
res.close();
|
|
});
|
|
}),
|
|
message,
|
|
client = http.createClient(PORT);
|
|
server.listen(PORT);
|
|
|
|
// could dry these two up a bit.
|
|
firstPart.addCallback(function testGoodMessages () {
|
|
var httpMessages = fixture.messages.slice(0);
|
|
sys.puts("testing "+httpMessages.length+" good messages");
|
|
(function testHTTP () {
|
|
message = httpMessages.pop();
|
|
if (!message) {
|
|
secondPart.emitSuccess();
|
|
return;
|
|
}
|
|
sys.puts("test message "+httpMessages.length);
|
|
var req = client.request("POST", "/", message.headers);
|
|
req.write(message.body, "binary");
|
|
req.addListener('response', function (res) {
|
|
var buff = "";
|
|
res.addListener("data", function (chunk) { buff += chunk });
|
|
res.addListener("end", function () {
|
|
assert.equal(buff, "ok");
|
|
process.nextTick(testHTTP);
|
|
});
|
|
});
|
|
req.close();
|
|
})();
|
|
});
|
|
secondPart.addCallback(function testBadMessages () {
|
|
var httpMessages = fixture.badMessages.slice(0);
|
|
sys.puts("testing "+httpMessages.length+" bad messages");
|
|
(function testHTTP () {
|
|
message = httpMessages.pop();
|
|
if (!message) {
|
|
server.close()
|
|
return;
|
|
}
|
|
sys.puts("test message "+httpMessages.length);
|
|
var req = client.request("POST", "/bad", message.headers);
|
|
req.write(message.body, "binary");
|
|
req.addListener('response', function (res) {
|
|
var buff = "";
|
|
res.addListener("data", function (chunk) { buff += chunk });
|
|
res.addListener("end", function () {
|
|
assert.equal(buff, "bad");
|
|
process.nextTick(testHTTP);
|
|
});
|
|
});
|
|
req.close();
|
|
})();
|
|
});
|
|
|