feat(tests): add dial and listen tests

This commit is contained in:
Friedel Ziegelmayer 2016-09-02 13:31:28 +02:00 committed by David Dias
parent 1bd20d94d9
commit d50224dc5d
10 changed files with 300 additions and 54 deletions

12
.gitignore vendored
View File

@ -1,7 +1,13 @@
**/node_modules/
**/*.log
test/repo-tests*
# Logs
logs
*.log
coverage
# Runtime data
pids
*.pid
@ -19,9 +25,11 @@ coverage
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
build
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
lib
dist

34
.npmignore Normal file
View File

@ -0,0 +1,34 @@
**/node_modules/
**/*.log
test/repo-tests*
# Logs
logs
*.log
coverage
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
build
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
test

10
.travis.yml Normal file
View File

@ -0,0 +1,10 @@
sudo: false
language: node_js
node_js:
- "stable"
before_install:
- npm install -g npm
script:
- npm run lint

View File

@ -32,21 +32,29 @@ Include this badge in your readme if you make a module that is compatible with t
## Node.js
```
var tape = require('tape')
var tests = require('interface-transport/tests')
var YourTransportHandler = require('../src')
```js
/* eslint-env mocha */
'use strict'
var common = {
setup: function (t, cb) {
cb(null, YourTransportHandler)
},
teardown: function (t, cb) {
cb()
}
}
const tests = require('interface-transport')
const multiaddr = require('multiaddr')
const YourTransport = require('../src')
tests(tape, common)
describe('compliance', () => {
tests({
setup (cb) {
let t = new YourTransport()
const addrs = [
multiaddr('valid-multiaddr-for-your-transport'),
multiaddr('valid-multiaddr2-for-your-transport')
]
cb(null, t, addrs)
},
teardown (cb) {
cb()
}
})
})
```
## Go

View File

@ -6,6 +6,21 @@
"type": "git",
"url": "https://github.com/diasdavid/interface-transport.git"
},
"main": "src/index.js",
"jsnext:main": "src/index.js",
"scripts": {
"lint": "aegir-lint",
"build": "aegir-build",
"release": "aegir-release",
"release-minor": "aegir-release --type minor",
"release-major": "aegir-release --type major",
"coverage": "exit(0)",
"coverage-publish": "exit(0)"
},
"pre-commit": [
"lint",
"test"
],
"keywords": [
"IPFS"
],
@ -15,9 +30,13 @@
"url": "https://github.com/diasdavid/interface-transport/issues"
},
"homepage": "https://github.com/diasdavid/interface-transport",
"devDependencies": {},
"devDependencies": {
"aegir": "^6.0.1"
},
"dependencies": {
"chai": "^3.5.0",
"multiaddr": "^2.0.2",
"timed-tape": "^0.1.1"
"pull-goodbye": "0.0.1",
"pull-stream": "^3.4.4"
}
}

74
src/dial-test.js Normal file
View File

@ -0,0 +1,74 @@
/* eslint-env mocha */
'use strict'
const expect = require('chai').expect
const pull = require('pull-stream')
const goodbye = require('pull-goodbye')
module.exports = (common) => {
describe('dial', () => {
let addrs
let transport
let listener
before((done) => {
common.setup((err, _transport, _addrs) => {
if (err) return done(err)
transport = _transport
addrs = _addrs
done()
})
})
after((done) => {
common.teardown(done)
})
beforeEach((done) => {
listener = transport.createListener((conn) => {
pull(
conn,
pull.map((x) => {
if (x.toString() !== 'GOODBYE') {
return new Buffer(x.toString() + '!')
}
return x
}),
conn
)
})
listener.listen(addrs[0], done)
})
afterEach((done) => {
listener.close(done)
})
it('simple', (done) => {
const s = goodbye({
source: pull.values([new Buffer('hey')]),
sink: pull.collect((err, values) => {
expect(err).to.not.exist
expect(
values
).to.be.eql(
[new Buffer('hey!')]
)
done()
})
})
pull(s, transport.dial(addrs[0]), s)
})
it('to non existent listener', (done) => {
pull(
transport.dial(addrs[1]),
pull.onEnd((err) => {
expect(err).to.exist
done()
})
)
})
})
}

12
src/index.js Normal file
View File

@ -0,0 +1,12 @@
/* eslint-env mocha */
'use strict'
const dial = require('./dial-test')
const listen = require('./listen-test')
module.exports = (common) => {
describe('interface-transport', () => {
dial(common)
listen(common)
})
}

118
src/listen-test.js Normal file
View File

@ -0,0 +1,118 @@
/* eslint max-nested-callbacks: ["error", 8] */
/* eslint-env mocha */
'use strict'
const expect = require('chai').expect
const pull = require('pull-stream')
module.exports = (common) => {
describe('listen', () => {
let addrs
let transport
before((done) => {
common.setup((err, _transport, _addrs) => {
if (err) return done(err)
transport = _transport
addrs = _addrs
done()
})
})
after((done) => {
common.teardown(done)
})
it('simple', (done) => {
const listener = transport.createListener((conn) => {})
listener.listen(addrs[0], () => {
listener.close(done)
})
})
it('close listener with connections, through timeout', (done) => {
const finish = plan(3, done)
const listener = transport.createListener((conn) => {
pull(conn, conn)
})
listener.listen(addrs[0], () => {
const socket1 = transport.dial(addrs[0], () => {
listener.close(finish)
})
pull(
transport.dial(addrs[0]),
pull.onEnd(() => {
finish()
})
)
pull(
pull.values([Buffer('Some data that is never handled')]),
socket1,
pull.onEnd(() => {
finish()
})
)
})
})
describe('events', () => {
// TODO: figure out why it fails in the full test suite
it.skip('connection', (done) => {
const finish = plan(2, done)
const listener = transport.createListener()
listener.on('connection', (conn) => {
expect(conn).to.exist
finish()
})
listener.listen(addrs[0], () => {
transport.dial(addrs[0], () => {
listener.close(finish)
})
})
})
it('listening', (done) => {
const listener = transport.createListener()
listener.on('listening', () => {
listener.close(done)
})
listener.listen(addrs[0])
})
// TODO: how to get the listener to emit an error?
it.skip('error', (done) => {
const listener = transport.createListener()
listener.on('error', (err) => {
expect(err).to.exist
listener.close(done)
})
})
it('close', (done) => {
const finish = plan(2, done)
const listener = transport.createListener()
listener.on('close', finish)
listener.listen(addrs[0], () => {
listener.close(finish)
})
})
})
})
}
function plan (n, done) {
let i = 0
return (err) => {
if (err) return done(err)
i++
if (i === n) done()
}
}

View File

@ -1,31 +0,0 @@
var multiaddr = require('multiaddr')
module.exports.all = function (test, common) {
test('a test', function (t) {
common.setup(test, function (err, transport) {
t.plan(5)
t.ifError(err)
var maddr = multiaddr('/ip4/127.0.0.1/tcp/9050')
var listener = transport.createListener(function (stream) {
t.pass('received incoming connection')
stream.end()
listener.close(function () {
t.pass('listener closed successfully')
t.end()
})
})
listener.listen(maddr.nodeAddress().port, function () {
t.pass('started listening')
var stream = transport.dial(maddr, {
ready: function () {
t.pass('dialed successfuly')
stream.end()
}
})
})
})
})
}

View File

@ -1,6 +0,0 @@
var timed = require('timed-tape')
module.exports = function (test, common) {
test = timed(test)
require('./base-test.js').all(test, common)
}