| 'use strict'; |
| |
| const common = require('../common'); |
| const tmpdir = require('../common/tmpdir'); |
| const assert = require('assert'); |
| const initHooks = require('./init-hooks'); |
| const { checkInvocations } = require('./hook-checks'); |
| const fs = require('fs'); |
| const path = require('path'); |
| |
| if (!common.isMainThread) |
| common.skip('Worker bootstrapping works differently -> different async IDs'); |
| |
| tmpdir.refresh(); |
| |
| const file1 = path.join(tmpdir.path, 'file1'); |
| const file2 = path.join(tmpdir.path, 'file2'); |
| |
| const onchangex = (x) => (curr, prev) => { |
| console.log(`Watcher: ${x}`); |
| console.log('current stat data:', curr); |
| console.log('previous stat data:', prev); |
| }; |
| |
| const checkWatcherStart = (name, watcher) => { |
| assert.strictEqual(watcher.type, 'STATWATCHER'); |
| assert.strictEqual(typeof watcher.uid, 'number'); |
| assert.strictEqual(watcher.triggerAsyncId, 1); |
| checkInvocations(watcher, { init: 1 }, |
| `${name}: when started to watch file`); |
| }; |
| |
| const hooks = initHooks(); |
| hooks.enable(); |
| |
| // Install first file watcher. |
| const w1 = fs.watchFile(file1, { interval: 10 }, onchangex('w1')); |
| let as = hooks.activitiesOfTypes('STATWATCHER'); |
| assert.strictEqual(as.length, 1); |
| // Count all change events to account for all of them in checkInvocations. |
| let w1HookCount = 0; |
| w1.on('change', () => w1HookCount++); |
| |
| const statwatcher1 = as[0]; |
| checkWatcherStart('watcher1', statwatcher1); |
| |
| // Install second file watcher |
| const w2 = fs.watchFile(file2, { interval: 10 }, onchangex('w2')); |
| as = hooks.activitiesOfTypes('STATWATCHER'); |
| assert.strictEqual(as.length, 2); |
| // Count all change events to account for all of them in checkInvocations. |
| let w2HookCount = 0; |
| w2.on('change', () => w2HookCount++); |
| |
| const statwatcher2 = as[1]; |
| checkInvocations(statwatcher1, { init: 1 }, |
| 'watcher1: when started to watch second file'); |
| checkWatcherStart('watcher2', statwatcher2); |
| |
| setTimeout(() => fs.writeFileSync(file1, 'foo++'), |
| common.platformTimeout(100)); |
| w1.on('change', common.mustCallAtLeast((curr, prev) => { |
| console.log('w1 change to', curr, 'from', prev); |
| // Wait until we get the write above. |
| if (prev.size !== 0 || curr.size !== 5) |
| return; |
| |
| setImmediate(() => { |
| checkInvocations(statwatcher1, |
| { init: 1, before: w1HookCount, after: w1HookCount }, |
| 'watcher1: when unwatched first file'); |
| checkInvocations(statwatcher2, { init: 1 }, |
| 'watcher2: when unwatched first file'); |
| |
| setTimeout(() => fs.writeFileSync(file2, 'bar++'), |
| common.platformTimeout(100)); |
| w2.on('change', common.mustCallAtLeast((curr, prev) => { |
| console.log('w2 change to', curr, 'from', prev); |
| // Wait until we get the write above. |
| if (prev.size !== 0 || curr.size !== 5) |
| return; |
| |
| setImmediate(() => { |
| checkInvocations(statwatcher1, |
| { init: 1, before: w1HookCount, after: w1HookCount }, |
| 'watcher1: when unwatched second file'); |
| checkInvocations(statwatcher2, |
| { init: 1, before: w2HookCount, after: w2HookCount }, |
| 'watcher2: when unwatched second file'); |
| fs.unwatchFile(file1); |
| fs.unwatchFile(file2); |
| }); |
| })); |
| }); |
| })); |
| |
| process.once('exit', () => { |
| hooks.disable(); |
| hooks.sanityCheck('STATWATCHER'); |
| checkInvocations(statwatcher1, |
| { init: 1, before: w1HookCount, after: w1HookCount }, |
| 'watcher1: when process exits'); |
| checkInvocations(statwatcher2, |
| { init: 1, before: w2HookCount, after: w2HookCount }, |
| 'watcher2: when process exits'); |
| }); |