225 lines
5.0 KiB
JavaScript
225 lines
5.0 KiB
JavaScript
|
'use strict'
|
||
|
const t = require('tap')
|
||
|
const ReadEntry = require('../lib/read-entry.js')
|
||
|
const Header = require('../lib/header.js')
|
||
|
|
||
|
t.test('create read entry', t => {
|
||
|
const h = new Header({
|
||
|
path: 'oof.txt',
|
||
|
mode: 0o755,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
size: 100,
|
||
|
mtime: new Date('2016-04-01T22:00Z'),
|
||
|
ctime: new Date('2016-04-01T22:00Z'),
|
||
|
atime: new Date('2016-04-01T22:00Z'),
|
||
|
type: 'File',
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
})
|
||
|
h.encode()
|
||
|
|
||
|
const entry = new ReadEntry(h, { x: 'y', path: 'foo.txt' }, { z: 0, a: null, b: undefined })
|
||
|
|
||
|
t.ok(entry.header.cksumValid, 'header checksum should be valid')
|
||
|
|
||
|
t.match(entry, {
|
||
|
extended: { x: 'y', path: 'foo.txt' },
|
||
|
globalExtended: { z: 0, a: null, b: undefined },
|
||
|
header: {
|
||
|
cksumValid: true,
|
||
|
needPax: false,
|
||
|
path: 'oof.txt',
|
||
|
mode: 0o755,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
size: 100,
|
||
|
mtime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
typeKey: '0',
|
||
|
type: 'File',
|
||
|
linkpath: null,
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
devmaj: 0,
|
||
|
devmin: 0,
|
||
|
atime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
ctime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
},
|
||
|
blockRemain: 512,
|
||
|
remain: 100,
|
||
|
type: 'File',
|
||
|
meta: false,
|
||
|
ignore: false,
|
||
|
path: 'foo.txt',
|
||
|
mode: 0o755,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
size: 100,
|
||
|
mtime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
atime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
ctime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
linkpath: null,
|
||
|
x: 'y',
|
||
|
z: 0,
|
||
|
})
|
||
|
|
||
|
let data = ''
|
||
|
let ended = false
|
||
|
entry.on('data', c => data += c)
|
||
|
entry.on('end', _ => ended = true)
|
||
|
|
||
|
const body = Buffer.alloc(512)
|
||
|
body.write(new Array(101).join('z'), 0)
|
||
|
entry.write(body)
|
||
|
entry.end()
|
||
|
|
||
|
t.equal(data, new Array(101).join('z'))
|
||
|
t.ok(ended, 'saw end event')
|
||
|
|
||
|
t.end()
|
||
|
})
|
||
|
|
||
|
t.test('meta entry', t => {
|
||
|
const h = new Header({
|
||
|
path: 'PaxHeader/foo.txt',
|
||
|
mode: 0o755,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
size: 23,
|
||
|
mtime: new Date('2016-04-01T22:00Z'),
|
||
|
ctime: new Date('2016-04-01T22:00Z'),
|
||
|
atime: new Date('2016-04-01T22:00Z'),
|
||
|
type: 'NextFileHasLongLinkpath',
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
})
|
||
|
const body = Buffer.alloc(512)
|
||
|
body.write('not that long, actually')
|
||
|
|
||
|
const expect = 'not that long, actually'
|
||
|
let actual = ''
|
||
|
|
||
|
const entry = new ReadEntry(h)
|
||
|
entry.on('data', c => actual += c)
|
||
|
|
||
|
entry.write(body.slice(0, 1))
|
||
|
entry.write(body.slice(1, 25))
|
||
|
entry.write(body.slice(25))
|
||
|
t.throws(_ => entry.write(Buffer.alloc(1024)))
|
||
|
|
||
|
t.equal(actual, expect)
|
||
|
t.match(entry, { meta: true, type: 'NextFileHasLongLinkpath' })
|
||
|
t.end()
|
||
|
})
|
||
|
|
||
|
t.test('unknown entry type', t => {
|
||
|
const h = new Header({
|
||
|
path: 'PaxHeader/foo.txt',
|
||
|
mode: 0o755,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
size: 23,
|
||
|
mtime: new Date('2016-04-01T22:00Z'),
|
||
|
ctime: new Date('2016-04-01T22:00Z'),
|
||
|
atime: new Date('2016-04-01T22:00Z'),
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
})
|
||
|
h.encode()
|
||
|
h.block.write('9', 156, 1, 'ascii')
|
||
|
|
||
|
const body = Buffer.alloc(512)
|
||
|
body.write('not that long, actually')
|
||
|
|
||
|
const expect = ''
|
||
|
let actual = ''
|
||
|
|
||
|
const entry = new ReadEntry(new Header(h.block))
|
||
|
|
||
|
entry.on('data', c => actual += c)
|
||
|
|
||
|
entry.write(body.slice(0, 1))
|
||
|
entry.write(body.slice(1, 25))
|
||
|
entry.write(body.slice(25))
|
||
|
t.throws(_ => entry.write(Buffer.alloc(1024)))
|
||
|
|
||
|
t.equal(actual, expect)
|
||
|
t.match(entry, { ignore: true })
|
||
|
t.end()
|
||
|
})
|
||
|
|
||
|
t.test('entry without mode', t => {
|
||
|
const h = new Header({
|
||
|
path: 'foo.txt',
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
size: 100,
|
||
|
mtime: new Date('2016-04-01T22:00Z'),
|
||
|
ctime: new Date('2016-04-01T22:00Z'),
|
||
|
atime: new Date('2016-04-01T22:00Z'),
|
||
|
type: 'File',
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
})
|
||
|
h.encode()
|
||
|
|
||
|
const entry = new ReadEntry(h)
|
||
|
|
||
|
t.ok(entry.header.cksumValid, 'header checksum should be valid')
|
||
|
|
||
|
t.match(entry, {
|
||
|
header: {
|
||
|
cksumValid: true,
|
||
|
needPax: false,
|
||
|
path: 'foo.txt',
|
||
|
mode: null,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
size: 100,
|
||
|
mtime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
typeKey: '0',
|
||
|
type: 'File',
|
||
|
linkpath: null,
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
devmaj: 0,
|
||
|
devmin: 0,
|
||
|
atime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
ctime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
},
|
||
|
blockRemain: 512,
|
||
|
remain: 100,
|
||
|
type: 'File',
|
||
|
meta: false,
|
||
|
ignore: false,
|
||
|
path: 'foo.txt',
|
||
|
mode: null,
|
||
|
uid: 24561,
|
||
|
gid: 20,
|
||
|
uname: 'isaacs',
|
||
|
gname: 'staff',
|
||
|
size: 100,
|
||
|
mtime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
atime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
ctime: new Date('2016-04-01T22:00:00.000Z'),
|
||
|
linkpath: null,
|
||
|
})
|
||
|
|
||
|
let data = ''
|
||
|
let ended = false
|
||
|
entry.on('data', c => data += c)
|
||
|
entry.on('end', _ => ended = true)
|
||
|
|
||
|
const body = Buffer.alloc(512)
|
||
|
body.write(new Array(101).join('z'), 0)
|
||
|
entry.write(body)
|
||
|
entry.end()
|
||
|
|
||
|
t.equal(data, new Array(101).join('z'))
|
||
|
t.ok(ended, 'saw end event')
|
||
|
|
||
|
t.end()
|
||
|
})
|