#include "helper.h"
#include "knet.h"
bool Test_Channel_Ref_State_Acceptor_Close = false;
CASE(Test_Channel_Ref_State) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect) {
EXPECT_TRUE(knet_channel_ref_check_state(channel, channel_state_active));
EXPECT_FALSE(knet_channel_ref_check_balance(channel));
knet_channel_ref_close(channel);
} else if (e & channel_cb_event_close) {
EXPECT_TRUE(knet_channel_ref_check_state(channel, channel_state_close));
}
}
static void acceptor_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_accept) {
knet_channel_ref_set_cb(channel, acceptor_cb);
} else if (e & channel_cb_event_close) {
Test_Channel_Ref_State_Acceptor_Close = true;
knet_loop_exit(knet_channel_ref_get_loop(channel));
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
kchannel_ref_t* acceptor = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_accept(acceptor, 0, 8000, 1);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_channel_ref_set_cb(acceptor, &holder::acceptor_cb);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
knet_loop_run(loop);
EXPECT_TRUE(Test_Channel_Ref_State_Acceptor_Close);
knet_loop_destroy(loop);
}
CASE(Test_Channel_Ref_Close_Socket_Fd_Outside) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect) {
#ifdef WIN32
closesocket(knet_channel_ref_get_socket_fd(channel));
#else
close(knet_channel_ref_get_socket_fd(channel));
#endif kstream_t* s = knet_channel_ref_get_stream(channel);
EXPECT_FALSE(error_ok == knet_stream_push(s, "123", 4));
} else if (e & channel_cb_event_close) {
knet_loop_exit(knet_channel_ref_get_loop(channel));
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
kchannel_ref_t* acceptor = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_accept(acceptor, 0, 8000, 1);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
EXPECT_TRUE(knet_channel_ref_check_state(connector, channel_state_connect));
EXPECT_TRUE(knet_channel_ref_check_state(acceptor, channel_state_accept));
knet_loop_run(loop);
knet_loop_destroy(loop);
}
CASE(Test_Channel_Ref_Connect_Accept_Twice) {
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
kchannel_ref_t* acceptor = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
EXPECT_FALSE(error_ok == knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1));
knet_channel_ref_accept(acceptor, 0, 8000, 1);
EXPECT_FALSE(error_ok == knet_channel_ref_accept(acceptor, 0, 8000, 1));
knet_loop_destroy(loop);
}
CASE(Test_Channel_Ref_Uuid) {
kloop_t* loop = knet_loop_create();
kchannel_ref_t* channel = knet_loop_create_channel(loop, 1, 1024);
EXPECT_TRUE(knet_channel_ref_get_uuid(channel));
knet_loop_destroy(loop);
}
CASE(Test_Channel_Connect_Timeout) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect_timeout) {
knet_loop_exit(knet_channel_ref_get_loop(channel));
} else if (e & channel_cb_event_close) {
} else {
CASE_FAIL();
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_loop_run(loop);
knet_loop_destroy(loop);
}
bool Test_Channel_Connect_Timeout2_Accept = 0;
CASE(Test_Channel_Connect_Timeout_Reconnect) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect_timeout) {
if (!Test_Channel_Connect_Timeout2_Accept) {
kchannel_ref_t* acceptor = knet_loop_create_channel(knet_channel_ref_get_loop(channel), 1, 100);
knet_channel_ref_accept(acceptor, 0, 8000, 10);
Test_Channel_Connect_Timeout2_Accept = true;
}
knet_channel_ref_reconnect(channel, 2);
} else if (e & channel_cb_event_connect) {
knet_loop_exit(knet_channel_ref_get_loop(channel));
} else if (e & channel_cb_event_close) {
} else {
CASE_FAIL();
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_loop_run(loop);
knet_loop_destroy(loop);
}
CASE(Test_Channel_Connect_Timeout_Auto_Reconnect) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect_timeout) {
if (!Test_Channel_Connect_Timeout2_Accept) {
kchannel_ref_t* acceptor = knet_loop_create_channel(knet_channel_ref_get_loop(channel), 1, 100);
knet_channel_ref_accept(acceptor, 0, 8000, 10);
Test_Channel_Connect_Timeout2_Accept = true;
}
} else if (e & channel_cb_event_connect) {
knet_loop_exit(knet_channel_ref_get_loop(channel));
} else if (e & channel_cb_event_close) {
} else {
CASE_FAIL();
}
}
};
Test_Channel_Connect_Timeout2_Accept = 0;
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
knet_channel_ref_set_auto_reconnect(connector, 1);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_loop_run(loop);
knet_loop_destroy(loop);
}
CASE(Test_Channel_Idle_Timeout) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect_timeout) {
knet_loop_exit(knet_channel_ref_get_loop(channel));
} else if (e & channel_cb_event_close) {
} else {
CASE_FAIL();
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_loop_run(loop);
knet_loop_destroy(loop);
}
bool case_Test_Channel_Recv_Timeout = false;
CASE(Test_Channel_Recv_Timeout) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect) {
} else if (e & channel_cb_event_close) {
}
}
static void acceptor_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_accept) {
knet_channel_ref_set_cb(channel, acceptor_cb);
knet_channel_ref_set_timeout(channel, 1);
} else if (e & channel_cb_event_timeout) {
case_Test_Channel_Recv_Timeout = true;
knet_loop_exit(knet_channel_ref_get_loop(channel));
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
kchannel_ref_t* acceptor = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_accept(acceptor, LOOP_ADDR, 8000, 1);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
knet_channel_ref_set_cb(acceptor, &holder::acceptor_cb);
knet_loop_run(loop);
knet_loop_destroy(loop);
}
kchannel_ref_t* case_Test_Channel_Share_Leave_channel = 0;
CASE(Test_Channel_Share_Leave) {
struct holder {
static void connector_cb(kchannel_ref_t* channel, knet_channel_cb_event_e e) {
if (e & channel_cb_event_connect) {
case_Test_Channel_Share_Leave_channel = knet_channel_ref_share(channel);
knet_channel_ref_close(channel);
} else if (e & channel_cb_event_close) {
knet_loop_exit(knet_channel_ref_get_loop(channel));
}
}
};
kloop_t* loop = knet_loop_create();
kchannel_ref_t* connector = knet_loop_create_channel(loop, 1, 1024);
kchannel_ref_t* acceptor = knet_loop_create_channel(loop, 1, 1024);
knet_channel_ref_accept(acceptor, 0, 8000, 1);
knet_channel_ref_connect(connector, LOOP_ADDR, 8000, 1);
knet_channel_ref_set_cb(connector, &holder::connector_cb);
EXPECT_TRUE(knet_channel_ref_check_state(connector, channel_state_connect));
EXPECT_TRUE(knet_channel_ref_check_state(acceptor, channel_state_accept));
knet_loop_run(loop);
knet_channel_ref_leave(case_Test_Channel_Share_Leave_channel);
for (int i = 0; i < 3; i++) {
knet_loop_run_once(loop);
}
EXPECT_TRUE(0 == knet_loop_get_close_channel_count(loop));
knet_loop_destroy(loop);
}