155 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.0 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}.`);
 | 
						|
            });
 | 
						|
  });
 | 
						|
}); |