strong-tie/inbound-calls
0
1'use strict'2 3const fs = require('fs')4const proxyquire = require('proxyquire')5const SonicBoom = require('../')6const { file, runTests } = require('./helper')7 8runTests(buildTests)9 10function buildTests (test, sync) {11 // Reset the umask for testing12 process.umask(0o000)13 14 test('reopen', (t) => {15 t.plan(9)16 17 const dest = file()18 const stream = new SonicBoom({ dest, sync })19 20 t.ok(stream.write('hello world\n'))21 t.ok(stream.write('something else\n'))22 23 const after = dest + '-moved'24 25 stream.once('drain', () => {26 t.pass('drain emitted')27 28 fs.renameSync(dest, after)29 stream.reopen()30 31 stream.once('ready', () => {32 t.pass('ready emitted')33 t.ok(stream.write('after reopen\n'))34 35 stream.once('drain', () => {36 fs.readFile(after, 'utf8', (err, data) => {37 t.error(err)38 t.equal(data, 'hello world\nsomething else\n')39 fs.readFile(dest, 'utf8', (err, data) => {40 t.error(err)41 t.equal(data, 'after reopen\n')42 stream.end()43 })44 })45 })46 })47 })48 })49 50 test('reopen with buffer', (t) => {51 t.plan(9)52 53 const dest = file()54 const stream = new SonicBoom({ dest, minLength: 4096, sync })55 56 t.ok(stream.write('hello world\n'))57 t.ok(stream.write('something else\n'))58 59 const after = dest + '-moved'60 61 stream.once('ready', () => {62 t.pass('drain emitted')63 64 stream.flush()65 fs.renameSync(dest, after)66 stream.reopen()67 68 stream.once('ready', () => {69 t.pass('ready emitted')70 t.ok(stream.write('after reopen\n'))71 stream.flush()72 73 stream.once('drain', () => {74 fs.readFile(after, 'utf8', (err, data) => {75 t.error(err)76 t.equal(data, 'hello world\nsomething else\n')77 fs.readFile(dest, 'utf8', (err, data) => {78 t.error(err)79 t.equal(data, 'after reopen\n')80 stream.end()81 })82 })83 })84 })85 })86 })87 88 test('reopen if not open', (t) => {89 t.plan(3)90 91 const dest = file()92 const stream = new SonicBoom({ dest, sync })93 94 t.ok(stream.write('hello world\n'))95 t.ok(stream.write('something else\n'))96 97 stream.reopen()98 99 stream.end()100 stream.on('close', function () {101 t.pass('ended')102 })103 })104 105 test('reopen with file', (t) => {106 t.plan(10)107 108 const dest = file()109 const stream = new SonicBoom({ dest, minLength: 0, sync })110 111 t.ok(stream.write('hello world\n'))112 t.ok(stream.write('something else\n'))113 114 const after = dest + '-new'115 116 stream.once('drain', () => {117 t.pass('drain emitted')118 119 stream.reopen(after)120 t.equal(stream.file, after)121 122 stream.once('ready', () => {123 t.pass('ready emitted')124 t.ok(stream.write('after reopen\n'))125 126 stream.once('drain', () => {127 fs.readFile(dest, 'utf8', (err, data) => {128 t.error(err)129 t.equal(data, 'hello world\nsomething else\n')130 fs.readFile(after, 'utf8', (err, data) => {131 t.error(err)132 t.equal(data, 'after reopen\n')133 stream.end()134 })135 })136 })137 })138 })139 })140 141 test('reopen throws an error', (t) => {142 t.plan(sync ? 10 : 9)143 144 const fakeFs = Object.create(fs)145 const SonicBoom = proxyquire('../', {146 fs: fakeFs147 })148 149 const dest = file()150 const stream = new SonicBoom({ dest, sync })151 152 t.ok(stream.write('hello world\n'))153 t.ok(stream.write('something else\n'))154 155 const after = dest + '-moved'156 157 stream.on('error', () => {158 t.pass('error emitted')159 })160 161 stream.once('drain', () => {162 t.pass('drain emitted')163 164 fs.renameSync(dest, after)165 if (sync) {166 fakeFs.openSync = function (file, flags) {167 t.pass('fake fs.openSync called')168 throw new Error('open error')169 }170 } else {171 fakeFs.open = function (file, flags, mode, cb) {172 t.pass('fake fs.open called')173 setTimeout(() => cb(new Error('open error')), 0)174 }175 }176 177 if (sync) {178 try {179 stream.reopen()180 } catch (err) {181 t.pass('reopen throwed')182 }183 } else {184 stream.reopen()185 }186 187 setTimeout(() => {188 t.ok(stream.write('after reopen\n'))189 190 stream.end()191 stream.on('finish', () => {192 fs.readFile(after, 'utf8', (err, data) => {193 t.error(err)194 t.equal(data, 'hello world\nsomething else\nafter reopen\n')195 })196 })197 stream.on('close', () => {198 t.pass('close emitted')199 })200 }, 0)201 })202 })203 204 test('reopen emits drain', (t) => {205 t.plan(9)206 207 const dest = file()208 const stream = new SonicBoom({ dest, sync })209 210 t.ok(stream.write('hello world\n'))211 t.ok(stream.write('something else\n'))212 213 const after = dest + '-moved'214 215 stream.once('drain', () => {216 t.pass('drain emitted')217 218 fs.renameSync(dest, after)219 stream.reopen()220 221 stream.once('drain', () => {222 t.pass('drain emitted')223 t.ok(stream.write('after reopen\n'))224 225 stream.once('drain', () => {226 fs.readFile(after, 'utf8', (err, data) => {227 t.error(err)228 t.equal(data, 'hello world\nsomething else\n')229 fs.readFile(dest, 'utf8', (err, data) => {230 t.error(err)231 t.equal(data, 'after reopen\n')232 stream.end()233 })234 })235 })236 })237 })238 })239}240 