From b6fe1b30c7b1b24424d5bdc6f8300746ac2100d9 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 12 Jul 2017 23:47:54 -0700 Subject: [PATCH 1/4] get - throw error on missing resolver --- src/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/index.js b/src/index.js index 078b0cb..c9242d2 100644 --- a/src/index.js +++ b/src/index.js @@ -134,6 +134,9 @@ class IPLDResolver { return cb(err) } const r = this.resolvers[cid.codec] + if (!r) { + return cb(new Error('No resolver found for codec "' + cid.codec + '"')) + } r.resolver.resolve(block, path, (err, result) => { if (err) { return cb(err) From 4086ad5e36b21526f249124d6e3fe8373e637fb1 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 12 Jul 2017 23:58:19 -0700 Subject: [PATCH 2/4] all - throw error on missing resolver --- src/index.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index c9242d2..9cc13a6 100644 --- a/src/index.js +++ b/src/index.js @@ -202,6 +202,9 @@ class IPLDResolver { options.hashAlg = options.hashAlg || 'sha2-256' const r = this.resolvers[options.format] + if (!r) { + return callback(new Error('No resolver found for codec "' + options.format + '"')) + } // TODO add support for different hash funcs in the utils of // each format (just really needed for CBOR for now, really // r.util.cid(node1, hashAlg, (err, cid) => { @@ -227,6 +230,9 @@ class IPLDResolver { if (!options.recursive) { p = pullDeferSource() const r = this.resolvers[cid.codec] + if (!r) { + return p.abort(new Error('No resolver found for codec "' + cid.codec + '"')) + } waterfall([ (cb) => this.bs.get(cid, cb), @@ -255,7 +261,11 @@ class IPLDResolver { } const deferred = pullDeferSource() - const r = this.resolvers[el.cid.codec] + const cid = el.cid + const r = this.resolvers[cid.codec] + if (!r) { + return p.abort(new Error('No resolver found for codec "' + cid.codec + '"')) + } waterfall([ (cb) => this.bs.get(el.cid, cb), @@ -327,6 +337,9 @@ class IPLDResolver { _get (cid, callback) { const r = this.resolvers[cid.codec] + if (!r) { + return callback(new Error('No resolver found for codec "' + cid.codec + '"')) + } waterfall([ (cb) => this.bs.get(cid, cb), @@ -349,6 +362,10 @@ class IPLDResolver { callback = callback || noop const r = this.resolvers[cid.codec] + if (!r) { + return callback(new Error('No resolver found for codec "' + cid.codec + '"')) + } + waterfall([ (cb) => r.util.serialize(node, cb), (buf, cb) => this.bs.put(new Block(buf, cid), cb) From 34a5c832ba66c601e8c6ecdeb0e3af6a0bfc1467 Mon Sep 17 00:00:00 2001 From: kumavis Date: Thu, 13 Jul 2017 02:12:31 -0700 Subject: [PATCH 3/4] tests - add resolver presence failure test --- test/basics.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/basics.js b/test/basics.js index cf27433..b79e5f2 100644 --- a/test/basics.js +++ b/test/basics.js @@ -6,6 +6,8 @@ const dirtyChai = require('dirty-chai') const expect = chai.expect chai.use(dirtyChai) const BlockService = require('ipfs-block-service') +const CID = require('cids') +const multihash = require('multihashes') const IPLDResolver = require('../src') @@ -27,4 +29,18 @@ module.exports = (repo) => { it.skip('add support to a new format', () => {}) it.skip('remove support to a new format', () => {}) }) + + describe('validation', () => { + it('errors on unknown resolver', (done) => { + const bs = new BlockService(repo) + const r = new IPLDResolver(bs) + // choosing a format that is not supported + const cid = new CID(1, 'base1', multihash.encode(new Buffer('abcd', 'hex'), 'sha1')) + r.get(cid, '/', {}, (err, result) => { + expect(err).to.exist() + expect(err.message).to.eql('No resolver found for codec "base1"') + done() + }) + }) + }) } From c43743ad120b6606458d43c27502d9813d91534f Mon Sep 17 00:00:00 2001 From: kumavis Date: Thu, 13 Jul 2017 02:51:19 -0700 Subject: [PATCH 4/4] tests - add more tests to resolver-check --- src/index.js | 12 ++++++++---- test/basics.js | 53 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index 9cc13a6..7023672 100644 --- a/src/index.js +++ b/src/index.js @@ -231,7 +231,8 @@ class IPLDResolver { p = pullDeferSource() const r = this.resolvers[cid.codec] if (!r) { - return p.abort(new Error('No resolver found for codec "' + cid.codec + '"')) + p.abort(new Error('No resolver found for codec "' + cid.codec + '"')) + return p } waterfall([ @@ -239,7 +240,8 @@ class IPLDResolver { (block, cb) => r.resolver.tree(block, cb) ], (err, paths) => { if (err) { - return p.abort(err) + p.abort(err) + return p } p.resolve(pull.values(paths)) }) @@ -264,7 +266,8 @@ class IPLDResolver { const cid = el.cid const r = this.resolvers[cid.codec] if (!r) { - return p.abort(new Error('No resolver found for codec "' + cid.codec + '"')) + deferred.abort(new Error('No resolver found for codec "' + cid.codec + '"')) + return deferred } waterfall([ @@ -284,7 +287,8 @@ class IPLDResolver { }) ], (err, paths) => { if (err) { - return deferred.abort(err) + deferred.abort(err) + return deferred } deferred.resolve(pull.values(paths.map((p) => { diff --git a/test/basics.js b/test/basics.js index b79e5f2..67530a5 100644 --- a/test/basics.js +++ b/test/basics.js @@ -8,6 +8,7 @@ chai.use(dirtyChai) const BlockService = require('ipfs-block-service') const CID = require('cids') const multihash = require('multihashes') +const pull = require('pull-stream') const IPLDResolver = require('../src') @@ -31,7 +32,7 @@ module.exports = (repo) => { }) describe('validation', () => { - it('errors on unknown resolver', (done) => { + it('get - errors on unknown resolver', (done) => { const bs = new BlockService(repo) const r = new IPLDResolver(bs) // choosing a format that is not supported @@ -42,5 +43,55 @@ module.exports = (repo) => { done() }) }) + + it('_get - errors on unknown resolver', (done) => { + const bs = new BlockService(repo) + const r = new IPLDResolver(bs) + // choosing a format that is not supported + const cid = new CID(1, 'base1', multihash.encode(new Buffer('abcd', 'hex'), 'sha1')) + r.get(cid, (err, result) => { + expect(err).to.exist() + expect(err.message).to.eql('No resolver found for codec "base1"') + done() + }) + }) + + it('put - errors on unknown resolver', (done) => { + const bs = new BlockService(repo) + const r = new IPLDResolver(bs) + // choosing a format that is not supported + r.put(null, { format: 'base1' }, (err, result) => { + expect(err).to.exist() + expect(err.message).to.eql('No resolver found for codec "base1"') + done() + }) + }) + + it('_put - errors on unknown resolver', (done) => { + const bs = new BlockService(repo) + const r = new IPLDResolver(bs) + // choosing a format that is not supported + const cid = new CID(1, 'base1', multihash.encode(new Buffer('abcd', 'hex'), 'sha1')) + r._put(cid, null, (err, result) => { + expect(err).to.exist() + expect(err.message).to.eql('No resolver found for codec "base1"') + done() + }) + }) + + it('treeStream - errors on unknown resolver', (done) => { + const bs = new BlockService(repo) + const r = new IPLDResolver(bs) + // choosing a format that is not supported + const cid = new CID(1, 'base1', multihash.encode(new Buffer('abcd', 'hex'), 'sha1')) + pull( + r.treeStream(cid, '/', {}), + pull.collect(function (err) { + expect(err).to.exist() + expect(err.message).to.eql('No resolver found for codec "base1"') + done() + }) + ) + }) }) }