source: node_modules/tar-fs/test/index.js@ 81bc7da

finki-main main
Last change on this file since 81bc7da was 81bc7da, checked in by Klimentina Efremova <klimentina08642@…>, 3 months ago

Initial commit

  • Property mode set to 100644
File size: 8.8 KB
Line 
1var test = require('tape')
2var rimraf = require('rimraf')
3var tar = require('../index')
4var tarStream = require('tar-stream')
5var path = require('path')
6var fs = require('fs')
7var os = require('os')
8
9var win32 = os.platform() === 'win32'
10
11var mtime = function (st) {
12 return Math.floor(st.mtime.getTime() / 1000)
13}
14
15test('copy a -> copy/a', function (t) {
16 t.plan(5)
17
18 var a = path.join(__dirname, 'fixtures', 'a')
19 var b = path.join(__dirname, 'fixtures', 'copy', 'a')
20
21 rimraf.sync(b)
22 tar.pack(a)
23 .pipe(tar.extract(b))
24 .on('finish', function () {
25 var files = fs.readdirSync(b)
26 t.same(files.length, 1)
27 t.same(files[0], 'hello.txt')
28 var fileB = path.join(b, files[0])
29 var fileA = path.join(a, files[0])
30 t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
31 t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
32 t.same(mtime(fs.statSync(fileB)), mtime(fs.statSync(fileA)))
33 })
34})
35
36test('copy b -> copy/b', function (t) {
37 t.plan(8)
38
39 var a = path.join(__dirname, 'fixtures', 'b')
40 var b = path.join(__dirname, 'fixtures', 'copy', 'b')
41
42 rimraf.sync(b)
43 tar.pack(a)
44 .pipe(tar.extract(b))
45 .on('finish', function () {
46 var files = fs.readdirSync(b)
47 t.same(files.length, 1)
48 t.same(files[0], 'a')
49 var dirB = path.join(b, files[0])
50 var dirA = path.join(a, files[0])
51 t.same(fs.statSync(dirB).mode, fs.statSync(dirA).mode)
52 t.same(mtime(fs.statSync(dirB)), mtime(fs.statSync(dirA)))
53 t.ok(fs.statSync(dirB).isDirectory())
54 var fileB = path.join(dirB, 'test.txt')
55 var fileA = path.join(dirA, 'test.txt')
56 t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
57 t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
58 t.same(mtime(fs.statSync(fileB)), mtime(fs.statSync(fileA)))
59 })
60})
61
62test('symlink', function (t) {
63 if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
64 t.plan(1)
65 t.ok(true)
66 return
67 }
68
69 t.plan(5)
70
71 var a = path.join(__dirname, 'fixtures', 'c')
72
73 rimraf.sync(path.join(a, 'link'))
74 fs.symlinkSync('.gitignore', path.join(a, 'link'))
75
76 var b = path.join(__dirname, 'fixtures', 'copy', 'c')
77
78 rimraf.sync(b)
79 tar.pack(a)
80 .pipe(tar.extract(b))
81 .on('finish', function () {
82 var files = fs.readdirSync(b).sort()
83 t.same(files.length, 2)
84 t.same(files[0], '.gitignore')
85 t.same(files[1], 'link')
86
87 var linkA = path.join(a, 'link')
88 var linkB = path.join(b, 'link')
89
90 t.same(mtime(fs.lstatSync(linkB)), mtime(fs.lstatSync(linkA)))
91 t.same(fs.readlinkSync(linkB), fs.readlinkSync(linkA))
92 })
93})
94
95test('follow symlinks', function (t) {
96 if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
97 t.plan(1)
98 t.ok(true)
99 return
100 }
101
102 t.plan(5)
103
104 var a = path.join(__dirname, 'fixtures', 'c')
105
106 rimraf.sync(path.join(a, 'link'))
107 fs.symlinkSync('.gitignore', path.join(a, 'link'))
108
109 var b = path.join(__dirname, 'fixtures', 'copy', 'c-dereference')
110
111 rimraf.sync(b)
112 tar.pack(a, { dereference: true })
113 .pipe(tar.extract(b))
114 .on('finish', function () {
115 var files = fs.readdirSync(b).sort()
116 t.same(files.length, 2)
117 t.same(files[0], '.gitignore')
118 t.same(files[1], 'link')
119
120 var file1 = path.join(b, '.gitignore')
121 var file2 = path.join(b, 'link')
122
123 t.same(mtime(fs.lstatSync(file1)), mtime(fs.lstatSync(file2)))
124 t.same(fs.readFileSync(file1), fs.readFileSync(file2))
125 })
126})
127
128test('strip', function (t) {
129 t.plan(2)
130
131 var a = path.join(__dirname, 'fixtures', 'b')
132 var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
133
134 rimraf.sync(b)
135
136 tar.pack(a)
137 .pipe(tar.extract(b, { strip: 1 }))
138 .on('finish', function () {
139 var files = fs.readdirSync(b).sort()
140 t.same(files.length, 1)
141 t.same(files[0], 'test.txt')
142 })
143})
144
145test('strip + map', function (t) {
146 t.plan(2)
147
148 var a = path.join(__dirname, 'fixtures', 'b')
149 var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
150
151 rimraf.sync(b)
152
153 var uppercase = function (header) {
154 header.name = header.name.toUpperCase()
155 return header
156 }
157
158 tar.pack(a)
159 .pipe(tar.extract(b, { strip: 1, map: uppercase }))
160 .on('finish', function () {
161 var files = fs.readdirSync(b).sort()
162 t.same(files.length, 1)
163 t.same(files[0], 'TEST.TXT')
164 })
165})
166
167test('map + dir + permissions', function (t) {
168 t.plan(win32 ? 1 : 2) // skip chmod test, it's not working like unix
169
170 var a = path.join(__dirname, 'fixtures', 'b')
171 var b = path.join(__dirname, 'fixtures', 'copy', 'a-perms')
172
173 rimraf.sync(b)
174
175 var aWithMode = function (header) {
176 if (header.name === 'a') {
177 header.mode = parseInt(700, 8)
178 }
179 return header
180 }
181
182 tar.pack(a)
183 .pipe(tar.extract(b, { map: aWithMode }))
184 .on('finish', function () {
185 var files = fs.readdirSync(b).sort()
186 var stat = fs.statSync(path.join(b, 'a'))
187 t.same(files.length, 1)
188 if (!win32) {
189 t.same(stat.mode & parseInt(777, 8), parseInt(700, 8))
190 }
191 })
192})
193
194test('specific entries', function (t) {
195 t.plan(6)
196
197 var a = path.join(__dirname, 'fixtures', 'd')
198 var b = path.join(__dirname, 'fixtures', 'copy', 'd-entries')
199
200 var entries = ['file1', 'sub-files/file3', 'sub-dir']
201
202 rimraf.sync(b)
203 tar.pack(a, { entries: entries })
204 .pipe(tar.extract(b))
205 .on('finish', function () {
206 var files = fs.readdirSync(b)
207 t.same(files.length, 3)
208 t.notSame(files.indexOf('file1'), -1)
209 t.notSame(files.indexOf('sub-files'), -1)
210 t.notSame(files.indexOf('sub-dir'), -1)
211 var subFiles = fs.readdirSync(path.join(b, 'sub-files'))
212 t.same(subFiles, ['file3'])
213 var subDir = fs.readdirSync(path.join(b, 'sub-dir'))
214 t.same(subDir, ['file5'])
215 })
216})
217
218test('check type while mapping header on packing', function (t) {
219 t.plan(3)
220
221 var e = path.join(__dirname, 'fixtures', 'e')
222
223 var checkHeaderType = function (header) {
224 if (header.name.indexOf('.') === -1) t.same(header.type, header.name)
225 }
226
227 tar.pack(e, { map: checkHeaderType })
228})
229
230test('finish callbacks', function (t) {
231 t.plan(3)
232
233 var a = path.join(__dirname, 'fixtures', 'a')
234 var b = path.join(__dirname, 'fixtures', 'copy', 'a')
235
236 rimraf.sync(b)
237
238 var packEntries = 0
239 var extractEntries = 0
240
241 var countPackEntry = function (header) { packEntries++ }
242 var countExtractEntry = function (header) { extractEntries++ }
243
244 var pack
245 var onPackFinish = function (passedPack) {
246 t.equal(packEntries, 2, 'All entries have been packed') // 2 entries - the file and base directory
247 t.equal(passedPack, pack, 'The finish hook passes the pack')
248 }
249
250 var onExtractFinish = function () { t.equal(extractEntries, 2) }
251
252 pack = tar.pack(a, { map: countPackEntry, finish: onPackFinish })
253
254 pack.pipe(tar.extract(b, { map: countExtractEntry, finish: onExtractFinish }))
255 .on('finish', function () {
256 t.end()
257 })
258})
259
260test('not finalizing the pack', function (t) {
261 t.plan(2)
262
263 var a = path.join(__dirname, 'fixtures', 'a')
264 var b = path.join(__dirname, 'fixtures', 'b')
265
266 var out = path.join(__dirname, 'fixtures', 'copy', 'merged-packs')
267
268 rimraf.sync(out)
269
270 var prefixer = function (prefix) {
271 return function (header) {
272 header.name = path.join(prefix, header.name)
273 return header
274 }
275 }
276
277 tar.pack(a, {
278 map: prefixer('a-files'),
279 finalize: false,
280 finish: packB
281 })
282
283 function packB (pack) {
284 tar.pack(b, { pack: pack, map: prefixer('b-files') })
285 .pipe(tar.extract(out))
286 .on('finish', assertResults)
287 }
288
289 function assertResults () {
290 var containers = fs.readdirSync(out)
291 t.deepEqual(containers, ['a-files', 'b-files'])
292 var aFiles = fs.readdirSync(path.join(out, 'a-files'))
293 t.deepEqual(aFiles, ['hello.txt'])
294 }
295})
296
297test('do not extract invalid tar', function (t) {
298 var a = path.join(__dirname, 'fixtures', 'invalid.tar')
299
300 var out = path.join(__dirname, 'fixtures', 'invalid')
301
302 rimraf.sync(out)
303
304 fs.createReadStream(a)
305 .pipe(tar.extract(out))
306 .on('error', function (err) {
307 t.ok(/is not a valid symlink/i.test(err.message))
308 fs.stat(path.join(out, '../bar'), function (err) {
309 t.ok(err)
310 t.end()
311 })
312 })
313})
314
315test('no abs hardlink targets', function (t) {
316 var out = path.join(__dirname, 'fixtures', 'invalid')
317 var outside = path.join(__dirname, 'fixtures', 'outside')
318
319 rimraf.sync(out)
320
321 var s = tarStream.pack()
322
323 fs.writeFileSync(outside, 'something')
324
325 s.entry({
326 type: 'link',
327 name: 'link',
328 linkname: outside
329 })
330
331 s.entry({
332 name: 'link'
333 }, 'overwrite')
334
335 s.finalize()
336
337 s.pipe(tar.extract(out))
338 .on('error', function (err) {
339 t.ok(err, 'had error')
340 fs.readFile(outside, 'utf-8', function (err, str) {
341 t.error(err, 'no error')
342 t.same(str, 'something')
343 t.end()
344 })
345 })
346})
Note: See TracBrowser for help on using the repository browser.