@carbon-io/fibers
Version:
724 lines (681 loc) • 20 kB
JavaScript
var assert = require('assert')
var debug = require('debug')
var mockery = require('mockery')
var sinon = require('sinon')
var o = require('@carbon-io/atom').o(module)
var oo = require('@carbon-io/atom').oo(module)
var _o = require('@carbon-io/bond')._o(module)
var testtube = require('@carbon-io/test-tube')
var __ = require('../index').__(module)
var _spawnBookkeeping = undefined
var FiberSpy = require('./util').FiberSpy
var debugSpy = function(namespace) {
debugSpy.spy = sinon.spy(debug(namespace))
return debugSpy.spy
}
/******************************************************************************
*
*/
var __Test = oo({
_type: testtube.Test,
_C: function() {
this.mod = module
},
setup: function() {
this.parent._setup(this.mod)
},
teardown: function() {
this.parent._teardown()
}
})
/******************************************************************************
*
*/
__(function() {
module.exports = o.main({
_type: testtube.Test,
name: '__Tests',
description: '__ tests',
/****************************************************************************
*
*/
_setup: function(mod) {
mockery.registerMock('fibers', FiberSpy)
mockery.registerMock('debug', debugSpy)
mockery.enable({
useCleanCache: true,
warnOnUnregistered: false,
warnOnReplace: false
})
__ = require('../index').__(mod)
this._spawnBookkeeping = require('../index')._spawnBookkeeping
this.spawnFibersLength = this._spawnBookkeeping._fibers._length
},
/****************************************************************************
*
*/
_teardown: function() {
mockery.disable()
mockery.deregisterAll()
assert.equal(this._spawnBookkeeping._fibers._length, this.spawnFibersLength)
__ = undefined
FiberSpy.resetAll()
debugSpy.spy.reset()
},
/****************************************************************************
*
*/
tests: [
/**************************************************************************
* __ tests
*/
o({
_type: __Test,
name: 'noCbTest',
doTest: function() {
var spy = sinon.spy()
__(function() {
spy(1)
})
assert(!FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'noCbErrTest',
doTest: function() {
var self = this
var spy = sinon.spy()
assert.throws(function() {
__(function() {
spy(1)
throw new Error(self.name)
})
}, Error)
assert(!FiberSpy.called)
assert(debugSpy.spy.firstCall.args[0].includes(this.name))
assert.equal(spy.firstCall.args[0], 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'cbTest',
doTest: function() {
var err = undefined
var res = undefined
__(function() {
return 1
}, function(e, r) {
err = e
res = r
})
assert(!FiberSpy.called)
assert.equal(res, 1)
assert(!err)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'cbErrTest',
doTest: function() {
var self = this
var err = undefined
var res = undefined
__(function() {
throw new Error(self.name)
}, function(e, r) {
err = e
res = r
})
assert(!FiberSpy.called)
assert.equal(typeof res, 'undefined')
assert(err instanceof Error)
assert(err.toString().includes(this.name))
}
}),
/**************************************************************************
* __.spawn tests
*/
o({
_type: __Test,
name: 'noCbTestSpawn',
doTest: function(ctx, done) {
var spy = sinon.spy()
__.spawn(function() {
spy(1)
})
setImmediate(function() {
var err = undefined
try {
assert(FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'noCbErrTestSpawn',
doTest: function(ctx, done) {
var self = this
var spy = sinon.spy()
assert.doesNotThrow(function() {
__.spawn(function() {
spy(1)
throw new Error(self.name)
})
}, Error)
setImmediate(function() {
var err = undefined
try {
assert(FiberSpy.called)
assert(debugSpy.spy.firstCall.args[0].includes(self.name))
assert.equal(spy.firstCall.args[0], 1)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'cbTestSpawn',
doTest: function(ctx, done) {
var self = this
var err = undefined
var res = undefined
__.spawn(function() {
return 1
}, function(e, r) {
err = e
res = r
})
setImmediate(function() {
try {
assert(FiberSpy.called)
assert.equal(res, 1)
assert.equal(err, null)
err = undefined
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'cbErrTestSpawn',
doTest: function(ctx, done) {
var self = this
var err = undefined
var res = undefined
__.spawn(function() {
throw new Error(self.name)
}, function(e, r) {
err = e
res = r
})
setImmediate(function() {
try {
assert(FiberSpy.called)
assert.equal(typeof res, 'undefined')
assert(err instanceof Error)
assert(err.toString().includes(self.name))
err = undefined
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
* __ tests outside of fiber
*/
o({
_type: __Test,
name: 'noCbTestNoFiber',
setup: function() {
__Test.prototype.setup.call(this)
sinon.stub(FiberSpy, '_getCurrent').returns(undefined)
},
teardown: function() {
FiberSpy._getCurrent.restore()
__Test.prototype.teardown.call(this)
},
doTest: function(ctx, done) {
var spy = sinon.spy()
__(function() {
spy(1)
})
setImmediate(function() {
var err = undefined
try {
assert(FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'noCbErrTestNoFiber',
setup: function() {
__Test.prototype.setup.call(this)
sinon.stub(FiberSpy, '_getCurrent').returns(undefined)
},
teardown: function() {
FiberSpy._getCurrent.restore()
__Test.prototype.teardown.call(this)
},
doTest: function(ctx, done) {
var self = this
var spy = sinon.spy()
assert.doesNotThrow(function() {
__(function() {
spy(1)
throw new Error(self.name)
})
}, Error)
setImmediate(function() {
var err = undefined
try {
assert(FiberSpy.called)
assert.equal(debugSpy.spy.callCount, 2)
assert(debugSpy.spy.firstCall.args[0].includes(self.name))
assert(debugSpy.spy.secondCall.args[0].includes(self.name))
assert.equal(spy.firstCall.args[0], 1)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'cbTestNoFiber',
setup: function() {
__Test.prototype.setup.call(this)
sinon.stub(FiberSpy, '_getCurrent').returns(undefined)
},
teardown: function() {
FiberSpy._getCurrent.restore()
__Test.prototype.teardown.call(this)
},
doTest: function(ctx, done) {
var err = undefined
var res = undefined
__(function() {
return 1
}, function(e, r) {
err = e
res = r
})
setImmediate(function() {
try {
assert(FiberSpy.called)
assert.equal(typeof error, 'undefined')
assert.equal(res, 1)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'cbErrTestNoFiber',
setup: function() {
__Test.prototype.setup.call(this)
sinon.stub(FiberSpy, '_getCurrent').returns(undefined)
},
teardown: function() {
FiberSpy._getCurrent.restore()
__Test.prototype.teardown.call(this)
},
doTest: function(ctx, done) {
var self = this
var err = undefined
var res = undefined
var spy = sinon.spy()
__(function() {
spy(1)
throw new Error(self.name)
}, function(e, r) {
err = e
res = r
})
setImmediate(function() {
try {
assert(FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
assert.equal(typeof res, 'undefined')
assert(err instanceof Error)
assert(err.message.includes(self.name))
err = undefined
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
* __.main tests with mod == require.main
*/
o({
_type: __Test,
name: 'mainMainNoCbTest',
mod: require.main,
doTest: function() {
var spy = sinon.spy()
__.main(function() {
spy(1)
})
assert(!FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'mainMainNoCbErrTest',
mod: require.main,
doTest: function() {
var self = this
var spy = sinon.spy()
assert.throws(function() {
__.main(function() {
spy(1)
throw new Error(self.name)
})
}, Error)
assert(!FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'mainMainCbTest',
mod: require.main,
doTest: function() {
var res = undefined
var err = undefined
__.main(function() {
return 1
}, function(e, r) {
err = e
res = r
})
assert(!FiberSpy.called)
assert.equal(res, 1)
assert(!err)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'mainMainCbErrTest',
mod: require.main,
doTest: function() {
var self = this
var err = undefined
var res = undefined
__.main(function() {
throw new Error(self.name)
}, function(e, r) {
err = e
res = r
})
assert(!FiberSpy.called)
assert.equal(typeof res, 'undefined')
assert(err instanceof Error)
}
}),
/**************************************************************************
* __.main tests with mod != require.main
*/
o({
_type: __Test,
name: 'mainNoMainNoCbTest',
doTest: function() {
var spy = sinon.spy()
__.main(function() {
spy(1)
})
assert(!FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'mainNoMainNoCbErrTest',
doTest: function() {
var self = this
var spy = sinon.spy()
assert.throws(function() {
__.main(function() {
spy(1)
throw new Error(self.name)
})
}, Error)
assert(!FiberSpy.called)
assert.equal(spy.firstCall.args[0], 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'mainNoMainCbTest',
doTest: function() {
var err = undefined
var res = undefined
__.main(function() {
return 1
}, function(e, r) {
err = e
res = r
})
assert(!FiberSpy.called)
assert.equal(res, 1)
assert.equal(err, null)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'mainNoMainCbErrTest',
doTest: function() {
var self = this
var err = undefined
var res = undefined
__.main(function() {
throw new Error(self.name)
}, function(e, r) {
err = e
res = r
})
assert(!FiberSpy.called)
assert.equal(typeof res, 'undefined')
assert(err instanceof Error)
assert.equal(err.message, this.name)
}
}),
/**************************************************************************
* XXX: remove when we have a separate logging module
*/
o({
_type: __Test,
name: 'consoleErrorCalledForMainModuleNoFiber',
mod: require.main,
setup: function() {
__Test.prototype.setup.call(this)
sinon.spy(console, 'error')
sinon.stub(FiberSpy, '_getCurrent').returns(undefined)
},
teardown: function() {
FiberSpy._getCurrent.restore()
console.error.restore()
__Test.prototype.teardown.call(this)
},
doTest: function(ctx, done) {
var self = this
__(function() {
_o('./fixtures/badRequirement')
})
setImmediate(function() {
var err = undefined
try {
assert.equal(console.error.callCount, 2)
assert.equal(debugSpy.spy.callCount, 2)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
* XXX: remove when we have a separate logging module
*/
o({
_type: __Test,
name: 'consoleErrorNotCalledForChildModuleNoFiber',
setup: function() {
__Test.prototype.setup.call(this)
sinon.spy(console, 'error')
sinon.stub(FiberSpy, '_getCurrent').returns(undefined)
},
teardown: function() {
FiberSpy._getCurrent.restore()
console.error.restore()
__Test.prototype.teardown.call(this)
},
doTest: function(ctx, done) {
var self = this
__(function() {
_o('./fixtures/badRequirement')
})
setImmediate(function() {
var err = undefined
try {
assert.equal(console.error.callCount, 0)
assert.equal(debugSpy.spy.callCount, 2)
} catch (e) {
err = e
}
done(err)
})
}
}),
/**************************************************************************
* XXX: remove when we have a separate logging module
*/
o({
_type: __Test,
name: 'consoleErrorNotCalledForChildModuleInFiber',
setup: function() {
__Test.prototype.setup.call(this)
sinon.spy(console, 'error')
},
teardown: function() {
console.error.restore()
__Test.prototype.teardown.call(this)
},
doTest: function() {
var self = this
assert.throws(function() {
__(function() {
_o('./fixtures/badRequirement')
})
}, /foo is not defined/)
assert.equal(console.error.callCount, 0)
assert.equal(debugSpy.spy.callCount, 1)
}
}),
/**************************************************************************
*
*/
o({
_type: __Test,
name: 'ensureSpawnMainRefTest',
doTest: function() {
// XXX: reinstate when module no longer needed (required for logging
// errors during initialization)
// assert.equal(__(module), __)
assert.equal(__, __.ensure)
assert.equal(__, __.ensure.ensure)
assert(__.spawn !== __)
assert(__.spawn !== __.ensure)
assert.equal(__.spawn, __.spawn.spawn)
assert.equal(__.spawn.ensure, __)
assert.equal(__.spawn.ensure, __.ensure)
assert.equal(__.spawn.ensure, __.ensure.ensure)
assert.equal(__.spawn.ensure.ensure, __)
assert.equal(__.spawn.ensure.ensure, __.ensure)
assert.equal(__.spawn.ensure.ensure, __.ensure.ensure)
assert.equal(__.ensure.spawn, __.spawn)
assert.equal(__.ensure.spawn, __.spawn.spawn)
assert.equal(__.ensure.spawn.spawn, __.spawn)
assert.equal(__.ensure.spawn.spawn, __.spawn.spawn)
assert.equal(__.ensure.spawn.ensure, __.ensure)
assert.equal(__.spawn.ensure.spawn, __.spawn)
assert.equal(__.ensure.spawn.ensure.main, __.main)
assert.equal(__.spawn.ensure.spawn.main, __.main)
}
})
]
})
})