210 lines
6.0 KiB
JavaScript
210 lines
6.0 KiB
JavaScript
var filed = require('../main')
|
|
, server = require('./server')
|
|
, fs = require('fs')
|
|
, path = require('path')
|
|
, assert = require('assert')
|
|
, request = require('request')
|
|
, test1buffer = ''
|
|
, testfile = path.join(__dirname, 'test.js')
|
|
, writefile = path.join(__dirname, 'testdump-')
|
|
, cleanup = []
|
|
, validations = []
|
|
, port = 9090
|
|
, i = 0
|
|
, url = 'http://localhost:'+port
|
|
;
|
|
|
|
while (i < 50) {
|
|
try {fs.unlinkSync(writefile+i)}
|
|
catch (e) {}
|
|
i += 1
|
|
}
|
|
|
|
function FileValidator (path) {
|
|
this.path = path
|
|
this.buffers = []
|
|
this.len = 0
|
|
this.writable = true
|
|
}
|
|
FileValidator.prototype.write = function (chunk) {
|
|
this.buffers.push(chunk)
|
|
this.len += chunk.length
|
|
}
|
|
FileValidator.prototype.end = function () {
|
|
var body = new Buffer(this.len)
|
|
var i = 0
|
|
this.buffers.forEach(function (chunk) {
|
|
chunk.copy(body, i, 0, chunk.length)
|
|
i += chunk.length
|
|
})
|
|
var f = fs.readFileSync(this.path)
|
|
assert.equal(body.length, f.length)
|
|
assert.deepEqual(body, f)
|
|
}
|
|
FileValidator.prototype.on = function () {}
|
|
FileValidator.prototype.removeListener = function () {}
|
|
FileValidator.prototype.emit = function () {}
|
|
|
|
function equalSync (f1, f2) {
|
|
f1 = fs.readFileSync(f1)
|
|
f2 = fs.readFileSync(f2)
|
|
assert.equal(f1.length, f2.length)
|
|
assert.deepEqual(f1, f2)
|
|
}
|
|
|
|
// Test reading
|
|
filed(testfile).pipe(new FileValidator(testfile))
|
|
|
|
// Test writing
|
|
|
|
function testwrites () {
|
|
var x = filed(writefile+1)
|
|
, y = fs.createReadStream(testfile)
|
|
;
|
|
y.pipe(x)
|
|
x.on('end', function () {
|
|
setTimeout(function () {
|
|
equalSync(writefile+1, testfile)
|
|
console.log("Passed writing files")
|
|
}, 1000)
|
|
})
|
|
}
|
|
testwrites()
|
|
|
|
function testhttp () {
|
|
// Test HTTP use cases
|
|
var s = server()
|
|
s.on('/test-req', function (req, resp) {
|
|
// Take a request and write it, do not send filed to the response
|
|
req.pipe(filed(writefile+2))
|
|
req.on('end', function () {
|
|
resp.writeHead(201)
|
|
resp.end()
|
|
setTimeout(function () {
|
|
equalSync(writefile+2, testfile)
|
|
console.log("Passed PUT file with pipe req only")
|
|
}, 1000)
|
|
})
|
|
})
|
|
|
|
s.on('/test-req-resp', function (req, resp) {
|
|
// Take a request and write it and pipe filed to the response
|
|
var x = filed(writefile+3)
|
|
req.pipe(x)
|
|
x.pipe(resp)
|
|
req.on('end', function () {
|
|
setTimeout(function () {
|
|
equalSync(writefile+3, testfile)
|
|
console.log("Passed PUT file with pipe req and resp")
|
|
}, 1000)
|
|
})
|
|
})
|
|
|
|
s.on('/test-resp', function (req, resp) {
|
|
// Send a file to an HTTP response
|
|
filed(testfile).pipe(resp)
|
|
})
|
|
|
|
var fullpipe = function (req, resp) {
|
|
var x = filed(testfile)
|
|
req.pipe(x)
|
|
x.pipe(resp)
|
|
}
|
|
|
|
s.on('/test-etags-wo', function (req, resp) {
|
|
fullpipe(req, resp)
|
|
})
|
|
s.on('/test-etags-with', function (req, resp) {
|
|
fullpipe(req, resp)
|
|
})
|
|
|
|
s.on('/test-lastmodified-wo', function (req, resp) {
|
|
fullpipe(req, resp)
|
|
})
|
|
s.on('/test-lastmodified-with', function (req, resp) {
|
|
fullpipe(req, resp)
|
|
})
|
|
|
|
s.on('/test-index', function (req, resp) {
|
|
var x = filed(__dirname)
|
|
x.pipe(resp)
|
|
})
|
|
|
|
s.on('/test-index-full', function (req, resp) {
|
|
var x = filed(__dirname)
|
|
req.pipe(x)
|
|
x.pipe(resp)
|
|
})
|
|
|
|
s.on('/test-not-found', function (req, resp) {
|
|
var x = filed(__dirname + "/there-is-no-such-file-here.no-extension")
|
|
req.pipe(x)
|
|
x.pipe(resp)
|
|
})
|
|
|
|
s.listen(port, function () {
|
|
|
|
fs.createReadStream(testfile).pipe(request.put(url+'/test-req'))
|
|
|
|
fs.createReadStream(testfile).pipe(request.put(url+'/test-req-resp', function (e, resp) {
|
|
assert.equal(resp.statusCode, 201)
|
|
assert.equal(resp.headers['content-length'], '0')
|
|
}))
|
|
|
|
var x = request.get(url+'/test-resp', function (e, resp) {
|
|
if (e) throw e
|
|
assert.equal(resp.statusCode, 200)
|
|
assert.equal(resp.headers['content-type'], 'text/javascript')
|
|
console.log("Passed GET file without piping request")
|
|
})
|
|
x.pipe(new FileValidator(testfile))
|
|
|
|
request.get(url+'/test-etags-wo', function (e, resp, body) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 200) throw new Error('Status code is not 200 it is '+resp.statusCode)
|
|
request.get({url:url+'/test-etags-with', headers:{'if-none-match':resp.headers.etag}}, function (e, resp) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 304) throw new Error('Status code is not 304 it is '+resp.statusCode)
|
|
console.log("Passed GET with etag")
|
|
})
|
|
})
|
|
|
|
request.get(url+'/test-lastmodified-wo', function (e, resp, body) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 200) throw new Error('Status code is not 200 it is '+resp.statusCode)
|
|
request.get({url:url+'/test-lastmodified-with', headers:{'if-modified-since':resp.headers['last-modified']}}, function (e, resp) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 304) throw new Error('Status code is not 304 it is '+resp.statusCode)
|
|
console.log("Passed GET with if-modified-since")
|
|
})
|
|
})
|
|
|
|
request.get(url+'/test-index', function (e, resp, body) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 200) throw new Error('Status code is not 200 it is '+resp.statusCode)
|
|
assert.equal(resp.headers['content-type'], 'text/html')
|
|
assert.equal(body, fs.readFileSync(path.join(__dirname, 'index.html')).toString())
|
|
console.log("Passed GET of directory index")
|
|
})
|
|
|
|
request.get(url+'/test-index-full', function (e, resp, body) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 200) throw new Error('Status code is not 200 it is '+resp.statusCode)
|
|
assert.equal(resp.headers['content-type'], 'text/html')
|
|
assert.equal(body, fs.readFileSync(path.join(__dirname, 'index.html')).toString())
|
|
console.log("Passed GET of directory index, full pipe")
|
|
})
|
|
|
|
request.get(url+'/test-not-found', function (e, resp, body) {
|
|
if (e) throw e
|
|
if (resp.statusCode !== 404) throw new Error('Status code is not 404 it is '+resp.statusCode)
|
|
console.log("Passed Not Found produces 404")
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
testhttp()
|
|
|
|
process.on('exit', function () {console.log('All tests passed.')})
|