#include <gtest/gtest.h>
#include <climits>
#include "AllocationTestHarness.h"
extern "C" {
#include "osi/include/data_dispatcher.h"
#include "osi/include/fixed_queue.h"
#include "osi/include/osi.h"
}
#define DUMMY_TYPE_0 34
#define DUMMY_TYPE_1 42
#define TYPE_EDGE_CASE_ZERO 0
#define TYPE_EDGE_CASE_MAX INT_MAX
#define DUMMY_QUEUE_SIZE 10
class DataDispatcherTest : public AllocationTestHarness {};
static char dummy_data_0[42] = "please test your code";
static char dummy_data_1[42] = "testing is good for your sanity";
TEST_F(DataDispatcherTest, test_new_free_simple) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
ASSERT_TRUE(dispatcher != NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_nowhere) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
EXPECT_FALSE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_single) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
// Send data to the queue
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
// Did we get it?
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
fixed_queue_free(dummy_queue, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_multiple) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register two queues
fixed_queue_t *dummy_queue0 = fixed_queue_new(DUMMY_QUEUE_SIZE);
fixed_queue_t *dummy_queue1 = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue0);
data_dispatcher_register(dispatcher, DUMMY_TYPE_1, dummy_queue1);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
// Send data to one of them
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
// Did we get it?
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
fixed_queue_free(dummy_queue0, NULL);
fixed_queue_free(dummy_queue1, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_default) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register two queues, a default and a typed one
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
fixed_queue_t *default_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
data_dispatcher_register_default(dispatcher, default_queue);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
EXPECT_TRUE(fixed_queue_is_empty(default_queue));
// Send data to nowhere
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_1, dummy_data_1));
// Did we get it?
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
EXPECT_FALSE(fixed_queue_is_empty(default_queue));
EXPECT_STREQ(dummy_data_1, (char *)fixed_queue_try_dequeue(default_queue));
EXPECT_TRUE(fixed_queue_is_empty(default_queue));
fixed_queue_free(dummy_queue, NULL);
fixed_queue_free(default_queue, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_multiple_to_single) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
// Send data to the queue
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_1));
// Did we get it?
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue));
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
EXPECT_STREQ(dummy_data_1, (char *)fixed_queue_try_dequeue(dummy_queue));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
fixed_queue_free(dummy_queue, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_multiple_to_multiple) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register two queues
fixed_queue_t *dummy_queue0 = fixed_queue_new(DUMMY_QUEUE_SIZE);
fixed_queue_t *dummy_queue1 = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue0);
data_dispatcher_register(dispatcher, DUMMY_TYPE_1, dummy_queue1);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
// Send data to both of them
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_1, dummy_data_1));
// Did we get it?
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue0));
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue1));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue0));
EXPECT_STREQ(dummy_data_1, (char *)fixed_queue_try_dequeue(dummy_queue1));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
fixed_queue_free(dummy_queue0, NULL);
fixed_queue_free(dummy_queue1, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_single_reregistered) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue, then reregister
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
fixed_queue_t *dummy_queue_reregistered = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue_reregistered);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue_reregistered));
// Send data to the queue
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
// Did we get it?
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue_reregistered));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue_reregistered));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue_reregistered));
fixed_queue_free(dummy_queue, NULL);
fixed_queue_free(dummy_queue_reregistered, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_reregistered_null) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
data_dispatcher_register(dispatcher, DUMMY_TYPE_0, NULL);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
EXPECT_FALSE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
fixed_queue_free(dummy_queue, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_single_to_default_reregistered_null) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register_default(dispatcher, dummy_queue);
data_dispatcher_register_default(dispatcher, NULL);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
EXPECT_FALSE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
fixed_queue_free(dummy_queue, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_edge_zero) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, TYPE_EDGE_CASE_ZERO, dummy_queue);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
// Send data to the queue
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, TYPE_EDGE_CASE_ZERO, dummy_data_0));
// Did we get it?
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
fixed_queue_free(dummy_queue, NULL);
data_dispatcher_free(dispatcher);
}
TEST_F(DataDispatcherTest, test_dispatch_edge_max) {
data_dispatcher_t *dispatcher = data_dispatcher_new("test_dispatcher");
// Register a queue
fixed_queue_t *dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
data_dispatcher_register(dispatcher, TYPE_EDGE_CASE_MAX, dummy_queue);
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
// Send data to the queue
EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, TYPE_EDGE_CASE_MAX, dummy_data_0));
// Did we get it?
EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
EXPECT_STREQ(dummy_data_0, (char *)fixed_queue_try_dequeue(dummy_queue));
EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
fixed_queue_free(dummy_queue, NULL);
data_dispatcher_free(dispatcher);
}