@@ -133,12 +133,51 @@ regress_pick_a_port(void *arg)
133
133
evconnlistener_free (listener2 );
134
134
}
135
135
136
+ static void
137
+ errorcb (struct evconnlistener * lis , void * data_ )
138
+ {
139
+ int * data = data_ ;
140
+ * data = 1000 ;
141
+ evconnlistener_disable (lis );
142
+ }
143
+
144
+ static void
145
+ regress_listener_error (void * arg )
146
+ {
147
+ struct basic_test_data * data = arg ;
148
+ struct event_base * base = data -> base ;
149
+ struct evconnlistener * listener = NULL ;
150
+ int count = 1 ;
151
+
152
+ /* send, so that pair[0] will look 'readable'*/
153
+ send (data -> pair [1 ], "hello" , 5 , 0 );
154
+
155
+ /* Start a listener with a bogus socket. */
156
+ listener = evconnlistener_new (base , acceptcb , & count ,
157
+ LEV_OPT_CLOSE_ON_FREE |LEV_OPT_REUSEABLE , 0 ,
158
+ data -> pair [0 ]);
159
+ tt_assert (listener );
160
+
161
+ evconnlistener_set_error_cb (listener , errorcb );
162
+
163
+ tt_assert (listener );
164
+
165
+ event_base_dispatch (base );
166
+ tt_int_op (count ,= = ,1000 ); /* set by error cb */
167
+
168
+ end :
169
+ evconnlistener_free (listener );
170
+ }
136
171
137
172
struct testcase_t listener_testcases [] = {
138
173
139
174
{ "randport" , regress_pick_a_port , TT_FORK |TT_NEED_BASE ,
140
175
& basic_setup , NULL },
141
176
177
+ { "error" , regress_listener_error ,
178
+ TT_FORK |TT_NEED_BASE |TT_NEED_SOCKETPAIR ,
179
+ & basic_setup , NULL },
180
+
142
181
END_OF_TESTCASES ,
143
182
};
144
183
@@ -147,5 +186,9 @@ struct testcase_t listener_iocp_testcases[] = {
147
186
TT_FORK |TT_NEED_BASE |TT_ENABLE_IOCP ,
148
187
& basic_setup , NULL },
149
188
189
+ { "error" , regress_listener_error ,
190
+ TT_FORK |TT_NEED_BASE |TT_NEED_SOCKETPAIR |TT_ENABLE_IOCP ,
191
+ & basic_setup , NULL },
192
+
150
193
END_OF_TESTCASES ,
151
194
};
0 commit comments