1
1
defmodule NextLs.RuntimeTest do
2
2
use ExUnit.Case , async: true
3
3
4
- import ExUnit.CaptureLog
5
4
import NextLS.Support.Utils
6
5
7
6
alias NextLS.Runtime
@@ -23,11 +22,13 @@ defmodule NextLs.RuntimeTest do
23
22
end
24
23
""" )
25
24
25
+ me = self ( )
26
+
26
27
{ :ok , logger } =
27
28
Task . start_link ( fn ->
28
29
recv = fn recv ->
29
30
receive do
30
- msg -> Logger . debug ( inspect ( msg ) )
31
+ { :"$gen_cast" , msg } -> send ( me , msg )
31
32
end
32
33
33
34
recv . ( recv )
@@ -36,68 +37,136 @@ defmodule NextLs.RuntimeTest do
36
37
recv . ( recv )
37
38
end )
38
39
39
- me = self ( )
40
+ on_init = fn msg -> send ( me , msg ) end
40
41
41
- on_init = fn _ -> send ( me , :ready ) end
42
+ on_exit ( & flush_messages / 0 )
42
43
43
44
[ logger: logger , cwd: Path . absname ( tmp_dir ) , on_init: on_init ]
44
45
end
45
46
46
- test "returns the response in an ok tuple" , % { logger: logger , cwd: cwd , on_init: on_init } do
47
- start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
48
- tvisor = start_supervised! ( Task.Supervisor )
47
+ describe "errors" do
48
+ test "emitted on crash during initialization" ,
49
+ % { tmp_dir: tmp_dir , logger: logger , cwd: cwd , on_init: on_init } do
50
+ # obvious syntax error
51
+ bad_mix_exs = String . replace ( mix_exs ( ) , "defmodule" , "" )
52
+ File . write! ( Path . join ( tmp_dir , "mix.exs" ) , bad_mix_exs )
53
+
54
+ start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
55
+
56
+ tvisor = start_supervised! ( Task.Supervisor )
49
57
50
- pid =
51
58
start_supervised! (
52
59
{ Runtime ,
60
+ task_supervisor: tvisor ,
53
61
name: "my_proj" ,
54
62
on_initialized: on_init ,
55
- task_supervisor: tvisor ,
56
63
working_dir: cwd ,
57
64
uri: "file://#{ cwd } " ,
58
65
parent: self ( ) ,
59
66
logger: logger ,
60
67
db: :some_db ,
61
- registry: RuntimeTest.Registry }
68
+ registry: RuntimeTest.Registry } ,
69
+ restart: :temporary
62
70
)
63
71
64
- Process . link ( pid )
72
+ assert_receive { :error , :portdown }
73
+
74
+ assert_receive { :log , :log , log_msg }
75
+ assert log_msg =~ "syntax error"
76
+
77
+ assert_receive { :log , :error , error_msg }
78
+ assert error_msg =~ "{:shutdown, :portdown}"
79
+ end
80
+
81
+ test "emitted on crash after initialization" ,
82
+ % { logger: logger , cwd: cwd , on_init: on_init } do
83
+ start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
84
+
85
+ tvisor = start_supervised! ( Task.Supervisor )
86
+
87
+ pid =
88
+ start_supervised! (
89
+ { Runtime ,
90
+ task_supervisor: tvisor ,
91
+ name: "my_proj" ,
92
+ on_initialized: on_init ,
93
+ working_dir: cwd ,
94
+ uri: "file://#{ cwd } " ,
95
+ parent: self ( ) ,
96
+ logger: logger ,
97
+ db: :some_db ,
98
+ registry: RuntimeTest.Registry } ,
99
+ restart: :temporary
100
+ )
101
+
102
+ assert_receive :ready
65
103
66
- assert wait_for_ready ( )
104
+ assert { :ok , { :badrpc , :nodedown } } = Runtime . call ( pid , { System , :halt , [ 1 ] } )
67
105
68
- assert { :ok , "\" hi\" " } = Runtime . call ( pid , { Kernel , :inspect , [ "hi" ] } )
106
+ assert_receive { :log , :error , error_msg }
107
+ assert error_msg =~ "{:shutdown, :nodedown}"
108
+ end
69
109
end
70
110
71
- test "call returns an error when the runtime is node ready" , % { logger: logger , cwd: cwd , on_init: on_init } do
72
- start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
111
+ describe "call/2" do
112
+ test "responds with an ok tuple if the runtime has initialized" ,
113
+ % { logger: logger , cwd: cwd , on_init: on_init } do
114
+ start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
115
+ tvisor = start_supervised! ( Task.Supervisor )
73
116
74
- tvisor = start_supervised! ( Task.Supervisor )
117
+ pid =
118
+ start_supervised! (
119
+ { Runtime ,
120
+ name: "my_proj" ,
121
+ on_initialized: on_init ,
122
+ task_supervisor: tvisor ,
123
+ working_dir: cwd ,
124
+ uri: "file://#{ cwd } " ,
125
+ parent: self ( ) ,
126
+ logger: logger ,
127
+ db: :some_db ,
128
+ registry: RuntimeTest.Registry }
129
+ )
75
130
76
- pid =
77
- start_supervised! (
78
- { Runtime ,
79
- task_supervisor: tvisor ,
80
- name: "my_proj" ,
81
- on_initialized: on_init ,
82
- working_dir: cwd ,
83
- uri: "file://#{ cwd } " ,
84
- parent: self ( ) ,
85
- logger: logger ,
86
- db: :some_db ,
87
- registry: RuntimeTest.Registry }
88
- )
131
+ Process . link ( pid )
132
+
133
+ assert_receive :ready
89
134
90
- Process . link ( pid )
135
+ assert { :ok , "\" hi\" " } = Runtime . call ( pid , { Kernel , :inspect , [ "hi" ] } )
136
+ end
137
+
138
+ test "responds with an error when the runtime hasn't initialized" , % { logger: logger , cwd: cwd , on_init: on_init } do
139
+ start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
140
+
141
+ tvisor = start_supervised! ( Task.Supervisor )
142
+
143
+ pid =
144
+ start_supervised! (
145
+ { Runtime ,
146
+ task_supervisor: tvisor ,
147
+ name: "my_proj" ,
148
+ on_initialized: on_init ,
149
+ working_dir: cwd ,
150
+ uri: "file://#{ cwd } " ,
151
+ parent: self ( ) ,
152
+ logger: logger ,
153
+ db: :some_db ,
154
+ registry: RuntimeTest.Registry }
155
+ )
91
156
92
- assert { :error , :not_ready } = Runtime . call ( pid , { IO , :puts , [ "hi" ] } )
157
+ Process . link ( pid )
158
+
159
+ assert { :error , :not_ready } = Runtime . call ( pid , { IO , :puts , [ "hi" ] } )
160
+ end
93
161
end
94
162
95
- test "compiles the code and returns diagnostics" , % { logger: logger , cwd: cwd , on_init: on_init } do
96
- start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
163
+ describe "compile/1" do
164
+ test "compiles the project and returns diagnostics" ,
165
+ % { logger: logger , cwd: cwd , on_init: on_init } do
166
+ start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
97
167
98
- tvisor = start_supervised! ( Task.Supervisor )
168
+ tvisor = start_supervised! ( Task.Supervisor )
99
169
100
- capture_log ( fn ->
101
170
pid =
102
171
start_link_supervised! (
103
172
{ Runtime ,
@@ -112,7 +181,7 @@ defmodule NextLs.RuntimeTest do
112
181
registry: RuntimeTest.Registry }
113
182
)
114
183
115
- assert wait_for_ready ( )
184
+ assert_receive :ready
116
185
117
186
file = Path . join ( cwd , "lib/bar.ex" )
118
187
@@ -143,15 +212,38 @@ defmodule NextLs.RuntimeTest do
143
212
""" )
144
213
145
214
assert [ ] == Runtime . compile ( pid )
146
- end ) =~ "Connected to node"
215
+ end
216
+
217
+ test "responds with an error when the runtime isn't ready" , % { logger: logger , cwd: cwd , on_init: on_init } do
218
+ start_supervised! ( { Registry , keys: :duplicate , name: RuntimeTest.Registry } )
219
+
220
+ tvisor = start_supervised! ( Task.Supervisor )
221
+
222
+ pid =
223
+ start_supervised! (
224
+ { Runtime ,
225
+ task_supervisor: tvisor ,
226
+ name: "my_proj" ,
227
+ on_initialized: on_init ,
228
+ working_dir: cwd ,
229
+ uri: "file://#{ cwd } " ,
230
+ parent: self ( ) ,
231
+ logger: logger ,
232
+ db: :some_db ,
233
+ registry: RuntimeTest.Registry }
234
+ )
235
+
236
+ Process . link ( pid )
237
+
238
+ assert { :error , :not_ready } = Runtime . compile ( pid )
239
+ end
147
240
end
148
241
149
- defp wait_for_ready do
242
+ defp flush_messages do
150
243
receive do
151
- :ready -> true
244
+ _ -> flush_messages ( )
152
245
after
153
- 30_000 ->
154
- false
246
+ 0 -> :ok
155
247
end
156
248
end
157
249
end
0 commit comments