253 lines
9.5 KiB
C++
253 lines
9.5 KiB
C++
#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);
|
|
}
|