Ejemplo n.º 1
0
static void test_loop_idle(void)
{
	int res = 0;
	struct idle_data data = {NULL, 0};

	/* Create loop */
	data.loop = pomp_loop_new();
	CU_ASSERT_PTR_NOT_NULL_FATAL(data.loop);

	/* Check register function is called once */
	data.n = 0;
	res = pomp_loop_idle_add(data.loop, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_wait_and_process(data.loop, 0);
	CU_ASSERT_EQUAL(res, -ETIMEDOUT);
	CU_ASSERT_EQUAL(data.n, 1);
	res = pomp_loop_wait_and_process(data.loop, 0);
	CU_ASSERT_EQUAL(res, -ETIMEDOUT);
	CU_ASSERT_EQUAL(data.n, 1);

	/* Check register function is called twice */
	data.n = 0;
	res = pomp_loop_idle_add(data.loop, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_idle_add(data.loop, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_wait_and_process(data.loop, 0);
	CU_ASSERT_EQUAL(res, -ETIMEDOUT);
	CU_ASSERT_EQUAL(data.n, 2);

	/* Check register function is not called */
	data.n = 0;
	res = pomp_loop_idle_add(data.loop, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_idle_remove(data.loop, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_wait_and_process(data.loop, 0);
	CU_ASSERT_EQUAL(res, -ETIMEDOUT);
	CU_ASSERT_EQUAL(data.n, 0);

	res = pomp_loop_idle_add(NULL, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);
	res = pomp_loop_idle_add(data.loop, NULL, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);
	res = pomp_loop_idle_remove(NULL, &idle_cb, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Destroy loop */
	res = pomp_loop_destroy(data.loop);
	CU_ASSERT_EQUAL(res, 0);
}
Ejemplo n.º 2
0
void muta_connect(libmuta_processing_callback f, void *priv)
{
  struct sockaddr_storage addr_storage;
  struct sockaddr *addr = NULL;
  uint32_t addrlen = 0;

  memset(&addr_storage, 0, sizeof(addr_storage));
  addr = (struct sockaddr *)&addr_storage;
  addrlen = sizeof(addr_storage);

  pomp_addr_parse(LIBMUTA_IMAGE_SOCKET, addr, &addrlen);

  s_app.ctx = pomp_ctx_new(client_event_cb, f);
  s_app.loop = pomp_ctx_get_loop(s_app.ctx);

  client_start(addr, addrlen);
  s_app.stop = 0;
  s_app.priv = priv;
  s_app.process = f;

  while (!s_app.stop) {
    pomp_loop_wait_and_process(s_app.loop, -1);
  }

  if (s_app.ctx != NULL) {
    pomp_ctx_stop(s_app.ctx);
    pomp_ctx_destroy(s_app.ctx);
  }
}
Ejemplo n.º 3
0
static void test_loop_wakeup(void)
{
	int res = 0, i = 0;
	struct pomp_loop *loop = NULL;
	HANDLE hthread = NULL;
	DWORD threadid = 0;

	/* Create loop */
	loop = pomp_loop_new();
	CU_ASSERT_PTR_NOT_NULL_FATAL(loop);

	/* Create a thread that will do the wakeup */
	hthread = CreateThread(NULL, 0, &test_loop_wakeup_thread, loop, 0, &threadid);
	CU_ASSERT_PTR_NOT_NULL_FATAL(hthread);

	for (i = 0; i < 10; i++) {
		/* Execute loop until wakeup, shall not timeout */
		res = pomp_loop_wait_and_process(loop, 1000);
		CU_ASSERT_EQUAL(res, 0);
	}

	res = WaitForSingleObject(hthread, INFINITE);
	CU_ASSERT_EQUAL(res, WAIT_OBJECT_0);
	CloseHandle(hthread);

	res = pomp_loop_wakeup(NULL);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Destroy loop */
	res = pomp_loop_destroy(loop);
	CU_ASSERT_EQUAL(res, 0);
}
Ejemplo n.º 4
0
static void test_loop_wakeup(void)
{
	int res = 0, i = 0;
	struct pomp_loop *loop = NULL;
	pthread_t thread;

	/* Create loop */
	loop = pomp_loop_new();
	CU_ASSERT_PTR_NOT_NULL_FATAL(loop);

	/* Create a thread that will do the wakeup */
	res = pthread_create(&thread, NULL, &test_loop_wakeup_thread, loop);
	CU_ASSERT_EQUAL(res, 0);

	for (i = 0; i < 10; i++) {
		/* Execute loop until wakeup, shall not timeout */
		res = pomp_loop_wait_and_process(loop, 1000);
		CU_ASSERT_EQUAL(res, 0);
	}

	res = pthread_join(thread, NULL);
	CU_ASSERT_EQUAL(res, 0);

	res = pomp_loop_wakeup(NULL);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Destroy loop */
	res = pomp_loop_destroy(loop);
	CU_ASSERT_EQUAL(res, 0);
}
Ejemplo n.º 5
0
static int test_ipc_entry(pomp_event_cb_t cb,
		const struct sockaddr *addr, uint32_t addrlen, int client)
{
	int res = 0;
	struct test_data data;
	struct pomp_ctx *ctx = NULL;
	struct pomp_loop *loop = NULL;
	struct pomp_timer *timer = NULL;

	memset(&data, 0, sizeof(data));
	data.pid = getpid();

	TEST_IPC_LOG("-> %s", __func__);

	/* Setup */
	ctx = pomp_ctx_new(cb, &data);
	TEST_IPC_CHECK(&data, ctx != NULL);
	loop = pomp_ctx_get_loop(ctx);
	TEST_IPC_CHECK(&data, loop != NULL);
	timer = pomp_timer_new(loop, &test_ipc_timer_cb, &data);
	TEST_IPC_CHECK(&data, timer != NULL);
	res = pomp_timer_set(timer, 10 * 1000);
	TEST_IPC_CHECK(&data, res == 0);

	/* Start client/server */
	if (client)
		res = pomp_ctx_connect(ctx, addr, addrlen);
	else
		res = pomp_ctx_listen(ctx, addr, addrlen);
	TEST_IPC_CHECK(&data, res == 0);

	/* Run loop */
	while (!data.stop)
		pomp_loop_wait_and_process(loop, -1);

	/* Cleanup */
	res = pomp_timer_destroy(timer);
	TEST_IPC_CHECK(&data, res == 0);
	res = pomp_ctx_stop(ctx);
	TEST_IPC_CHECK(&data, res == 0);
	res = pomp_ctx_destroy(ctx);
	TEST_IPC_CHECK(&data, res == 0);

	TEST_IPC_LOG("<-- %s", __func__);
	return data.status;
}
Ejemplo n.º 6
0
static void test_loop(int is_epoll)
{
	int res = 0;
	int tfd1 = -1, tfd2 = -1, tfd3 = -1;
	int fd = -1;
	struct test_data data;
	struct pomp_loop *loop = NULL;

	memset(&data, 0, sizeof(data));

	/* Create loop */
	loop = pomp_loop_new();
	CU_ASSERT_PTR_NOT_NULL_FATAL(loop);

	/* Create timers for testing */
	tfd1 = setup_timerfd(100, 500);
	CU_ASSERT_TRUE_FATAL(tfd1 >= 0);
	tfd2 = setup_timerfd(50, 500);
	CU_ASSERT_TRUE_FATAL(tfd2 >= 0);
	tfd3 = setup_timerfd(150, 500);
	CU_ASSERT_TRUE_FATAL(tfd3 >= 0);

	/* Add timer in loop */
	res = pomp_loop_add(loop, tfd1, POMP_FD_EVENT_IN, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, 0);

	res = pomp_loop_has_fd(loop, tfd1);
	CU_ASSERT_EQUAL(res, 1);

	res = pomp_loop_has_fd(loop, tfd2);
	CU_ASSERT_EQUAL(res, 0);

	/* Invalid add (already in loop) */
	res = pomp_loop_add(loop, tfd1, POMP_FD_EVENT_IN, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, -EEXIST);

	/* Invalid add (NULL param) */
	res = pomp_loop_add(NULL, tfd1, POMP_FD_EVENT_IN, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);
	res = pomp_loop_add(loop, tfd1, POMP_FD_EVENT_IN, NULL, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid add (invalid events) */
	res = pomp_loop_add(loop, tfd1, 0, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid add (invalid fd) */
	res = pomp_loop_add(loop, -1, POMP_FD_EVENT_IN, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Update events */
	res = pomp_loop_update(loop, tfd1, POMP_FD_EVENT_IN | POMP_FD_EVENT_OUT);
	CU_ASSERT_EQUAL(res, 0);

	/* Invalid update (NULL param) */
	res = pomp_loop_update(NULL, tfd1, POMP_FD_EVENT_IN | POMP_FD_EVENT_OUT);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid update (invalid events) */
	res = pomp_loop_update(loop, tfd1, 0);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid update (invalid fd) */
	res = pomp_loop_update(loop, -1, POMP_FD_EVENT_IN | POMP_FD_EVENT_OUT);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid remove (fd not registered) */
	res = pomp_loop_update(loop, 2, POMP_FD_EVENT_IN | POMP_FD_EVENT_OUT);
	CU_ASSERT_EQUAL(res, -ENOENT);

	/* Update again events */
	res = pomp_loop_update(loop, tfd1, POMP_FD_EVENT_IN);
	CU_ASSERT_EQUAL(res, 0);

	/* Add 2nd and 3rd timer in loop */
	res = pomp_loop_add(loop, tfd2, POMP_FD_EVENT_IN, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_add(loop, tfd3, POMP_FD_EVENT_IN, &timerfd_cb, &data);
	CU_ASSERT_EQUAL(res, 0);

	/* Get loop fd */
	fd = pomp_loop_get_fd(loop);
	CU_ASSERT_TRUE((is_epoll && fd >= 0) || (!is_epoll && fd == -ENOSYS));
	fd = pomp_loop_get_fd(NULL);
	CU_ASSERT_EQUAL(fd, -EINVAL);

	/* Run loop with different timeout first one should have all timers) */
	res = pomp_loop_wait_and_process(loop, 500);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_wait_and_process(loop, 0);
	CU_ASSERT_TRUE(res == -ETIMEDOUT || res == 0);
	res = pomp_loop_wait_and_process(loop, -1);
	CU_ASSERT_EQUAL(res, 0);

	/* Invalid run (NULL param) */
	res = pomp_loop_wait_and_process(NULL, 0);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid destroy (NULL param) */
	res = pomp_loop_destroy(NULL);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid destroy (busy) */
	res = pomp_loop_destroy(loop);
	CU_ASSERT_EQUAL(res, -EBUSY);

	/* Invalid remove (NULL param) */
	res = pomp_loop_remove(NULL, tfd1);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid remove (invalid fd) */
	res = pomp_loop_remove(loop, -1);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid remove (fd not registered) */
	res = pomp_loop_remove(loop, 2);
	CU_ASSERT_EQUAL(res, -ENOENT);

	/* Remove timers */
	res = pomp_loop_remove(loop, tfd1);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_remove(loop, tfd2);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_remove(loop, tfd3);
	CU_ASSERT_EQUAL(res, 0);

	/* Close timers */
	res = close(tfd1);
	CU_ASSERT_EQUAL(res, 0);
	res = close(tfd2);
	CU_ASSERT_EQUAL(res, 0);
	res = close(tfd3);
	CU_ASSERT_EQUAL(res, 0);

	/* Destroy loop */
	res = pomp_loop_destroy(loop);
	CU_ASSERT_EQUAL(res, 0);
}
Ejemplo n.º 7
0
static void test_loop(void)
{
	int res = 0;
	HANDLE htimer1 = NULL, htimer2 = NULL, htimer3 = NULL;
	struct test_data data;
	struct pomp_loop *loop = NULL;
	struct pomp_fd *pfd = NULL;

	memset(&data, 0, sizeof(data));

	/* Create loop */
	loop = pomp_loop_new();
	CU_ASSERT_PTR_NOT_NULL_FATAL(loop);

	/* Create timers for testing */
	htimer1 = setup_timer_win32(100, 500);
	CU_ASSERT_PTR_NOT_NULL_FATAL(htimer1);
	htimer2 = setup_timer_win32(50, 500);
	CU_ASSERT_PTR_NOT_NULL_FATAL(htimer2);
	htimer3 = setup_timer_win32(150, 500);
	CU_ASSERT_PTR_NOT_NULL_FATAL(htimer3);

	/* Add timer in loop */
	pfd = pomp_loop_win32_add_pfd_with_hevt(loop, htimer1, &timer_win32_cb, &data);
	CU_ASSERT_PTR_NOT_NULL(pfd);

	/* Add 2nd and 3rd timer in loop */
	pfd = pomp_loop_win32_add_pfd_with_hevt(loop, htimer2, &timer_win32_cb, &data);
	CU_ASSERT_PTR_NOT_NULL(pfd);
	pfd = pomp_loop_win32_add_pfd_with_hevt(loop, htimer3, &timer_win32_cb, &data);
	CU_ASSERT_PTR_NOT_NULL(pfd);

	/* Run loop with different timeout first one should have all timers) */
	res = pomp_loop_wait_and_process(loop, 500);
	CU_ASSERT_EQUAL(res, 0);
	res = pomp_loop_wait_and_process(loop, 0);
	CU_ASSERT_TRUE(res == -ETIMEDOUT || res == 0);
	res = pomp_loop_wait_and_process(loop, -1);
	CU_ASSERT_EQUAL(res, 0);

	/* Invalid run (NULL param) */
	res = pomp_loop_wait_and_process(NULL, 0);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid destroy (NULL param) */
	res = pomp_loop_destroy(NULL);
	CU_ASSERT_EQUAL(res, -EINVAL);

	/* Invalid destroy (busy) */
	res = pomp_loop_destroy(loop);
	CU_ASSERT_EQUAL(res, -EBUSY);

	/* Remove timers */
	pfd = pomp_loop_win32_find_pfd_by_hevt(loop, htimer1);
	CU_ASSERT_PTR_NOT_NULL(pfd);
	res = pomp_loop_remove_pfd(loop, pfd);
	CU_ASSERT_EQUAL(res, 0);
	free(pfd);
	pfd = pomp_loop_win32_find_pfd_by_hevt(loop, htimer2);
	CU_ASSERT_PTR_NOT_NULL(pfd);
	res = pomp_loop_remove_pfd(loop, pfd);
	CU_ASSERT_EQUAL(res, 0);
	free(pfd);
	pfd = pomp_loop_win32_find_pfd_by_hevt(loop, htimer3);
	CU_ASSERT_PTR_NOT_NULL(pfd);
	res = pomp_loop_remove_pfd(loop, pfd);
	CU_ASSERT_EQUAL(res, 0);
	free(pfd);

	/* Close timers */
	res = CloseHandle(htimer1);
	CU_ASSERT_EQUAL(res, 1);
	res = CloseHandle(htimer2);
	CU_ASSERT_EQUAL(res, 1);
	res = CloseHandle(htimer3);
	CU_ASSERT_EQUAL(res, 1);

	/* Destroy loop */
	res = pomp_loop_destroy(loop);
	CU_ASSERT_EQUAL(res, 0);
}