| // Flags: --expose-gc --no-warnings |
| 'use strict'; |
| |
| // Test that a runtime warning is emitted when a FileHandle object |
| // is allowed to close on garbage collection. In the future, this |
| // test should verify that closing on garbage collection throws a |
| // process fatal exception. |
| |
| const common = require('../common'); |
| const assert = require('assert'); |
| const { promises: fs } = require('fs'); |
| |
| const warning = |
| 'Closing a FileHandle object on garbage collection is deprecated. ' + |
| 'Please close FileHandle objects explicitly using ' + |
| 'FileHandle.prototype.close(). In the future, an error will be ' + |
| 'thrown if a file descriptor is closed during garbage collection.'; |
| |
| async function doOpen() { |
| const fh = await fs.open(__filename); |
| |
| common.expectWarning({ |
| Warning: [[`Closing file descriptor ${fh.fd} on garbage collection`]], |
| DeprecationWarning: [[warning, 'DEP0137']] |
| }); |
| |
| return fh; |
| } |
| |
| doOpen().then(common.mustCall((fd) => { |
| assert.strictEqual(typeof fd, 'object'); |
| })).then(common.mustCall(() => { |
| setImmediate(() => { |
| // The FileHandle should be out-of-scope and no longer accessed now. |
| global.gc(); |
| |
| // Wait an extra event loop turn, as the warning is emitted from the |
| // native layer in an unref()'ed setImmediate() callback. |
| setImmediate(common.mustCall()); |
| }); |
| })); |