@@ -3,8 +3,7 @@ use std::error::Error;
3
3
use std:: io:: Cursor ;
4
4
5
5
use conduit:: { Handler , Request , Response } ;
6
- use futures:: { Future , Stream } ;
7
- use hyper;
6
+ use futures:: { future, Future , Stream } ;
8
7
9
8
struct OkResult ;
10
9
impl Handler for OkResult {
@@ -73,25 +72,28 @@ fn build_headers(msg: &str) -> HashMap<String, Vec<String>> {
73
72
headers
74
73
}
75
74
76
- fn build_threadpool ( ) -> tokio:: runtime:: Runtime {
77
- tokio:: runtime:: Builder :: new ( )
75
+ fn block_on < F > ( f : F )
76
+ where
77
+ F : FnOnce ( ) -> ( ) + Send + ' static ,
78
+ {
79
+ let mut rt = tokio:: runtime:: Builder :: new ( )
78
80
. core_threads ( 1 )
79
81
. blocking_threads ( 1 )
80
82
. build ( )
81
- . unwrap ( )
83
+ . unwrap ( ) ;
84
+ rt. spawn ( futures:: lazy ( move || {
85
+ f ( ) ;
86
+ future:: ok ( ( ) )
87
+ } ) ) ;
88
+ rt. shutdown_on_idle ( ) . wait ( ) . unwrap ( ) ;
82
89
}
83
90
84
91
fn simulate_request < H : Handler > ( handler : H ) -> hyper:: Response < hyper:: Body > {
85
92
use hyper:: service:: { NewService , Service } ;
86
93
87
- let mut pool = build_threadpool ( ) ;
88
-
89
- pool. block_on ( futures:: lazy ( || {
90
- let new_service = super :: Service :: new ( handler) ;
91
- let mut service = new_service. new_service ( ) . wait ( ) . unwrap ( ) ;
92
- service. call ( hyper:: Request :: default ( ) ) . wait ( )
93
- } ) )
94
- . unwrap ( )
94
+ let new_service = super :: Service :: new ( handler) ;
95
+ let mut service = new_service. new_service ( ) . wait ( ) . unwrap ( ) ;
96
+ service. call ( hyper:: Request :: default ( ) ) . wait ( ) . unwrap ( )
95
97
}
96
98
97
99
fn into_chunk ( resp : hyper:: Response < hyper:: Body > ) -> hyper:: Chunk {
@@ -107,37 +109,43 @@ fn assert_generic_err(resp: hyper::Response<hyper::Body>) {
107
109
108
110
#[ test]
109
111
fn valid_ok_response ( ) {
110
- let resp = simulate_request ( OkResult ) ;
111
- assert_eq ! ( resp. status( ) , 200 ) ;
112
- assert_eq ! ( resp. headers( ) . len( ) , 1 ) ;
113
- let full_body = into_chunk ( resp) ;
114
- assert_eq ! ( & * full_body, b"Hello, world!" ) ;
112
+ block_on ( || {
113
+ let resp = simulate_request ( OkResult ) ;
114
+ assert_eq ! ( resp. status( ) , 200 ) ;
115
+ assert_eq ! ( resp. headers( ) . len( ) , 1 ) ;
116
+ let full_body = into_chunk ( resp) ;
117
+ assert_eq ! ( & * full_body, b"Hello, world!" ) ;
118
+ } )
115
119
}
116
120
117
121
#[ test]
118
122
fn invalid_ok_responses ( ) {
119
- assert_generic_err ( simulate_request ( InvalidHeader ) ) ;
120
- assert_generic_err ( simulate_request ( InvalidStatus ) ) ;
123
+ block_on ( || {
124
+ assert_generic_err ( simulate_request ( InvalidHeader ) ) ;
125
+ assert_generic_err ( simulate_request ( InvalidStatus ) ) ;
126
+ } )
121
127
}
122
128
123
129
#[ test]
124
130
fn err_responses ( ) {
125
- assert_generic_err ( simulate_request ( ErrorResult ) ) ;
131
+ block_on ( || {
132
+ assert_generic_err ( simulate_request ( ErrorResult ) ) ;
133
+ } )
126
134
}
127
135
128
136
#[ ignore] // catch_unwind not yet implemented
129
137
#[ test]
130
138
fn recover_from_panic ( ) {
131
- assert_generic_err ( simulate_request ( Panic ) ) ;
139
+ block_on ( || {
140
+ assert_generic_err ( simulate_request ( Panic ) ) ;
141
+ } )
132
142
}
133
143
134
144
#[ test]
135
145
fn normalize_path ( ) {
136
146
use hyper:: service:: { NewService , Service } ;
137
147
138
- let mut pool = build_threadpool ( ) ;
139
-
140
- pool. block_on ( futures:: lazy ( || {
148
+ block_on ( || {
141
149
let new_service = super :: Service :: new ( AssertPathNormalized ) ;
142
150
let mut service = new_service. new_service ( ) . wait ( ) . unwrap ( ) ;
143
151
let req = hyper:: Request :: put ( "//removed/.././.././normalized" )
@@ -153,7 +161,5 @@ fn normalize_path() {
153
161
let resp = service. call ( req) . wait ( ) . unwrap ( ) ;
154
162
assert_eq ! ( resp. status( ) , 200 ) ;
155
163
assert_eq ! ( resp. headers( ) . len( ) , 1 ) ;
156
- Ok :: < _ , ( ) > ( ( ) )
157
- } ) )
158
- . unwrap ( )
164
+ } )
159
165
}
0 commit comments