145 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @license
							 | 
						||
| 
								 | 
							
								 * Copyright Google Inc. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Use of this source code is governed by an MIT-style license that can be
							 | 
						||
| 
								 | 
							
								 * found in the LICENSE file at https://angular.io/license
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {closeSync, exists, fstatSync, openSync, read, unlink, unlinkSync, unwatchFile, watch, watchFile, write, writeFile} from 'fs';
							 | 
						||
| 
								 | 
							
								import * as util from 'util';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('nodejs file system', () => {
							 | 
						||
| 
								 | 
							
								  describe('async method patch test', () => {
							 | 
						||
| 
								 | 
							
								    it('has patched exists()', (done) => {
							 | 
						||
| 
								 | 
							
								      const zoneA = Zone.current.fork({name: 'A'});
							 | 
						||
| 
								 | 
							
								      zoneA.run(() => {
							 | 
						||
| 
								 | 
							
								        exists('testfile', (_) => {
							 | 
						||
| 
								 | 
							
								          expect(Zone.current.name).toBe(zoneA.name);
							 | 
						||
| 
								 | 
							
								          done();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it('has patched exists as macroTask', (done) => {
							 | 
						||
| 
								 | 
							
								      const zoneASpec = {
							 | 
						||
| 
								 | 
							
								        name: 'A',
							 | 
						||
| 
								 | 
							
								        onScheduleTask: (delegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task):
							 | 
						||
| 
								 | 
							
								                            Task => { return delegate.scheduleTask(targetZone, task); }
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      const zoneA = Zone.current.fork(zoneASpec);
							 | 
						||
| 
								 | 
							
								      spyOn(zoneASpec, 'onScheduleTask').and.callThrough();
							 | 
						||
| 
								 | 
							
								      zoneA.run(() => {
							 | 
						||
| 
								 | 
							
								        exists('testfile', (_) => {
							 | 
						||
| 
								 | 
							
								          expect(zoneASpec.onScheduleTask).toHaveBeenCalled();
							 | 
						||
| 
								 | 
							
								          done();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('watcher related methods test', () => {
							 | 
						||
| 
								 | 
							
								    const zoneASpec = {
							 | 
						||
| 
								 | 
							
								      name: 'A',
							 | 
						||
| 
								 | 
							
								      onScheduleTask: (delegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task):
							 | 
						||
| 
								 | 
							
								                          Task => { return delegate.scheduleTask(targetZone, task); }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it('fs.watch has been patched as eventTask', (done) => {
							 | 
						||
| 
								 | 
							
								      spyOn(zoneASpec, 'onScheduleTask').and.callThrough();
							 | 
						||
| 
								 | 
							
								      const zoneA = Zone.current.fork(zoneASpec);
							 | 
						||
| 
								 | 
							
								      zoneA.run(() => {
							 | 
						||
| 
								 | 
							
								        writeFile('testfile', 'test content', () => {
							 | 
						||
| 
								 | 
							
								          const watcher = watch('testfile', (eventType, filename) => {
							 | 
						||
| 
								 | 
							
								            expect(filename).toEqual('testfile');
							 | 
						||
| 
								 | 
							
								            expect(eventType).toEqual('change');
							 | 
						||
| 
								 | 
							
								            expect(zoneASpec.onScheduleTask).toHaveBeenCalled();
							 | 
						||
| 
								 | 
							
								            expect(Zone.current.name).toBe('A');
							 | 
						||
| 
								 | 
							
								            watcher.close();
							 | 
						||
| 
								 | 
							
								            unlink('testfile', () => { done(); });
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								          writeFile('testfile', 'test new content', () => {});
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it('fs.watchFile has been patched as eventTask', (done) => {
							 | 
						||
| 
								 | 
							
								      spyOn(zoneASpec, 'onScheduleTask').and.callThrough();
							 | 
						||
| 
								 | 
							
								      const zoneA = Zone.current.fork(zoneASpec);
							 | 
						||
| 
								 | 
							
								      zoneA.run(() => {
							 | 
						||
| 
								 | 
							
								        writeFile('testfile', 'test content', () => {
							 | 
						||
| 
								 | 
							
								          watchFile('testfile', {persistent: false, interval: 1000}, (curr, prev) => {
							 | 
						||
| 
								 | 
							
								            expect(curr.size).toBe(16);
							 | 
						||
| 
								 | 
							
								            expect(prev.size).toBe(12);
							 | 
						||
| 
								 | 
							
								            expect(zoneASpec.onScheduleTask).toHaveBeenCalled();
							 | 
						||
| 
								 | 
							
								            expect(Zone.current.name).toBe('A');
							 | 
						||
| 
								 | 
							
								            unwatchFile('testfile');
							 | 
						||
| 
								 | 
							
								            unlink('testfile', () => { done(); });
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								          writeFile('testfile', 'test new content', () => {});
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('util.promisify', () => {
							 | 
						||
| 
								 | 
							
								  it('fs.exists should work with util.promisify', (done: DoneFn) => {
							 | 
						||
| 
								 | 
							
								    const promisifyExists = util.promisify(exists);
							 | 
						||
| 
								 | 
							
								    promisifyExists(__filename)
							 | 
						||
| 
								 | 
							
								        .then(
							 | 
						||
| 
								 | 
							
								            r => {
							 | 
						||
| 
								 | 
							
								              expect(r).toBe(true);
							 | 
						||
| 
								 | 
							
								              done();
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            err => { fail(`should not be here with error: ${err}`); });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('fs.read should work with util.promisify', (done: DoneFn) => {
							 | 
						||
| 
								 | 
							
								    const promisifyRead = util.promisify(read);
							 | 
						||
| 
								 | 
							
								    const fd = openSync(__filename, 'r');
							 | 
						||
| 
								 | 
							
								    const stats = fstatSync(fd);
							 | 
						||
| 
								 | 
							
								    const bufferSize = stats.size;
							 | 
						||
| 
								 | 
							
								    const chunkSize = 512;
							 | 
						||
| 
								 | 
							
								    const buffer = new Buffer(bufferSize);
							 | 
						||
| 
								 | 
							
								    let bytesRead = 0;
							 | 
						||
| 
								 | 
							
								    // fd, buffer, offset, length, position, callback
							 | 
						||
| 
								 | 
							
								    promisifyRead(fd, buffer, bytesRead, chunkSize, bytesRead)
							 | 
						||
| 
								 | 
							
								        .then(
							 | 
						||
| 
								 | 
							
								            (value) => {
							 | 
						||
| 
								 | 
							
								              expect(value.bytesRead).toBe(chunkSize);
							 | 
						||
| 
								 | 
							
								              closeSync(fd);
							 | 
						||
| 
								 | 
							
								              done();
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            err => {
							 | 
						||
| 
								 | 
							
								              closeSync(fd);
							 | 
						||
| 
								 | 
							
								              fail(`should not be here with error: ${error}.`);
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('fs.write should work with util.promisify', (done: DoneFn) => {
							 | 
						||
| 
								 | 
							
								    const promisifyWrite = util.promisify(write);
							 | 
						||
| 
								 | 
							
								    const dest = __filename + 'write';
							 | 
						||
| 
								 | 
							
								    const fd = openSync(dest, 'a');
							 | 
						||
| 
								 | 
							
								    const stats = fstatSync(fd);
							 | 
						||
| 
								 | 
							
								    const chunkSize = 512;
							 | 
						||
| 
								 | 
							
								    const buffer = new Buffer(chunkSize);
							 | 
						||
| 
								 | 
							
								    for (let i = 0; i < chunkSize; i++) {
							 | 
						||
| 
								 | 
							
								      buffer[i] = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // fd, buffer, offset, length, position, callback
							 | 
						||
| 
								 | 
							
								    promisifyWrite(fd, buffer, 0, chunkSize, 0)
							 | 
						||
| 
								 | 
							
								        .then(
							 | 
						||
| 
								 | 
							
								            (value) => {
							 | 
						||
| 
								 | 
							
								              expect(value.bytesWritten).toBe(chunkSize);
							 | 
						||
| 
								 | 
							
								              closeSync(fd);
							 | 
						||
| 
								 | 
							
								              unlinkSync(dest);
							 | 
						||
| 
								 | 
							
								              done();
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            err => {
							 | 
						||
| 
								 | 
							
								              closeSync(fd);
							 | 
						||
| 
								 | 
							
								              unlinkSync(dest);
							 | 
						||
| 
								 | 
							
								              fail(`should not be here with error: ${error}.`);
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |