/*
* Copyright (C) 2011-2013 Karlsruhe Institute of Technology
*
* This file is part of Ufo.
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#include
#include
#include "test-suite.h"
typedef struct {
gchar *addr;
} Fixture;
static void
setup (Fixture *fixture, gconstpointer data)
{
fixture->addr = g_strdup ("tcp://127.0.0.1:5555");
}
static void
teardown (Fixture *fixture, gconstpointer data)
{
g_free (fixture->addr);
}
static void send_num_devices_request (gpointer unused)
{
GError *error = NULL;
UfoMessenger *msger = UFO_MESSENGER (ufo_zmq_messenger_new ());
gchar *addr = g_strdup ("tcp://127.0.0.1:5555");
ufo_messenger_connect (msger, addr, UFO_MESSENGER_CLIENT, &error);
g_assert_no_error (error);
guint x = 0;
while (x++ < 10) {
UfoMessage *request = ufo_message_new (UFO_MESSAGE_GET_NUM_DEVICES, 0);
UfoMessage *response;
response = ufo_messenger_send_blocking (msger, request, &error);
g_assert_no_error (error);
guint16 num_devices = *(guint16 *) response->data;
g_assert (num_devices == x);
ufo_message_free (request);
ufo_message_free (response);
}
ufo_messenger_disconnect (msger);
g_object_unref (msger);
}
static void handle_num_devices (gpointer unused)
{
GError *error = NULL;
UfoMessenger *msger = UFO_MESSENGER (ufo_zmq_messenger_new ());
gchar *addr = g_strdup ("tcp://127.0.0.1:5555");
ufo_messenger_connect (msger, addr, UFO_MESSENGER_SERVER, &error);
g_assert_no_error (error);
guint16 x = 0;
while (x++ < 10) {
UfoMessage *msg = ufo_messenger_recv_blocking (UFO_MESSENGER (msger), &error);
g_assert_no_error (error);
UfoMessage *resp;
switch (msg->type) {
case UFO_MESSAGE_GET_NUM_DEVICES:
resp = ufo_message_new (UFO_MESSAGE_ACK, sizeof (guint16));
*(guint16 *)resp->data = x;
ufo_messenger_send_blocking (msger, resp, &error);
g_assert_no_error (error);
ufo_message_free (resp);
break;
default:
g_critical ("Unexpected message type: %d", msg->type);
break;
}
ufo_message_free (msg);
};
ufo_messenger_disconnect (msger);
g_object_unref (msger);
}
static void test_zmq_messenger (Fixture *fixture, gconstpointer unused)
{
GThread *server = g_thread_create ((GThreadFunc) handle_num_devices, NULL, TRUE, NULL);
GThread *client = g_thread_create ((GThreadFunc) send_num_devices_request, NULL, TRUE, NULL);
g_thread_join (client);
g_thread_join (server);
}
void
test_add_zmq_messenger (void)
{
g_test_add ("/opencl/zmq_messenger/test_messenger",
Fixture, NULL,
setup, test_zmq_messenger, teardown);
}