mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-25 01:25:36 -05:00
Merge VS Code 1.31.1 (#4283)
This commit is contained in:
@@ -141,7 +141,7 @@ suite('Config', () => {
|
||||
testFile('config', 'config.json').then(res => {
|
||||
fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "bar" }');
|
||||
|
||||
let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile, { changeBufferDelay: 100, onError: console.error, defaultConfig: void 0 });
|
||||
let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile, { changeBufferDelay: 100, onError: console.error, defaultConfig: { foo: 'bar' } });
|
||||
watcher.getConfig(); // ensure we are in sync
|
||||
|
||||
fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "changed" }');
|
||||
|
||||
@@ -11,39 +11,38 @@ suite('Console', () => {
|
||||
|
||||
test('getFirstFrame', () => {
|
||||
let stack = 'at vscode.commands.registerCommand (/Users/someone/Desktop/test-ts/out/src/extension.js:18:17)';
|
||||
let frame = getFirstFrame(stack);
|
||||
let frame = getFirstFrame(stack)!;
|
||||
|
||||
assert.equal(frame.uri.fsPath, normalize('/Users/someone/Desktop/test-ts/out/src/extension.js'));
|
||||
assert.equal(frame.line, 18);
|
||||
assert.equal(frame.column, 17);
|
||||
|
||||
stack = 'at /Users/someone/Desktop/test-ts/out/src/extension.js:18:17';
|
||||
frame = getFirstFrame(stack);
|
||||
frame = getFirstFrame(stack)!;
|
||||
|
||||
assert.equal(frame.uri.fsPath, normalize('/Users/someone/Desktop/test-ts/out/src/extension.js'));
|
||||
assert.equal(frame.line, 18);
|
||||
assert.equal(frame.column, 17);
|
||||
|
||||
stack = 'at c:\\Users\\someone\\Desktop\\end-js\\extension.js:18:17';
|
||||
frame = getFirstFrame(stack);
|
||||
frame = getFirstFrame(stack)!;
|
||||
|
||||
assert.equal(frame.uri.fsPath, 'c:\\Users\\someone\\Desktop\\end-js\\extension.js');
|
||||
assert.equal(frame.line, 18);
|
||||
assert.equal(frame.column, 17);
|
||||
|
||||
stack = 'at e.$executeContributedCommand(c:\\Users\\someone\\Desktop\\end-js\\extension.js:18:17)';
|
||||
frame = getFirstFrame(stack);
|
||||
frame = getFirstFrame(stack)!;
|
||||
|
||||
assert.equal(frame.uri.fsPath, 'c:\\Users\\someone\\Desktop\\end-js\\extension.js');
|
||||
assert.equal(frame.line, 18);
|
||||
assert.equal(frame.column, 17);
|
||||
|
||||
stack = 'at /Users/someone/Desktop/test-ts/out/src/extension.js:18:17\nat /Users/someone/Desktop/test-ts/out/src/other.js:28:27\nat /Users/someone/Desktop/test-ts/out/src/more.js:38:37';
|
||||
frame = getFirstFrame(stack);
|
||||
frame = getFirstFrame(stack)!;
|
||||
|
||||
assert.equal(frame.uri.fsPath, normalize('/Users/someone/Desktop/test-ts/out/src/extension.js'));
|
||||
assert.equal(frame.line, 18);
|
||||
assert.equal(frame.column, 17);
|
||||
|
||||
});
|
||||
});
|
||||
@@ -38,7 +38,7 @@ function toReadable(value: string, throwError?: boolean): Readable {
|
||||
this.emit('error', new Error(readError));
|
||||
}
|
||||
|
||||
let res: string;
|
||||
let res!: string;
|
||||
let canPush = true;
|
||||
while (canPush && (res = stringChunks[counter++])) {
|
||||
canPush = this.push(res);
|
||||
@@ -96,14 +96,14 @@ suite('Extfs', () => {
|
||||
return done(error);
|
||||
}
|
||||
|
||||
assert.ok(!statAndIsLink.isSymbolicLink);
|
||||
assert.ok(!statAndIsLink!.isSymbolicLink);
|
||||
|
||||
extfs.statLink(symbolicLink, (error, statAndIsLink) => {
|
||||
if (error) {
|
||||
return done(error);
|
||||
}
|
||||
|
||||
assert.ok(statAndIsLink.isSymbolicLink);
|
||||
assert.ok(statAndIsLink!.isSymbolicLink);
|
||||
extfs.delSync(directory);
|
||||
done();
|
||||
});
|
||||
@@ -258,7 +258,7 @@ suite('Extfs', () => {
|
||||
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
extfs.writeFileAndFlush(testFile, 'Hello World', null, error => {
|
||||
extfs.writeFileAndFlush(testFile, 'Hello World', null!, error => {
|
||||
if (error) {
|
||||
return done(error);
|
||||
}
|
||||
@@ -267,7 +267,7 @@ suite('Extfs', () => {
|
||||
|
||||
const largeString = (new Array(100 * 1024)).join('Large String\n');
|
||||
|
||||
extfs.writeFileAndFlush(testFile, largeString, null, error => {
|
||||
extfs.writeFileAndFlush(testFile, largeString, null!, error => {
|
||||
if (error) {
|
||||
return done(error);
|
||||
}
|
||||
@@ -293,7 +293,7 @@ suite('Extfs', () => {
|
||||
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
extfs.writeFileAndFlush(testFile, toReadable('Hello World'), null, error => {
|
||||
extfs.writeFileAndFlush(testFile, toReadable('Hello World'), null!, error => {
|
||||
if (error) {
|
||||
return done(error);
|
||||
}
|
||||
@@ -302,7 +302,7 @@ suite('Extfs', () => {
|
||||
|
||||
const largeString = (new Array(100 * 1024)).join('Large String\n');
|
||||
|
||||
extfs.writeFileAndFlush(testFile, toReadable(largeString), null, error => {
|
||||
extfs.writeFileAndFlush(testFile, toReadable(largeString), null!, error => {
|
||||
if (error) {
|
||||
return done(error);
|
||||
}
|
||||
@@ -329,7 +329,7 @@ suite('Extfs', () => {
|
||||
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
extfs.writeFileAndFlush(testFile, fs.createReadStream(sourceFile), null, error => {
|
||||
extfs.writeFileAndFlush(testFile, fs.createReadStream(sourceFile), null!, error => {
|
||||
if (error) {
|
||||
return done(error);
|
||||
}
|
||||
@@ -356,7 +356,7 @@ suite('Extfs', () => {
|
||||
|
||||
fs.mkdirSync(testFile); // this will trigger an error because testFile is now a directory!
|
||||
|
||||
extfs.writeFileAndFlush(testFile, 'Hello World', null, error => {
|
||||
extfs.writeFileAndFlush(testFile, 'Hello World', null!, error => {
|
||||
if (!error) {
|
||||
return done(new Error('Expected error for writing to readonly file'));
|
||||
}
|
||||
@@ -382,7 +382,7 @@ suite('Extfs', () => {
|
||||
fs.mkdirSync(testFile); // this will trigger an error because testFile is now a directory!
|
||||
|
||||
const readable = toReadable('Hello World');
|
||||
extfs.writeFileAndFlush(testFile, readable, null, error => {
|
||||
extfs.writeFileAndFlush(testFile, readable, null!, error => {
|
||||
if (!error || (<any>error).code !== 'EISDIR') {
|
||||
return done(new Error('Expected EISDIR error for writing to folder but got: ' + (error ? (<any>error).code : 'no error')));
|
||||
}
|
||||
@@ -408,7 +408,7 @@ suite('Extfs', () => {
|
||||
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
extfs.writeFileAndFlush(testFile, toReadable('Hello World', true /* throw error */), null, error => {
|
||||
extfs.writeFileAndFlush(testFile, toReadable('Hello World', true /* throw error */), null!, error => {
|
||||
if (!error || error.message !== readError) {
|
||||
return done(new Error('Expected error for writing to folder'));
|
||||
}
|
||||
@@ -438,7 +438,7 @@ suite('Extfs', () => {
|
||||
fs.writeFileSync(testFile, '');
|
||||
fs.chmodSync(testFile, 33060); // make readonly
|
||||
|
||||
extfs.writeFileAndFlush(testFile, toReadable('Hello World'), null, error => {
|
||||
extfs.writeFileAndFlush(testFile, toReadable('Hello World'), null!, error => {
|
||||
if (!error || !((<any>error).code !== 'EACCES' || (<any>error).code !== 'EPERM')) {
|
||||
return done(new Error('Expected EACCES/EPERM error for writing to folder but got: ' + (error ? (<any>error).code : 'no error')));
|
||||
}
|
||||
@@ -464,7 +464,7 @@ suite('Extfs', () => {
|
||||
|
||||
fs.mkdirSync(testFile); // this will trigger an error because testFile is now a directory!
|
||||
|
||||
extfs.writeFileAndFlush(testFile, fs.createReadStream(sourceFile), null, error => {
|
||||
extfs.writeFileAndFlush(testFile, fs.createReadStream(sourceFile), null!, error => {
|
||||
if (!error) {
|
||||
return done(new Error('Expected error for writing to folder'));
|
||||
}
|
||||
@@ -487,12 +487,12 @@ suite('Extfs', () => {
|
||||
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
extfs.writeFileAndFlushSync(testFile, 'Hello World', null);
|
||||
extfs.writeFileAndFlushSync(testFile, 'Hello World', null!);
|
||||
assert.equal(fs.readFileSync(testFile), 'Hello World');
|
||||
|
||||
const largeString = (new Array(100 * 1024)).join('Large String\n');
|
||||
|
||||
extfs.writeFileAndFlushSync(testFile, largeString, null);
|
||||
extfs.writeFileAndFlushSync(testFile, largeString, null!);
|
||||
assert.equal(fs.readFileSync(testFile), largeString);
|
||||
|
||||
extfs.del(parentDir, os.tmpdir(), done, ignore);
|
||||
@@ -551,13 +551,13 @@ suite('Extfs', () => {
|
||||
const newDir = path.join(parentDir, 'extfs', id);
|
||||
|
||||
mkdirp(newDir, 493, error => {
|
||||
let realpath: string;
|
||||
let realpath!: string;
|
||||
try {
|
||||
realpath = extfs.realpathSync(newDir);
|
||||
} catch (error) {
|
||||
assert.ok(!error);
|
||||
}
|
||||
assert.ok(realpath);
|
||||
assert.ok(realpath!);
|
||||
|
||||
extfs.del(parentDir, os.tmpdir(), done, ignore);
|
||||
});
|
||||
|
||||
@@ -8,8 +8,8 @@ var Workforce;
|
||||
return Company;
|
||||
})();
|
||||
(function (property, Workforce, IEmployee) {
|
||||
if (property === void 0) { property = employees; }
|
||||
if (IEmployee === void 0) { IEmployee = []; }
|
||||
if (property === undefined) { property = employees; }
|
||||
if (IEmployee === undefined) { IEmployee = []; }
|
||||
property;
|
||||
calculateMonthlyExpenses();
|
||||
{
|
||||
|
||||
@@ -7,9 +7,9 @@ var Conway;
|
||||
return Cell;
|
||||
})();
|
||||
(function (property, number, property, number, property, boolean) {
|
||||
if (property === void 0) { property = row; }
|
||||
if (property === void 0) { property = col; }
|
||||
if (property === void 0) { property = live; }
|
||||
if (property === undefined) { property = row; }
|
||||
if (property === undefined) { property = col; }
|
||||
if (property === undefined) { property = live; }
|
||||
});
|
||||
var GameOfLife = (function () {
|
||||
function GameOfLife() {
|
||||
|
||||
@@ -7,10 +7,10 @@ var M;
|
||||
return C;
|
||||
})();
|
||||
(function (x, property, number) {
|
||||
if (property === void 0) { property = w; }
|
||||
if (property === undefined) { property = w; }
|
||||
var local = 1;
|
||||
// unresolved symbol because x is local
|
||||
//self.x++;
|
||||
//self.x++;
|
||||
self.w--; // ok because w is a property
|
||||
property;
|
||||
f = function (y) {
|
||||
|
||||
@@ -430,7 +430,7 @@ suite('Flow', () => {
|
||||
|
||||
parallel(elements, function (element, callback) {
|
||||
sum += element;
|
||||
callback(null, element * element);
|
||||
callback(null!, element * element);
|
||||
}, function (errors, result) {
|
||||
assert.ok(!errors);
|
||||
|
||||
@@ -449,7 +449,7 @@ suite('Flow', () => {
|
||||
parallel(elements, function (element, callback) {
|
||||
setTimeout(function () {
|
||||
sum += element;
|
||||
callback(null, element * element);
|
||||
callback(null!, element * element);
|
||||
}, timeouts.pop());
|
||||
}, function (errors, result) {
|
||||
assert.ok(!errors);
|
||||
@@ -469,10 +469,10 @@ suite('Flow', () => {
|
||||
parallel(elements, function (element, callback) {
|
||||
setTimeout(function () {
|
||||
if (element === 4) {
|
||||
callback(new Error('error!'), null);
|
||||
callback(new Error('error!'), null!);
|
||||
} else {
|
||||
sum += element;
|
||||
callback(null, element * element);
|
||||
callback(null!, element * element);
|
||||
}
|
||||
}, timeouts.pop());
|
||||
}, function (errors, result) {
|
||||
|
||||
@@ -738,24 +738,24 @@ suite('Glob', () => {
|
||||
});
|
||||
|
||||
test('falsy expression/pattern', function () {
|
||||
assert.strictEqual(glob.match(null, 'foo'), false);
|
||||
assert.strictEqual(glob.match(null!, 'foo'), false);
|
||||
assert.strictEqual(glob.match('', 'foo'), false);
|
||||
assert.strictEqual(glob.parse(null)('foo'), false);
|
||||
assert.strictEqual(glob.parse(null!)('foo'), false);
|
||||
assert.strictEqual(glob.parse('')('foo'), false);
|
||||
});
|
||||
|
||||
test('falsy path', function () {
|
||||
assert.strictEqual(glob.parse('foo')(null), false);
|
||||
assert.strictEqual(glob.parse('foo')(null!), false);
|
||||
assert.strictEqual(glob.parse('foo')(''), false);
|
||||
assert.strictEqual(glob.parse('**/*.j?')(null), false);
|
||||
assert.strictEqual(glob.parse('**/*.j?')(null!), false);
|
||||
assert.strictEqual(glob.parse('**/*.j?')(''), false);
|
||||
assert.strictEqual(glob.parse('**/*.foo')(null), false);
|
||||
assert.strictEqual(glob.parse('**/*.foo')(null!), false);
|
||||
assert.strictEqual(glob.parse('**/*.foo')(''), false);
|
||||
assert.strictEqual(glob.parse('**/foo')(null), false);
|
||||
assert.strictEqual(glob.parse('**/foo')(null!), false);
|
||||
assert.strictEqual(glob.parse('**/foo')(''), false);
|
||||
assert.strictEqual(glob.parse('{**/baz,**/foo}')(null), false);
|
||||
assert.strictEqual(glob.parse('{**/baz,**/foo}')(null!), false);
|
||||
assert.strictEqual(glob.parse('{**/baz,**/foo}')(''), false);
|
||||
assert.strictEqual(glob.parse('{**/*.baz,**/*.foo}')(null), false);
|
||||
assert.strictEqual(glob.parse('{**/*.baz,**/*.foo}')(null!), false);
|
||||
assert.strictEqual(glob.parse('{**/*.baz,**/*.foo}')(''), false);
|
||||
});
|
||||
|
||||
@@ -808,7 +808,7 @@ suite('Glob', () => {
|
||||
}, ['foo', 'bar', 'baz'], [
|
||||
['bar/foo', '**/foo/**'],
|
||||
['foo/bar', '{**/bar/**,**/baz/**}'],
|
||||
['bar/nope', null]
|
||||
['bar/nope', null!]
|
||||
]);
|
||||
|
||||
const siblings = ['baz', 'baz.zip', 'nope'];
|
||||
@@ -817,12 +817,12 @@ suite('Glob', () => {
|
||||
'**/foo/**': { when: '$(basename).zip' },
|
||||
'**/bar/**': true
|
||||
}, ['bar'], [
|
||||
['bar/foo', null],
|
||||
['bar/foo/baz', null],
|
||||
['bar/foo/nope', null],
|
||||
['bar/foo', null!],
|
||||
['bar/foo/baz', null!],
|
||||
['bar/foo/nope', null!],
|
||||
['foo/bar', '**/bar/**'],
|
||||
], [
|
||||
null,
|
||||
null!,
|
||||
hasSibling,
|
||||
hasSibling
|
||||
]);
|
||||
@@ -832,7 +832,7 @@ suite('Glob', () => {
|
||||
const parsed = glob.parse(<glob.IExpression>pattern, { trimForExclusions: true });
|
||||
assert.deepStrictEqual(glob.getBasenameTerms(parsed), basenameTerms);
|
||||
matches.forEach(([text, result], i) => {
|
||||
assert.strictEqual(parsed(text, null, siblingsFns[i]), result);
|
||||
assert.strictEqual(parsed(text, null!, siblingsFns[i]), result);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -914,7 +914,7 @@ suite('Glob', () => {
|
||||
[nativeSep('bar/foo/bar'), '**/foo/bar/**'],
|
||||
// Not supported
|
||||
// [nativeSep('foo/bar/bar'), '{**/bar/bar/**,**/baz/bar/**}'],
|
||||
[nativeSep('/foo/bar/nope'), null]
|
||||
[nativeSep('/foo/bar/nope'), null!]
|
||||
]);
|
||||
|
||||
const siblings = ['baz', 'baz.zip', 'nope'];
|
||||
@@ -923,12 +923,12 @@ suite('Glob', () => {
|
||||
'**/foo/123/**': { when: '$(basename).zip' },
|
||||
'**/bar/123/**': true
|
||||
}, ['*/bar/123'], [
|
||||
[nativeSep('bar/foo/123'), null],
|
||||
[nativeSep('bar/foo/123/baz'), null],
|
||||
[nativeSep('bar/foo/123/nope'), null],
|
||||
[nativeSep('bar/foo/123'), null!],
|
||||
[nativeSep('bar/foo/123/baz'), null!],
|
||||
[nativeSep('bar/foo/123/nope'), null!],
|
||||
[nativeSep('foo/bar/123'), '**/bar/123/**'],
|
||||
], [
|
||||
null,
|
||||
null!,
|
||||
hasSibling,
|
||||
hasSibling
|
||||
]);
|
||||
@@ -938,7 +938,7 @@ suite('Glob', () => {
|
||||
const parsed = glob.parse(<glob.IExpression>pattern, { trimForExclusions: true });
|
||||
assert.deepStrictEqual(glob.getPathTerms(parsed), pathTerms);
|
||||
matches.forEach(([text, result], i) => {
|
||||
assert.strictEqual(parsed(text, null, siblingsFns[i]), result);
|
||||
assert.strictEqual(parsed(text, null!, siblingsFns[i]), result);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ suite('PFS', () => {
|
||||
return pfs.mkdirp(newDir, 493).then(() => {
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
return pfs.writeFile(testFile, 'Hello World', null).then(() => {
|
||||
return pfs.writeFile(testFile, 'Hello World', null!).then(() => {
|
||||
assert.equal(fs.readFileSync(testFile), 'Hello World');
|
||||
|
||||
return pfs.del(parentDir, os.tmpdir());
|
||||
@@ -46,11 +46,11 @@ suite('PFS', () => {
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
return Promise.all([
|
||||
pfs.writeFile(testFile1, 'Hello World 1', null),
|
||||
pfs.writeFile(testFile2, 'Hello World 2', null),
|
||||
pfs.writeFile(testFile3, 'Hello World 3', null),
|
||||
pfs.writeFile(testFile4, 'Hello World 4', null),
|
||||
pfs.writeFile(testFile5, 'Hello World 5', null)
|
||||
pfs.writeFile(testFile1, 'Hello World 1', null!),
|
||||
pfs.writeFile(testFile2, 'Hello World 2', null!),
|
||||
pfs.writeFile(testFile3, 'Hello World 3', null!),
|
||||
pfs.writeFile(testFile4, 'Hello World 4', null!),
|
||||
pfs.writeFile(testFile5, 'Hello World 5', null!)
|
||||
]).then(() => {
|
||||
assert.equal(fs.readFileSync(testFile1), 'Hello World 1');
|
||||
assert.equal(fs.readFileSync(testFile2), 'Hello World 2');
|
||||
@@ -73,11 +73,11 @@ suite('PFS', () => {
|
||||
assert.ok(fs.existsSync(newDir));
|
||||
|
||||
return Promise.all([
|
||||
pfs.writeFile(testFile, 'Hello World 1', null),
|
||||
pfs.writeFile(testFile, 'Hello World 2', null),
|
||||
timeout(10).then(() => pfs.writeFile(testFile, 'Hello World 3', null)),
|
||||
pfs.writeFile(testFile, 'Hello World 4', null),
|
||||
timeout(10).then(() => pfs.writeFile(testFile, 'Hello World 5', null))
|
||||
pfs.writeFile(testFile, 'Hello World 1', undefined),
|
||||
pfs.writeFile(testFile, 'Hello World 2', undefined),
|
||||
timeout(10).then(() => pfs.writeFile(testFile, 'Hello World 3', undefined)),
|
||||
pfs.writeFile(testFile, 'Hello World 4', undefined),
|
||||
timeout(10).then(() => pfs.writeFile(testFile, 'Hello World 5', undefined))
|
||||
]).then(() => {
|
||||
assert.equal(fs.readFileSync(testFile), 'Hello World 5');
|
||||
|
||||
@@ -119,23 +119,6 @@ suite('PFS', () => {
|
||||
});
|
||||
});
|
||||
|
||||
test('unlinkIgnoreError', function () {
|
||||
const id = uuid.generateUuid();
|
||||
const parentDir = path.join(os.tmpdir(), 'vsctests', id);
|
||||
const newDir = path.join(parentDir, 'extfs', id);
|
||||
|
||||
return pfs.mkdirp(newDir, 493).then(() => {
|
||||
return pfs.unlinkIgnoreError(path.join(newDir, 'foo')).then(() => {
|
||||
|
||||
return pfs.del(parentDir, os.tmpdir());
|
||||
}, error => {
|
||||
assert.fail(error);
|
||||
|
||||
return Promise.reject(error);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('moveIgnoreError', function () {
|
||||
const id = uuid.generateUuid();
|
||||
const parentDir = path.join(os.tmpdir(), 'vsctests', id);
|
||||
|
||||
@@ -21,7 +21,7 @@ suite('Ports', () => {
|
||||
|
||||
// create a server to block this port
|
||||
const server = net.createServer();
|
||||
server.listen(initialPort, null, null, () => {
|
||||
server.listen(initialPort, undefined, undefined, () => {
|
||||
|
||||
// once listening, find another free port and assert that the port is different from the opened one
|
||||
ports.findFreePort(7000, 50, 300000).then(freePort => {
|
||||
|
||||
@@ -84,4 +84,29 @@ suite('Processes', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
test('sanitizeProcessEnvironment', () => {
|
||||
let env = {
|
||||
FOO: 'bar',
|
||||
ELECTRON_ENABLE_STACK_DUMPING: 'x',
|
||||
ELECTRON_ENABLE_LOGGING: 'x',
|
||||
ELECTRON_NO_ASAR: 'x',
|
||||
ELECTRON_NO_ATTACH_CONSOLE: 'x',
|
||||
ELECTRON_RUN_AS_NODE: 'x',
|
||||
GOOGLE_API_KEY: 'x',
|
||||
VSCODE_CLI: 'x',
|
||||
VSCODE_DEV: 'x',
|
||||
VSCODE_IPC_HOOK: 'x',
|
||||
VSCODE_LOGS: 'x',
|
||||
VSCODE_NLS_CONFIG: 'x',
|
||||
VSCODE_PORTABLE: 'x',
|
||||
VSCODE_PID: 'x',
|
||||
VSCODE_NODE_CACHED_DATA_DIR: 'x',
|
||||
VSCODE_NEW_VAR: 'x'
|
||||
};
|
||||
processes.sanitizeProcessEnvironment(env);
|
||||
assert.equal(env['FOO'], 'bar');
|
||||
assert.equal(Object.keys(env).length, 1);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -8,9 +8,10 @@ import { generateUuid } from 'vs/base/common/uuid';
|
||||
import { join } from 'path';
|
||||
import { tmpdir } from 'os';
|
||||
import { equal, ok } from 'assert';
|
||||
import { mkdirp, del, writeFile } from 'vs/base/node/pfs';
|
||||
import { mkdirp, del, writeFile, exists, unlink } from 'vs/base/node/pfs';
|
||||
import { timeout } from 'vs/base/common/async';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { isWindows } from 'vs/base/common/platform';
|
||||
|
||||
suite('Storage Library', () => {
|
||||
|
||||
@@ -90,7 +91,6 @@ suite('Storage Library', () => {
|
||||
await Promise.all([delete1Promise, delete2Promise, delete3Promise]).then(() => deletePromiseResolved = true);
|
||||
equal(deletePromiseResolved, true);
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
@@ -100,7 +100,7 @@ suite('Storage Library', () => {
|
||||
await mkdirp(storageDir);
|
||||
|
||||
class TestSQLiteStorageDatabase extends SQLiteStorageDatabase {
|
||||
private _onDidChangeItemsExternal: Emitter<IStorageItemsChangeEvent> = new Emitter<IStorageItemsChangeEvent>();
|
||||
private _onDidChangeItemsExternal = new Emitter<IStorageItemsChangeEvent>();
|
||||
get onDidChangeItemsExternal(): Event<IStorageItemsChangeEvent> { return this._onDidChangeItemsExternal.event; }
|
||||
|
||||
fireDidChangeItemsExternal(event: IStorageItemsChangeEvent): void {
|
||||
@@ -136,18 +136,17 @@ suite('Storage Library', () => {
|
||||
changes.clear();
|
||||
|
||||
// Delete is accepted
|
||||
change.set('foo', null);
|
||||
change.set('foo', undefined);
|
||||
database.fireDidChangeItemsExternal({ items: change });
|
||||
ok(changes.has('foo'));
|
||||
equal(storage.get('foo', null), null);
|
||||
equal(storage.get('foo', null!), null);
|
||||
changes.clear();
|
||||
|
||||
// Nothing happens if changing to same value
|
||||
change.set('foo', null);
|
||||
change.set('foo', undefined);
|
||||
database.fireDidChangeItemsExternal({ items: change });
|
||||
equal(changes.size, 0);
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
@@ -168,7 +167,6 @@ suite('Storage Library', () => {
|
||||
let setPromiseResolved = false;
|
||||
Promise.all([set1Promise, set2Promise]).then(() => setPromiseResolved = true);
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
|
||||
equal(setPromiseResolved, true);
|
||||
@@ -179,7 +177,6 @@ suite('Storage Library', () => {
|
||||
equal(storage.get('foo'), 'bar');
|
||||
equal(storage.get('bar'), 'foo');
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
|
||||
storage = new Storage(new SQLiteStorageDatabase(join(storageDir, 'storage.db')));
|
||||
@@ -194,7 +191,6 @@ suite('Storage Library', () => {
|
||||
let deletePromiseResolved = false;
|
||||
Promise.all([delete1Promise, delete2Promise]).then(() => deletePromiseResolved = true);
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
|
||||
equal(deletePromiseResolved, true);
|
||||
@@ -205,7 +201,6 @@ suite('Storage Library', () => {
|
||||
ok(!storage.get('foo'));
|
||||
ok(!storage.get('bar'));
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
@@ -248,7 +243,36 @@ suite('Storage Library', () => {
|
||||
await Promise.all([set4Promise, delete1Promise]).then(() => setAndDeletePromiseResolved = true);
|
||||
ok(setAndDeletePromiseResolved);
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
|
||||
test('corrupt DB recovers', async () => {
|
||||
const storageDir = uniqueStorageDir();
|
||||
await mkdirp(storageDir);
|
||||
|
||||
const storageFile = join(storageDir, 'storage.db');
|
||||
|
||||
let storage = new Storage(new SQLiteStorageDatabase(storageFile));
|
||||
await storage.init();
|
||||
|
||||
await storage.set('bar', 'foo');
|
||||
|
||||
await writeFile(storageFile, 'This is a broken DB');
|
||||
|
||||
await storage.set('foo', 'bar');
|
||||
|
||||
equal(storage.get('bar'), 'foo');
|
||||
equal(storage.get('foo'), 'bar');
|
||||
|
||||
await storage.close();
|
||||
|
||||
storage = new Storage(new SQLiteStorageDatabase(storageFile));
|
||||
await storage.init();
|
||||
|
||||
equal(storage.get('bar'), 'foo');
|
||||
equal(storage.get('foo'), 'bar');
|
||||
|
||||
await storage.close();
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
@@ -270,7 +294,7 @@ suite('SQLite Storage Library', () => {
|
||||
}
|
||||
|
||||
async function testDBBasics(path, logError?: (error) => void) {
|
||||
let options: ISQLiteStorageDatabaseOptions;
|
||||
let options!: ISQLiteStorageDatabaseOptions;
|
||||
if (logError) {
|
||||
options = {
|
||||
logging: {
|
||||
@@ -331,7 +355,14 @@ suite('SQLite Storage Library', () => {
|
||||
storedItems = await storage.getItems();
|
||||
equal(storedItems.size, 0);
|
||||
|
||||
await storage.close();
|
||||
let recoveryCalled = false;
|
||||
await storage.close(() => {
|
||||
recoveryCalled = true;
|
||||
|
||||
return new Map();
|
||||
});
|
||||
|
||||
equal(recoveryCalled, false);
|
||||
}
|
||||
|
||||
test('basics', async () => {
|
||||
@@ -339,7 +370,7 @@ suite('SQLite Storage Library', () => {
|
||||
|
||||
await mkdirp(storageDir);
|
||||
|
||||
testDBBasics(join(storageDir, 'storage.db'));
|
||||
await testDBBasics(join(storageDir, 'storage.db'));
|
||||
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
@@ -399,7 +430,14 @@ suite('SQLite Storage Library', () => {
|
||||
equal(storedItems.get('some/foo/path'), 'some/bar/path');
|
||||
equal(storedItems.get(JSON.stringify({ foo: 'bar' })), JSON.stringify({ bar: 'foo' }));
|
||||
|
||||
await storage.close();
|
||||
let recoveryCalled = false;
|
||||
await storage.close(() => {
|
||||
recoveryCalled = true;
|
||||
|
||||
return new Map();
|
||||
});
|
||||
|
||||
equal(recoveryCalled, false);
|
||||
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
@@ -433,6 +471,74 @@ suite('SQLite Storage Library', () => {
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
|
||||
test('basics (DB that becomes corrupt during runtime stores all state from cache on close)', async () => {
|
||||
if (isWindows) {
|
||||
await Promise.resolve(); // Windows will fail to write to open DB due to locking
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const storageDir = uniqueStorageDir();
|
||||
|
||||
await mkdirp(storageDir);
|
||||
|
||||
const storagePath = join(storageDir, 'storage.db');
|
||||
let storage = new SQLiteStorageDatabase(storagePath);
|
||||
|
||||
const items = new Map<string, string>();
|
||||
items.set('foo', 'bar');
|
||||
items.set('some/foo/path', 'some/bar/path');
|
||||
items.set(JSON.stringify({ foo: 'bar' }), JSON.stringify({ bar: 'foo' }));
|
||||
|
||||
await storage.updateItems({ insert: items });
|
||||
await storage.close();
|
||||
|
||||
const backupPath = `${storagePath}.backup`;
|
||||
equal(await exists(backupPath), true);
|
||||
|
||||
storage = new SQLiteStorageDatabase(storagePath);
|
||||
await storage.getItems();
|
||||
|
||||
await writeFile(storagePath, 'This is now a broken DB');
|
||||
|
||||
// we still need to trigger a check to the DB so that we get to know that
|
||||
// the DB is corrupt. We have no extra code on shutdown that checks for the
|
||||
// health of the DB. This is an optimization to not perform too many tasks
|
||||
// on shutdown.
|
||||
await storage.checkIntegrity(true).then(null, error => { } /* error is expected here but we do not want to fail */);
|
||||
|
||||
await unlink(backupPath); // also test that the recovery DB is backed up properly
|
||||
|
||||
let recoveryCalled = false;
|
||||
await storage.close(() => {
|
||||
recoveryCalled = true;
|
||||
|
||||
return items;
|
||||
});
|
||||
|
||||
equal(recoveryCalled, true);
|
||||
equal(await exists(backupPath), true);
|
||||
|
||||
storage = new SQLiteStorageDatabase(storagePath);
|
||||
|
||||
const storedItems = await storage.getItems();
|
||||
equal(storedItems.size, items.size);
|
||||
equal(storedItems.get('foo'), 'bar');
|
||||
equal(storedItems.get('some/foo/path'), 'some/bar/path');
|
||||
equal(storedItems.get(JSON.stringify({ foo: 'bar' })), JSON.stringify({ bar: 'foo' }));
|
||||
|
||||
recoveryCalled = false;
|
||||
await storage.close(() => {
|
||||
recoveryCalled = true;
|
||||
|
||||
return new Map();
|
||||
});
|
||||
|
||||
equal(recoveryCalled, false);
|
||||
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
|
||||
test('real world example', async () => {
|
||||
const storageDir = uniqueStorageDir();
|
||||
|
||||
@@ -627,7 +733,70 @@ suite('SQLite Storage Library', () => {
|
||||
equal(items.get('foo3'), 'bar');
|
||||
equal(items.get('some/foo3/path'), 'some/bar/path');
|
||||
|
||||
storage.beforeClose();
|
||||
await storage.close();
|
||||
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
|
||||
test('lots of INSERT & DELETE (below inline max)', async () => {
|
||||
const storageDir = uniqueStorageDir();
|
||||
|
||||
await mkdirp(storageDir);
|
||||
|
||||
const storage = new SQLiteStorageDatabase(join(storageDir, 'storage.db'));
|
||||
|
||||
const items = new Map<string, string>();
|
||||
const keys: Set<string> = new Set<string>();
|
||||
for (let i = 0; i < 200; i++) {
|
||||
const uuid = generateUuid();
|
||||
const key = `key: ${uuid}`;
|
||||
|
||||
items.set(key, `value: ${uuid}`);
|
||||
keys.add(key);
|
||||
}
|
||||
|
||||
await storage.updateItems({ insert: items });
|
||||
|
||||
let storedItems = await storage.getItems();
|
||||
equal(storedItems.size, items.size);
|
||||
|
||||
await storage.updateItems({ delete: keys });
|
||||
|
||||
storedItems = await storage.getItems();
|
||||
equal(storedItems.size, 0);
|
||||
|
||||
await storage.close();
|
||||
|
||||
await del(storageDir, tmpdir());
|
||||
});
|
||||
|
||||
test('lots of INSERT & DELETE (above inline max)', async () => {
|
||||
const storageDir = uniqueStorageDir();
|
||||
|
||||
await mkdirp(storageDir);
|
||||
|
||||
const storage = new SQLiteStorageDatabase(join(storageDir, 'storage.db'));
|
||||
|
||||
const items = new Map<string, string>();
|
||||
const keys: Set<string> = new Set<string>();
|
||||
for (let i = 0; i < 400; i++) {
|
||||
const uuid = generateUuid();
|
||||
const key = `key: ${uuid}`;
|
||||
|
||||
items.set(key, `value: ${uuid}`);
|
||||
keys.add(key);
|
||||
}
|
||||
|
||||
await storage.updateItems({ insert: items });
|
||||
|
||||
let storedItems = await storage.getItems();
|
||||
equal(storedItems.size, items.size);
|
||||
|
||||
await storage.updateItems({ delete: keys });
|
||||
|
||||
storedItems = await storage.getItems();
|
||||
equal(storedItems.size, 0);
|
||||
|
||||
await storage.close();
|
||||
|
||||
await del(storageDir, tmpdir());
|
||||
|
||||
@@ -14,7 +14,7 @@ suite('Stream', () => {
|
||||
|
||||
return stream.readExactlyByFile(file, 10).then(({ buffer, bytesRead }) => {
|
||||
assert.equal(bytesRead, 10);
|
||||
assert.equal(buffer.toString(), '/*--------');
|
||||
assert.equal(buffer!.toString(), '/*--------');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -10,10 +10,10 @@ import { mkdirp, del } from 'vs/base/node/pfs';
|
||||
|
||||
export interface ITestFileResult {
|
||||
testFile: string;
|
||||
cleanUp: () => Thenable<void>;
|
||||
cleanUp: () => Promise<void>;
|
||||
}
|
||||
|
||||
export function testFile(folder: string, file: string): Thenable<ITestFileResult> {
|
||||
export function testFile(folder: string, file: string): Promise<ITestFileResult> {
|
||||
const id = generateUuid();
|
||||
const parentDir = join(tmpdir(), 'vsctests', id);
|
||||
const newDir = join(parentDir, 'config', id);
|
||||
|
||||
Reference in New Issue
Block a user