Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 71 additions & 51 deletions packages/file-service/__tests__/node/file-service-watcher.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,29 @@ import { FileSystemWatcherServer } from '../../src/node/file-service-watcher';
function sleep(time: number) {
return new Promise((resolve) => setTimeout(resolve, time));
}

jest.setTimeout(10000);

let seed = 1;
const sleepTime = 1000;

(isMacintosh ? describe.skip : describe)('ParceWatcher Test', () => {
const track = temp.track();
const sleepTime = 1000;
let injector: MockInjector;
let root: URI;
let watcherServer: FileSystemWatcherServer;
let watcherId: number;

beforeEach(async () => {
injector = createNodeInjector([]);
root = FileUri.create(fse.realpathSync(await temp.mkdir('parce-watcher-test')));
const watcherServerList: FileSystemWatcherServer[] = [];
let seed = 1;

async function generateWatcher() {
const injector = createNodeInjector([]);
const root = FileUri.create(fse.realpathSync(await temp.mkdir(`parce-watcher-test-${seed++}`)));
// @ts-ignore
injector.mock(FileSystemWatcherServer, 'isEnableNSFW', () => false);
watcherServer = injector.get(FileSystemWatcherServer);
watcherId = await watcherServer.watchFileChanges(root.toString());
});
const watcherServer = injector.get(FileSystemWatcherServer);
const watcherId = await watcherServer.watchFileChanges(root.toString());

return { root, watcherServer, watcherId };
}

afterEach(async () => {
afterAll(async () => {
track.cleanupSync();
watcherServer.dispose();
watcherServerList.forEach((watcherServer) => {
watcherServer.dispose();
});
});

it('Should receive file changes events from in the workspace by default.', async () => {
Expand All @@ -47,6 +45,8 @@ let seed = 1;
event.changes.forEach((c) => actualUris.add(c.uri.toString()));
},
};

const { root, watcherServer } = await generateWatcher();
watcherServer.setClient(watcherClient);

const expectedUris = [
Expand All @@ -55,10 +55,10 @@ let seed = 1;
root.withPath(root.path.join('foo', 'bar', 'baz.txt')).toString(),
];

await fse.mkdir(FileUri.fsPath(root.resolve('foo')));
await fse.mkdir(FileUri.fsPath(root.resolve('foo')), { recursive: true });
expect(fse.statSync(FileUri.fsPath(root.resolve('foo'))).isDirectory()).toBe(true);

await fse.mkdir(FileUri.fsPath(root.resolve('foo').resolve('bar')));
await fse.mkdir(FileUri.fsPath(root.resolve('foo').resolve('bar')), { recursive: true });
expect(fse.statSync(FileUri.fsPath(root.resolve('foo').resolve('bar'))).isDirectory()).toBe(true);

await fse.writeFile(FileUri.fsPath(root.resolve('foo').resolve('bar').resolve('baz.txt')), 'baz');
Expand All @@ -67,6 +67,8 @@ let seed = 1;
);
await sleep(sleepTime);
expect(expectedUris).toEqual(Array.from(actualUris));

watcherServerList.push(watcherServer);
});

it('Should not receive file changes events from in the workspace by default if unwatched', async () => {
Expand All @@ -77,16 +79,17 @@ let seed = 1;
event.changes.forEach((c) => actualUris.add(c.uri.toString()));
},
};
const { root, watcherServer, watcherId } = await generateWatcher();
watcherServer.setClient(watcherClient);

/* Unwatch root */
await watcherServer.unwatchFileChanges(watcherId);

fse.mkdirSync(FileUri.fsPath(root.resolve('foo')));
fse.mkdirSync(FileUri.fsPath(root.resolve('foo')), { recursive: true });
expect(fse.statSync(FileUri.fsPath(root.resolve('foo'))).isDirectory()).toBe(true);
await sleep(sleepTime);

fse.mkdirSync(FileUri.fsPath(root.resolve('foo').resolve('bar')));
fse.mkdirSync(FileUri.fsPath(root.resolve('foo').resolve('bar')), { recursive: true });
expect(fse.statSync(FileUri.fsPath(root.resolve('foo').resolve('bar'))).isDirectory()).toBe(true);
await sleep(sleepTime);

Expand All @@ -95,79 +98,91 @@ let seed = 1;
'baz',
);
await sleep(sleepTime);

expect(actualUris.size).toEqual(0);

watcherServerList.push(watcherServer);
});

it('Merge common events on one watcher', async () => {
const folderName = `folder_${seed++}`;
const { root, watcherServer, watcherId } = await generateWatcher();
const folderName = `folder_${seed}`;
const newFolder = FileUri.fsPath(root.resolve(folderName));
expect(watcherId).toBeDefined();
fse.mkdirSync(newFolder);
fse.mkdirSync(newFolder, { recursive: true });
const newWatcherId = await watcherServer.watchFileChanges(newFolder);
expect(newWatcherId === watcherId).toBeTruthy();
watcherServerList.push(watcherServer);
});

it('Can receive events while watch file is not existed', async () => {
const folderName = `folder_${seed++}`;
const { root, watcherServer, watcherId } = await generateWatcher();

const folderName = `folder_${seed}`;
const newFolder = FileUri.fsPath(root.resolve(folderName));
expect(watcherId).toBeDefined();
fse.mkdirSync(newFolder);
fse.mkdirSync(newFolder, { recursive: true });
const parentId = await watcherServer.watchFileChanges(newFolder);
const childFile = FileUri.fsPath(root.resolve(folderName).resolve('index.js'));
const childId = await watcherServer.watchFileChanges(childFile);
expect(parentId === childId).toBeTruthy();
watcherServerList.push(watcherServer);
});

it('Excludes options should be worked', async () => {
const watcherClient = {
onDidFilesChanged: jest.fn(),
};
const { root, watcherServer } = await generateWatcher();
watcherServer.setClient(watcherClient);
const folderName = `folder_${seed++}`;

const folderName = `folder_${seed}`;
const newFolder = FileUri.fsPath(root.resolve(folderName));
const fileA = FileUri.fsPath(root.resolve(folderName).resolve('a'));
const fileB = FileUri.fsPath(root.resolve(folderName).resolve('b'));
fse.mkdirSync(newFolder);

fse.mkdirSync(newFolder, { recursive: true });
await sleep(sleepTime);
watcherClient.onDidFilesChanged.mockClear();

let id = await watcherServer.watchFileChanges(newFolder, { excludes: [] });
await fse.ensureFile(fileA);
await sleep(sleepTime);
expect(watcherClient.onDidFilesChanged).toBeCalledTimes(1);
await watcherServer.unwatchFileChanges(id);

id = await watcherServer.watchFileChanges(newFolder, { excludes: ['**/b/**'] });
await fse.ensureFile(fileB);
await sleep(sleepTime);
expect(watcherClient.onDidFilesChanged).toBeCalledTimes(1);
watcherServer.unwatchFileChanges(id);
await watcherServer.unwatchFileChanges(id);
watcherServerList.push(watcherServer);
});
});

(isMacintosh ? describe.skip : describe)('Watch file rename/move/new', () => {
jest.setTimeout(10000);

const track = temp.track();
const sleepTime = 1000;
let root: URI;
let watcherServer: FileSystemWatcherServer;
let injector: MockInjector;

beforeEach(async () => {
injector = createNodeInjector([]);
root = FileUri.create(fse.realpathSync(temp.mkdirSync('nsfw-test')));
fse.mkdirpSync(FileUri.fsPath(root.resolve('for_rename_folder')));
fse.writeFileSync(FileUri.fsPath(root.resolve('for_rename')), 'rename');

async function generateWatcher() {
const injector = createNodeInjector([]);
const root = FileUri.create(fse.realpathSync(await temp.mkdir('nfsw-test')));
// @ts-ignore
injector.mock(FileSystemWatcherServer, 'isEnableNSFW', () => false);
watcherServer = injector.get(FileSystemWatcherServer);
const watcherServer = injector.get(FileSystemWatcherServer);

fse.mkdirpSync(FileUri.fsPath(root.resolve('for_rename_folder')));
fse.writeFileSync(FileUri.fsPath(root.resolve('for_rename')), 'rename');

await watcherServer.watchFileChanges(root.toString());
await sleep(sleepTime);
});

afterEach(() => {
return { root, watcherServer };
}
const watcherServerList: FileSystemWatcherServer[] = [];

afterAll(async () => {
track.cleanupSync();
watcherServer.dispose();
watcherServerList.forEach((watcherServer) => {
watcherServer.dispose();
});
});

it('Rename file', async () => {
Expand All @@ -186,7 +201,7 @@ let seed = 1;
});
},
};

const { root, watcherServer } = await generateWatcher();
watcherServer.setClient(watcherClient);

const expectedAddUris = [root.resolve('for_rename_renamed').toString()];
Expand All @@ -198,6 +213,7 @@ let seed = 1;

expect([...addUris]).toEqual(expectedAddUris);
expect([...deleteUris]).toEqual(expectedDeleteUris);
watcherServerList.push(watcherServer);
});

it('Move file', async () => {
Expand All @@ -217,11 +233,12 @@ let seed = 1;
},
};

const { root, watcherServer } = await generateWatcher();
watcherServer.setClient(watcherClient);

const expectedAddUris = [root.resolve('for_rename_folder').resolve('for_rename').toString()];

const expectedDeleteUris = [root.resolve('for_rename').toString()];

await fse.move(
FileUri.fsPath(root.resolve('for_rename')),
FileUri.fsPath(root.resolve('for_rename_folder').resolve('for_rename')),
Expand All @@ -234,6 +251,7 @@ let seed = 1;

expect(Array.from(addUris)).toEqual(expectedAddUris);
expect(Array.from(deleteUris)).toEqual(expectedDeleteUris);
watcherServerList.push(watcherServer);
});

it('Move file on current directry', async () => {
Expand All @@ -252,7 +270,7 @@ let seed = 1;
});
},
};

const { root, watcherServer } = await generateWatcher();
watcherServer.setClient(watcherClient);

const expectedAddUris = [root.resolve('for_rename_1').toString()];
Expand All @@ -266,6 +284,7 @@ let seed = 1;

expect(Array.from(addUris)).toEqual(expectedAddUris);
expect(Array.from(deleteUris)).toEqual(expectedDeleteUris);
watcherServerList.push(watcherServer);
});

it('New file', async () => {
Expand All @@ -284,7 +303,7 @@ let seed = 1;
});
},
};

const { root, watcherServer } = await generateWatcher();
watcherServer.setClient(watcherClient);

const expectedAddUris = [root.resolve('README.md').toString()];
Expand All @@ -296,5 +315,6 @@ let seed = 1;

expect(Array.from(addUris)).toEqual(expectedAddUris);
expect(Array.from(deleteUris)).toEqual(expectedDeleteUris);
watcherServerList.push(watcherServer);
});
});