1 | require("should");
|
---|
2 |
|
---|
3 | const fs = require('fs-extra');
|
---|
4 | const path = require('path');
|
---|
5 | const zlib = require('zlib');
|
---|
6 | const proxyquire = require('proxyquire').noPreserveCache();
|
---|
7 | const moveAndMaybeCompressFile = require('../lib/moveAndMaybeCompressFile');
|
---|
8 | const TEST_DIR = path.normalize(`/tmp/moveAndMaybeCompressFile_${Math.floor(Math.random()*10000)}`);
|
---|
9 |
|
---|
10 | describe('moveAndMaybeCompressFile', () => {
|
---|
11 | beforeEach(async () => {
|
---|
12 | await fs.emptyDir(TEST_DIR);
|
---|
13 | });
|
---|
14 |
|
---|
15 | after(async () => {
|
---|
16 | await fs.remove(TEST_DIR);
|
---|
17 | });
|
---|
18 |
|
---|
19 | it('should move the source file to a new destination', async () => {
|
---|
20 | const source = path.join(TEST_DIR, 'test.log');
|
---|
21 | const destination = path.join(TEST_DIR, 'moved-test.log');
|
---|
22 | await fs.outputFile(source, 'This is the test file.');
|
---|
23 | await moveAndMaybeCompressFile(source, destination);
|
---|
24 |
|
---|
25 | const contents = await fs.readFile(destination, 'utf8');
|
---|
26 | contents.should.equal('This is the test file.');
|
---|
27 |
|
---|
28 | const exists = await fs.pathExists(source);
|
---|
29 | exists.should.be.false();
|
---|
30 |
|
---|
31 | });
|
---|
32 |
|
---|
33 | it('should compress the source file at the new destination', async () => {
|
---|
34 | const source = path.join(TEST_DIR, 'test.log');
|
---|
35 | const destination = path.join(TEST_DIR, 'moved-test.log.gz');
|
---|
36 | await fs.outputFile(source, 'This is the test file.');
|
---|
37 | await moveAndMaybeCompressFile(source, destination, true);
|
---|
38 |
|
---|
39 | const zippedContents = await fs.readFile(destination);
|
---|
40 | const contents = await new Promise(resolve => {
|
---|
41 | zlib.gunzip(zippedContents, (e, data) => {
|
---|
42 | resolve(data.toString());
|
---|
43 | });
|
---|
44 | });
|
---|
45 | contents.should.equal('This is the test file.');
|
---|
46 |
|
---|
47 | const exists = await fs.pathExists(source);
|
---|
48 | exists.should.be.false();
|
---|
49 | });
|
---|
50 |
|
---|
51 | it('should do nothing if the source file and destination are the same', async () => {
|
---|
52 | const source = path.join(TEST_DIR, 'pants.log');
|
---|
53 | const destination = path.join(TEST_DIR, 'pants.log');
|
---|
54 | await fs.outputFile(source, 'This is the test file.');
|
---|
55 | await moveAndMaybeCompressFile(source, destination);
|
---|
56 |
|
---|
57 | (await fs.readFile(source, 'utf8')).should.equal('This is the test file.');
|
---|
58 | });
|
---|
59 |
|
---|
60 | it('should do nothing if the source file does not exist', async () => {
|
---|
61 | const source = path.join(TEST_DIR, 'pants.log');
|
---|
62 | const destination = path.join(TEST_DIR, 'moved-pants.log');
|
---|
63 | await moveAndMaybeCompressFile(source, destination);
|
---|
64 |
|
---|
65 | (await fs.pathExists(destination)).should.be.false();
|
---|
66 | });
|
---|
67 |
|
---|
68 | it('should use copy+truncate if source file is locked (windows)', async () => {
|
---|
69 | const moveWithMock = proxyquire('../lib/moveAndMaybeCompressFile', {
|
---|
70 | "fs-extra": {
|
---|
71 | exists: () => Promise.resolve(true),
|
---|
72 | move: () => Promise.reject({ code: 'EBUSY', message: 'all gone wrong'}),
|
---|
73 | copy: (fs.copy.bind(fs)),
|
---|
74 | truncate: (fs.truncate.bind(fs))
|
---|
75 | }
|
---|
76 | });
|
---|
77 |
|
---|
78 | const source = path.join(TEST_DIR, 'test.log');
|
---|
79 | const destination = path.join(TEST_DIR, 'moved-test.log');
|
---|
80 | await fs.outputFile(source, 'This is the test file.');
|
---|
81 | await moveWithMock(source, destination);
|
---|
82 |
|
---|
83 | const contents = await fs.readFile(destination, 'utf8');
|
---|
84 | contents.should.equal('This is the test file.');
|
---|
85 |
|
---|
86 | // won't delete the source, but it will be empty
|
---|
87 | (await fs.readFile(source, 'utf8')).should.be.empty()
|
---|
88 |
|
---|
89 | });
|
---|
90 |
|
---|
91 | it('should truncate file if remove fails when compressed (windows)', async () => {
|
---|
92 | const moveWithMock = proxyquire('../lib/moveAndMaybeCompressFile', {
|
---|
93 | "fs-extra": {
|
---|
94 | exists: () => Promise.resolve(true),
|
---|
95 | unlink: () => Promise.reject({ code: 'EBUSY', message: 'all gone wrong'}),
|
---|
96 | createReadStream: fs.createReadStream.bind(fs),
|
---|
97 | truncate: fs.truncate.bind(fs)
|
---|
98 | }
|
---|
99 | });
|
---|
100 |
|
---|
101 | const source = path.join(TEST_DIR, 'test.log');
|
---|
102 | const destination = path.join(TEST_DIR, 'moved-test.log.gz');
|
---|
103 | await fs.outputFile(source, 'This is the test file.');
|
---|
104 | await moveWithMock(source, destination, true);
|
---|
105 |
|
---|
106 | const zippedContents = await fs.readFile(destination);
|
---|
107 | const contents = await new Promise(resolve => {
|
---|
108 | zlib.gunzip(zippedContents, (e, data) => {
|
---|
109 | resolve(data.toString());
|
---|
110 | });
|
---|
111 | });
|
---|
112 | contents.should.equal('This is the test file.');
|
---|
113 |
|
---|
114 | // won't delete the source, but it will be empty
|
---|
115 | (await fs.readFile(source, 'utf8')).should.be.empty()
|
---|
116 |
|
---|
117 | });
|
---|
118 | });
|
---|