You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					114 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					114 lines
				
				2.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const test = require('tap').test
							 | 
						||
| 
								 | 
							
								const boot = require('..')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('reentrant', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(7)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const app = boot()
							 | 
						||
| 
								 | 
							
								  let firstLoaded = false
							 | 
						||
| 
								 | 
							
								  let secondLoaded = false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app
							 | 
						||
| 
								 | 
							
								    .use(first)
							 | 
						||
| 
								 | 
							
								    .after(() => {
							 | 
						||
| 
								 | 
							
								      t.ok(firstLoaded, 'first is loaded')
							 | 
						||
| 
								 | 
							
								      t.ok(secondLoaded, 'second is loaded')
							 | 
						||
| 
								 | 
							
								      t.pass('booted')
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function first (s, opts, done) {
							 | 
						||
| 
								 | 
							
								    t.notOk(firstLoaded, 'first is not loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(secondLoaded, 'second is not loaded')
							 | 
						||
| 
								 | 
							
								    firstLoaded = true
							 | 
						||
| 
								 | 
							
								    s.use(second)
							 | 
						||
| 
								 | 
							
								    done()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function second (s, opts, done) {
							 | 
						||
| 
								 | 
							
								    t.ok(firstLoaded, 'first is loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(secondLoaded, 'second is not loaded')
							 | 
						||
| 
								 | 
							
								    secondLoaded = true
							 | 
						||
| 
								 | 
							
								    done()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('reentrant with callbacks deferred', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(11)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const app = boot()
							 | 
						||
| 
								 | 
							
								  let firstLoaded = false
							 | 
						||
| 
								 | 
							
								  let secondLoaded = false
							 | 
						||
| 
								 | 
							
								  let thirdLoaded = false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.use(first)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function first (s, opts, done) {
							 | 
						||
| 
								 | 
							
								    t.notOk(firstLoaded, 'first is not loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(secondLoaded, 'second is not loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(thirdLoaded, 'third is not loaded')
							 | 
						||
| 
								 | 
							
								    firstLoaded = true
							 | 
						||
| 
								 | 
							
								    s.use(second)
							 | 
						||
| 
								 | 
							
								    setTimeout(() => {
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        s.use(third)
							 | 
						||
| 
								 | 
							
								      } catch (err) {
							 | 
						||
| 
								 | 
							
								        t.equal(err.message, 'root plugin has already booted')
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }, 500)
							 | 
						||
| 
								 | 
							
								    done()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function second (s, opts, done) {
							 | 
						||
| 
								 | 
							
								    t.ok(firstLoaded, 'first is loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(secondLoaded, 'second is not loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(thirdLoaded, 'third is not loaded')
							 | 
						||
| 
								 | 
							
								    secondLoaded = true
							 | 
						||
| 
								 | 
							
								    done()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function third (s, opts, done) {
							 | 
						||
| 
								 | 
							
								    thirdLoaded = true
							 | 
						||
| 
								 | 
							
								    done()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.on('start', () => {
							 | 
						||
| 
								 | 
							
								    t.ok(firstLoaded, 'first is loaded')
							 | 
						||
| 
								 | 
							
								    t.ok(secondLoaded, 'second is loaded')
							 | 
						||
| 
								 | 
							
								    t.notOk(thirdLoaded, 'third is not loaded')
							 | 
						||
| 
								 | 
							
								    t.pass('booted')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('multiple loading time', t => {
							 | 
						||
| 
								 | 
							
								  t.plan(1)
							 | 
						||
| 
								 | 
							
								  const app = boot()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function a (instance, opts, done) {
							 | 
						||
| 
								 | 
							
								    (opts.use || []).forEach(_ => { instance.use(_, { use: opts.subUse || [] }) })
							 | 
						||
| 
								 | 
							
								    setTimeout(done, 10)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  const pointer = a
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function b (instance, opts, done) {
							 | 
						||
| 
								 | 
							
								    (opts.use || []).forEach(_ => { instance.use(_, { use: opts.subUse || [] }) })
							 | 
						||
| 
								 | 
							
								    setTimeout(done, 20)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function c (instance, opts, done) {
							 | 
						||
| 
								 | 
							
								    (opts.use || []).forEach(_ => { instance.use(_, { use: opts.subUse || [] }) })
							 | 
						||
| 
								 | 
							
								    setTimeout(done, 30)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app
							 | 
						||
| 
								 | 
							
								    .use(function a (instance, opts, done) {
							 | 
						||
| 
								 | 
							
								      instance.use(pointer, { use: [b], subUse: [c] })
							 | 
						||
| 
								 | 
							
								        .use(b)
							 | 
						||
| 
								 | 
							
								      setTimeout(done, 0)
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								    .after(() => {
							 | 
						||
| 
								 | 
							
								      t.pass('booted')
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								})
							 |