Ejemplo n.º 1
0
test('disables, and then enables a dev extension', async t => {
  setTimeout(()=>t.fail('Test took too long.'), 0)
  const enabled = promise()
  const disabled = promise()

  const promises = [disabled, enabled]

  const chrome = t.context.chrome
  chrome.management.setEnabled = (id, boolean, cb) => {
    promises.shift().resolve(boolean)
    cb()
  }

  const msg = {command: 'reload'}
  makeReload({chrome})(msg)

  // If this happens in the wrong order, these results
  // will be switched and both should fail.
  const wasDisabled = await disabled
  const wasEnabled = await enabled

  t.is(wasDisabled, false),
  t.is(wasEnabled, true)

  return
})
Ejemplo n.º 2
0
test('passes reload message to messenger', async t=> {
  setTimeout(()=> t.fail('Test took too long.'), 0)

  const helloSpy = promise()
  const msgSpy = promise()

  const lrSocket = makeLrSocket({
    port: ports.valid,
    host: hosts.valid,
    messenger: {message: msgSpy.resolve},
    onError: ()=> {},
    onOpen: ()=> {},

    WebSocket: function WebSocket() {
      this.readyState = 1
      this.send = helloSpy.resolve
      this.close = ()=> {}
    },
  })

  const socket = lrSocket.connect()
  socket.onopen()

  // must send a Hello before a Reload will be accepted
  socket.onmessage(helloEvent)
  await helloSpy

  socket.onmessage(reloadEvent)

  t.is(msgSpy.done(), true)
})
Ejemplo n.º 3
0
test('Waits for open readyState after open event', async t=> {
  setTimeout(()=> t.fail('Test took too long.'), 2000)

  const spy = promise()

  const lrSocket = makeLrSocket({
    port: ports.valid,
    host: hosts.valid,
    messenger: {message(){}},

    WebSocket: function WebSocket() {
      this.send = spy.resolve
      this.readyState = 0
      setTimeout(() => {this.readyState = 1}, 400)
    },
  })

  const socket = lrSocket.connect()
  socket.onopen()

  t.is(
    JSON.parse(await spy).command,
    'hello'
  )
})
Ejemplo n.º 4
0
test('only reloads developer extensions', async t => {
  const disabled = promise()
  const chrome = t.context.chrome

  const installTypes = [ 'admin','normal','sideload','other' ]

  const extensions = [10,11,12,13].map((id, i)=>
    Object.assign({},
      chrome.management.extensions[0],
      { id, installType: installTypes[i]  }
    )
  )

  chrome.management.extensions = extensions
  chrome.management.setEnabled = (id, boolean, cb) => {
    disabled.resolve(boolean)
    cb()
  }

  const msg = {command: 'reload'}
  await makeReload({chrome})(msg)
    .then(()=> {
      // If we get to here with disabled not already
      // resolved, then setEnabled was not called
      t.pass('setEnabled not called')
      disabled.resolve()
    })
  return
})
Ejemplo n.º 5
0
test('hangs up if too long to fully connect', async t=> {
  const testsComplete = promise()
  setTimeout(()=>
    testsComplete.reject('Test took too long'),
  12000)

  const sendSpy = promise()
  const closeSpy = promise()
  const errorSpy = promise()

  const lrSocket = makeLrSocket({
    port: ports.valid,
    host: hosts.valid,
    messenger: {message(){}},
    onError: errorSpy.resolve,

    WebSocket: function WebSocket() {
      this.send = sendSpy.resolve
      this.close = closeSpy.resolve
      this.readyState = 0
      setTimeout(() => {this.readyState = 1}, 8500)
    },
  })

  const socket = lrSocket.connect()
  socket.onopen()

  setTimeout(async () => {
    t.is(sendSpy.done(), false)
    sendSpy.resolve()

    t.is(closeSpy.done(), true)
    t.is(
      (await errorSpy).message.indexOf('Timeout') > -1,
      true
    )

    testsComplete.resolve()
  }, 9000)

  await testsComplete
})
Ejemplo n.º 6
0
test('connects to websocket', t=> {
  const spy = promise()
  const lrSocket = makeLrSocket({
    port: ports.valid,
    host: hosts.valid,
    messenger: {message(){}},

    WebSocket: function WebSocket(){
      spy.resolve()
    },
  })

  lrSocket.connect()

  t.is(spy.done(), true)
})
Ejemplo n.º 7
0
test('calls close callback on close', async t=> {
  setTimeout(()=> t.fail('Test took too long.'), 0)
  const spy = promise()

  const lrSocket = makeLrSocket({
    port: ports.valid,
    host: hosts.valid,
    onClose: spy.resolve,

    WebSocket: function WebSocket() {},
  })

  const socket = lrSocket.connect()
  socket.onclose()

  t.is(spy.done(), true)
})
Ejemplo n.º 8
0
test('does not reload disabled extensions', async t => {
  const disabled = promise()

  const chrome = t.context.chrome
  chrome.management.extensions[0].enabled = false
  chrome.management.setEnabled = (id, boolean, cb) => {
    disabled.resolve(boolean)
    cb()
  }

  const msg = {command: 'reload'}
  await makeReload({chrome})(msg)
    .then(()=> {
      // If we get to here with disabled not already
      // resolved, then setEnabled was not called
      t.pass('setEnabled not called')
      disabled.resolve()
    })
  return
})
Ejemplo n.º 9
0
test('does not attempt to reload self', async t=> {
  const disabled = promise()

  const chrome = t.context.chrome
  chrome.runtime.id = 20
  chrome.setEnabled = (id, boolean, cb) => {
    disabled.resolve(boolean)
    cb()
  }

  const msg = {command: 'reload'}
  await makeReload({chrome})(msg)
    .then(()=> {
      // If we get to here with disabled not already
      // resolved, then setEnabled was not called
      t.pass('setEnabled not called')
      disabled.resolve()
    })
  return
})
Ejemplo n.º 10
0
  return async msg=> {
    const ChrMgt = chrome.management

    async function reload (ext) {
      const reloaded = promise()

      // enabled -> disabled -> enabled == reload
      ChrMgt.setEnabled(ext.id, false, ()=>
        ChrMgt.setEnabled(ext.id, true, reloaded.resolve))
      await reloaded

      // Forward msg in case extension wants to know
      const forwardMsg = ()=>
        chrome.runtime.sendMessage(ext.id, msg)

      // apps still need to launch to finish reload
      if (ext.type.match(/app/))
        ChrMgt.launchApp(ext.id, forwardMsg)

      // extensions should be up already
      else forwardMsg()

      return ext
    }

    const extensions = promise()
    ChrMgt.getAll(extensions.resolve)

    const reloaded = (await extensions)
      .filter(extension=>
        // installed as unpacked folder
        extension.installType === 'development'
        // if app not specified, only reload enabled
        && extension.enabled === true
        // Clerc shouldn't reload itself
        && extension.id !== chrome.runtime.id
      )
      // and... Go!! :)
      .map(reload)
    return Promise.all(reloaded)
  }
Ejemplo n.º 11
0
    async function reload (ext) {
      const reloaded = promise()

      // enabled -> disabled -> enabled == reload
      ChrMgt.setEnabled(ext.id, false, ()=>
        ChrMgt.setEnabled(ext.id, true, reloaded.resolve))
      await reloaded

      // Forward msg in case extension wants to know
      const forwardMsg = ()=>
        chrome.runtime.sendMessage(ext.id, msg)

      // apps still need to launch to finish reload
      if (ext.type.match(/app/))
        ChrMgt.launchApp(ext.id, forwardMsg)

      // extensions should be up already
      else forwardMsg()

      return ext
    }
Ejemplo n.º 12
0
test('fails to create socket with invalid port', t=> {
  const validUrl =
    `ws://${hosts.valid}:${ports.valid}/livereload`

  const spy = promise()
  const lrSocket = makeLrSocket({
    port: ports.invalid,
    host: hosts.valid,
    messenger: {message(){}},
    onError: spy.resolve,

    WebSocket: function WebSocket(url) {
      if (url !== validUrl) throw 'bad url'
    },
  })

  const socket = lrSocket.connect()

  t.is(socket, void 0)
  t.is(spy.done(), true)
})
Ejemplo n.º 13
0
test('hangs up if hello is not valid', t=> {
  const spy = promise()

  const lrSocket = makeLrSocket({
    port: ports.valid,
    host: hosts.valid,
    messenger: {message(){}},
    onError: ()=> {},

    WebSocket: function WebSocket() {
      this.send = ()=> {},
      this.close = spy.resolve
    },
  })

  const socket = lrSocket.connect()
  socket.onopen()
  socket.onmessage('bad string')

  t.is(spy.done(), true)
})