This source file includes following definitions.
- on_close
- timer_close_cb
- timer_cb
- on_connect_with_close
- on_connect_without_close
- connection_fail
- TEST_IMPL
- TEST_IMPL
#include "uv.h"
#include "task.h"
#include <stdlib.h>
#include <stdio.h>
static uv_tcp_t tcp;
static uv_connect_t req;
static int connect_cb_calls;
static int close_cb_calls;
static uv_timer_t timer;
static int timer_close_cb_calls;
static int timer_cb_calls;
static void on_close(uv_handle_t* handle) {
close_cb_calls++;
}
static void timer_close_cb(uv_handle_t* handle) {
timer_close_cb_calls++;
}
static void timer_cb(uv_timer_t* handle, int status) {
ASSERT(status == 0);
timer_cb_calls++;
ASSERT(close_cb_calls == 0);
ASSERT(connect_cb_calls == 1);
uv_close((uv_handle_t*)&tcp, on_close);
uv_close((uv_handle_t*)handle, timer_close_cb);
}
static void on_connect_with_close(uv_connect_t *req, int status) {
ASSERT((uv_stream_t*) &tcp == req->handle);
ASSERT(status == UV_ECONNREFUSED);
connect_cb_calls++;
ASSERT(close_cb_calls == 0);
uv_close((uv_handle_t*)req->handle, on_close);
}
static void on_connect_without_close(uv_connect_t *req, int status) {
ASSERT(status == UV_ECONNREFUSED);
connect_cb_calls++;
uv_timer_start(&timer, timer_cb, 100, 0);
ASSERT(close_cb_calls == 0);
}
static void connection_fail(uv_connect_cb connect_cb) {
struct sockaddr_in client_addr, server_addr;
int r;
client_addr = uv_ip4_addr("0.0.0.0", 0);
server_addr = uv_ip4_addr("127.0.0.1", TEST_PORT);
r = uv_tcp_init(uv_default_loop(), &tcp);
ASSERT(!r);
uv_tcp_bind(&tcp, client_addr);
r = uv_tcp_connect(&req, &tcp, server_addr, connect_cb);
ASSERT(!r);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
ASSERT(connect_cb_calls == 1);
ASSERT(close_cb_calls == 1);
}
TEST_IMPL(connection_fail) {
connection_fail(on_connect_with_close);
ASSERT(timer_close_cb_calls == 0);
ASSERT(timer_cb_calls == 0);
MAKE_VALGRIND_HAPPY();
return 0;
}
TEST_IMPL(connection_fail_doesnt_auto_close) {
int r;
r = uv_timer_init(uv_default_loop(), &timer);
ASSERT(r == 0);
connection_fail(on_connect_without_close);
ASSERT(timer_close_cb_calls == 1);
ASSERT(timer_cb_calls == 1);
MAKE_VALGRIND_HAPPY();
return 0;
}