提交 1425d048 编写于 作者: B Benjamin Pasero

storage - add test for migration

上级 b5aa0f02
......@@ -15,9 +15,8 @@ import { Action } from 'vs/base/common/actions';
import { IWindowService } from 'vs/platform/windows/common/windows';
import { localize } from 'vs/nls';
import { mark, getDuration } from 'vs/base/common/performance';
import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
import { join, basename } from 'path';
import { mkdirp, copy } from 'vs/base/node/pfs';
import { copy } from 'vs/base/node/pfs';
export class StorageService extends Disposable implements IStorageService {
_serviceBrand: any;
......@@ -59,7 +58,7 @@ export class StorageService extends Disposable implements IStorageService {
constructor(
workspaceStoragePath: string,
@ILogService logService: ILogService,
@IEnvironmentService private environmentService: IEnvironmentService
@IEnvironmentService environmentService: IEnvironmentService
) {
super();
......@@ -197,26 +196,23 @@ export class StorageService extends Disposable implements IStorageService {
});
}
migrate(toWorkspace: IWorkspaceIdentifier): Promise<void> {
migrate(toWorkspaceStorageFolder: string): Promise<void> {
if (this.workspaceStoragePath === StorageService.IN_MEMORY_PATH) {
return Promise.resolve(); // no migration needed if running in memory
}
// Compute new workspace storage path based on workspace identifier
const newWorkspaceStorageHome = join(this.environmentService.workspaceStorageHome, toWorkspace.id);
const newWorkspaceStoragePath = join(newWorkspaceStorageHome, basename(this.workspaceStoragePath));
const newWorkspaceStoragePath = join(toWorkspaceStorageFolder, basename(this.workspaceStoragePath));
if (this.workspaceStoragePath === newWorkspaceStoragePath) {
return Promise.resolve(); // guard against migrating to same path
}
// Close workspace DB to be able to copy
return this.workspaceStorage.close().then(() => {
return mkdirp(newWorkspaceStorageHome).then(() => {
return copy(this.workspaceStoragePath, newWorkspaceStoragePath).then(() => {
this.createWorkspaceStorage(newWorkspaceStoragePath);
return copy(this.workspaceStoragePath, newWorkspaceStoragePath).then(() => {
this.createWorkspaceStorage(newWorkspaceStoragePath);
return this.workspaceStorage.init();
});
return this.workspaceStorage.init();
});
});
}
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { StorageScope } from 'vs/platform/storage/common/storage';
// tslint:disable-next-line:import-patterns
import { TestStorageService } from 'vs/workbench/test/workbenchTestServices';
suite('StorageService', () => {
test('Remove Data', () => {
let storage = new TestStorageService();
storage.store('Monaco.IDE.Core.Storage.Test.remove', 'foobar', StorageScope.GLOBAL);
assert.strictEqual('foobar', storage.get('Monaco.IDE.Core.Storage.Test.remove', StorageScope.GLOBAL));
storage.remove('Monaco.IDE.Core.Storage.Test.remove', StorageScope.GLOBAL);
assert.ok(!storage.get('Monaco.IDE.Core.Storage.Test.remove', StorageScope.GLOBAL));
});
test('Get Data, Integer, Boolean', () => {
let storage = new TestStorageService();
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', StorageScope.GLOBAL, 'foobar'), 'foobar');
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', StorageScope.GLOBAL, ''), '');
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getInteger', StorageScope.GLOBAL, 5), 5);
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getInteger', StorageScope.GLOBAL, 0), 0);
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getBoolean', StorageScope.GLOBAL, true), true);
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getBoolean', StorageScope.GLOBAL, false), false);
storage.store('Monaco.IDE.Core.Storage.Test.get', 'foobar', StorageScope.GLOBAL);
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', StorageScope.GLOBAL), 'foobar');
storage.store('Monaco.IDE.Core.Storage.Test.get', '', StorageScope.GLOBAL);
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', StorageScope.GLOBAL), '');
storage.store('Monaco.IDE.Core.Storage.Test.getInteger', 5, StorageScope.GLOBAL);
assert.strictEqual(storage.getInteger('Monaco.IDE.Core.Storage.Test.getInteger', StorageScope.GLOBAL), 5);
storage.store('Monaco.IDE.Core.Storage.Test.getInteger', 0, StorageScope.GLOBAL);
assert.strictEqual(storage.getInteger('Monaco.IDE.Core.Storage.Test.getInteger', StorageScope.GLOBAL), 0);
storage.store('Monaco.IDE.Core.Storage.Test.getBoolean', true, StorageScope.GLOBAL);
assert.strictEqual(storage.getBoolean('Monaco.IDE.Core.Storage.Test.getBoolean', StorageScope.GLOBAL), true);
storage.store('Monaco.IDE.Core.Storage.Test.getBoolean', false, StorageScope.GLOBAL);
assert.strictEqual(storage.getBoolean('Monaco.IDE.Core.Storage.Test.getBoolean', StorageScope.GLOBAL), false);
assert.strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getDefault', StorageScope.GLOBAL, 'getDefault'), 'getDefault');
assert.strictEqual(storage.getInteger('Monaco.IDE.Core.Storage.Test.getIntegerDefault', StorageScope.GLOBAL, 5), 5);
assert.strictEqual(storage.getBoolean('Monaco.IDE.Core.Storage.Test.getBooleanDefault', StorageScope.GLOBAL, true), true);
});
});
\ No newline at end of file
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { strictEqual, ok, equal } from 'assert';
import { StorageScope } from 'vs/platform/storage/common/storage';
import { TestStorageService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices';
import { StorageService } from 'vs/platform/storage/node/storageService';
import { generateUuid } from 'vs/base/common/uuid';
import { join } from 'path';
import { tmpdir } from 'os';
import { mkdirp, del } from 'vs/base/node/pfs';
import { NullLogService } from 'vs/platform/log/common/log';
suite('StorageService', () => {
test('Remove Data (global, in-memory)', () => {
removeData(StorageScope.GLOBAL);
});
test('Remove Data (workspace, in-memory)', () => {
removeData(StorageScope.WORKSPACE);
});
function removeData(scope: StorageScope): void {
const storage = new TestStorageService();
storage.store('Monaco.IDE.Core.Storage.Test.remove', 'foobar', scope);
strictEqual('foobar', storage.get('Monaco.IDE.Core.Storage.Test.remove', scope));
storage.remove('Monaco.IDE.Core.Storage.Test.remove', scope);
ok(!storage.get('Monaco.IDE.Core.Storage.Test.remove', scope));
}
test('Get Data, Integer, Boolean (global, in-memory)', () => {
storeData(StorageScope.GLOBAL);
});
test('Get Data, Integer, Boolean (workspace, in-memory)', () => {
storeData(StorageScope.WORKSPACE);
});
function storeData(scope: StorageScope): void {
const storage = new TestStorageService();
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', scope, 'foobar'), 'foobar');
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', scope, ''), '');
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getInteger', scope, 5), 5);
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getInteger', scope, 0), 0);
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getBoolean', scope, true), true);
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getBoolean', scope, false), false);
storage.store('Monaco.IDE.Core.Storage.Test.get', 'foobar', scope);
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', scope), 'foobar');
storage.store('Monaco.IDE.Core.Storage.Test.get', '', scope);
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.get', scope), '');
storage.store('Monaco.IDE.Core.Storage.Test.getInteger', 5, scope);
strictEqual(storage.getInteger('Monaco.IDE.Core.Storage.Test.getInteger', scope), 5);
storage.store('Monaco.IDE.Core.Storage.Test.getInteger', 0, scope);
strictEqual(storage.getInteger('Monaco.IDE.Core.Storage.Test.getInteger', scope), 0);
storage.store('Monaco.IDE.Core.Storage.Test.getBoolean', true, scope);
strictEqual(storage.getBoolean('Monaco.IDE.Core.Storage.Test.getBoolean', scope), true);
storage.store('Monaco.IDE.Core.Storage.Test.getBoolean', false, scope);
strictEqual(storage.getBoolean('Monaco.IDE.Core.Storage.Test.getBoolean', scope), false);
strictEqual(storage.get('Monaco.IDE.Core.Storage.Test.getDefault', scope, 'getDefault'), 'getDefault');
strictEqual(storage.getInteger('Monaco.IDE.Core.Storage.Test.getIntegerDefault', scope, 5), 5);
strictEqual(storage.getBoolean('Monaco.IDE.Core.Storage.Test.getBooleanDefault', scope, true), true);
}
function uniqueStorageDir(): string {
const id = generateUuid();
return join(tmpdir(), 'vsctests', id, 'storage2', id);
}
test('Migrate Data', async () => {
const storageDir = uniqueStorageDir();
await mkdirp(storageDir);
const storage = new StorageService(join(storageDir, 'storage.db'), new NullLogService(), TestEnvironmentService);
await storage.init();
storage.store('bar', 'foo', StorageScope.WORKSPACE);
storage.store('barNumber', 55, StorageScope.WORKSPACE);
storage.store('barBoolean', true, StorageScope.GLOBAL);
const newStorageDir = uniqueStorageDir();
await mkdirp(newStorageDir);
await storage.migrate(newStorageDir);
equal(storage.get('bar', StorageScope.WORKSPACE), 'foo');
equal(storage.getInteger('barNumber', StorageScope.WORKSPACE), 55);
equal(storage.getBoolean('barBoolean', StorageScope.GLOBAL), true);
await storage.close();
await del(newStorageDir, tmpdir());
await del(storageDir, tmpdir());
});
});
\ No newline at end of file
......@@ -25,6 +25,9 @@ import { distinct } from 'vs/base/common/arrays';
import { isLinux } from 'vs/base/common/platform';
import { isEqual } from 'vs/base/common/resources';
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
import { join } from 'path';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { mkdirp } from 'vs/base/node/pfs';
export class WorkspaceEditingService implements IWorkspaceEditingService {
......@@ -39,7 +42,8 @@ export class WorkspaceEditingService implements IWorkspaceEditingService {
@IExtensionService private extensionService: IExtensionService,
@IBackupFileService private backupFileService: IBackupFileService,
@INotificationService private notificationService: INotificationService,
@ICommandService private commandService: ICommandService
@ICommandService private commandService: ICommandService,
@IEnvironmentService private environmentService: IEnvironmentService
) {
}
......@@ -237,9 +241,13 @@ export class WorkspaceEditingService implements IWorkspaceEditingService {
}
private migrateStorage(toWorkspace: IWorkspaceIdentifier): TPromise<void> {
const storageImpl = this.storageService as DelegatingStorageService;
const newWorkspaceStorageHome = join(this.environmentService.workspaceStorageHome, toWorkspace.id);
return storageImpl.storage.migrate(toWorkspace);
return mkdirp(newWorkspaceStorageHome).then(() => {
const storageImpl = this.storageService as DelegatingStorageService;
return storageImpl.storage.migrate(newWorkspaceStorageHome);
});
}
private migrateWorkspaceSettings(toWorkspace: IWorkspaceIdentifier): TPromise<void> {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册