END_TEST START_TEST(test_message_encode) { message * msg; char * res; uint32_t len; msg = message_create_echo(MESSAGE_TYPE_REQUEST, "hey"); ck_assert_int_eq(message_encode(msg, &res, &len), 0); ck_assert_int_eq(len, 7); ck_assert_int_eq(memcmp(res, "\x93\x00\x01\xa3hey", len), 0); msg = message_decode("\x93\x00\x01\xa3hey", 7); ck_assert(msg != NULL); ck_assert_str_eq(msg->data.echo, "hey"); msg = message_create_echo(MESSAGE_TYPE_RESPONSE, "hey"); ck_assert_int_eq(message_encode(msg, &res, &len), 0); ck_assert_int_eq(len, 7); ck_assert_int_eq(memcmp(res, "\x93\x01\x01\xa3hey", len), 0); msg = message_decode("\x93\x01\x01\xa3hey", 7); ck_assert(msg != NULL); ck_assert_str_eq(msg->data.echo, "hey"); msg = message_create_identity(MESSAGE_TYPE_REQUEST, NULL, 0); ck_assert_int_eq(message_encode(msg, &res, &len), 0); ck_assert_int_eq(len, 4); ck_assert_int_eq(memcmp(res, "\x93\x00\x00\xc0", len), 0); msg = message_create_identity(MESSAGE_TYPE_RESPONSE, "localhost", 10000); ck_assert_int_eq(message_encode(msg, &res, &len), 0); ck_assert_int_eq(len, 17); ck_assert_int_eq(memcmp(res, "\x93\x01\x00\x92\xa9localhost\xcd'\x10", len), 0); msg = message_decode("\x93\x01\x00\x92\xa9localhost\xcd'\x10", 17); ck_assert(msg != NULL); /* ck_assert_int_eq(msg->data.identity.port , 10000); */ /* ck_assert_str_eq(msg->data.identity.name, "localhost"); */ msg = message_create(MESSAGE_TYPE_REQUEST, MESSAGE_ACTION_DISCOVER); ck_assert_int_eq(message_encode(msg, &res, &len), 0); ck_assert_int_eq(len, 4); ck_assert_int_eq(memcmp(res, "\x93\x00\x02\xc0", len), 0); msg = message_decode("\x93\x00\x02\xc0", 4); ck_assert(msg != NULL); ck_assert_int_eq(msg->type, MESSAGE_TYPE_REQUEST); ck_assert_int_eq(msg->action, MESSAGE_ACTION_DISCOVER); }
/* Test sending/receiving a message in chunks */ static void test_message_stream(test_t *t) { test_proactor_t tps[] ={ test_proactor(t, message_stream_handler), test_proactor(t, message_stream_handler) }; pn_proactor_t *client = tps[0].proactor; pn_listener_t *l = test_listen(&tps[1], ""); struct message_stream_context ctx = { 0 }; tps[0].handler.context = &ctx; tps[1].handler.context = &ctx; /* Encode a large (not very) message to send in chunks */ char *body = (char*)malloc(BODY); memset(body, 'x', BODY); pn_message_t *m = pn_message(); pn_data_put_binary(pn_message_body(m), pn_bytes(BODY, body)); free(body); ctx.size = message_encode(m, &ctx.send_buf); pn_message_free(m); pn_connection_t *c = pn_connection(); pn_proactor_connect2(client, c, NULL, listener_info(l).connect); pn_session_t *ssn = pn_session(c); pn_session_open(ssn); pn_link_t *snd = pn_sender(ssn, "x"); pn_link_open(snd); TEST_PROACTORS_RUN_UNTIL(tps, PN_LINK_FLOW); /* Send and receive the message in chunks */ do { pn_connection_wake(c); /* Initiate send/receive of one chunk */ do { /* May be multiple receives for one send */ TEST_PROACTORS_RUN_UNTIL(tps, PN_DELIVERY); } while (ctx.received < ctx.sent); } while (!ctx.complete); TEST_CHECK(t, ctx.received == ctx.size); TEST_CHECK(t, ctx.sent == ctx.size); TEST_CHECK(t, !memcmp(ctx.send_buf.start, ctx.recv_buf.start, ctx.size)); free(ctx.send_buf.start); free(ctx.recv_buf.start); TEST_PROACTORS_DESTROY(tps); }
int message_send(message_t *msg, int fd){ int send_num; // Increment cunk seq msg->chunk_seq++; // Encode message to buffer char *buffer = message_encode(msg); send_num = write(fd,buffer, CHARCOAL_MSG_SIZE); if (send_num < 0){ logger_log(LOG_ERROR, "failed writing to socket, %s",strerror(errno)); return -1; } return 0; }