diff --git a/.travis.yml b/.travis.yml index fdd1203c..b0136dec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,3 +10,10 @@ before_install: script: - npm run lint - npm test + +addons: + firefox: 'latest' + +before_script: + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 00000000..07cb4fce --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,51 @@ +module.exports = function (config) { + var path = require('path') + var nodeForgePath = path.resolve(__dirname, 'node_modules/peer-id/deps/forge.bundle.js') + + config.set({ + basePath: '', + frameworks: ['mocha'], + + files: [ + nodeForgePath, + 'tests/browser.js' + ], + + preprocessors: { + 'tests/*': ['webpack'] + }, + + webpack: { + resolve: { + extensions: ['', '.js', '.json'] + }, + externals: { + fs: '{}', + 'node-forge': 'forge' + }, + node: { + Buffer: true + }, + module: { + loaders: [ + { test: /\.json$/, loader: 'json' } + ] + } + }, + + webpackMiddleware: { + noInfo: true, + stats: { + colors: true + } + }, + reporters: ['spec'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: false, + browsers: process.env.TRAVIS ? ['Firefox'] : ['Chrome'], + captureTimeout: 60000, + singleRun: true + }) +} diff --git a/package.json b/package.json index 3cda3a14..ecb670b3 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "libp2p swarm implementation in Node.js", "main": "src/index.js", "scripts": { - "test": "mocha tests/*-test.js", + "test:node": "mocha tests/*-test.js", + "test:browser": "node tests/karma.js", + "test": "npm run test:node && npm run test:browser", "coverage": "istanbul cover --print both -- _mocha tests/*-test.js", "lint": "standard" }, @@ -30,8 +32,16 @@ }, "devDependencies": { "bl": "^1.1.2", + "buffer-loader": "0.0.1", "chai": "^3.5.0", "istanbul": "^0.4.2", + "json-loader": "^0.5.4", + "karma": "^0.13.22", + "karma-chrome-launcher": "^0.2.2", + "karma-firefox-launcher": "^0.1.7", + "karma-mocha": "^0.2.2", + "karma-spec-reporter": "0.0.24", + "karma-webpack": "^1.7.0", "libp2p-spdy": "^0.2.3", "libp2p-tcp": "^0.4.0", "libp2p-websockets": "^0.2.1", @@ -41,7 +51,8 @@ "peer-info": "^0.6.0", "pre-commit": "^1.1.2", "standard": "^6.0.7", - "stream-pair": "^1.0.3" + "stream-pair": "^1.0.3", + "webpack": "^2.1.0-beta.4" }, "dependencies": { "duplex-passthrough": "github:diasdavid/duplex-passthrough", diff --git a/src/identify.js b/src/identify.js index 0ef04ae9..078d8444 100644 --- a/src/identify.js +++ b/src/identify.js @@ -8,12 +8,18 @@ const multistream = require('multistream-select') const fs = require('fs') const path = require('path') -const pbStream = require('protocol-buffers-stream')( - fs.readFileSync(path.join(__dirname, 'identify.proto'))) const Info = require('peer-info') const Id = require('peer-id') const multiaddr = require('multiaddr') +const isNode = !global.window + +const identity = isNode + ? fs.readFileSync(path.join(__dirname, 'identify.proto')) + : require('buffer!./identify.proto') + +const pbStream = require('protocol-buffers-stream')(identity) + exports = module.exports exports.multicodec = '/ipfs/identify/1.0.0' diff --git a/tests/browser.js b/tests/browser.js new file mode 100644 index 00000000..62d81f1f --- /dev/null +++ b/tests/browser.js @@ -0,0 +1,51 @@ +/* eslint-env mocha */ + +const expect = require('chai').expect +// const async = require('async') + +const multiaddr = require('multiaddr') +// const Id = require('peer-id') +const Peer = require('peer-info') +const Swarm = require('../src') +const WebSockets = require('libp2p-websockets') +const bl = require('bl') + +describe('basics', () => { + it('throws on missing peerInfo', (done) => { + expect(Swarm).to.throw(Error) + done() + }) +}) + +describe('transport - websockets', function () { + this.timeout(10000) + + var swarmB + var peerB = new Peer() + + before((done) => { + peerB.multiaddr.add(multiaddr('/ip4/127.0.0.1/tcp/9999/websockets')) + swarmB = new Swarm(peerB) + done() + }) + + it('add', (done) => { + swarmB.transport.add('ws', new WebSockets(), () => { + expect(Object.keys(swarmB.transports).length).to.equal(1) + done() + }) + }) + + it('dial', (done) => { + const conn = swarmB.transport.dial('ws', multiaddr('/ip4/127.0.0.1/tcp/9888/websockets'), (err, conn) => { + expect(err).to.not.exist + }) + conn.pipe(bl((err, data) => { + expect(err).to.not.exist + expect(data.toString()).to.equal('hey') + done() + })) + conn.write('hey') + conn.end() + }) +}) diff --git a/tests/karma.js b/tests/karma.js new file mode 100644 index 00000000..d41ea25e --- /dev/null +++ b/tests/karma.js @@ -0,0 +1,33 @@ +const Server = require('karma').Server +const path = require('path') + +const Peer = require('peer-info') +const WebSockets = require('libp2p-websockets') +const Swarm = require('../src') +const multiaddr = require('multiaddr') + +var swarmA +var peerA + +function createServer (done) { + peerA = new Peer() + peerA.multiaddr.add(multiaddr('/ip4/127.0.0.1/tcp/9888/websockets')) + swarmA = new Swarm(peerA) + swarmA.transport.add('ws', new WebSockets()) + swarmA.transport.listen('ws', {}, (conn) => { + conn.pipe(conn) + }, done) +} + +function stopServer (done) { + swarmA.transport.close('ws', done) +} + +function runTests (done) { + new Server({ + configFile: path.join(__dirname, '/../karma.conf.js'), + singleRun: true + }, done).start() +} + +createServer(() => runTests(() => stopServer(() => null)))