tests: pipes: Add pipe flush tests
Extends the pipes tests to include tests for k_pipe_flush() and k_pipe_buffer_flush(). Signed-off-by: Peter Mitsis <peter.mitsis@intel.com>
This commit is contained in:
parent
d1353a4584
commit
192265c661
2 changed files with 135 additions and 2 deletions
|
@ -17,8 +17,10 @@ extern void test_pipe_get_invalid_size(void);
|
||||||
extern void test_pipe_get_min_xfer(void);
|
extern void test_pipe_get_min_xfer(void);
|
||||||
extern void test_pipe_put_min_xfer(void);
|
extern void test_pipe_put_min_xfer(void);
|
||||||
extern void test_pipe_define_at_runtime(void);
|
extern void test_pipe_define_at_runtime(void);
|
||||||
|
extern void test_pipe_flush(void);
|
||||||
|
|
||||||
extern struct k_pipe test_pipe;
|
extern struct k_pipe test_pipe;
|
||||||
|
extern struct k_pipe small_pipe;
|
||||||
extern struct k_sem put_sem, get_sem, sync_sem, multiple_send_sem;
|
extern struct k_sem put_sem, get_sem, sync_sem, multiple_send_sem;
|
||||||
extern struct k_stack stack_1;
|
extern struct k_stack stack_1;
|
||||||
extern struct k_thread get_single_tid;
|
extern struct k_thread get_single_tid;
|
||||||
|
@ -27,7 +29,7 @@ extern struct k_thread get_single_tid;
|
||||||
void test_main(void)
|
void test_main(void)
|
||||||
{
|
{
|
||||||
k_thread_access_grant(k_current_get(),
|
k_thread_access_grant(k_current_get(),
|
||||||
&test_pipe, &put_sem, &get_sem,
|
&test_pipe, &small_pipe, &put_sem, &get_sem,
|
||||||
&sync_sem, &multiple_send_sem,
|
&sync_sem, &multiple_send_sem,
|
||||||
&get_single_tid, &stack_1);
|
&get_single_tid, &stack_1);
|
||||||
|
|
||||||
|
@ -42,7 +44,8 @@ void test_main(void)
|
||||||
ztest_user_unit_test(test_pipe_get_invalid_size),
|
ztest_user_unit_test(test_pipe_get_invalid_size),
|
||||||
ztest_user_unit_test(test_pipe_get_min_xfer),
|
ztest_user_unit_test(test_pipe_get_min_xfer),
|
||||||
ztest_user_unit_test(test_pipe_put_min_xfer),
|
ztest_user_unit_test(test_pipe_put_min_xfer),
|
||||||
ztest_unit_test(test_pipe_define_at_runtime)
|
ztest_unit_test(test_pipe_define_at_runtime),
|
||||||
|
ztest_unit_test(test_pipe_flush)
|
||||||
);
|
);
|
||||||
|
|
||||||
ztest_run_test_suite(test_pipe);
|
ztest_run_test_suite(test_pipe);
|
||||||
|
|
|
@ -14,6 +14,8 @@ K_PIPE_DEFINE(test_pipe, 256, 4);
|
||||||
#define STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACKSIZE)
|
#define STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACKSIZE)
|
||||||
#define PIPE_SIZE (256)
|
#define PIPE_SIZE (256)
|
||||||
|
|
||||||
|
K_PIPE_DEFINE(small_pipe, 10, 4);
|
||||||
|
|
||||||
K_THREAD_STACK_DEFINE(stack_1, STACK_SIZE);
|
K_THREAD_STACK_DEFINE(stack_1, STACK_SIZE);
|
||||||
|
|
||||||
K_SEM_DEFINE(get_sem, 0, 1);
|
K_SEM_DEFINE(get_sem, 0, 1);
|
||||||
|
@ -1024,3 +1026,131 @@ void test_pipe_define_at_runtime(void)
|
||||||
PIPE_SIZE, &read,
|
PIPE_SIZE, &read,
|
||||||
PIPE_SIZE, TIMEOUT_VAL), -EAGAIN, NULL);
|
PIPE_SIZE, TIMEOUT_VAL), -EAGAIN, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Helper thread to test k_pipe_flush() and k_pipe_buffer_flush()
|
||||||
|
*
|
||||||
|
* This helper thread attempts to write 50 bytes to the pipe identified by
|
||||||
|
* [p1], which has an internal buffer size of 10. This helper thread is
|
||||||
|
* expected to fill the internal buffer, and then block until it can complete
|
||||||
|
* the write.
|
||||||
|
*/
|
||||||
|
void test_pipe_flush_helper(void *p1, void *p2, void *p3)
|
||||||
|
{
|
||||||
|
struct k_pipe *pipe = (struct k_pipe *)p1;
|
||||||
|
char buffer[50];
|
||||||
|
size_t i;
|
||||||
|
size_t bytes_written;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(buffer); i++) {
|
||||||
|
buffer[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = k_pipe_put(pipe, buffer, sizeof(buffer), &bytes_written,
|
||||||
|
sizeof(buffer), K_FOREVER);
|
||||||
|
|
||||||
|
zassert_true(rv == 0, "k_pipe_put() failed with %d", rv);
|
||||||
|
zassert_true(bytes_written == sizeof(buffer),
|
||||||
|
"Expected %zu bytes written, not %zu",
|
||||||
|
sizeof(buffer), bytes_written);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test flushing a pipe
|
||||||
|
*
|
||||||
|
* @ingroup kernel_pipe_tests
|
||||||
|
*
|
||||||
|
* @details
|
||||||
|
* Test Objective:
|
||||||
|
* - Check if the kernel flushes a pipe properly at runtime.
|
||||||
|
*
|
||||||
|
* Testing techniques:
|
||||||
|
* - function and block box testing,Interface testing,
|
||||||
|
* Dynamic analysis and testing.
|
||||||
|
*
|
||||||
|
* Prerequisite Conditions:
|
||||||
|
* - CONFIG_TEST_USERSPACE.
|
||||||
|
*
|
||||||
|
* Input Specifications:
|
||||||
|
* - N/A
|
||||||
|
*
|
||||||
|
* Test Procedure:
|
||||||
|
* -# Define and initialize a pipe at run time
|
||||||
|
* -# Use this pipe to transfer data.
|
||||||
|
* -# Have a thread fill and block on writing to the pipe
|
||||||
|
* -# Flush the pipe and check that the pipe is completely empty
|
||||||
|
* -# Have a thread fill and block on writing to the pipe
|
||||||
|
* -# Flush only the pipe's buffer and check the results
|
||||||
|
*
|
||||||
|
* Expected Test Result:
|
||||||
|
* - Reading from the pipe after k_pipe_flush() results in no data to read.
|
||||||
|
* - Reading from the pipe after k_pipe_buffer_flush() results in read data,
|
||||||
|
* but missing the original data that was in the buffer prior to the flush.
|
||||||
|
*
|
||||||
|
* Pass/Fail Criteria:
|
||||||
|
* - Successful if check points in test procedure are all passed, otherwise
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
* Assumptions and Constraints:
|
||||||
|
* - N/A
|
||||||
|
*/
|
||||||
|
void test_pipe_flush(void)
|
||||||
|
{
|
||||||
|
unsigned char results_buffer[50];
|
||||||
|
size_t bytes_read;
|
||||||
|
size_t i;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
memset(results_buffer, 0, sizeof(results_buffer));
|
||||||
|
|
||||||
|
(void)k_thread_create(&get_single_tid, stack_1, STACK_SIZE,
|
||||||
|
test_pipe_flush_helper, &small_pipe, NULL, NULL,
|
||||||
|
K_PRIO_PREEMPT(0), K_INHERIT_PERMS | K_USER,
|
||||||
|
K_NO_WAIT);
|
||||||
|
|
||||||
|
k_sleep(K_MSEC(50)); /* give helper thread time to execute */
|
||||||
|
|
||||||
|
/* Completely flush the pipe */
|
||||||
|
|
||||||
|
k_pipe_flush(&small_pipe);
|
||||||
|
|
||||||
|
rv = k_pipe_get(&small_pipe, results_buffer, sizeof(results_buffer),
|
||||||
|
&bytes_read, 0, K_MSEC(100));
|
||||||
|
|
||||||
|
zassert_true(rv == 0, "k_pipe_get() failed with %d\n", rv);
|
||||||
|
zassert_true(bytes_read == 0,
|
||||||
|
"k_pipe_get() unexpectedly read %zu bytes\n", bytes_read);
|
||||||
|
|
||||||
|
rv = k_thread_join(&get_single_tid, K_MSEC(50));
|
||||||
|
zassert_true(rv == 0, "Wait for helper thread failed (%d)", rv);
|
||||||
|
|
||||||
|
(void)k_thread_create(&get_single_tid, stack_1, STACK_SIZE,
|
||||||
|
test_pipe_flush_helper, &small_pipe, NULL, NULL,
|
||||||
|
K_PRIO_PREEMPT(0), K_INHERIT_PERMS | K_USER,
|
||||||
|
K_NO_WAIT);
|
||||||
|
|
||||||
|
k_sleep(K_MSEC(50)); /* give helper thread time to execute */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only flush the pipe's buffer. This is expected to leave 40 bytes
|
||||||
|
* left to receive.
|
||||||
|
*/
|
||||||
|
|
||||||
|
k_pipe_buffer_flush(&small_pipe);
|
||||||
|
|
||||||
|
rv = k_pipe_get(&small_pipe, results_buffer, sizeof(results_buffer),
|
||||||
|
&bytes_read, 0, K_MSEC(100));
|
||||||
|
|
||||||
|
zassert_true(rv == 0, "k_pipe_get() failed with %d\n", rv);
|
||||||
|
zassert_true(bytes_read == 40,
|
||||||
|
"k_pipe_get() unexpectedly read %zu bytes\n", bytes_read);
|
||||||
|
for (i = 0; i < 40; i++) {
|
||||||
|
zassert_true(results_buffer[i] == (unsigned char)(i + 10),
|
||||||
|
"At offset %zd, expected byte %02x, not %02x\n",
|
||||||
|
i, (i + 10), results_buffer[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = k_thread_join(&get_single_tid, K_MSEC(50));
|
||||||
|
zassert_true(rv == 0, "Wait for helper thread failed (%d)", rv);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue