static void recv_size_err_callback_check_fn(
    atbus::channel::io_stream_channel* channel,         // 事件触发的channel
    atbus::channel::io_stream_connection* connection,   // 事件触发的连接
    int status,                         // libuv传入的转态码
    void* input,                        // 额外参数(不同事件不同含义)
    size_t s                            // 额外参数长度
    ) {
    CASE_EXPECT_NE(NULL, channel);
    CASE_EXPECT_NE(NULL, connection);

    if (EN_ATBUS_ERR_INVALID_SIZE == status) {
        CASE_EXPECT_NE(NULL, input);
        CASE_EXPECT_EQ(EN_ATBUS_ERR_INVALID_SIZE, status);
        CASE_EXPECT_EQ(0, channel->error_code);

    } else if (EN_ATBUS_ERR_READ_FAILED == status) {
        CASE_EXPECT_EQ(NULL, input);
        CASE_EXPECT_EQ(EN_ATBUS_ERR_READ_FAILED, status);
        CASE_EXPECT_TRUE(UV_ECONNRESET == channel->error_code || UV_EOF == channel->error_code);
    } else {
        CASE_EXPECT_TRUE(EN_ATBUS_ERR_INVALID_SIZE == status || EN_ATBUS_ERR_READ_FAILED == status);
    }

    ++g_check_flag;
}
Esempio n. 2
0
    int operator()() {
        CASE_EXPECT_EQ(g_test_coroutine_task_status, check_);
        g_test_coroutine_task_status = set_;

        CASE_EXPECT_EQ(copp::COPP_EC_IS_RUNNING, cotask::this_task::get_task()->start());
        return 0;
    }
CASE_TEST(coroutine, context_base)
{
    char* stack_buff = new char[64 * 1024];
    g_test_coroutine_base_status = 0;
    ++ g_test_coroutine_base_status;
    CASE_EXPECT_EQ(g_test_coroutine_base_status, 1);

    test_context_base_coroutine_context_test_type co;
    test_context_base_foo_runner runner;
    runner.call_times = 0;

    co.get_allocator().attach(stack_buff, 64 * 1024);
    co.create(&runner, 64 * 1024);
    int res = co.create(&runner, 64 * 1024); // can not be created muli times
    CASE_EXPECT_EQ(res, copp::COPP_EC_ALREADY_INITED);

    co.start();

    ++ g_test_coroutine_base_status;
    CASE_EXPECT_EQ(g_test_coroutine_base_status, 3);
    co.resume();

    ++ g_test_coroutine_base_status;
    CASE_EXPECT_EQ(g_test_coroutine_base_status, 5);

    delete []stack_buff;
}
CASE_TEST(coroutine, shared_runner)
{
    const int stack_len = 16 * 1024;
    char* stack_buff = new char[4 * stack_len];
    g_test_coroutine_base_status = 0;
    ++ g_test_coroutine_base_status;
    CASE_EXPECT_EQ(g_test_coroutine_base_status, 1);

    test_context_base_coroutine_context_test_type co[4];
    test_context_base_foo_runner runner;
    runner.call_times = 0;

    for (int i = 0; i < 4; ++ i) {
        co[i].get_allocator().attach(stack_buff + i * stack_len, stack_len);
        co[i].create(&runner, stack_len);
        co[i].start();
    }

    CASE_EXPECT_EQ(g_test_coroutine_base_status, 5);

    for (int i = 0; i < 4; ++ i)
        co[i].resume();

    CASE_EXPECT_EQ(g_test_coroutine_base_status, 9);

    CASE_EXPECT_EQ(runner.call_times, 4);

    delete []stack_buff;
}
Esempio n. 5
0
CASE_TEST(coroutine_task, auto_finish)
{
    typedef std::shared_ptr< cotask::task<> > task_ptr_type;
    {
        test_context_task_mem_function obj;
        task_ptr_type co_task = cotask::task<>::create(&test_context_task_mem_function::real_run, &obj);
        g_test_coroutine_task_status = 0;
        obj.task_id_ = co_task->get_id();
    }
    CASE_EXPECT_EQ(0, g_test_coroutine_task_status); 

    {
        test_context_task_mem_function obj;
        task_ptr_type co_task = cotask::task<>::create(&test_context_task_mem_function::real_run, &obj);
        g_test_coroutine_task_status = 0;
        obj.task_id_ = co_task->get_id();

        CASE_EXPECT_EQ(0, co_task->start());

        ++ g_test_coroutine_task_status;
        CASE_EXPECT_EQ(g_test_coroutine_task_status, 2);

        CASE_EXPECT_FALSE(co_task->is_completed());
    }

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 4);
}
Esempio n. 6
0
CASE_TEST(coroutine_task, custom_action)
{
    typedef std::shared_ptr< cotask::task<> > task_ptr_type;
    cotask::task<>::action_ptr_t action = cotask::task<>::action_ptr_t(new test_context_task_action());
    task_ptr_type co_task = cotask::task<>::create(action);
    task_ptr_type co_another_task = cotask::task<>::create(action); // share action

    g_test_coroutine_task_status = 0;

    CASE_EXPECT_EQ(0, co_task->start());

    CASE_EXPECT_EQ(g_test_coroutine_task_status, 1);
    CASE_EXPECT_FALSE(co_task->is_completed());

    CASE_EXPECT_EQ(0, co_another_task->start());
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 2);

    CASE_EXPECT_EQ(0, co_task->resume());
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 3);

    CASE_EXPECT_EQ(0, co_another_task->resume());
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 4);

    CASE_EXPECT_TRUE(co_task->is_completed());
    CASE_EXPECT_TRUE(co_another_task->is_completed());

    CASE_EXPECT_GT(0, co_another_task->resume());
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 4);

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 5);

    CASE_EXPECT_NE(co_task->get_id(), 0);
}
CASE_TEST(atbus_endpoint, get_children_min_max)
{
    atbus::endpoint::bus_id_t tested = atbus::endpoint::get_children_max_id(0x12345678, 16);
    CASE_EXPECT_EQ(tested, 0x1234FFFF);

    tested = atbus::endpoint::get_children_min_id(0x12345678, 16);
    CASE_EXPECT_EQ(tested, 0x12340000);
}
Esempio n. 8
0
static void test_context_task_function_2() {
    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 1);

    cotask::this_task::get_task()->yield();

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 3);
}
CASE_TEST(crypto_cipher, aes_cfb_nopadding_encrypt) {
#if defined(CRYPTO_USE_OPENSSL) || defined(CRYPTO_USE_LIBRESSL) || defined(CRYPTO_USE_BORINGSSL)
    if (!openssl_test_inited) {
        openssl_test_inited = std::make_shared<openssl_test_init_wrapper>();
    }
#endif

    {
        util::crypto::cipher ci;
        CASE_EXPECT_EQ(0, ci.init("AES-256-CFB", ::util::crypto::cipher::mode_t::EN_CMODE_ENCRYPT));

        // CASE_EXPECT_EQ(16, ci.get_iv_size());
        // CASE_EXPECT_EQ(0, ci.set_iv(aes_test_cfb128_iv, 16));
        CASE_EXPECT_EQ(256, ci.get_key_bits());
        CASE_EXPECT_EQ(0, ci.set_key(aes_test_cfb128_key[2], 256));

        const size_t buffer_len = 29;

        for (int i = 0; i < 3; ++i) {
            unsigned char buf_in[64] = {0}, buf_out[128] = {0};
            size_t        olen = sizeof(buf_out);
            memcpy(buf_in, aes_test_cfb128_nopadding_pt[i], buffer_len);
            CASE_EXPECT_EQ(0, ci.encrypt(buf_in, buffer_len, buf_out, &olen));
            CASE_EXPECT_EQ(0, memcmp(buf_out, aes_test_cfb128_nopadding_ct[i], buffer_len));

            CASE_MSG_INFO() << "AES-256-CFB => txt: " << aes_test_cfb128_nopadding_pt[i] << std::endl;
            CASE_MSG_INFO() << "AES-256-CFB => enc: ";
            util::string::dumphex(buf_out, olen, std::cout);
            std::cout << std::endl;
        }
    }

    {
        util::crypto::cipher ci;
        CASE_EXPECT_EQ(0, ci.init("AES-256-CFB", ::util::crypto::cipher::mode_t::EN_CMODE_DECRYPT));

        // CASE_EXPECT_EQ(16, ci.get_iv_size());
        // CASE_EXPECT_EQ(0, ci.set_iv(aes_test_cfb128_iv, 16));
        CASE_EXPECT_EQ(256, ci.get_key_bits());
        CASE_EXPECT_EQ(0, ci.set_key(aes_test_cfb128_key[2], 256));

        const size_t buffer_len = 29;

        for (int i = 0; i < 3; ++i) {
            unsigned char buf_in[64] = {0}, buf_out[128] = {0};
            size_t        olen = sizeof(buf_out);
            memcpy(buf_in, aes_test_cfb128_nopadding_ct[i], buffer_len);
            CASE_EXPECT_EQ(0, ci.decrypt(buf_in, buffer_len, buf_out, &olen));
            CASE_EXPECT_EQ(0, memcmp(buf_out, aes_test_cfb128_nopadding_pt[i], buffer_len));

            CASE_MSG_INFO() << "AES-256-CFB => dec: ";
            util::string::dumphex(buf_in, buffer_len, std::cout);
            std::cout << std::endl;
            CASE_MSG_INFO() << "AES-256-CFB => txt: " << ((unsigned char *)buf_out) << std::endl;
        }
    }
}
Esempio n. 10
0
static int test_context_task_function_1() {
    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 1);

    cotask::this_task::get_task()->yield();

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 3);

    return 100;
}
Esempio n. 11
0
    int operator()() const {
        ++ g_test_coroutine_task_status;
        CASE_EXPECT_EQ(g_test_coroutine_task_status, 1);

        cotask::this_task::get_task()->yield();

        ++ g_test_coroutine_task_status;
        CASE_EXPECT_EQ(g_test_coroutine_task_status, 3);

        return 0;
    }
Esempio n. 12
0
    int operator()() {
        ++ g_test_coroutine_task_status;

        CASE_EXPECT_EQ(cotask::EN_TS_RUNNING, cotask::this_task::get_task()->get_status());
        cotask::this_task::get_task()->yield();
        CASE_EXPECT_EQ(cotask::EN_TS_RUNNING, cotask::this_task::get_task()->get_status());

        ++ g_test_coroutine_task_status;

        return 0;
    }
Esempio n. 13
0
    int real_run() {
        ++ g_test_coroutine_task_status;
        CASE_EXPECT_EQ(g_test_coroutine_task_status, 1);

        CASE_EXPECT_EQ(task_id_, cotask::task<>::this_task()->get_id());
        cotask::task<>::this_task()->yield();
        CASE_EXPECT_EQ(task_id_, cotask::task<>::this_task()->get_id());

        ++ g_test_coroutine_task_status;
        CASE_EXPECT_EQ(g_test_coroutine_task_status, 3);

        return -1;
    }
Esempio n. 14
0
// task start and coroutine context yield
static void test_context_task_function_3() {
    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 1);

    CASE_EXPECT_EQ(cotask::EN_TS_RUNNING, cotask::this_task::get_task()->get_status());

    copp::this_coroutine::yield();

    CASE_EXPECT_EQ(cotask::EN_TS_RUNNING, cotask::this_task::get< cotask::task<> >()->get_status());

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 3);
}
CASE_TEST(atbus_endpoint, get_connection)
{
    atbus::node::conf_t conf;
    atbus::node::default_conf(&conf);
    conf.children_mask = 16;
    uv_loop_t ev_loop;
    uv_loop_init(&ev_loop);

    conf.ev_loop = &ev_loop;
    conf.recv_buffer_size = 64 * 1024;

    char* buffer = new char[conf.recv_buffer_size];
    memset(buffer, -1, sizeof(conf.recv_buffer_size)); // init it and then valgrind will now report uninitialised used

    char addr[32] = { 0 };
    UTIL_STRFUNC_SNPRINTF(addr, sizeof(addr), "mem://0x%p", buffer);
    if (addr[8] == '0' && addr[9] == 'x') {
        memset(addr, 0, sizeof(addr));
        UTIL_STRFUNC_SNPRINTF(addr, sizeof(addr), "mem://%p", buffer);
    }

    // 排除未完成连接
    {
        atbus::node::ptr_t node = atbus::node::create();
        node->init(0x12345678, &conf);

        atbus::connection::ptr_t conn1 = atbus::connection::create(node.get());

        CASE_EXPECT_EQ(0, conn1->connect(addr));

        atbus::connection::ptr_t conn2 = atbus::connection::create(node.get());
        conn2->connect("ipv4://127.0.0.1:80");

        atbus::endpoint::ptr_t ep = atbus::endpoint::create(node.get(), 0x12345679, 8, node->get_pid(), node->get_hostname());
        CASE_EXPECT_TRUE(ep->add_connection(conn1.get(), false));
        CASE_EXPECT_TRUE(ep->add_connection(conn2.get(), false));

        CASE_EXPECT_EQ(0, node->add_endpoint(ep));

        atbus::connection* conn3 = node->get_self_endpoint()->get_data_connection(ep.get());
        CASE_EXPECT_EQ(conn3, conn1.get());

    }

    while (UV_EBUSY == uv_loop_close(&ev_loop)) {
        uv_run(&ev_loop, UV_RUN_ONCE);
    }

    delete []buffer;
}
Esempio n. 16
0
CASE_TEST(ac_automation, skip) {
    util::string::ac_automation<> actree;

    actree.insert_keyword("艹");
    actree.insert_keyword("操你妈逼");
    actree.insert_keyword("你妈逼");
    actree.insert_keyword("艹你妈");
    actree.set_skip(' ');
    actree.set_skip('\t');
    actree.set_skip('\r');
    actree.set_skip('\n');

    std::string input = "小册老艹,我干死你操  你妈操  你妈\r\n逼艹 你妈";
    util::string::ac_automation<>::value_type res = actree.match(input);

// CI may not support this encoding
#ifndef _MSC_VER
    CASE_EXPECT_EQ(3, res.size());
#endif

    std::stringstream ss;
    size_t in_idx = 0;
    for (size_t i = 0; i < res.size(); ++i) {
        ss.write(&input[in_idx], res[i].start - in_idx);
        ss << "**";
        in_idx = res[i].start + res[i].length;
    }

    if (in_idx < input.size()) {
        ss.write(&input[in_idx], input.size() - in_idx);
    }

    CASE_MSG_INFO() << "filter resault: " << ss.str() << std::endl;
}
static void listen_callback_test_fn(
    atbus::channel::io_stream_channel* channel,         // 事件触发的channel
    atbus::channel::io_stream_connection* connection,   // 事件触发的连接
    int status,                         // libuv传入的转态码
    void*,                              // 额外参数(不同事件不同含义)
    size_t s                            // 额外参数长度
    ) {
    CASE_EXPECT_NE(NULL, channel);
    CASE_EXPECT_NE(NULL, connection);
    CASE_EXPECT_EQ(0, status);
    CASE_EXPECT_EQ(0, channel->error_code);

    // listen accepted event
    connection->evt.callbacks[atbus::channel::io_stream_callback_evt_t::EN_FN_ACCEPTED] = accepted_callback_test_fn;

    ++g_check_flag;
}
Esempio n. 18
0
CASE_TEST(coroutine_task, next)
{
    typedef std::shared_ptr< cotask::task<> > task_ptr_type;

    task_ptr_type co_task = cotask::task<>::create(test_context_task_next_action(15, 0));
    co_task->next(test_context_task_next_action(7, 15))
        ->next(test_context_task_next_action(99, 7))
        ->next(test_context_task_next_action(1023, 99))
        ->next(test_context_task_next_action(5, 1023));


    g_test_coroutine_task_status = 0;
    CASE_EXPECT_EQ(0, co_task->start());
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 5);

    CASE_EXPECT_EQ(copp::COPP_EC_ALREADY_FINISHED, co_task->start());
}
Esempio n. 19
0
CASE_TEST(ac_automation, prefix) {
    util::string::ac_automation<> actree;

    actree.insert_keyword("cb");
    actree.insert_keyword("abc");
    actree.insert_keyword("bc");
    actree.set_skip(' ');
    actree.set_skip('\n');

    util::string::ac_automation<>::value_type res = actree.match("ca b\ncd");

    CASE_EXPECT_EQ(1, res.size());
    if (!res.empty()) {
        CASE_EXPECT_EQ(1, res[0].start);
        CASE_EXPECT_EQ(5, res[0].length);
    }
}
Esempio n. 20
0
CASE_TEST(ac_automation, match_char) {
    util::string::ac_automation<> actree;

    actree.insert_keyword("a");

    util::string::ac_automation<>::value_type res = actree.match(" aaa");

    CASE_EXPECT_EQ(3, res.size());

    res = actree.match("a");
    CASE_EXPECT_EQ(1, res.size());

    res = actree.match("b");
    CASE_EXPECT_EQ(0, res.size());

    res = actree.match("");
    CASE_EXPECT_EQ(0, res.size());
}
static int node_test_on_shutdown(const atbus::node& n, int reason) {
    if (0 == g_node_test_on_shutdown_check_reason) {
        ++ g_node_test_on_shutdown_check_reason;
    } else {
        CASE_EXPECT_EQ(reason, g_node_test_on_shutdown_check_reason);
        g_node_test_on_shutdown_check_reason = 0;
    }

    return 0;
}
// reset by peer(client)
CASE_TEST(channel, io_stream_tcp_reset_by_client)
{
    atbus::channel::io_stream_channel svr, cli;
    atbus::channel::io_stream_init(&svr, NULL, NULL);
    atbus::channel::io_stream_init(&cli, NULL, NULL);

    svr.evt.callbacks[atbus::channel::io_stream_callback_evt_t::EN_FN_DISCONNECTED] = disconnected_callback_test_fn;

    int check_flag = g_check_flag = 0;

    int inited_fds = 0;
    inited_fds += setup_channel(svr, "ipv6://:::16387", NULL);
    CASE_EXPECT_EQ(1, g_check_flag);
    CASE_EXPECT_NE(NULL, svr.ev_loop);
    if (0 == inited_fds) {
        return;
    }

    inited_fds = 0;
    inited_fds += setup_channel(cli, NULL, "ipv4://127.0.0.1:16387");
    inited_fds += setup_channel(cli, NULL, "dns://localhost:16387");
    inited_fds += setup_channel(cli, NULL, "ipv6://::1:16387");

    while (g_check_flag - check_flag < 2 * inited_fds + 1) {
        atbus::channel::io_stream_run(&svr, atbus::adapter::RUN_NOWAIT);
        atbus::channel::io_stream_run(&cli, atbus::adapter::RUN_NOWAIT);
        CASE_THREAD_SLEEP_MS(8);
    }
    CASE_EXPECT_NE(0, cli.conn_pool.size());

    check_flag = g_check_flag;
    atbus::channel::io_stream_close(&cli);
    CASE_EXPECT_EQ(0, cli.conn_pool.size());

    while (g_check_flag - check_flag < inited_fds) {
        atbus::channel::io_stream_run(&svr, atbus::adapter::RUN_NOWAIT);
        CASE_THREAD_SLEEP_MS(8);
    }
    CASE_EXPECT_EQ(1, svr.conn_pool.size());

    atbus::channel::io_stream_close(&svr);
    CASE_EXPECT_EQ(0, svr.conn_pool.size());
}
Esempio n. 23
0
CASE_TEST(coroutine_task, functor_drived_action)
{
    typedef std::shared_ptr< cotask::task<> > task_ptr_type;
    task_ptr_type co_task = cotask::task<>::create_with<test_context_task_functor_drived>(
        cotask::task<>::stack_allocator_t::default_stacksize(),
        1, 
        3
    );
    CASE_EXPECT_EQ(0, co_task->start());
}
static void connected_callback_test_fn(
    atbus::channel::io_stream_channel* channel,         // 事件触发的channel
    atbus::channel::io_stream_connection* connection,   // 事件触发的连接
    int status,                         // libuv传入的转态码
    void*,                              // 额外参数(不同事件不同含义)
    size_t s                            // 额外参数长度
    ) {
    CASE_EXPECT_NE(NULL, channel);
    CASE_EXPECT_NE(NULL, connection);
    CASE_EXPECT_EQ(0, status);
    CASE_EXPECT_EQ(0, channel->error_code);

    if (0 != status) {
        CASE_MSG_INFO() << uv_err_name(channel->error_code) << ":"<< uv_strerror(channel->error_code) << std::endl;
    } else {
        CASE_MSG_INFO() << "connect to " << connection->addr.address<< " success" << std::endl;
    }

    ++g_check_flag;
}
Esempio n. 25
0
CASE_TEST(coroutine_task, functor_action)
{
    typedef std::shared_ptr< cotask::task<> > task_ptr_type;
    task_ptr_type co_task = cotask::task<>::create(test_context_task_functor());
    g_test_coroutine_task_status = 0;

    CASE_EXPECT_EQ(0, co_task->start());

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 2);

    CASE_EXPECT_FALSE(co_task->is_completed());
    CASE_EXPECT_EQ(0, co_task->resume());

    CASE_EXPECT_TRUE(co_task->is_completed());

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 4);

    CASE_EXPECT_NE(co_task->get_id(), 0);
}
Esempio n. 26
0
CASE_TEST(owent_foreach, Array) {
    //数组
    const int arr[] = {1, 7, 3, 9, 5, 6, 2, 8, 4};
    int sum1 = 0, sum2 = 0;
    owent_foreach(const int &v, arr) { sum1 += v; }

    for (int i = 0; i < 9; ++i) {
        sum2 += arr[i];
    }

    CASE_EXPECT_EQ(sum1, sum2);
}
Esempio n. 27
0
CASE_TEST(ac_automation, failed) {
    util::string::ac_automation<> actree;

    actree.insert_keyword("acd");
    actree.insert_keyword("aceb");
    actree.insert_keyword("bef");
    actree.insert_keyword("cef");
    actree.insert_keyword("ef");

    util::string::ac_automation<>::value_type res = actree.match("lolololnmmnmuiyt");

    CASE_EXPECT_EQ(0, res.size());
}
// 注册成功流程测试
CASE_TEST(atbus_node_reg, reg_success)
{
    atbus::node::conf_t conf;
    atbus::node::default_conf(&conf);
    conf.children_mask = 16;
    uv_loop_t ev_loop;
    uv_loop_init(&ev_loop);

    conf.ev_loop = &ev_loop;

    int check_ep_rm = recv_msg_history.remove_endpoint_count;
    {
        atbus::node::ptr_t node_parent = atbus::node::create();
        atbus::node::ptr_t node_child = atbus::node::create();
        node_parent->on_debug = node_reg_test_on_debug;
        node_child->on_debug = node_reg_test_on_debug;

        node_parent->init(0x12345678, &conf);
        
        conf.children_mask = 8;
        conf.father_address = "ipv4://127.0.0.1:16387";
        node_child->init(0x12346789, &conf);

        CASE_EXPECT_EQ(EN_ATBUS_ERR_SUCCESS, node_parent->listen("ipv4://127.0.0.1:16387"));
        CASE_EXPECT_EQ(EN_ATBUS_ERR_SUCCESS, node_child->listen("ipv4://127.0.0.1:16388"));

        CASE_EXPECT_EQ(EN_ATBUS_ERR_SUCCESS, node_parent->start());
        CASE_EXPECT_EQ(EN_ATBUS_ERR_SUCCESS, node_child->start());

        // 父子节点注册回调测试
        int check_ep_count = recv_msg_history.add_endpoint_count;
        node_parent->set_on_add_endpoint_handle(node_reg_test_add_endpoint_fn);
        node_parent->set_on_remove_endpoint_handle(node_reg_test_remove_endpoint_fn);
        node_child->set_on_add_endpoint_handle(node_reg_test_add_endpoint_fn);
        node_child->set_on_remove_endpoint_handle(node_reg_test_remove_endpoint_fn);

        time_t proc_t = time(NULL);
        node_parent->proc(proc_t + 1, 0);
        node_child->proc(proc_t + 1, 0);

        // 注册成功自动会有可用的端点
        for (int i = 0; i < 512; ++i) {
            atbus::endpoint* ep1 = node_child->get_endpoint(node_parent->get_id());
            atbus::endpoint* ep2 = node_parent->get_endpoint(node_child->get_id());

            if (NULL != ep1 && NULL != ep2 && NULL != ep1->get_data_connection(ep2) && NULL != ep2->get_data_connection(ep1)) {
                break;
            }

            uv_run(conf.ev_loop, UV_RUN_ONCE);
        }
        CASE_EXPECT_EQ(check_ep_count + 2, recv_msg_history.add_endpoint_count);
    }

    node_reg_test_setup_exit(&ev_loop);

    CASE_EXPECT_EQ(check_ep_rm + 2, recv_msg_history.remove_endpoint_count);
}
CASE_TEST(happ_connection, basic)
{
    AutoPtr<hiredis::happ::connection> conn1(new hiredis::happ::connection());
    AutoPtr<hiredis::happ::connection> conn2(new hiredis::happ::connection());

    CASE_EXPECT_EQ(conn1->get_sequence() + 1, conn2->get_sequence());

    hiredis::happ::holder_t h;
    redisAsyncContext vir_context;

    conn1->init(h, "127.0.0.2", 1234);
    conn2->init(h, "127.0.0.3", 1234);

    CASE_EXPECT_TRUE("127.0.0.2" == conn1->get_key().ip);
    CASE_EXPECT_TRUE(1234 == conn1->get_key().port);
    CASE_EXPECT_TRUE("127.0.0.2:1234" == conn1->get_key().name);

    CASE_EXPECT_EQ(hiredis::happ::connection::status::DISCONNECTED, conn1->conn_status);
    hiredis::happ::cmd_exec* cmd = hiredis::happ::cmd_exec::create(h, NULL, &vir_context, 0);

    int res = conn1->redis_cmd(cmd, NULL);
    CASE_EXPECT_EQ(hiredis::happ::error_code::REDIS_HAPP_CREATE, res);

    conn1->set_connecting(&vir_context);

    CASE_EXPECT_EQ(conn1->get_context(), &vir_context);
    CASE_EXPECT_EQ(hiredis::happ::connection::status::CONNECTING, conn1->conn_status);
    conn1->set_connected();
    CASE_EXPECT_EQ(hiredis::happ::connection::status::CONNECTED, conn1->conn_status);

    CASE_EXPECT_EQ(conn1->get_context(), &vir_context);

    cmd->pri_data = conn2.get();
    conn2->set_connecting(&vir_context);

    conn1->release(false);
    conn2->release(false);

    CASE_EXPECT_EQ(conn1->get_context(), NULL);
    CASE_EXPECT_EQ(conn2->get_context(), NULL);

    hiredis::happ::cmd_exec::destroy(cmd);
}
Esempio n. 30
0
CASE_TEST(coroutine_task, mem_function_action)
{
    typedef std::shared_ptr< cotask::task<> > task_ptr_type;
    test_context_task_mem_function obj;
    task_ptr_type co_task = cotask::task<>::create(&test_context_task_mem_function::real_run, &obj);
    g_test_coroutine_task_status = 0;
    obj.task_id_ = co_task->get_id();

    CASE_EXPECT_EQ(0, co_task->start());

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 2);

    CASE_EXPECT_FALSE(co_task->is_completed());
    CASE_EXPECT_EQ(0, co_task->resume());

    CASE_EXPECT_TRUE(co_task->is_completed());

    ++ g_test_coroutine_task_status;
    CASE_EXPECT_EQ(g_test_coroutine_task_status, 4);

    CASE_EXPECT_NE(co_task->get_coroutine_context().get_ret_code(), -1);
}