Merge VS Code 1.31.1 (#4283)

This commit is contained in:
Matt Irvine
2019-03-15 13:09:45 -07:00
committed by GitHub
parent 7d31575149
commit 86bac90001
1716 changed files with 53308 additions and 48375 deletions

View File

@@ -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" }');

View File

@@ -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);
});
});

View File

@@ -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);
});

View File

@@ -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();
{

View File

@@ -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() {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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);
});
}

View File

@@ -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);

View File

@@ -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 => {

View File

@@ -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);
});
});

View File

@@ -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());

View File

@@ -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(), '/*--------');
});
});

View File

@@ -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);