From 2fd00ba9feff480d3ff6dde51201dc1e53fbe7e1 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Mon, 11 Jan 2021 09:11:33 +0100 Subject: [PATCH] Add a way to troubleshoot fs calls --- .../{lifecycle.ts => troubleshooting.ts} | 14 ++++- test/unit/electron/renderer.js | 54 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) rename src/vs/base/test/common/{lifecycle.ts => troubleshooting.ts} (79%) diff --git a/src/vs/base/test/common/lifecycle.ts b/src/vs/base/test/common/troubleshooting.ts similarity index 79% rename from src/vs/base/test/common/lifecycle.ts rename to src/vs/base/test/common/troubleshooting.ts index a6bda7f67a3..1d9d99632bd 100644 --- a/src/vs/base/test/common/lifecycle.ts +++ b/src/vs/base/test/common/troubleshooting.ts @@ -27,10 +27,22 @@ export function beginTrackingDisposables(): void { setDisposableTracker(currentTracker); } -export function logTrackedDisposables(): void { +export function endTrackingDisposables(): void { if (currentTracker) { setDisposableTracker(null); console.log(currentTracker!.allDisposables.map(e => `${e[0]}\n${e[1]}`).join('\n\n')); currentTracker = null; } } + +export function beginLoggingFS(withStacks: boolean = false): void { + if ((self).beginLoggingFS) { + (self).beginLoggingFS(withStacks); + } +} + +export function endLoggingFS(): void { + if ((self).endLoggingFS) { + (self).endLoggingFS(); + } +} diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 002ac43da55..dff47ec61c6 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -5,6 +5,60 @@ /*eslint-env mocha*/ +(function() { + const fs = require('fs'); + const originals = {}; + let logging = false; + let withStacks = false; + + self.beginLoggingFS = (withStacks) => { + logging = true; + withStacks = withStacks || false; + }; + self.endLoggingFS = () => { + logging = false; + withStacks = false; + }; + + function createSpy(element, cnt) { + return function(...args) { + if (logging) { + console.log(`calling ${element}: ` + args.slice(0, cnt).join(',') + (withStacks ? (`\n` + new Error().stack.split('\n').slice(2).join('\n')) : '')); + } + return originals[element].call(this, ...args); + }; + } + + function intercept(element, cnt) { + originals[element] = fs[element]; + fs[element] = createSpy(element, cnt); + } + + [ + ['realpathSync', 1], + ['readFileSync', 1], + ['openSync', 3], + ['readSync', 1], + ['closeSync', 1], + ['readFile', 2], + ['mkdir', 1], + ['lstat', 1], + ['stat', 1], + ['watch', 1], + ['readdir', 1], + ['access', 2], + ['open', 2], + ['write', 1], + ['fdatasync', 1], + ['close', 1], + ['read', 1], + ['unlink', 1], + ['rmdir', 1], + ].forEach((element) => { + intercept(element[0], element[1]); + }) +})(); + const { ipcRenderer } = require('electron'); const assert = require('assert'); const path = require('path');