UNPKG

light-node-zookeeper

Version:

small node zookeeper

122 lines (108 loc) 3.74 kB
var ZK = require ('../lib/zookeeper'); var assert = require('assert'); var log4js = require('log4js'); var async = require('async'); // // based on node-leader // https://github.com/mcavage/node-leader // callback(error, zookeeperConnection) // function startZK(options, callback) { if(typeof(options) !== 'object') throw new TypeError('options (Object) required'); if(typeof(options.zookeeper) !== 'string') throw new TypeError('options.zookeeper (String) required'); if(typeof(options.log4js) !== 'object') throw new TypeError('options.log4js (Object) required'); if(options.timeout && typeof(options.timeout) !== 'number') throw new TypeError('options.timeout (Number) required'); if(typeof(callback) !== 'function') throw new TypeError('callback (Function) required'); var log = options.log4js.getLogger('mkdirp-test'); var zkLogLevel = ZK.ZOO_LOG_LEVEL_WARNING; if(log.isTraceEnabled()) zkLogLevel = ZK.ZOO_LOG_LEVEL_DEBUG; var zk = new ZK({ connect: options.zookeeper, timeout: options.timeout || 1000, debug_level: zkLogLevel, host_order_deterministic: false }); log.debug('connecting to zookeeper'); return zk.connect(function(err) { if(err) return callback(err); log.debug('connected to zookeeper.'); return callback && callback(null, zk); }); } if (require.main === module) { var options = { zookeeper: 'localhost:2181', log4js: log4js }; var PATH = '/mkdirp/test/path/of/death/n/destruction'; var con = null; startZK(options, function(err, connection) { if(err) return console.log(err); con = connection; return con.mkdirp(PATH, onMkdir); }); function onMkdir(err, win) { assert.ifError(err); // make sure the path now exists :) con.a_exists(PATH, null, function(rc, error, stat) { if(rc != 0) { throw new Error('Zookeeper Error: code='+rc+' '+error); } // path already exists, do nothing :) assert.ok(stat); return mkDirpAgain(); }); } // tests that no errors are thrown if you mkdirp a bunch of dirs that exist function mkDirpAgain(err, win) { con.mkdirp(PATH, finish); } function finish(err) { assert.ifError(err); console.log('TEST PASSED!', __filename); var dirs = [ '/mkdirp/test/path/of/death/n/destruction' , '/mkdirp/test/path/of/death/n' , '/mkdirp/test/path/of/death' , '/mkdirp/test/path/of' , '/mkdirp/test/path' , '/mkdirp/test' , '/mkdirp' ]; // can't easily delete the path, b/c haven't written rm -rf :) async.series([ function (cb) { con.a_delete_(dirs[0], 0, normalizeCb(cb)); } , function (cb) { con.a_delete_(dirs[1], 0, normalizeCb(cb)); } , function (cb) { con.a_delete_(dirs[2], 0, normalizeCb(cb)); } , function (cb) { con.a_delete_(dirs[3], 0, normalizeCb(cb)); } , function (cb) { con.a_delete_(dirs[4], 0, normalizeCb(cb)); } , function (cb) { con.a_delete_(dirs[5], 0, normalizeCb(cb)); } , function (cb) { con.a_delete_(dirs[6], 0, normalizeCb(cb)); } ], function(err, results) { console.log('Deleted mkdirp`ed dirs: '+results.length+' of '+dirs.length); process.exit(0); }); } // allows a callback that expects to be called like this: // cb() // to instead be called like this: // cb(rc, error) // and then have the original callback only be called with an Error, or // nothing at all if there was no Error. function normalizeCb(callback) { return function(rc, error) { if(!callback) return; if(rc != 0) { return callback(new Error('Zookeeper Error: code='+rc+' '+error)); } return callback(null, true); }; } }