@@ -21,6 +21,9 @@ import util = require('util');
21
21
import vscode = require( 'vscode' ) ;
22
22
import { isInPreviewMode } from '../../src/goLanguageServer' ;
23
23
import { allToolsInformation } from '../../src/goToolsInformation' ;
24
+ import { listOutdatedTools } from '../../src/goMain' ;
25
+ import * as goInstallTools from '../../src/goInstallTools' ;
26
+ import * as utilModule from '../../src/util' ;
24
27
25
28
interface installationTestCase {
26
29
name : string ;
@@ -238,27 +241,112 @@ function shouldRunSlowTests(): boolean {
238
241
239
242
suite ( 'getConfiguredTools' , ( ) => {
240
243
test ( 'do not require legacy tools when using language server' , async ( ) => {
241
- const configured = getConfiguredTools ( fakeGoVersion ( '1.15.6' ) , { useLanguageServer : true } , { } ) ;
244
+ const configured = getConfiguredTools (
245
+ fakeGoVersion ( 'go version go1.15.6 linux/amd64' ) ,
246
+ { useLanguageServer : true } ,
247
+ { }
248
+ ) ;
242
249
const got = configured . map ( ( tool ) => tool . name ) ?? [ ] ;
243
250
assert ( got . includes ( 'gopls' ) , `omitted 'gopls': ${ JSON . stringify ( got ) } ` ) ;
244
251
assert ( ! got . includes ( 'guru' ) && ! got . includes ( 'gocode' ) , `suggested legacy tools: ${ JSON . stringify ( got ) } ` ) ;
245
252
} ) ;
246
253
247
254
test ( 'do not require gopls when not using language server' , async ( ) => {
248
- const configured = getConfiguredTools ( fakeGoVersion ( '1.15.6' ) , { useLanguageServer : false } , { } ) ;
255
+ const configured = getConfiguredTools (
256
+ fakeGoVersion ( 'go version go1.15.6 linux/amd64' ) ,
257
+ { useLanguageServer : false } ,
258
+ { }
259
+ ) ;
249
260
const got = configured . map ( ( tool ) => tool . name ) ?? [ ] ;
250
261
assert ( ! got . includes ( 'gopls' ) , `suggested 'gopls': ${ JSON . stringify ( got ) } ` ) ;
251
262
assert ( got . includes ( 'guru' ) && got . includes ( 'gocode' ) , `omitted legacy tools: ${ JSON . stringify ( got ) } ` ) ;
252
263
} ) ;
253
264
254
265
test ( 'do not require gopls when the go version is old' , async ( ) => {
255
- const configured = getConfiguredTools ( fakeGoVersion ( '1.9' ) , { useLanguageServer : true } , { } ) ;
266
+ const configured = getConfiguredTools (
267
+ fakeGoVersion ( 'go version go1.9 linux/amd64' ) ,
268
+ { useLanguageServer : true } ,
269
+ { }
270
+ ) ;
256
271
const got = configured . map ( ( tool ) => tool . name ) ?? [ ] ;
257
272
assert ( ! got . includes ( 'gopls' ) , `suggested 'gopls' for old go: ${ JSON . stringify ( got ) } ` ) ;
258
273
assert ( got . includes ( 'guru' ) && got . includes ( 'gocode' ) , `omitted legacy tools: ${ JSON . stringify ( got ) } ` ) ;
259
274
} ) ;
260
275
} ) ;
261
276
262
- function fakeGoVersion ( version : string ) {
263
- return new GoVersion ( '/path/to/go' , `go version go ${ version } windows/amd64` ) ;
277
+ function fakeGoVersion ( versionStr : string ) {
278
+ return new GoVersion ( '/path/to/go' , versionStr ) ;
264
279
}
280
+
281
+ suite ( 'listOutdatedTools' , ( ) => {
282
+ let sandbox : sinon . SinonSandbox ;
283
+ setup ( ( ) => {
284
+ sandbox = sinon . createSandbox ( ) ;
285
+ } ) ;
286
+ teardown ( ( ) => sandbox . restore ( ) ) ;
287
+
288
+ async function runTest ( goVersion : string | undefined , tools : { [ key : string ] : string | undefined } ) {
289
+ const binPathStub = sandbox . stub ( utilModule , 'getBinPath' ) ;
290
+ const versionStub = sandbox . stub ( goInstallTools , 'inspectGoToolVersion' ) ;
291
+ for ( const tool in tools ) {
292
+ binPathStub . withArgs ( tool ) . returns ( `/bin/${ tool } ` ) ;
293
+ versionStub . withArgs ( `/bin/${ tool } ` ) . returns ( Promise . resolve ( { goVersion : tools [ tool ] } ) ) ;
294
+ }
295
+
296
+ const toolsToCheck = Object . keys ( tools ) . map ( ( tool ) => getToolAtVersion ( tool ) ) ;
297
+
298
+ const configuredGoVersion = goVersion ? fakeGoVersion ( goVersion ) : undefined ;
299
+ const toolsToUpdate = await listOutdatedTools ( configuredGoVersion , toolsToCheck ) ;
300
+ return toolsToUpdate . map ( ( tool ) => tool . name ) . filter ( ( tool ) => ! ! tool ) ;
301
+ }
302
+
303
+ test ( 'minor version difference requires updates' , async ( ) => {
304
+ const x = await runTest ( 'go version go1.18 linux/amd64' , {
305
+ gopls : 'go1.16' , // 1.16 < 1.18
306
+ dlv : 'go1.17' , // 1.17 < 1.18
307
+ staticcheck : 'go1.18' , // 1.18 == 1.18
308
+ gotests : 'go1.19' // 1.19 > 1.18
309
+ } ) ;
310
+ assert . deepStrictEqual ( x , [ 'gopls' , 'dlv' ] ) ;
311
+ } ) ;
312
+ test ( 'patch version difference does not require updates' , async ( ) => {
313
+ const x = await runTest ( 'go version go1.16.1 linux/amd64' , {
314
+ gopls : 'go1.16' , // 1.16 < 1.16.1
315
+ dlv : 'go1.16.1' , // 1.16.1 == 1.16.1
316
+ staticcheck : 'go1.16.2' , // 1.16.2 > 1.16.1
317
+ gotests : 'go1.16rc1' // 1.16rc1 != 1.16.1
318
+ } ) ;
319
+ assert . deepStrictEqual ( x , [ 'gotests' ] ) ;
320
+ } ) ;
321
+ test ( 'go is beta version' , async ( ) => {
322
+ const x = await runTest ( 'go version go1.18beta2 linux/amd64' , {
323
+ gopls : 'go1.17.1' , // 1.17.1 < 1.18beta2
324
+ dlv : 'go1.18beta1' , // 1.18beta1 != 1.18beta2
325
+ staticcheck : 'go1.18beta2' , // 1.18beta2 == 1.18beta2
326
+ gotests : 'go1.18' // 1.18 > 1.18beta2
327
+ } ) ;
328
+ assert . deepStrictEqual ( x , [ 'gopls' , 'dlv' ] ) ;
329
+ } ) ;
330
+ test ( 'go is dev version' , async ( ) => {
331
+ const x = await runTest ( 'go version devel go1.18-41f485b9a7 linux/amd64' , {
332
+ gopls : 'go1.17.1' ,
333
+ dlv : 'go1.18beta1' ,
334
+ staticcheck : 'go1.18' ,
335
+ gotests : 'go1.19'
336
+ } ) ;
337
+ assert . deepStrictEqual ( x , [ ] ) ;
338
+ } ) ;
339
+ test ( 'go is unknown version' , async ( ) => {
340
+ const x = await runTest ( '' , {
341
+ gopls : 'go1.17.1'
342
+ } ) ;
343
+ assert . deepStrictEqual ( x , [ ] ) ;
344
+ } ) ;
345
+ test ( 'tools are unknown versions' , async ( ) => {
346
+ const x = await runTest ( 'go version go1.17 linux/amd64' , {
347
+ gopls : undefined , // this can be because gopls was compiled with go1.18 or it's too old.
348
+ dlv : 'go1.16.1'
349
+ } ) ;
350
+ assert . deepStrictEqual ( x , [ 'dlv' ] ) ;
351
+ } ) ;
352
+ } ) ;
0 commit comments