text: const os = require('os')
  const fs = require('fs')
  const tape = require('tape')
  const { spawnSync, exec } = require('child_process')
  
  const createMountpoint = require('./fixtures/mnt')
  
  const Fuse = require('../')
  const { unmount } = require('./helpers')
  const simpleFS = require('./fixtures/simple-fs')
  
  const mnt = createMountpoint()
  
  tape('mount', function (t) {
    const fuse = new Fuse(mnt, {}, { force: true })
    fuse.mount(function (err) {
      t.error(err, 'no error')
      t.ok(true, 'works')
      unmount(fuse, function () {
        t.end()
      })
    })
  })
  
  tape('mount + unmount + mount', function (t) {
    const fuse1 = new Fuse(mnt, {}, { force: true, debug: false })
    const fuse2 = new Fuse(mnt, {}, { force: true, debug: false })
  
    fuse1.mount(function (err) {
      t.error(err, 'no error')
      t.ok(true, 'works')
      unmount(fuse1, function () {
        fuse2.mount(function (err) {
          t.error(err, 'no error')
          t.ok(true, 'works')
          unmount(fuse2, function () {
            t.end()
          })
        })
      })
    })
  })
  
  tape('mount + unmount + mount with same instance fails', function (t) {
    const fuse = new Fuse(mnt, {}, { force: true, debug: false })
  
    fuse.mount(function (err) {
      t.error(err, 'no error')
      t.pass('works')
      unmount(fuse, function () {
        fuse.mount(function (err) {
          t.ok(err, 'had error')
          t.end()
        })
      })
    })
  })
  
  tape('(not win32) mnt point must exist', function (t) {
    if (os.platform() === 'win32') return t.end()
    const fuse = new Fuse('.does-not-exist', {}, { debug: false })
    fuse.mount(function (err) {
      t.ok(err, 'had error')
      t.end()
    })
  })
  
  tape('(not win32) mnt point must be directory', function (t) {
    if (os.platform() === 'win32') return t.end()
    const fuse = new Fuse(__filename, {}, { debug: false })
    fuse.mount(function (err) {
      t.ok(err, 'had error')
      t.end()
    })
  })
  
  tape('mounting twice without force fails', function (t) {
    const fuse1 = new Fuse(mnt, {}, { force: true, debug: false })
    const fuse2 = new Fuse(mnt, {}, { force: false, debug: false })
  
    fuse1.mount(function (err) {
      t.error(err, 'no error')
      t.pass('works')
      fuse2.mount(function (err) {
        t.true(err, 'cannot mount over existing mountpoint')
        unmount(fuse1, function () {
          t.end()
        })
      })
    })
  })
  
  tape('mounting twice with force fail if mountpoint is not broken', function (t) {
    const fuse1 = new Fuse(mnt, {}, { force: true, debug: false })
    const fuse2 = new Fuse(mnt, {}, { force: true, debug: false })
  
    fuse1.mount(function (err) {
      t.error(err, 'no error')
      t.pass('works')
      fuse2.mount(function (err) {
        t.true(err, 'cannot mount over existing mountpoint')
        unmount(fuse1, function () {
          t.end()
        })
      })
    })
  })
  
  tape('mounting over a broken mountpoint with force succeeds', function (t) {
    createBrokenMountpoint(mnt)
  
    const fuse = new Fuse(mnt, {}, { force: true, debug: false })
    fuse.mount(function (err) {
      t.error(err, 'no error')
      t.pass('works')
      unmount(fuse, function (err) {
        t.end()
      })
    })
  })
  
  tape('(not win32) mounting without mkdir option and a nonexistent mountpoint fails', function (t) {
    if (os.platform() === 'win32') return t.end()
    const nonexistentMnt = createMountpoint({ doNotCreate: true })
  
    const fuse = new Fuse(nonexistentMnt, {}, { debug: false })
    fuse.mount(function (err) {
      t.true(err, 'could not mount')
      t.end()
    })
  })
  
  tape('mounting with mkdir option and a nonexistent mountpoint succeeds', function (t) {
    const nonexistentMnt = createMountpoint({ doNotCreate: true })
  
    const fuse = new Fuse(nonexistentMnt, {}, { debug: false, mkdir: true })
    fuse.mount(function (err) {
      t.error(err, 'no error')
      unmount(fuse, function (err) {
        t.end()
      })
    })
  })
  
  tape('(osx only) unmount with Finder open succeeds', function (t) {
    if (os.platform() !== 'darwin') return t.end()
    const fuse = new Fuse(mnt, simpleFS(), { force: true, debug: false })
    fuse.mount(function (err) {
      t.error(err, 'no error')
      exec(`open ${mnt}`, err => {
        t.error(err, 'no error')
        setTimeout(() => {
          fs.readdir(mnt, (err, list) => {
            t.error(err, 'no error')
            t.same(list, ['test'])
            unmount(fuse, err => {
              t.error(err, 'no error')
              fs.readdir(mnt, (err, list) => {
                t.error(err, 'no error')
                t.same(list, [])
                t.end()
              })
            })
          })
        }, 1000)
      })
    })
  })
  
  tape('(osx only) unmount with Terminal open succeeds', function (t) {
    if (os.platform() !== 'darwin') return t.end()
    const fuse = new Fuse(mnt, simpleFS(), { force: true, debug: false })
    fuse.mount(function (err) {
      t.error(err, 'no error')
      exec(`open -a Terminal ${mnt}`, err => {
        t.error(err, 'no error')
        setTimeout(() => {
          fs.readdir(mnt, (err, list) => {
            t.error(err, 'no error')
            t.same(list, ['test'])
            unmount(fuse, err => {
              t.error(err, 'no error')
              fs.readdir(mnt, (err, list) => {
                t.error(err, 'no error')
                t.same(list, [])
                t.end()
              })
            })
          })
        }, 1000)
      })
    })
  })
  
  tape('static unmounting', function (t) {
    t.end()
  })
  
  function createBrokenMountpoint (mnt) {
    spawnSync(process.execPath, ['-e', `
      const Fuse = require('..')
      const mnt = ${JSON.stringify(mnt)}
      const fuse = new Fuse(mnt, {}, { force: true, debug: false })
      fuse.mount(() => {
        process.exit(0)
      })
    `], {
      cwd: __dirname,
      stdio: 'inherit'
    })
  }
  