Files
OpenCellular/test/queue.c
Vic Yang 61ae739eef More queue unit test
Check queue_remove_unit returns 0 on queue empty.

BUG=chrome-os-partner:19236
TEST=Pass the test.
BRANCH=None

Change-Id: I3162ba5e57e9111e1896954d815c26882fa372eb
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/58331
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
2013-06-13 18:13:19 -07:00

168 lines
3.9 KiB
C

/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Test queue.
*/
#include "common.h"
#include "console.h"
#include "queue.h"
#include "test_util.h"
#include "timer.h"
#include "util.h"
static char buffer6[6]; /* Max 5 items in queue */
static struct queue test_queue6 = {
.buf_bytes = sizeof(buffer6),
.unit_bytes = sizeof(char),
.buf = buffer6,
};
static char buffer5[5]; /* Max 2 items (2 byte for each) in queue */
static struct queue test_queue5 = {
.buf_bytes = sizeof(buffer5),
.unit_bytes = 2,
.buf = buffer5,
};
#define LOOP_DEQUE(q, d, n) \
do { \
int i; \
for (i = 0; i < n; ++i) \
TEST_ASSERT(queue_remove_unit(&q, d + i)); \
} while (0)
static int test_queue6_empty(void)
{
char dummy = 1;
queue_reset(&test_queue6);
TEST_ASSERT(queue_is_empty(&test_queue6));
TEST_ASSERT(!queue_remove_unit(&test_queue6, &dummy));
queue_add_units(&test_queue6, &dummy, 1);
TEST_ASSERT(!queue_is_empty(&test_queue6));
return EC_SUCCESS;
}
static int test_queue6_reset(void)
{
char dummy = 1;
queue_reset(&test_queue6);
queue_add_units(&test_queue6, &dummy, 1);
queue_reset(&test_queue6);
TEST_ASSERT(queue_is_empty(&test_queue6));
return EC_SUCCESS;
}
static int test_queue6_fifo(void)
{
char buf1[3] = {1, 2, 3};
char buf2[3];
queue_reset(&test_queue6);
queue_add_units(&test_queue6, buf1 + 0, 1);
queue_add_units(&test_queue6, buf1 + 1, 1);
queue_add_units(&test_queue6, buf1 + 2, 1);
LOOP_DEQUE(test_queue6, buf2, 3);
TEST_ASSERT_ARRAY_EQ(buf1, buf2, 3);
return EC_SUCCESS;
}
static int test_queue6_multiple_units_add(void)
{
char buf1[5] = {1, 2, 3, 4, 5};
char buf2[5];
queue_reset(&test_queue6);
TEST_ASSERT(queue_has_space(&test_queue6, 5));
queue_add_units(&test_queue6, buf1, 5);
LOOP_DEQUE(test_queue6, buf2, 5);
TEST_ASSERT_ARRAY_EQ(buf1, buf2, 5);
return EC_SUCCESS;
}
static int test_queue6_removal(void)
{
char buf1[5] = {1, 2, 3, 4, 5};
char buf2[5];
queue_reset(&test_queue6);
queue_add_units(&test_queue6, buf1, 5);
/* 1, 2, 3, 4, 5 */
LOOP_DEQUE(test_queue6, buf2, 3);
TEST_ASSERT_ARRAY_EQ(buf1, buf2, 3);
/* 4, 5 */
queue_add_units(&test_queue6, buf1, 2);
/* 4, 5, 1, 2 */
TEST_ASSERT(queue_has_space(&test_queue6, 1));
TEST_ASSERT(!queue_has_space(&test_queue6, 2));
LOOP_DEQUE(test_queue6, buf2, 1);
TEST_ASSERT(buf2[0] == 4);
/* 5, 1, 2 */
queue_add_units(&test_queue6, buf1 + 2, 2);
/* 5, 1, 2, 3, 4 */
TEST_ASSERT(!queue_has_space(&test_queue6, 1));
LOOP_DEQUE(test_queue6, buf2, 1);
TEST_ASSERT(buf2[0] == 5);
LOOP_DEQUE(test_queue6, buf2, 4);
TEST_ASSERT_ARRAY_EQ(buf1, buf2, 4);
TEST_ASSERT(queue_is_empty(&test_queue6));
/* Empty */
queue_add_units(&test_queue6, buf1, 5);
LOOP_DEQUE(test_queue6, buf2, 5);
TEST_ASSERT_ARRAY_EQ(buf1, buf2, 5);
return EC_SUCCESS;
}
static int test_queue5_odd_even(void)
{
uint16_t buf1[3] = {1, 2, 3};
uint16_t buf2[3];
queue_reset(&test_queue5);
queue_add_units(&test_queue5, buf1, 1);
/* 1 */
TEST_ASSERT(!queue_has_space(&test_queue5, 2));
TEST_ASSERT(queue_has_space(&test_queue5, 1));
queue_add_units(&test_queue5, buf1 + 1, 1);
/* 1, 2 */
TEST_ASSERT(!queue_has_space(&test_queue5, 1));
LOOP_DEQUE(test_queue5, buf2, 2);
TEST_ASSERT_ARRAY_EQ(buf1, buf2, 2);
TEST_ASSERT(queue_is_empty(&test_queue5));
/* Empty */
TEST_ASSERT(!queue_has_space(&test_queue5, 3));
TEST_ASSERT(queue_has_space(&test_queue5, 2));
TEST_ASSERT(queue_has_space(&test_queue5, 1));
queue_add_units(&test_queue5, buf1 + 2, 1);
/* 3 */
LOOP_DEQUE(test_queue5, buf2, 1);
TEST_ASSERT(buf2[0] == 3);
TEST_ASSERT(queue_is_empty(&test_queue5));
return EC_SUCCESS;
}
void run_test(void)
{
test_reset();
RUN_TEST(test_queue6_empty);
RUN_TEST(test_queue6_reset);
RUN_TEST(test_queue6_fifo);
RUN_TEST(test_queue6_multiple_units_add);
RUN_TEST(test_queue6_removal);
RUN_TEST(test_queue5_odd_even);
test_print_result();
}