static void serial_service(void) { char *txdata; int txlen; static char rxdata; static int rxpending; int r, i; if(!rxpending && uart_read_nonblock()) { rxdata = uart_read(); rxpending = 1; } if(rxpending) { r = session_input(&rxdata, 1); if(r > 0) rxpending = 0; if(r < 0) /* do not signal if reset was requested by host */ reset_serial_session(r != -2); } session_poll((void **)&txdata, &txlen); if(txlen > 0) { for(i = 0; i < txlen; i++) uart_write(txdata[i]); session_ack_consumed(txlen); session_ack_sent(txlen); } else if(txlen < 0) { reset_serial_session(1); } }
void test_session_tcp(void) { lagopus_result_t ret; char cbuf[256] = {0}; char sbuf[256] = {0}; bool b; lagopus_session_t sesc, sess, sesa, sesp[3]; struct addrunion dst, src; ret = session_create(SESSION_TCP|SESSION_PASSIVE, &sess); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); addrunion_ipv4_set(&src, "0.0.0.0"); ret = session_bind(sess, &src, 10022); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = session_create(SESSION_TCP|SESSION_ACTIVE, &sesc); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); addrunion_ipv4_set(&dst, "127.0.0.1"); ret = session_connect(sesc, &dst, 10022, NULL, 0); if (ret == 0 || errno == EINPROGRESS) { TEST_ASSERT(true); } else { TEST_ASSERT(false); } session_write_event_set(sesc); session_read_event_set(sess); sesp[0] = sesc; sesp[1] = sess; ret = session_poll(sesp, 2, 1); TEST_ASSERT_EQUAL(2, ret); ret = session_is_writable(sesc, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_TRUE(b); ret = session_is_readable(sess, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_TRUE(b); ret = session_accept(sess, &sesa); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_NOT_NULL(sesa); TEST_ASSERT_TRUE(session_is_alive(sess)); TEST_ASSERT_TRUE(session_is_alive(sesc)); TEST_ASSERT_TRUE(session_is_alive(sesa)); session_write_event_set(sesc); session_read_event_set(sess); session_read_event_set(sesa); sesp[0] = sesc; sesp[1] = sess; sesp[2] = sesa; ret = session_poll(sesp, 3, 1); TEST_ASSERT_EQUAL(1, ret); ret = session_is_writable(sesc, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_TRUE(b); ret = session_is_readable(sess, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_FALSE(b); ret = session_is_readable(sesa, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_FALSE(b); snprintf(cbuf, sizeof(cbuf), "hogehoge\n"); ret = session_write(sesc, cbuf, strlen(cbuf)); TEST_ASSERT_EQUAL(ret, strlen(cbuf)); session_read_event_set(sesa); sesp[0] = sesa; ret = session_poll(sesp, 1, 1); TEST_ASSERT_EQUAL(1, ret); ret = session_is_readable(sesa, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_TRUE(b); ret = session_read(sesa, sbuf, sizeof(sbuf)); TEST_ASSERT_EQUAL(ret, strlen(sbuf)); ret = session_write(sesa, sbuf, strlen(sbuf)); TEST_ASSERT_EQUAL(ret, strlen(sbuf)); ret = session_read(sesc, cbuf, sizeof(cbuf)); TEST_ASSERT_EQUAL(ret, strlen(cbuf)); session_close(sesc); TEST_ASSERT_FALSE(session_is_alive(sesc)); session_close(sesa); TEST_ASSERT_FALSE(session_is_alive(sesa)); session_close(sess); TEST_ASSERT_FALSE(session_is_alive(sesa)); session_write_event_set(sesc); session_read_event_set(sess); session_read_event_set(sesa); sesp[0] = sesc; sesp[1] = sess; sesp[2] = sesa; ret = session_poll(sesp, 3, 1); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_TIMEDOUT, ret); ret = session_is_writable(sesc, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_FALSE(b); ret = session_is_readable(sess, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_FALSE(b); ret = session_is_readable(sesa, &b); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_FALSE(b); session_destroy(sesc); session_destroy(sesa); session_destroy(sess); }
void test_session_fgets(void) { ssize_t ret; char *c; #if 0 char cbuf[256] = {0}; #endif char sbuf[256] = {0}; lagopus_session_t sesc, sess, sesa, sesp[1]; struct addrunion dst, src; ret = session_create(SESSION_TCP|SESSION_PASSIVE, &sess); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); addrunion_ipv4_set(&src, "0.0.0.0"); ret = session_bind(sess, &src, 10022); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = session_create(SESSION_TCP|SESSION_ACTIVE, &sesc); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); addrunion_ipv4_set(&dst, "127.0.0.1"); ret = session_connect(sesc, &dst, 10022, NULL, 0); if (ret == 0 || errno == EINPROGRESS) { TEST_ASSERT(true); } else { TEST_ASSERT(false); } ret = session_accept(sess, &sesa); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_NOT_NULL(sesa); TEST_ASSERT_TRUE(session_is_alive(sess)); TEST_ASSERT_TRUE(session_is_alive(sesc)); TEST_ASSERT_TRUE(session_is_alive(sesa)); ret = session_printf(sesc, "%s", "hogehoge\n\nhoge"); TEST_ASSERT_EQUAL(ret, strlen("hogehoge\n\nhoge")); session_read_event_set(sesa); sesp[0] = sesa; ret = session_poll(sesp, 1, 1); TEST_ASSERT_EQUAL(ret, 1); c = session_fgets(sbuf, 5, sesa); fprintf(stderr, "1.%s\n", sbuf); TEST_ASSERT_NOT_NULL(c); TEST_ASSERT_EQUAL(0, strncmp(sbuf, "hoge", 5)); c = session_fgets(sbuf, 10, sesa); fprintf(stderr, "2.%s\n", sbuf); TEST_ASSERT_NOT_NULL(c); TEST_ASSERT_EQUAL(0, strncmp(sbuf, "hoge\n", 5)); c = session_fgets(sbuf, 10, sesa); fprintf(stderr, "3.%s\n", sbuf); TEST_ASSERT_NOT_NULL(c); TEST_ASSERT_EQUAL(0, strncmp(sbuf, "\n", 1)); c = session_fgets(sbuf, 5, sesa); fprintf(stderr, "4.%s\n", sbuf); TEST_ASSERT_NOT_NULL(c); TEST_ASSERT_EQUAL(0, strncmp(sbuf, "hoge", 5)); #if 0 do { fprintf(stderr, "out:%s", sbuf); fgets(cbuf, sizeof(cbuf), stdin); fprintf(stderr, "in :%s", cbuf); session_write(sesc, cbuf, strlen(cbuf)); } while (session_fgets(sbuf, sizeof(sbuf), sesa) != NULL); #endif session_close(sesc); TEST_ASSERT_FALSE(session_is_alive(sesc)); session_close(sesa); TEST_ASSERT_FALSE(session_is_alive(sesa)); session_close(sess); TEST_ASSERT_FALSE(session_is_alive(sesa)); session_destroy(sesc); session_destroy(sesa); session_destroy(sess); }