Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/chat/test/browser/resolveRemoteAuthority.test.ts
13405 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
8
import { getEntryAddress, IRemoteAgentHostEntry, IRemoteAgentHostService, RemoteAgentHostEntryType } from '../../../../../platform/agentHost/common/remoteAgentHostService.js';
9
import { ISessionsProvidersService } from '../../../../services/sessions/browser/sessionsProvidersService.js';
10
import { resolveRemoteAuthority, sshAuthorityString } from '../../browser/openInVSCodeUtils.js';
11
import { decodeHex } from '../../../../../base/common/buffer.js';
12
13
suite('resolveRemoteAuthority', () => {
14
15
ensureNoDisposablesAreLeakedInTestSuite();
16
17
function makeProvidersService(remoteAddress?: string): ISessionsProvidersService {
18
return {
19
getProvider: (id: string) => remoteAddress ? { id, remoteAddress } : undefined,
20
} as unknown as ISessionsProvidersService; // no-as-any justification: lightweight test mock for a multi-method service interface
21
}
22
23
function makeRemoteAgentHostService(entries: IRemoteAgentHostEntry[] = []): IRemoteAgentHostService {
24
return {
25
getEntryByAddress: (address: string) => entries.find(e => getEntryAddress(e) === address),
26
} as unknown as IRemoteAgentHostService; // no-as-any justification: lightweight test mock for a multi-method service interface
27
}
28
29
test('returns undefined for a local provider', () => {
30
const result = resolveRemoteAuthority(
31
'local-provider',
32
makeProvidersService(undefined) as ISessionsProvidersService,
33
makeRemoteAgentHostService() as IRemoteAgentHostService,
34
);
35
assert.strictEqual(result, undefined);
36
});
37
38
test('returns undefined when provider has no remoteAddress', () => {
39
const noRemoteProviders = {
40
getProvider: (id: string) => ({ id /* no remoteAddress */ }),
41
} as unknown as ISessionsProvidersService; // no-as-any justification: lightweight test mock for a multi-method service interface
42
const result = resolveRemoteAuthority(
43
'agenthost-no-address',
44
noRemoteProviders,
45
makeRemoteAgentHostService() as IRemoteAgentHostService,
46
);
47
assert.strictEqual(result, undefined);
48
});
49
50
test('returns ssh-remote authority for SSH with sshConfigHost', () => {
51
const result = resolveRemoteAuthority(
52
'agenthost-myserver',
53
makeProvidersService('localhost:4321') as ISessionsProvidersService,
54
makeRemoteAgentHostService([{
55
name: 'My Server',
56
connection: {
57
type: RemoteAgentHostEntryType.SSH,
58
address: 'localhost:4321',
59
sshConfigHost: 'my-ssh-host',
60
hostName: 'myserver.example.com',
61
},
62
}]) as IRemoteAgentHostService,
63
);
64
assert.strictEqual(result, 'ssh-remote+my-ssh-host');
65
});
66
67
test('returns ssh-remote with simple hostName for SSH without sshConfigHost', () => {
68
const result = resolveRemoteAuthority(
69
'agenthost-myserver',
70
makeProvidersService('localhost:4321') as ISessionsProvidersService,
71
makeRemoteAgentHostService([{
72
name: 'My Server',
73
connection: {
74
type: RemoteAgentHostEntryType.SSH,
75
address: 'localhost:4321',
76
hostName: 'myserver',
77
},
78
}]) as IRemoteAgentHostService,
79
);
80
assert.strictEqual(result, 'ssh-remote+myserver');
81
});
82
83
test('returns ssh-remote with hex-encoded authority for SSH with user and port', () => {
84
const result = resolveRemoteAuthority(
85
'agenthost-myserver',
86
makeProvidersService('localhost:4321') as ISessionsProvidersService,
87
makeRemoteAgentHostService([{
88
name: 'My Server',
89
connection: {
90
type: RemoteAgentHostEntryType.SSH,
91
address: 'localhost:4321',
92
hostName: 'myserver.example.com',
93
user: 'admin',
94
port: 2222,
95
},
96
}]) as IRemoteAgentHostService,
97
);
98
assert.ok(result?.startsWith('ssh-remote+'));
99
// The authority should be hex-encoded JSON
100
const authority = result!.slice('ssh-remote+'.length);
101
const decoded = decodeHex(authority).toString();
102
assert.deepStrictEqual(JSON.parse(decoded), {
103
hostName: 'myserver.example.com',
104
user: 'admin',
105
port: 2222,
106
});
107
});
108
109
test('returns tunnel authority using label', () => {
110
const result = resolveRemoteAuthority(
111
'agenthost-tunnel',
112
makeProvidersService('tunnel:myTunnelId') as ISessionsProvidersService,
113
makeRemoteAgentHostService([{
114
name: 'My Tunnel',
115
connection: {
116
type: RemoteAgentHostEntryType.Tunnel,
117
tunnelId: 'myTunnelId',
118
clusterId: 'usw2',
119
label: 'my-machine',
120
},
121
}]) as IRemoteAgentHostService,
122
);
123
assert.strictEqual(result, 'tunnel+my-machine');
124
});
125
126
test('returns tunnel authority falling back to tunnelId when no label', () => {
127
const result = resolveRemoteAuthority(
128
'agenthost-tunnel',
129
makeProvidersService('tunnel:myTunnelId') as ISessionsProvidersService,
130
makeRemoteAgentHostService([{
131
name: 'My Tunnel',
132
connection: {
133
type: RemoteAgentHostEntryType.Tunnel,
134
tunnelId: 'myTunnelId',
135
clusterId: 'usw2',
136
},
137
}]) as IRemoteAgentHostService,
138
);
139
assert.strictEqual(result, 'tunnel+myTunnelId.usw2');
140
});
141
142
test('returns undefined for WebSocket connections', () => {
143
const result = resolveRemoteAuthority(
144
'agenthost-ws',
145
makeProvidersService('myhost:4321') as ISessionsProvidersService,
146
makeRemoteAgentHostService([{
147
name: 'WS Host',
148
connection: {
149
type: RemoteAgentHostEntryType.WebSocket,
150
address: 'myhost:4321',
151
},
152
}]) as IRemoteAgentHostService,
153
);
154
assert.strictEqual(result, undefined);
155
});
156
157
test('returns undefined when no matching entry found', () => {
158
const result = resolveRemoteAuthority(
159
'agenthost-missing',
160
makeProvidersService('unknown-address:9999') as ISessionsProvidersService,
161
makeRemoteAgentHostService([{
162
name: 'Other',
163
connection: {
164
type: RemoteAgentHostEntryType.WebSocket,
165
address: 'different-address:1234',
166
},
167
}]) as IRemoteAgentHostService,
168
);
169
assert.strictEqual(result, undefined);
170
});
171
});
172
173
suite('sshAuthorityString', () => {
174
175
ensureNoDisposablesAreLeakedInTestSuite();
176
177
test('hex-encodes when user is present', () => {
178
const result = sshAuthorityString({
179
type: RemoteAgentHostEntryType.SSH,
180
address: 'localhost:4321',
181
hostName: 'myserver',
182
user: 'admin',
183
});
184
const decoded = decodeHex(result).toString();
185
assert.deepStrictEqual(JSON.parse(decoded), { hostName: 'myserver', user: 'admin' });
186
});
187
188
test('hex-encodes when port is present', () => {
189
const result = sshAuthorityString({
190
type: RemoteAgentHostEntryType.SSH,
191
address: 'localhost:4321',
192
hostName: 'myserver',
193
port: 2222,
194
});
195
const decoded = decodeHex(result).toString();
196
assert.deepStrictEqual(JSON.parse(decoded), { hostName: 'myserver', port: 2222 });
197
});
198
199
test('hex-encodes when hostName has uppercase letters', () => {
200
const result = sshAuthorityString({
201
type: RemoteAgentHostEntryType.SSH,
202
address: 'localhost:4321',
203
hostName: 'MyServer',
204
});
205
const decoded = decodeHex(result).toString();
206
assert.deepStrictEqual(JSON.parse(decoded), { hostName: 'MyServer' });
207
});
208
209
test('hex-encodes with all fields', () => {
210
const result = sshAuthorityString({
211
type: RemoteAgentHostEntryType.SSH,
212
address: 'localhost:4321',
213
hostName: 'MyServer.example.com',
214
user: 'root',
215
port: 22,
216
});
217
const decoded = decodeHex(result).toString();
218
assert.deepStrictEqual(JSON.parse(decoded), {
219
hostName: 'MyServer.example.com',
220
user: 'root',
221
port: 22,
222
});
223
});
224
225
test('uses hostName directly when address differs', () => {
226
const result = sshAuthorityString({
227
type: RemoteAgentHostEntryType.SSH,
228
address: 'localhost:4321',
229
hostName: 'actualhost',
230
});
231
assert.strictEqual(result, 'actualhost');
232
});
233
});
234
235