Skip to content

Commit 6becf17

Browse files
committed
microsoft#93960 fix tests
1 parent 175fddc commit 6becf17

5 files changed

Lines changed: 63 additions & 22 deletions

File tree

src/vs/platform/userDataSync/common/userDataSync.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ export const enum SyncResource {
149149
export const ALL_SYNC_RESOURCES: SyncResource[] = [SyncResource.Settings, SyncResource.Keybindings, SyncResource.Snippets, SyncResource.Extensions, SyncResource.GlobalState];
150150

151151
export interface IUserDataManifest {
152-
latest?: Record<SyncResource, string>
152+
latest?: Record<ServerResource, string>
153153
session: string;
154154
}
155155

src/vs/platform/userDataSync/common/userDataSyncMachines.ts

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/service
99
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1010
import { IFileService } from 'vs/platform/files/common/files';
1111
import { IStorageService } from 'vs/platform/storage/common/storage';
12-
import { IUserDataSyncStoreService, IUserData, IUserDataSyncLogService } from 'vs/platform/userDataSync/common/userDataSync';
12+
import { IUserDataSyncStoreService, IUserData, IUserDataSyncLogService, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync';
1313
import { localize } from 'vs/nls';
1414
import { IProductService } from 'vs/platform/product/common/productService';
1515

@@ -31,11 +31,11 @@ export const IUserDataSyncMachinesService = createDecorator<IUserDataSyncMachine
3131
export interface IUserDataSyncMachinesService {
3232
_serviceBrand: any;
3333

34-
getMachines(): Promise<IUserDataSyncMachine[]>;
35-
updateName(name: string): Promise<void>;
36-
unset(): Promise<void>;
37-
34+
getMachines(manifest?: IUserDataManifest): Promise<IUserDataSyncMachine[]>;
35+
updateName(name: string, manifest?: IUserDataManifest): Promise<void>;
3836
disable(id: string): Promise<void>
37+
38+
unset(): Promise<void>;
3939
}
4040

4141
export class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMachinesService {
@@ -60,15 +60,15 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData
6060
this.currentMachineIdPromise = getServiceMachineId(environmentService, fileService, storageService);
6161
}
6262

63-
async getMachines(): Promise<IUserDataSyncMachine[]> {
63+
async getMachines(manifest?: IUserDataManifest): Promise<IUserDataSyncMachine[]> {
6464
const currentMachineId = await this.currentMachineIdPromise;
65-
const machineData = await this.readMachinesData();
65+
const machineData = await this.readMachinesData(manifest);
6666
return machineData.machines.map<IUserDataSyncMachine>(machine => ({ ...machine, ...{ isCurrent: machine.id === currentMachineId } }));
6767
}
6868

69-
async updateName(name: string): Promise<void> {
69+
async updateName(name: string, manifest?: IUserDataManifest): Promise<void> {
7070
const currentMachineId = await this.currentMachineIdPromise;
71-
const machineData = await this.readMachinesData();
71+
const machineData = await this.readMachinesData(manifest);
7272
let currentMachine = machineData.machines.find(({ id }) => id === currentMachineId);
7373
if (currentMachine) {
7474
currentMachine.name = name;
@@ -97,8 +97,8 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData
9797
}
9898
}
9999

100-
private async readMachinesData(): Promise<IMachinesData> {
101-
this.userData = await this.userDataSyncStoreService.read(UserDataSyncMachinesService.RESOURCE, this.userData);
100+
private async readMachinesData(manifest?: IUserDataManifest): Promise<IMachinesData> {
101+
this.userData = await this.readUserData(manifest);
102102
const machinesData = this.parse(this.userData);
103103
if (machinesData.version !== UserDataSyncMachinesService.VERSION) {
104104
throw new Error(localize('error incompatible', "Cannot read machines data as the current version is incompatible. Please update {0} and try again.", this.productService.nameLong));
@@ -112,6 +112,25 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData
112112
this.userData = { ref, content };
113113
}
114114

115+
private async readUserData(manifest?: IUserDataManifest): Promise<IUserData> {
116+
if (this.userData) {
117+
118+
const latestRef = manifest && manifest.latest ? manifest.latest[UserDataSyncMachinesService.RESOURCE] : undefined;
119+
120+
// Last time synced resource and latest resource on server are same
121+
if (this.userData.ref === latestRef) {
122+
return this.userData;
123+
}
124+
125+
// There is no resource on server and last time it was synced with no resource
126+
if (latestRef === undefined && this.userData.content === null) {
127+
return this.userData;
128+
}
129+
}
130+
131+
return this.userDataSyncStoreService.read(UserDataSyncMachinesService.RESOURCE, this.userData);
132+
}
133+
115134
private parse(userData: IUserData): IMachinesData {
116135
if (userData.content !== null) {
117136
try {

src/vs/platform/userDataSync/common/userDataSyncService.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
146146
throw new UserDataSyncError(localize('session expired', "Cannot sync because current session is expired"), UserDataSyncErrorCode.SessionExpired);
147147
}
148148

149-
const machines = await this.userDataSyncMachinesService.getMachines();
149+
const machines = await this.userDataSyncMachinesService.getMachines(manifest || undefined);
150150
const currentMachine = machines.find(machine => machine.isCurrent);
151151

152152
// Check if sync was turned off from other machine
@@ -187,7 +187,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
187187
const index = matches ? parseInt(matches[1]) : 0;
188188
nameIndex = index > nameIndex ? index : nameIndex;
189189
}
190-
await this.userDataSyncMachinesService.updateName(`${namePrefix} #${nameIndex + 1}`);
190+
await this.userDataSyncMachinesService.updateName(`${namePrefix} #${nameIndex + 1}`, manifest || undefined);
191191
}
192192

193193
this.logService.info(`Sync done. Took ${new Date().getTime() - startTime}ms`);
@@ -277,15 +277,17 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
277277

278278
async reset(): Promise<void> {
279279
await this.checkEnablement();
280-
await this.resetLocal();
281280
await this.resetRemote();
281+
await this.resetLocal(true);
282282
}
283283

284-
async resetLocal(): Promise<void> {
284+
async resetLocal(donotUnsetMachine?: boolean): Promise<void> {
285285
await this.checkEnablement();
286286
this.storageService.remove(SESSION_ID_KEY, StorageScope.GLOBAL);
287287
this.storageService.remove(LAST_SYNC_TIME_KEY, StorageScope.GLOBAL);
288-
await this.userDataSyncMachinesService.unset();
288+
if (!donotUnsetMachine) {
289+
await this.userDataSyncMachinesService.unset();
290+
}
289291
for (const synchroniser of this.synchronisers) {
290292
try {
291293
await synchroniser.resetLocal();

src/vs/platform/userDataSync/test/common/userDataSyncClient.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { IRequestService } from 'vs/platform/request/common/request';
77
import { IRequestOptions, IRequestContext, IHeaders } from 'vs/base/parts/request/common/request';
88
import { CancellationToken } from 'vs/base/common/cancellation';
9-
import { IUserData, IUserDataManifest, ALL_SYNC_RESOURCES, IUserDataSyncLogService, IUserDataSyncStoreService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncService, getDefaultIgnoredSettings, IUserDataSyncBackupStoreService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync';
9+
import { IUserData, IUserDataManifest, ALL_SYNC_RESOURCES, IUserDataSyncLogService, IUserDataSyncStoreService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncService, getDefaultIgnoredSettings, IUserDataSyncBackupStoreService, SyncResource, ServerResource } from 'vs/platform/userDataSync/common/userDataSync';
1010
import { bufferToStream, VSBuffer } from 'vs/base/common/buffer';
1111
import { generateUuid } from 'vs/base/common/uuid';
1212
import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService';
@@ -37,6 +37,7 @@ import product from 'vs/platform/product/common/product';
3737
import { IProductService } from 'vs/platform/product/common/productService';
3838
import { UserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSyncBackupStoreService';
3939
import { IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys';
40+
import { IUserDataSyncMachinesService, UserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines';
4041

4142
export class UserDataSyncClient extends Disposable {
4243

@@ -89,6 +90,7 @@ export class UserDataSyncClient extends Disposable {
8990
this.instantiationService.stub(IUserDataSyncLogService, logService);
9091
this.instantiationService.stub(ITelemetryService, NullTelemetryService);
9192
this.instantiationService.stub(IUserDataSyncStoreService, this.instantiationService.createInstance(UserDataSyncStoreService));
93+
this.instantiationService.stub(IUserDataSyncMachinesService, this.instantiationService.createInstance(UserDataSyncMachinesService));
9294
this.instantiationService.stub(IUserDataSyncBackupStoreService, this.instantiationService.createInstance(UserDataSyncBackupStoreService));
9395
this.instantiationService.stub(IUserDataSyncUtilService, new TestUserDataSyncUtilService());
9496
this.instantiationService.stub(IUserDataSyncEnablementService, this.instantiationService.createInstance(UserDataSyncEnablementService));
@@ -130,13 +132,15 @@ export class UserDataSyncClient extends Disposable {
130132

131133
}
132134

135+
const ALL_SERVER_RESOURCES: ServerResource[] = [...ALL_SYNC_RESOURCES, 'machines'];
136+
133137
export class UserDataSyncTestServer implements IRequestService {
134138

135139
_serviceBrand: any;
136140

137141
readonly url: string = 'http://host:3000';
138142
private session: string | null = null;
139-
private readonly data: Map<SyncResource, IUserData> = new Map<SyncResource, IUserData>();
143+
private readonly data: Map<ServerResource, IUserData> = new Map<SyncResource, IUserData>();
140144

141145
private _requests: { url: string, type: string, headers?: IHeaders }[] = [];
142146
get requests(): { url: string, type: string, headers?: IHeaders }[] { return this._requests; }
@@ -188,7 +192,7 @@ export class UserDataSyncTestServer implements IRequestService {
188192

189193
private async getManifest(headers?: IHeaders): Promise<IRequestContext> {
190194
if (this.session) {
191-
const latest: Record<SyncResource, string> = Object.create({});
195+
const latest: Record<ServerResource, string> = Object.create({});
192196
const manifest: IUserDataManifest = { session: this.session, latest };
193197
this.data.forEach((value, key) => latest[key] = value.ref);
194198
return this.toResponse(200, { 'Content-Type': 'application/json' }, JSON.stringify(manifest));
@@ -197,7 +201,7 @@ export class UserDataSyncTestServer implements IRequestService {
197201
}
198202

199203
private async getLatestData(resource: string, headers: IHeaders = {}): Promise<IRequestContext> {
200-
const resourceKey = ALL_SYNC_RESOURCES.find(key => key === resource);
204+
const resourceKey = ALL_SERVER_RESOURCES.find(key => key === resource);
201205
if (resourceKey) {
202206
const data = this.data.get(resourceKey);
203207
if (!data) {
@@ -215,7 +219,7 @@ export class UserDataSyncTestServer implements IRequestService {
215219
if (!this.session) {
216220
this.session = generateUuid();
217221
}
218-
const resourceKey = ALL_SYNC_RESOURCES.find(key => key === resource);
222+
const resourceKey = ALL_SERVER_RESOURCES.find(key => key === resource);
219223
if (resourceKey) {
220224
const data = this.data.get(resourceKey);
221225
if (headers['If-Match'] !== undefined && headers['If-Match'] !== (data ? data.ref : '0')) {

src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ suite('UserDataSyncService', () => {
3131
assert.deepEqual(target.requests, [
3232
// Manifest
3333
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
34+
// Machines
35+
{ type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} },
3436
// Settings
3537
{ type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} },
3638
{ type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } },
@@ -47,6 +49,8 @@ suite('UserDataSyncService', () => {
4749
{ type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} },
4850
// Manifest
4951
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
52+
// Machines
53+
{ type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } },
5054
]);
5155

5256
});
@@ -64,6 +68,8 @@ suite('UserDataSyncService', () => {
6468
assert.deepEqual(target.requests, [
6569
// Manifest
6670
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
71+
// Machines
72+
{ type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} },
6773
// Settings
6874
{ type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} },
6975
// Keybindings
@@ -76,6 +82,8 @@ suite('UserDataSyncService', () => {
7682
{ type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} },
7783
// Manifest
7884
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
85+
// Machines
86+
{ type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } },
7987
]);
8088

8189
});
@@ -179,11 +187,13 @@ suite('UserDataSyncService', () => {
179187
{ type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} },
180188
/* sync */
181189
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
190+
{ type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} },
182191
{ type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} },
183192
{ type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} },
184193
{ type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} },
185194
{ type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} },
186195
{ type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} },
196+
{ type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '1' } },
187197
]);
188198

189199
});
@@ -219,6 +229,7 @@ suite('UserDataSyncService', () => {
219229

220230
/* first time sync */
221231
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
232+
{ type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} },
222233
{ type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} },
223234
{ type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '1' } },
224235
{ type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} },
@@ -227,6 +238,7 @@ suite('UserDataSyncService', () => {
227238
{ type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '1' } },
228239
{ type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} },
229240
{ type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} },
241+
{ type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '1' } },
230242
]);
231243

232244
});
@@ -366,6 +378,8 @@ suite('UserDataSyncService', () => {
366378
assert.deepEqual(target.requests, [
367379
// Manifest
368380
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
381+
// Machines
382+
{ type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } },
369383
// Settings
370384
{ type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} },
371385
{ type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } },
@@ -382,6 +396,8 @@ suite('UserDataSyncService', () => {
382396
{ type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} },
383397
// Manifest
384398
{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} },
399+
// Machines
400+
{ type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } },
385401
]);
386402

387403
});

0 commit comments

Comments
 (0)