@@ -5,6 +5,7 @@ import time
55import veb
66
77const graceful_shutdown_host = '127.0.0.1'
8+ const graceful_shutdown_wait_timeout = 10 * time.second
89
910struct GracefulShutdownContext {
1011 veb.Context
@@ -31,19 +32,6 @@ pub fn (mut app GracefulShutdownApp) slow(mut ctx GracefulShutdownContext) veb.R
3132 return ctx.text ('slow done' )
3233}
3334
34- pub fn (mut app GracefulShutdownApp) shutdown (mut ctx GracefulShutdownContext) veb.Result {
35- spawn app.shutdown_now ()
36- return ctx.text ('shutting down' )
37- }
38-
39- fn (app &GracefulShutdownApp) shutdown_now () {
40- mut server := app.server
41- if server == unsafe { nil } {
42- panic ('veb server was not initialized' )
43- }
44- server.shutdown (timeout: 5 * time.second) or { panic (err) }
45- }
46-
4735fn run_graceful_shutdown_app (mut app GracefulShutdownApp, port int ) {
4836 veb.run_at[GracefulShutdownApp, GracefulShutdownContext](mut app,
4937 host: graceful_shutdown_host
@@ -58,6 +46,51 @@ fn send_slow_request(port int, responses chan http.Response) {
5846 responses < - response
5947}
6048
49+ fn shutdown_graceful_server (server & veb.Server, done chan string ) {
50+ server.shutdown (timeout: 5 * time.second) or {
51+ done < - err.msg ()
52+ return
53+ }
54+ done < - ''
55+ }
56+
57+ fn wait_for_slow_request (started chan bool ) ! {
58+ select {
59+ _ := < - started {
60+ return
61+ }
62+ graceful_shutdown_wait_timeout {
63+ return error ('slow request did not start' )
64+ }
65+ }
66+ }
67+
68+ fn wait_for_slow_response (responses chan http.Response) ! http.Response {
69+ select {
70+ response := < - responses {
71+ return response
72+ }
73+ graceful_shutdown_wait_timeout {
74+ return error ('slow request did not finish' )
75+ }
76+ }
77+ return error ('slow request did not finish' )
78+ }
79+
80+ fn wait_for_shutdown (done chan string ) ! {
81+ select {
82+ shutdown_error := < - done {
83+ if shutdown_error != '' {
84+ return error (shutdown_error)
85+ }
86+ return
87+ }
88+ graceful_shutdown_wait_timeout {
89+ return error ('server shutdown did not finish' )
90+ }
91+ }
92+ }
93+
6194fn wait_for_server (port int ) ! {
6295 url := 'http://${graceful_shutdown_host }:${port }/'
6396 for _ in 0 .. 100 {
@@ -88,25 +121,30 @@ fn test_veb_graceful_shutdown_waits_for_in_flight_requests() {
88121
89122 slow_responses := chan http.Response{cap: 1 }
90123 spawn send_slow_request (int (port), slow_responses)
91- _ := < - app.slow_started or {
92- assert false , 'slow request did not start'
124+ wait_for_slow_request ( app.slow_started) or {
125+ assert false , err. msg ()
93126 return
94127 }
95128
96- shutdown_response := http.get ('http://${graceful_shutdown_host }:${port }/shutdown' ) or {
97- assert false , err.msg ()
129+ mut server := app.server
130+ if server == unsafe { nil } {
131+ assert false , 'veb server was not initialized'
98132 return
99133 }
100- assert shutdown_response. status () == .ok
101- assert shutdown_response. body == 'shutting down'
134+ shutdown_done := chan string {cap: 1 }
135+ spawn shutdown_graceful_server (server, shutdown_done)
102136
103- slow_response := < - slow_responses or {
137+ slow_response := wait_for_slow_response ( slow_responses) or {
104138 assert false , err.msg ()
105139 return
106140 }
107141 assert slow_response.status () == .ok
108142 assert slow_response.body == 'slow done'
109143
144+ wait_for_shutdown (shutdown_done) or {
145+ assert false , err.msg ()
146+ return
147+ }
110148 server_thread.wait ()
111149
112150 http.get ('http://${graceful_shutdown_host }:${port }/' ) or {
0 commit comments