1
1
// tslint:disable: no-console
2
2
import * as assert from 'assert' ;
3
+ import * as fs from 'fs' ;
3
4
import * as os from 'os' ;
4
5
import * as path from 'path' ;
5
6
import { TextEncoder } from 'util' ;
@@ -10,12 +11,12 @@ function getExtension() {
10
11
return vscode . extensions . getExtension ( 'haskell.haskell' ) ;
11
12
}
12
13
13
- async function delay ( ms : number ) {
14
- return new Promise ( ( resolve ) => setTimeout ( ( ) => resolve ( false ) , ms ) ) ;
14
+ async function delay ( seconds : number ) {
15
+ return new Promise ( ( resolve ) => setTimeout ( ( ) => resolve ( false ) , seconds * 1000 ) ) ;
15
16
}
16
17
17
18
async function withTimeout ( seconds : number , f : Promise < any > ) {
18
- return Promise . race ( [ f , delay ( seconds * 1000 ) ] ) ;
19
+ return Promise . race ( [ f , delay ( seconds ) ] ) ;
19
20
}
20
21
21
22
function getHaskellConfig ( ) {
@@ -31,18 +32,39 @@ function getWorkspaceFile(name: string) {
31
32
return wsroot . with ( { path : path . posix . join ( wsroot . path , name ) } ) ;
32
33
}
33
34
34
- async function deleteWorkspaceFiles ( ) {
35
- const dirContents = await vscode . workspace . fs . readDirectory ( getWorkspaceRoot ( ) . uri ) ;
36
- console . log ( `Deleting test ws contents: ${ dirContents } ` ) ;
35
+ async function deleteWorkspaceFiles ( pred ?: ( fileType : [ string , vscode . FileType ] ) => boolean ) {
36
+ await deleteFiles ( getWorkspaceRoot ( ) . uri , pred ) ;
37
+ }
38
+
39
+ function getExtensionLogContent ( ) : string | undefined {
40
+ const extLog = getWorkspaceFile ( 'hls.log' ) . fsPath ;
41
+ if ( fs . existsSync ( extLog ) ) {
42
+ const logContents = fs . readFileSync ( extLog ) ;
43
+ return logContents . toString ( ) ;
44
+ } else {
45
+ console . log ( `${ extLog } does not exist!` ) ;
46
+ return undefined ;
47
+ }
48
+ }
49
+
50
+ async function deleteFiles ( dir : vscode . Uri , pred ?: ( fileType : [ string , vscode . FileType ] ) => boolean ) {
51
+ const dirContents = await vscode . workspace . fs . readDirectory ( dir ) ;
52
+ console . log ( `Deleting ${ dir } contents: ${ dirContents } ` ) ;
37
53
dirContents . forEach ( async ( [ name , type ] ) => {
38
54
const uri : vscode . Uri = getWorkspaceFile ( name ) ;
39
- console . log ( `Deleting ${ uri } ` ) ;
40
- await vscode . workspace . fs . delete ( getWorkspaceFile ( name ) , { recursive : true } ) ;
55
+ if ( ! pred || pred ( [ name , type ] ) ) {
56
+ console . log ( `Deleting ${ uri } ` ) ;
57
+ await vscode . workspace . fs . delete ( getWorkspaceFile ( name ) , {
58
+ recursive : true ,
59
+ useTrash : false ,
60
+ } ) ;
61
+ }
41
62
} ) ;
42
63
}
43
64
44
65
suite ( 'Extension Test Suite' , ( ) => {
45
66
const disposables : vscode . Disposable [ ] = [ ] ;
67
+ const filesCreated : Map < string , Promise < vscode . Uri > > = new Map ( ) ;
46
68
47
69
async function existsWorkspaceFile ( pattern : string , pred ?: ( uri : vscode . Uri ) => boolean ) {
48
70
const relPath : vscode . RelativePattern = new vscode . RelativePattern ( getWorkspaceRoot ( ) , pattern ) ;
@@ -65,9 +87,19 @@ suite('Extension Test Suite', () => {
65
87
await getHaskellConfig ( ) . update ( 'logFile' , 'hls.log' ) ;
66
88
await getHaskellConfig ( ) . update ( 'trace.server' , 'messages' ) ;
67
89
await getHaskellConfig ( ) . update ( 'releasesDownloadStoragePath' , path . normalize ( getWorkspaceFile ( 'bin' ) . fsPath ) ) ;
68
- await getHaskellConfig ( ) . update ( 'serverEnvironment' , { XDG_CACHE_HOME : path . normalize ( getWorkspaceFile ( 'cache-test' ) . fsPath ) } ) ;
90
+ await getHaskellConfig ( ) . update ( 'serverEnvironment' , {
91
+ XDG_CACHE_HOME : path . normalize ( getWorkspaceFile ( 'cache-test' ) . fsPath ) ,
92
+ } ) ;
69
93
const contents = new TextEncoder ( ) . encode ( 'main = putStrLn "hi vscode tests"' ) ;
70
94
await vscode . workspace . fs . writeFile ( getWorkspaceFile ( 'Main.hs' ) , contents ) ;
95
+
96
+ const pred = ( uri : vscode . Uri ) => ! [ 'download' , 'gz' , 'zip' ] . includes ( path . extname ( uri . fsPath ) ) ;
97
+ const exeExt = os . platform . toString ( ) === 'win32' ? '.exe' : '' ;
98
+ // Setting up watchers before actual tests start, to ensure we will got the created event
99
+ filesCreated . set ( 'wrapper' , existsWorkspaceFile ( `bin/haskell-language-server-wrapper*${ exeExt } ` , pred ) ) ;
100
+ filesCreated . set ( 'server' , existsWorkspaceFile ( `bin/haskell-language-server-[1-9]*${ exeExt } ` , pred ) ) ;
101
+ filesCreated . set ( 'log' , existsWorkspaceFile ( 'hls.log' ) ) ;
102
+ filesCreated . set ( 'cache' , existsWorkspaceFile ( 'cache-test' ) ) ;
71
103
} ) ;
72
104
73
105
test ( 'Extension should be present' , ( ) => {
@@ -79,40 +111,53 @@ suite('Extension Test Suite', () => {
79
111
assert . ok ( true ) ;
80
112
} ) ;
81
113
114
+ test ( 'Extension should create the extension log file' , async ( ) => {
115
+ await vscode . workspace . openTextDocument ( getWorkspaceFile ( 'Main.hs' ) ) ;
116
+ assert . ok ( await withTimeout ( 30 , filesCreated . get ( 'log' ) ! ) , 'Extension log not created in 30 seconds' ) ;
117
+ } ) ;
118
+
82
119
test ( 'HLS executables should be downloaded' , async ( ) => {
83
120
await vscode . workspace . openTextDocument ( getWorkspaceFile ( 'Main.hs' ) ) ;
84
- const exeExt = os . platform . toString ( ) === 'win32' ? '.exe' : '' ;
85
121
console . log ( 'Testing wrapper' ) ;
86
- const pred = ( uri : vscode . Uri ) => ! [ 'download' , 'gz' , 'zip' ] . includes ( path . extname ( uri . fsPath ) ) ;
87
122
assert . ok (
88
- await withTimeout ( 30 , existsWorkspaceFile ( `bin/haskell-language-server- wrapper* ${ exeExt } ` , pred ) ) ,
123
+ await withTimeout ( 30 , filesCreated . get ( ' wrapper' ) ! ) ,
89
124
'The wrapper executable was not downloaded in 30 seconds'
90
125
) ;
91
126
console . log ( 'Testing server' ) ;
92
127
assert . ok (
93
- await withTimeout ( 60 , existsWorkspaceFile ( `bin/haskell-language- server-[1-9]* ${ exeExt } ` , pred ) ) ,
128
+ await withTimeout ( 60 , filesCreated . get ( ' server' ) ! ) ,
94
129
'The server executable was not downloaded in 60 seconds'
95
130
) ;
96
131
} ) ;
97
132
98
- test ( 'Server log should be created ' , async ( ) => {
133
+ test ( 'Extension log should have server output ' , async ( ) => {
99
134
await vscode . workspace . openTextDocument ( getWorkspaceFile ( 'Main.hs' ) ) ;
100
- assert . ok ( await withTimeout ( 30 , existsWorkspaceFile ( 'hls.log' ) ) , 'Server log not created in 30 seconds' ) ;
135
+ await delay ( 10 ) ;
136
+ const logContents = getExtensionLogContent ( ) ;
137
+ assert . ok ( logContents , 'Extension log file does not exist' ) ;
138
+ assert . match ( logContents , / I N F O h l s : \s + R e g i s t e r i n g i d e c o n f i g u r a t i o n / , 'Extension log file has no hls output' ) ;
101
139
} ) ;
102
140
103
141
test ( 'Server should inherit environment variables defined in the settings' , async ( ) => {
104
142
await vscode . workspace . openTextDocument ( getWorkspaceFile ( 'Main.hs' ) ) ;
105
143
assert . ok (
106
- // Folder will have already been created by this point, so it will not trigger watcher in existsWorkspaceFile()
107
- vscode . workspace . getWorkspaceFolder ( getWorkspaceFile ( 'cache-test' ) ) ,
144
+ await withTimeout ( 30 , filesCreated . get ( 'cache' ) ! ) ,
108
145
'Server did not inherit XDG_CACHE_DIR from environment variables set in the settings'
109
146
) ;
110
147
} ) ;
111
148
112
149
suiteTeardown ( async ( ) => {
150
+ console . log ( 'Disposing all resources' ) ;
113
151
disposables . forEach ( ( d ) => d . dispose ( ) ) ;
152
+ console . log ( 'Stopping the lsp server' ) ;
114
153
await vscode . commands . executeCommand ( CommandNames . StopServerCommandName ) ;
115
- delay ( 5 ) ; // to give time to shutdown server
116
- await deleteWorkspaceFiles ( ) ;
154
+ await delay ( 5 ) ;
155
+ console . log ( 'Contents of the extension log:' ) ;
156
+ const logContent = getExtensionLogContent ( ) ;
157
+ if ( logContent ) {
158
+ console . log ( logContent ) ;
159
+ }
160
+ console . log ( 'Deleting test workspace contents' ) ;
161
+ await deleteWorkspaceFiles ( ( [ name , type ] ) => ! name . includes ( '.log' ) ) ;
117
162
} ) ;
118
163
} ) ;
0 commit comments