var hashish = require('hashish');
|
|
var fs = require('fs');
|
|
var findit = require('findit');
|
|
var path = require('path');
|
|
var http = require('http');
|
|
var net = require('net');
|
|
var assert = require('assert');
|
|
|
|
var common = require('../common');
|
|
var formidable = common.formidable;
|
|
|
|
var server = http.createServer();
|
|
server.listen(common.port, findFixtures);
|
|
|
|
function findFixtures() {
|
|
var fixtures = [];
|
|
findit
|
|
.sync(common.dir.fixture + '/js')
|
|
.forEach(function(jsPath) {
|
|
if (!/\.js$/.test(jsPath)) return;
|
|
|
|
var group = path.basename(jsPath, '.js');
|
|
hashish.forEach(require(jsPath), function(fixture, name) {
|
|
fixtures.push({
|
|
name : group + '/' + name,
|
|
fixture : fixture,
|
|
});
|
|
});
|
|
});
|
|
|
|
testNext(fixtures);
|
|
}
|
|
|
|
function testNext(fixtures) {
|
|
var fixture = fixtures.shift();
|
|
if (!fixture) return server.close();
|
|
|
|
var name = fixture.name;
|
|
var fixture = fixture.fixture;
|
|
|
|
uploadFixture(name, function(err, parts) {
|
|
if (err) throw err;
|
|
|
|
fixture.forEach(function(expectedPart, i) {
|
|
var parsedPart = parts[i];
|
|
assert.equal(parsedPart.type, expectedPart.type);
|
|
assert.equal(parsedPart.name, expectedPart.name);
|
|
|
|
if (parsedPart.type === 'file') {
|
|
var file = parsedPart.value;
|
|
assert.equal(file.name, expectedPart.filename);
|
|
if(expectedPart.sha1) assert.equal(file.hash, expectedPart.sha1);
|
|
}
|
|
});
|
|
|
|
testNext(fixtures);
|
|
});
|
|
};
|
|
|
|
function uploadFixture(name, cb) {
|
|
server.once('request', function(req, res) {
|
|
var form = new formidable.IncomingForm();
|
|
form.uploadDir = common.dir.tmp;
|
|
form.hash = "sha1";
|
|
form.parse(req);
|
|
|
|
function callback() {
|
|
var realCallback = cb;
|
|
cb = function() {};
|
|
realCallback.apply(null, arguments);
|
|
}
|
|
|
|
var parts = [];
|
|
form
|
|
.on('error', callback)
|
|
.on('fileBegin', function(name, value) {
|
|
parts.push({type: 'file', name: name, value: value});
|
|
})
|
|
.on('field', function(name, value) {
|
|
parts.push({type: 'field', name: name, value: value});
|
|
})
|
|
.on('end', function() {
|
|
res.end('OK');
|
|
callback(null, parts);
|
|
});
|
|
});
|
|
|
|
var socket = net.createConnection(common.port);
|
|
var file = fs.createReadStream(common.dir.fixture + '/http/' + name);
|
|
|
|
file.pipe(socket, {end: false});
|
|
socket.on('data', function () {
|
|
socket.end();
|
|
});
|
|
|
|
}
|