• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2var fs = require('graceful-fs')
3var path = require('path')
4var test = require('tap').test
5var rimraf = require('rimraf')
6var writeStream = require('../index.js')
7
8var target = path.resolve(__dirname, 'test-rename-eperm1')
9var target2 = path.resolve(__dirname, 'test-rename-eperm2')
10var target3 = path.resolve(__dirname, 'test-rename-eperm3')
11
12test('rename eperm none existing file', function (t) {
13  t.plan(2)
14
15  var _rename = fs.rename
16  fs.existsSync = function (src) {
17    return true
18  }
19  fs.rename = function (src, dest, cb) {
20    // simulate a failure during rename where the file
21    // is renamed successfully but the process encounters
22    // an EPERM error and the target file does not exist
23    _rename(src, dest, function (e) {
24      var err = new Error('TEST BREAK')
25      err.syscall = 'rename'
26      err.code = 'EPERM'
27      cb(err)
28    })
29  }
30
31  var stream = writeStream(target, { isWin: true })
32  var hadError = false
33  var calledFinish = false
34  stream.on('error', function (er) {
35    hadError = true
36    console.log('#', er)
37  })
38  stream.on('finish', function () {
39    calledFinish = true
40  })
41  stream.on('close', function () {
42    t.is(hadError, true, 'error was caught')
43    t.is(calledFinish, false, 'finish was called before close')
44  })
45  stream.end()
46})
47
48// test existing file with diff. content
49test('rename eperm existing file different content', function (t) {
50  t.plan(2)
51
52  var _rename = fs.rename
53  fs.existsSync = function (src) {
54    return true
55  }
56  fs.rename = function (src, dest, cb) {
57    // simulate a failure during rename where the file
58    // is renamed successfully but the process encounters
59    // an EPERM error and the target file that has another content than the
60    // destination
61    _rename(src, dest, function (e) {
62      fs.writeFile(src, 'dest', function (writeErr) {
63        if (writeErr) {
64          return console.log('WRITEERR: ' + writeErr)
65        }
66
67        fs.writeFile(target2, 'target', function (writeErr) {
68          if (writeErr) {
69            return console.log('WRITEERR: ' + writeErr)
70          }
71
72          var err = new Error('TEST BREAK')
73          err.syscall = 'rename'
74          err.code = 'EPERM'
75          cb(err)
76        })
77      })
78    })
79  }
80
81  var stream = writeStream(target2, { isWin: true })
82  var hadError = false
83  var calledFinish = false
84  stream.on('error', function (er) {
85    hadError = true
86    console.log('#', er)
87  })
88  stream.on('finish', function () {
89    calledFinish = true
90  })
91  stream.on('close', function () {
92    t.is(hadError, true, 'error was caught')
93    t.is(calledFinish, false, 'finish was called before close')
94  })
95  stream.end()
96})
97
98// test existing file with the same content
99// test existing file with diff. content
100test('rename eperm existing file different content', function (t) {
101  t.plan(2)
102
103  var _rename = fs.rename
104  fs.existsSync = function (src) {
105    return true
106  }
107  fs.rename = function (src, dest, cb) {
108    // simulate a failure during rename where the file
109    // is renamed successfully but the process encounters
110    // an EPERM error and the target file that has the same content than the
111    // destination
112    _rename(src, dest, function (e) {
113      fs.writeFile(src, 'target2', function (writeErr) {
114        if (writeErr) {
115          return console.log('WRITEERR: ' + writeErr)
116        }
117
118        fs.writeFile(target3, 'target2', function (writeErr) {
119          if (writeErr) {
120            return console.log('WRITEERR: ' + writeErr)
121          }
122
123          var err = new Error('TEST BREAK')
124          err.syscall = 'rename'
125          err.code = 'EPERM'
126          cb(err)
127        })
128      })
129    })
130  }
131
132  var stream = writeStream(target3, { isWin: true })
133  var hadError = false
134  var calledFinish = false
135  stream.on('error', function (er) {
136    hadError = true
137    console.log('#', er)
138  })
139  stream.on('finish', function () {
140    calledFinish = true
141  })
142  stream.on('close', function () {
143    t.is(hadError, false, 'error was caught')
144    t.is(calledFinish, true, 'finish was called before close')
145  })
146  stream.end()
147})
148
149test('cleanup', function (t) {
150  rimraf.sync(target)
151  rimraf.sync(target2)
152  rimraf.sync(target3)
153  t.end()
154})
155