net: Add unit tests for new nbuf API's

Tests for net_nbuf_read, net_nbuf_write and net_nbuf_skip API's.

Change-Id: I77f702dda8c9df7892120f47ff03a6b256191d31
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This commit is contained in:
Ravi kumar Veeramally 2016-09-22 11:26:13 +03:00 committed by Jukka Rissanen
commit 913c1f29ca
2 changed files with 177 additions and 1 deletions

View file

@ -6,7 +6,7 @@ CONFIG_NET_BUF=y
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_NET_NBUF_RX_COUNT=4
CONFIG_NET_NBUF_TX_COUNT=4
CONFIG_NET_NBUF_DATA_COUNT=25
CONFIG_NET_NBUF_DATA_COUNT=34
# The data size is calculated to be this, do not change
# it without fixing the tests.
CONFIG_NET_NBUF_DATA_SIZE=100

View file

@ -584,6 +584,178 @@ static int test_fragment_pull(void)
return 0;
}
static char test_rw_short[] = "test-read-write-data";
static char test_rw_long[] =
"test-read-write-data-test-read-write"
"test-read-write-data-test-read-write"
"test-read-write-data-test-read-write"
"test-read-write-data-test-read-write"
"test-read-write-data-test-read-write"
"test-read-write-data-test-read-write";
static int test_nbuf_read_write(void)
{
struct net_buf *buf, *frag, *tfrag;
struct ipv6_hdr *ipv6;
struct udp_hdr *udp;
uint8_t verify_rw_short[sizeof(test_rw_short)];
uint8_t verify_rw_long[sizeof(test_rw_long)];
int bytes, remaining = strlen(example_data), pos = 0;
uint16_t off, tpos;
/* Example of multi fragment read, write and skip APS's */
buf = net_nbuf_get_reserve_rx(0);
frag = net_nbuf_get_reserve_data(LL_RESERVE);
/* Place the IP + UDP header in the first fragment */
if (!net_buf_tailroom(frag)) {
ipv6 = (struct ipv6_hdr *)(frag->data);
udp = (struct udp_hdr *)((void *)ipv6 + sizeof(*ipv6));
if (net_buf_tailroom(frag) < sizeof(ipv6)) {
printk("Not enough space for IPv6 header, "
"needed %zd bytes, has %zd bytes\n",
sizeof(ipv6), net_buf_tailroom(frag));
return -EINVAL;
}
net_buf_add(frag, sizeof(ipv6));
if (net_buf_tailroom(frag) < sizeof(udp)) {
printk("Not enough space for UDP header, "
"needed %zd bytes, has %zd bytes\n",
sizeof(udp), net_buf_tailroom(frag));
return -EINVAL;
}
net_nbuf_set_appdata(buf, (void *)udp + sizeof(*udp));
net_nbuf_set_appdatalen(buf, 0);
}
net_buf_frag_add(buf, frag);
/* Put some data to rest of the fragments */
frag = net_nbuf_get_reserve_data(LL_RESERVE);
if (net_buf_tailroom(frag) -
(CONFIG_NET_NBUF_DATA_SIZE - LL_RESERVE)) {
printk("Invalid number of bytes available in the buf, "
"should be 0 but was %zd - %d\n",
net_buf_tailroom(frag),
CONFIG_NET_NBUF_DATA_SIZE - LL_RESERVE);
return -EINVAL;
}
if (((int)net_buf_tailroom(frag) - remaining) > 0) {
printk("We should have been out of space now, "
"tailroom %zd user data len %zd\n",
net_buf_tailroom(frag),
strlen(example_data));
return -EINVAL;
}
while (remaining > 0) {
int copy;
bytes = net_buf_tailroom(frag);
copy = remaining > bytes ? bytes : remaining;
memcpy(net_buf_add(frag, copy), &example_data[pos], copy);
printk("Remaining %d left %d copy %d\n", remaining, bytes,
copy);
pos += bytes;
remaining -= bytes;
if (net_buf_tailroom(frag) - (bytes - copy)) {
printk("There should have not been any tailroom left, "
"tailroom %zd\n",
net_buf_tailroom(frag) - (bytes - copy));
return -EINVAL;
}
net_buf_frag_add(buf, frag);
if (remaining > 0) {
frag = net_nbuf_get_reserve_data(LL_RESERVE);
}
}
bytes = net_buf_frags_len(buf->frags);
if (bytes != strlen(example_data)) {
printk("Invalid number of bytes in message, %zd vs %d\n",
strlen(example_data), bytes);
return -EINVAL;
}
/* Short data test case */
/* Test case scenario:
* 1) Cache the current fragment and offset
* 2) Write short data
* 3) Write short data again
* 4) Skip first short data from cached frag or offset
* 5) Read short data and compare
*/
tfrag = net_buf_frag_last(buf->frags);
off = tfrag->len;
if (!net_nbuf_write(buf, sizeof(test_rw_short), test_rw_short)) {
printk("net_nbuf_write failed\n");
return -EINVAL;
}
if (!net_nbuf_write(buf, sizeof(test_rw_short), test_rw_short)) {
printk("net_nbuf_write failed\n");
return -EINVAL;
}
tfrag = net_nbuf_skip(tfrag, off, &tpos, sizeof(test_rw_short));
if (!tfrag) {
printk("net_nbuf_skip failed\n");
return -EINVAL;
}
tfrag = net_nbuf_read(tfrag, tpos, &tpos, sizeof(test_rw_short),
verify_rw_short);
if (memcmp(test_rw_short, verify_rw_short, sizeof(test_rw_short))) {
printk("net_nbuf_read failed with mismatch data");
return -EINVAL;
}
/* Long data test case */
/* Test case scenario:
* 1) Cache the current fragment and offset
* 2) Write long data
* 3) Write long data again
* 4) Skip first long data from cached frag or offset
* 5) Read long data and compare
*/
tfrag = net_buf_frag_last(buf->frags);
off = tfrag->len;
if (!net_nbuf_write(buf, sizeof(test_rw_long), test_rw_long)) {
printk("net_nbuf_write failed\n");
return -EINVAL;
}
if (!net_nbuf_write(buf, sizeof(test_rw_long), test_rw_long)) {
printk("net_nbuf_write failed\n");
return -EINVAL;
}
tfrag = net_nbuf_skip(tfrag, off, &tpos, sizeof(test_rw_long));
if (!tfrag) {
printk("net_nbuf_skip failed\n");
return -EINVAL;
}
tfrag = net_nbuf_read(tfrag, tpos, &tpos, sizeof(test_rw_long),
verify_rw_long);
if (memcmp(test_rw_long, verify_rw_long, sizeof(test_rw_long))) {
printk("net_nbuf_read failed with mismatch data");
return -EINVAL;
}
net_nbuf_unref(buf);
return 0;
}
#ifdef CONFIG_MICROKERNEL
void mainloop(void)
#else
@ -606,6 +778,10 @@ void main(void)
goto fail;
}
if (test_nbuf_read_write() < 0) {
goto fail;
}
printk("nbuf tests passed\n");
TC_END_REPORT(TC_PASS);