Skip to content

Commit e7fb298

Browse files
committed
Recursive fsWatch tests
1 parent a1eb638 commit e7fb298

File tree

1 file changed

+213
-13
lines changed

1 file changed

+213
-13
lines changed

src/testRunner/unittests/sys/symlinkWatching.ts

Lines changed: 213 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ describe("unittests:: sys:: symlinkWatching::", () => {
123123
verifyEventAndFileNames(`${opType}:: link`, linkResult.actual, expectedLinkResult);
124124
}
125125
deferred.resolve();
126-
}, 4000);
126+
}, 2000);
127127
return deferred.promise;
128128
}
129129

@@ -289,28 +289,20 @@ describe("unittests:: sys:: symlinkWatching::", () => {
289289
initializeWatchDirectoryResult(dirResult, linkResult);
290290
switch (opType) {
291291
case "fileCreate":
292-
sys.writeFile(`${dir}/file1.ts`, "export const x = 100;");
293-
break;
294292
case "linkFileCreate":
295-
sys.writeFile(`${link}/file2.ts`, "export const x = 100;");
293+
sys.writeFile(fileName(opType), "export const x = 100;");
296294
break;
297295
case "fileChange":
298-
sys.writeFile(`${dir}/file1.ts`, "export const x2 = 100;");
299-
break;
300296
case "linkFileChange":
301-
sys.writeFile(`${link}/file2.ts`, "export const x2 = 100;");
297+
sys.writeFile(fileName(opType), "export const x2 = 100;");
302298
break;
303299
case "fileModifiedTimeChange":
304-
sys.setModifiedTime!(`${dir}/file1.ts`, new Date());
305-
break;
306300
case "linkModifiedTimeChange":
307-
sys.setModifiedTime!(`${link}/file2.ts`, new Date());
301+
sys.setModifiedTime!(fileName(opType), new Date());
308302
break;
309303
case "fileDelete":
310-
sys.deleteFile!(`${dir}/file1.ts`);
311-
break;
312304
case "linkFileDelete":
313-
sys.deleteFile!(`${link}/file2.ts`);
305+
sys.deleteFile!(fileName(opType));
314306
break;
315307
default:
316308
ts.Debug.assertNever(opType);
@@ -324,6 +316,183 @@ describe("unittests:: sys:: symlinkWatching::", () => {
324316
tableOfEvents[opType],
325317
);
326318
}
319+
320+
function fileName(opType: string) {
321+
return ts.startsWith(opType, "file") ?
322+
`${dir}/file1.ts` :
323+
`${link}/file2.ts`;
324+
}
325+
});
326+
}
327+
328+
interface RecursiveFsEventsForWatchDirectory extends FsEventsForWatchDirectory {
329+
// For recursive the first time events are most of the time are not predictable, so just create random file for that reason
330+
init?: ExpectedEventAndFileName[];
331+
linkSubFileCreate: readonly ExpectedEventAndFileName[];
332+
parallelFileCreate: readonly ExpectedEventAndFileName[];
333+
parallelLinkFileCreate: readonly ExpectedEventAndFileName[];
334+
linkSubFileChange: readonly ExpectedEventAndFileName[];
335+
parallelFileChange: readonly ExpectedEventAndFileName[];
336+
parallelLinkFileChange: readonly ExpectedEventAndFileName[];
337+
linkSubModifiedTimeChange: readonly ExpectedEventAndFileName[];
338+
parallelFileModifiedTimeChange: readonly ExpectedEventAndFileName[];
339+
parallelLinkModifiedTimeChange: readonly ExpectedEventAndFileName[];
340+
linkedSubFileDelete: readonly ExpectedEventAndFileName[];
341+
parallelFileDelete: readonly ExpectedEventAndFileName[];
342+
parallelLinkFileDelete: readonly ExpectedEventAndFileName[];
343+
}
344+
function verifyRecursiveWatchDirectoryUsingFsEvents<System extends ts.System>(
345+
sys: System,
346+
fsWatch: FsWatch<System>,
347+
dir: string,
348+
link: string,
349+
isMacOs: boolean,
350+
) {
351+
it(`recursive watchDirectory using fsEvents`, async () => {
352+
console.log("recrusive watchDirectory using fsEvents");
353+
354+
const eventsForDir: Partial<RecursiveFsEventsForWatchDirectory> = isMacOs ?
355+
{
356+
fileCreate: [
357+
{ event: "rename", fileName: "sub/folder/file1.ts" },
358+
],
359+
linkFileCreate: [
360+
{ event: "rename", fileName: "sub/folder/file2.ts" },
361+
],
362+
} :
363+
{
364+
fileCreate: [
365+
{ event: "rename", fileName: "sub/folder/file1.ts" },
366+
{ event: "change", fileName: "sub/folder/file1.ts" },
367+
{ event: "change", fileName: "sub/folder" },
368+
],
369+
linkFileCreate: [
370+
{ event: "rename", fileName: "sub/folder/file2.ts" },
371+
{ event: "change", fileName: "sub/folder/file2.ts" },
372+
{ event: "change", fileName: "sub/folder" },
373+
],
374+
};
375+
376+
const eventsForLink: Partial<RecursiveFsEventsForWatchDirectory> = isMacOs ?
377+
{
378+
fileCreate: [
379+
{ event: "rename", fileName: "sub/folder/file1.ts" },
380+
],
381+
linkFileCreate: [
382+
{ event: "rename", fileName: "sub/folder/file2.ts" },
383+
],
384+
} :
385+
{
386+
fileCreate: [
387+
{ event: "rename", fileName: "sub/folder/file1.ts" },
388+
{ event: "change", fileName: "sub/folder/file1.ts" },
389+
{ event: "change", fileName: "sub/folder" },
390+
],
391+
linkFileCreate: [
392+
{ event: "rename", fileName: "sub/folder/file2.ts" },
393+
{ event: "change", fileName: "sub/folder/file2.ts" },
394+
{ event: "change", fileName: "sub/folder" },
395+
],
396+
};
397+
398+
const dirResult = recursiveWatchDirectory(dir);
399+
const linkResult = recursiveWatchDirectory(link);
400+
401+
await operation("init");
402+
await operation("fileCreate");
403+
await operation("linkFileCreate");
404+
await operation("linkSubFileCreate");
405+
await operation("parallelFileCreate");
406+
await operation("parallelLinkFileCreate");
407+
408+
await operation("fileChange");
409+
await operation("linkFileChange");
410+
await operation("linkSubFileChange");
411+
await operation("parallelFileChange");
412+
await operation("parallelLinkFileChange");
413+
414+
await operation("fileModifiedTimeChange");
415+
await operation("linkModifiedTimeChange");
416+
await operation("linkSubModifiedTimeChange");
417+
await operation("parallelFileModifiedTimeChange");
418+
await operation("parallelLinkModifiedTimeChange");
419+
420+
await operation("fileDelete");
421+
await operation("linkFileDelete");
422+
await operation("linkedSubFileDelete");
423+
await operation("parallelFileDelete");
424+
await operation("parallelLinkFileDelete");
425+
426+
dirResult.watcher.close();
427+
linkResult.watcher.close();
428+
429+
function recursiveWatchDirectory(dir: string) {
430+
return watchDirectory(sys, fsWatch, dir, /*recursive*/ true);
431+
}
432+
433+
async function operation(opType: keyof RecursiveFsEventsForWatchDirectory) {
434+
console.log("");
435+
console.log(opType);
436+
initializeWatchDirectoryResult(dirResult, linkResult);
437+
switch (opType) {
438+
case "init":
439+
sys.writeFile(`${dir}/sub/folder/init.ts`, "export const x = 100;");
440+
sys.writeFile(`${dir}2/sub/folder/init.ts`, "export const x = 100;");
441+
break;
442+
case "fileCreate":
443+
case "linkFileCreate":
444+
case "linkSubFileCreate":
445+
case "parallelFileCreate":
446+
case "parallelLinkFileCreate":
447+
sys.writeFile(fileName(opType), "export const x = 100;");
448+
break;
449+
case "fileChange":
450+
case "linkFileChange":
451+
case "linkSubFileChange":
452+
case "parallelFileChange":
453+
case "parallelLinkFileChange":
454+
sys.writeFile(fileName(opType), "export const x2 = 100;");
455+
break;
456+
case "fileModifiedTimeChange":
457+
case "linkModifiedTimeChange":
458+
case "linkSubModifiedTimeChange":
459+
case "parallelFileModifiedTimeChange":
460+
case "parallelLinkModifiedTimeChange":
461+
sys.setModifiedTime!(fileName(opType), new Date());
462+
break;
463+
case "fileDelete":
464+
case "linkFileDelete":
465+
case "linkedSubFileDelete":
466+
case "parallelFileDelete":
467+
case "parallelLinkFileDelete":
468+
sys.deleteFile!(fileName(opType));
469+
break;
470+
default:
471+
ts.Debug.assertNever(opType);
472+
}
473+
474+
await verfiyWatchDirectoryResult(
475+
opType,
476+
dirResult,
477+
eventsForDir[opType]!,
478+
linkResult,
479+
eventsForLink[opType]!,
480+
// opType === "init",
481+
/*skipAsserts*/ true,
482+
);
483+
}
484+
485+
function fileName(opType: string) {
486+
return ts.startsWith(opType, "file") ?
487+
`${dir}/sub/folder/file1.ts` :
488+
ts.startsWith(opType, "linkSub") ?
489+
`${dir}/linkedsub/folder/file3.ts` :
490+
ts.startsWith(opType, "link") ?
491+
`${link}/sub/folder/file2.ts` :
492+
ts.startsWith(opType, "parallelFile") ?
493+
`${dir}2/sub/folder/file4.ts` :
494+
`${dir}/linkedsub2/sub/folder/file5.ts`;
495+
}
327496
});
328497
}
329498

@@ -345,6 +514,11 @@ describe("unittests:: sys:: symlinkWatching::", () => {
345514
withSwallowException(() => fs.symlinkSync(`${root}/dirpolling`, `${root}/linkeddirpolling`, "junction"));
346515
ts.sys.writeFile(`${root}/dirfsevents/file.ts`, "export const x = 10;");
347516
withSwallowException(() => fs.symlinkSync(`${root}/dirfsevents`, `${root}/linkeddirfsevents`, "junction"));
517+
ts.sys.writeFile(`${root}/recursivefsevents/sub/folder/file.ts`, "export const x = 10;");
518+
ts.sys.writeFile(`${root}/recursivefsevents2/sub/folder/file.ts`, "export const x = 10;");
519+
withSwallowException(() => fs.symlinkSync(`${root}/recursivefsevents`, `${root}/recursivelinkedfsevents`, "junction"));
520+
withSwallowException(() => fs.symlinkSync(`${root}/recursivefsevents/sub`, `${root}/recursivefsevents/linkedsub`, "junction"));
521+
withSwallowException(() => fs.symlinkSync(`${root}/recursivefsevents2`, `${root}/recursivefsevents/linkedsub2`, "junction"));
348522
});
349523
after(() => {
350524
cleanup();
@@ -393,6 +567,16 @@ describe("unittests:: sys:: symlinkWatching::", () => {
393567
isMacOs,
394568
isWindows,
395569
);
570+
571+
if (isMacOs || isWindows) {
572+
verifyRecursiveWatchDirectoryUsingFsEvents(
573+
ts.sys,
574+
(dir, recursive, cb) => fs.watch(dir, { persistent: true, recursive }, cb),
575+
`${root}/recursivefsevents`,
576+
`${root}/recursivelinkedfsevents`,
577+
isMacOs,
578+
);
579+
}
396580
});
397581

398582
describe("with virtualFileSystem::", () => {
@@ -454,5 +638,21 @@ describe("unittests:: sys:: symlinkWatching::", () => {
454638
// /*isMacOs*/ false,
455639
// /*isWindows*/ false,
456640
// );
641+
642+
// verifyRecursiveWatchDirectoryUsingFsEvents(
643+
// getSys(),
644+
// (dir, recursive, cb, sys) => sys.fsWatchWorker(dir, recursive, cb),
645+
// `${root}/recursivefsevents`,
646+
// `${root}/recursivelinkedfsevents`,
647+
// /*isMacOs*/ false,
648+
// );
649+
650+
// verifyRecursiveWatchDirectoryUsingFsEvents(
651+
// getSys(),
652+
// (dir, recursive, cb, sys) => sys.fsWatchWorker(dir, recursive, cb),
653+
// `${root}/recursivefsevents`,
654+
// `${root}/recursivelinkedfsevents`,
655+
// /*isMacOs*/ true,
656+
// );
457657
});
458658
});

0 commit comments

Comments
 (0)