backupMainService.test.ts 5.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

import * as assert from 'assert';
import * as platform from 'vs/base/common/platform';
import crypto = require('crypto');
D
Daniel Imms 已提交
11
import fs = require('fs');
12 13 14 15 16 17
import os = require('os');
import path = require('path');
import extfs = require('vs/base/node/extfs');
import pfs = require('vs/base/node/pfs');
import Uri from 'vs/base/common/uri';
import { TestEnvironmentService } from 'vs/test/utils/servicesTestUtils';
18
import { TestLifecycleService } from 'vs/code/test/electron-main/servicesTestUtils';
D
Daniel Imms 已提交
19
import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService';
20
import { IBackupWorkspacesFormat } from 'vs/platform/backup/common/backup';
21

D
Daniel Imms 已提交
22
class TestBackupMainService extends BackupMainService {
23
	constructor(backupHome: string, backupWorkspacesPath: string) {
24
		super(TestEnvironmentService, new TestLifecycleService());
25 26

		this.backupHome = backupHome;
D
Daniel Imms 已提交
27
		this.workspacesJsonPath = backupWorkspacesPath;
28 29 30

		// Force a reload with the new paths
		this.loadSync();
31 32 33
	}
}

D
Daniel Imms 已提交
34
suite('BackupMainService', () => {
D
Daniel Imms 已提交
35
	const parentDir = path.join(os.tmpdir(), 'vsctests', 'service');
36 37 38 39 40 41
	const backupHome = path.join(parentDir, 'Backups');
	const backupWorkspacesPath = path.join(backupHome, 'workspaces.json');

	const fooFile = Uri.file(platform.isWindows ? 'C:\\foo' : '/foo');
	const barFile = Uri.file(platform.isWindows ? 'C:\\bar' : '/bar');

42 43
	const fooWorkspaceBackupDir = path.join(backupHome, crypto.createHash('md5').update(fooFile.fsPath).digest('hex'));

D
Daniel Imms 已提交
44
	let service: BackupMainService;
45 46

	setup(done => {
D
Daniel Imms 已提交
47
		service = new TestBackupMainService(backupHome, backupWorkspacesPath);
48 49 50 51

		// Delete any existing backups completely and then re-create it.
		extfs.del(backupHome, os.tmpdir(), () => {
			pfs.mkdirp(backupHome).then(() => {
D
Daniel Imms 已提交
52
				done();
53 54 55 56 57 58 59 60
			});
		});
	});

	teardown(done => {
		extfs.del(backupHome, os.tmpdir(), done);
	});

61
	test('getWorkspaceBackupPaths should return [] when workspaces.json doesn\'t exist', () => {
D
Daniel Imms 已提交
62
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
63 64
	});

65
	test('getWorkspaceBackupPaths should return [] when workspaces.json is not properly formed JSON', () => {
D
Daniel Imms 已提交
66
		fs.writeFileSync(backupWorkspacesPath, '');
D
Daniel Imms 已提交
67
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
68
		fs.writeFileSync(backupWorkspacesPath, '{]');
D
Daniel Imms 已提交
69
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
70
		fs.writeFileSync(backupWorkspacesPath, 'foo');
D
Daniel Imms 已提交
71
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
72 73
	});

74
	test('getWorkspaceBackupPaths should return [] when folderWorkspaces in workspaces.json is absent', () => {
D
Daniel Imms 已提交
75
		fs.writeFileSync(backupWorkspacesPath, '{}');
D
Daniel Imms 已提交
76
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
77 78
	});

79
	test('getWorkspaceBackupPaths should return [] when folderWorkspaces in workspaces.json is not a string array', () => {
D
Daniel Imms 已提交
80
		fs.writeFileSync(backupWorkspacesPath, '{"folderWorkspaces":{}}');
D
Daniel Imms 已提交
81
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
82
		fs.writeFileSync(backupWorkspacesPath, '{"folderWorkspaces":{"foo": ["bar"]}}');
D
Daniel Imms 已提交
83
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
84
		fs.writeFileSync(backupWorkspacesPath, '{"folderWorkspaces":{"foo": []}}');
D
Daniel Imms 已提交
85
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
86
		fs.writeFileSync(backupWorkspacesPath, '{"folderWorkspaces":{"foo": "bar"}}');
D
Daniel Imms 已提交
87
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
88
		fs.writeFileSync(backupWorkspacesPath, '{"folderWorkspaces":"foo"}');
D
Daniel Imms 已提交
89
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
90
		fs.writeFileSync(backupWorkspacesPath, '{"folderWorkspaces":1}');
D
Daniel Imms 已提交
91
		assert.deepEqual(service.getWorkspaceBackupPaths(), []);
D
Daniel Imms 已提交
92 93
	});

94
	test('pushWorkspaceBackupPathsSync should persist paths to workspaces.json', () => {
D
Daniel Imms 已提交
95 96
		service.pushWorkspaceBackupPathsSync([fooFile, barFile]);
		assert.deepEqual(service.getWorkspaceBackupPaths(), [fooFile.fsPath, barFile.fsPath]);
97 98
	});

99
	test('removeWorkspaceBackupPath should remove workspaces from workspaces.json', done => {
D
Daniel Imms 已提交
100 101
		service.pushWorkspaceBackupPathsSync([fooFile, barFile]);
		service.removeWorkspaceBackupPathSync(fooFile);
102 103 104
		pfs.readFile(backupWorkspacesPath, 'utf-8').then(buffer => {
			const json = <IBackupWorkspacesFormat>JSON.parse(buffer);
			assert.deepEqual(json.folderWorkspaces, [barFile.fsPath]);
D
Daniel Imms 已提交
105
			service.removeWorkspaceBackupPathSync(barFile);
106 107 108 109
			pfs.readFile(backupWorkspacesPath, 'utf-8').then(content => {
				const json2 = <IBackupWorkspacesFormat>JSON.parse(content);
				assert.deepEqual(json2.folderWorkspaces, []);
				done();
110 111 112 113 114 115
			});
		});
	});

	test('removeWorkspaceBackupPath should fail gracefully when removing a path that doesn\'t exist', done => {
		const workspacesJson: IBackupWorkspacesFormat = { folderWorkspaces: [fooFile.fsPath] };
116
		pfs.writeFile(backupWorkspacesPath, JSON.stringify(workspacesJson)).then(() => {
D
Daniel Imms 已提交
117
			service.removeWorkspaceBackupPathSync(barFile);
118 119 120 121 122 123 124
			pfs.readFile(backupWorkspacesPath, 'utf-8').then(content => {
				const json = <IBackupWorkspacesFormat>JSON.parse(content);
				assert.deepEqual(json.folderWorkspaces, [fooFile.fsPath]);
				done();
			});
		});
	});
125 126

	test('doesWorkspaceHaveBackups should return whether the workspace\'s backup exists', () => {
D
Daniel Imms 已提交
127
		assert.equal(service.hasWorkspaceBackup(fooFile), false);
128
		fs.mkdirSync(fooWorkspaceBackupDir);
D
Daniel Imms 已提交
129
		assert.equal(service.hasWorkspaceBackup(fooFile), true);
130
	});
131
});