1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2019 Intel Corporation. 3063252faSBen Walker * All rights reserved. 4063252faSBen Walker */ 5063252faSBen Walker 6063252faSBen Walker #include "spdk/stdinc.h" 7063252faSBen Walker 8ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h" 9063252faSBen Walker 10063252faSBen Walker #include "util/pipe.c" 11063252faSBen Walker #include "common/lib/test_env.c" 12063252faSBen Walker 13063252faSBen Walker static void 14063252faSBen Walker test_create_destroy(void) 15063252faSBen Walker { 16063252faSBen Walker struct spdk_pipe *pipe; 17063252faSBen Walker uint8_t mem[10]; 18063252faSBen Walker 19063252faSBen Walker pipe = spdk_pipe_create(mem, sizeof(mem)); 20063252faSBen Walker SPDK_CU_ASSERT_FATAL(pipe != NULL); 21063252faSBen Walker 22063252faSBen Walker spdk_pipe_destroy(pipe); 23063252faSBen Walker } 24063252faSBen Walker 25063252faSBen Walker static void 26063252faSBen Walker test_write_get_buffer(void) 27063252faSBen Walker { 28063252faSBen Walker struct spdk_pipe *pipe; 29063252faSBen Walker uint8_t mem[10]; 30063252faSBen Walker struct iovec iovs[2]; 31063252faSBen Walker int rc; 32063252faSBen Walker 33063252faSBen Walker pipe = spdk_pipe_create(mem, sizeof(mem)); 34063252faSBen Walker SPDK_CU_ASSERT_FATAL(pipe != NULL); 35063252faSBen Walker 36063252faSBen Walker /* Get some available memory. */ 37063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 5, iovs); 38063252faSBen Walker CU_ASSERT(rc == 5); 39063252faSBen Walker CU_ASSERT(iovs[0].iov_base == mem); 40063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 5); 41063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 42063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 43063252faSBen Walker CU_ASSERT(pipe->write == 0); 44063252faSBen Walker CU_ASSERT(pipe->read == 0); 45063252faSBen Walker 46063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 47063252faSBen Walker 48063252faSBen Walker /* Get 0 bytes. */ 49063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 0, iovs); 50063252faSBen Walker CU_ASSERT(rc == 0); 51063252faSBen Walker CU_ASSERT(iovs[0].iov_base == NULL); 52063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 0); 53063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 54063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 55063252faSBen Walker CU_ASSERT(pipe->write == 0); 56063252faSBen Walker CU_ASSERT(pipe->read == 0); 57063252faSBen Walker 58063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 59063252faSBen Walker 60063252faSBen Walker /* Get all available memory */ 61063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 10, iovs); 626648ea0fSBen Walker CU_ASSERT(rc == 10); 63063252faSBen Walker CU_ASSERT(iovs[0].iov_base == mem); 646648ea0fSBen Walker CU_ASSERT(iovs[0].iov_len == 10); 65063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 66063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 67063252faSBen Walker CU_ASSERT(pipe->write == 0); 68063252faSBen Walker CU_ASSERT(pipe->read == 0); 69063252faSBen Walker 70063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 71063252faSBen Walker 72063252faSBen Walker /* Advance the write pointer 7 bytes in. */ 73063252faSBen Walker pipe->write = 7; 74063252faSBen Walker 75063252faSBen Walker /* Get all of the available memory. */ 766648ea0fSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 3, iovs); 776648ea0fSBen Walker CU_ASSERT(rc == 3); 78063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 796648ea0fSBen Walker CU_ASSERT(iovs[0].iov_len == 3); 80063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 81063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 82063252faSBen Walker CU_ASSERT(pipe->write == 7); 83063252faSBen Walker CU_ASSERT(pipe->read == 0); 84063252faSBen Walker 85063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 86063252faSBen Walker 87063252faSBen Walker /* Get more than the available memory */ 886648ea0fSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 4, iovs); 896648ea0fSBen Walker CU_ASSERT(rc == 3); 90063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 916648ea0fSBen Walker CU_ASSERT(iovs[0].iov_len == 3); 92063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 93063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 94063252faSBen Walker CU_ASSERT(pipe->write == 7); 95063252faSBen Walker CU_ASSERT(pipe->read == 0); 96063252faSBen Walker 97063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 98063252faSBen Walker 99063252faSBen Walker /* Advance the read pointer 3 bytes in. */ 100063252faSBen Walker pipe->read = 3; 101063252faSBen Walker 102063252faSBen Walker /* Get all of the available memory. */ 1036648ea0fSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 6, iovs); 1046648ea0fSBen Walker CU_ASSERT(rc == 6); 105063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 106063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 3); 107063252faSBen Walker CU_ASSERT(iovs[1].iov_base == mem); 1086648ea0fSBen Walker CU_ASSERT(iovs[1].iov_len == 3); 109063252faSBen Walker CU_ASSERT(pipe->write == 7); 110063252faSBen Walker CU_ASSERT(pipe->read == 3); 111063252faSBen Walker 112063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 113063252faSBen Walker 114063252faSBen Walker /* Get more than the available memory */ 1156648ea0fSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 7, iovs); 1166648ea0fSBen Walker CU_ASSERT(rc == 6); 117063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 118063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 3); 119063252faSBen Walker CU_ASSERT(iovs[1].iov_base == mem); 1206648ea0fSBen Walker CU_ASSERT(iovs[1].iov_len == 3); 121063252faSBen Walker CU_ASSERT(pipe->write == 7); 122063252faSBen Walker CU_ASSERT(pipe->read == 3); 123063252faSBen Walker 124063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 125063252faSBen Walker 126063252faSBen Walker /* Advance the read pointer past the write pointer */ 127063252faSBen Walker pipe->read = 9; 128063252faSBen Walker 129063252faSBen Walker /* Get all of the available memory. */ 1306648ea0fSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 2, iovs); 1316648ea0fSBen Walker CU_ASSERT(rc == 2); 132063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 1336648ea0fSBen Walker CU_ASSERT(iovs[0].iov_len == 2); 134063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 135063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 136063252faSBen Walker CU_ASSERT(pipe->write == 7); 137063252faSBen Walker CU_ASSERT(pipe->read == 9); 138063252faSBen Walker 139063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 140063252faSBen Walker 141063252faSBen Walker /* Get more than the available memory */ 1426648ea0fSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 3, iovs); 1436648ea0fSBen Walker CU_ASSERT(rc == 2); 144063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 1456648ea0fSBen Walker CU_ASSERT(iovs[0].iov_len == 2); 146063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 147063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 148063252faSBen Walker CU_ASSERT(pipe->write == 7); 149063252faSBen Walker CU_ASSERT(pipe->read == 9); 150063252faSBen Walker 151063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 152063252faSBen Walker 153063252faSBen Walker /* Fill the pipe */ 1546648ea0fSBen Walker pipe->write = 9; 1556648ea0fSBen Walker pipe->full = true; 156063252faSBen Walker 157063252faSBen Walker /* Get data while the pipe is full */ 158063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 1, iovs); 159063252faSBen Walker CU_ASSERT(rc == 0); 160063252faSBen Walker CU_ASSERT(iovs[0].iov_base == NULL); 161063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 0); 162063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 163063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 1646648ea0fSBen Walker CU_ASSERT(pipe->write == 9); 165063252faSBen Walker CU_ASSERT(pipe->read == 9); 166063252faSBen Walker 167063252faSBen Walker spdk_pipe_destroy(pipe); 168063252faSBen Walker } 169063252faSBen Walker 170063252faSBen Walker static void 171063252faSBen Walker test_write_advance(void) 172063252faSBen Walker { 173063252faSBen Walker struct spdk_pipe *pipe; 174063252faSBen Walker uint8_t mem[10]; 175063252faSBen Walker int rc; 176063252faSBen Walker 177063252faSBen Walker pipe = spdk_pipe_create(mem, sizeof(mem)); 178063252faSBen Walker SPDK_CU_ASSERT_FATAL(pipe != NULL); 179063252faSBen Walker 180063252faSBen Walker /* Advance half way through the pipe */ 181063252faSBen Walker rc = spdk_pipe_writer_advance(pipe, 5); 182063252faSBen Walker CU_ASSERT(rc == 0); 183063252faSBen Walker CU_ASSERT(pipe->write == 5); 184063252faSBen Walker CU_ASSERT(pipe->read == 0); 1856648ea0fSBen Walker CU_ASSERT(!pipe->full); 186063252faSBen Walker 187063252faSBen Walker pipe->write = 0; 1886648ea0fSBen Walker pipe->full = false; 189063252faSBen Walker 190063252faSBen Walker /* Advance to the end of the pipe */ 1916648ea0fSBen Walker rc = spdk_pipe_writer_advance(pipe, 10); 192063252faSBen Walker CU_ASSERT(rc == 0); 1936648ea0fSBen Walker CU_ASSERT(pipe->write == 0); 194063252faSBen Walker CU_ASSERT(pipe->read == 0); 1956648ea0fSBen Walker CU_ASSERT(pipe->full); 196063252faSBen Walker 197063252faSBen Walker pipe->write = 0; 1986648ea0fSBen Walker pipe->full = false; 199063252faSBen Walker 200063252faSBen Walker /* Advance beyond the end */ 2016648ea0fSBen Walker rc = spdk_pipe_writer_advance(pipe, 11); 202063252faSBen Walker CU_ASSERT(rc == -EINVAL); 203063252faSBen Walker CU_ASSERT(pipe->write == 0); 204063252faSBen Walker CU_ASSERT(pipe->read == 0); 2056648ea0fSBen Walker CU_ASSERT(!pipe->full); 206063252faSBen Walker 207063252faSBen Walker /* Move the read pointer forward */ 208063252faSBen Walker pipe->write = 0; 209063252faSBen Walker pipe->read = 5; 2106648ea0fSBen Walker pipe->full = false; 211063252faSBen Walker 212063252faSBen Walker /* Advance to the end of the pipe */ 2136648ea0fSBen Walker rc = spdk_pipe_writer_advance(pipe, 5); 214063252faSBen Walker CU_ASSERT(rc == 0); 2156648ea0fSBen Walker CU_ASSERT(pipe->write == 5); 216063252faSBen Walker CU_ASSERT(pipe->read == 5); 2176648ea0fSBen Walker CU_ASSERT(pipe->full); 218063252faSBen Walker 219063252faSBen Walker pipe->write = 0; 220063252faSBen Walker pipe->read = 5; 2216648ea0fSBen Walker pipe->full = false; 222063252faSBen Walker 223063252faSBen Walker /* Advance beyond the end */ 224063252faSBen Walker rc = spdk_pipe_writer_advance(pipe, 6); 225063252faSBen Walker CU_ASSERT(rc == -EINVAL); 2266648ea0fSBen Walker CU_ASSERT(pipe->write == 0); 2276648ea0fSBen Walker CU_ASSERT(pipe->read == 5); 2286648ea0fSBen Walker CU_ASSERT(!pipe->full); 2296648ea0fSBen Walker 2306648ea0fSBen Walker /* Test wrap around */ 2316648ea0fSBen Walker pipe->write = 7; 2326648ea0fSBen Walker pipe->read = 3; 2336648ea0fSBen Walker pipe->full = false; 2346648ea0fSBen Walker 2356648ea0fSBen Walker /* Advance to the end of the pipe */ 2366648ea0fSBen Walker rc = spdk_pipe_writer_advance(pipe, 6); 2376648ea0fSBen Walker CU_ASSERT(rc == 0); 2386648ea0fSBen Walker CU_ASSERT(pipe->write == 3); 2396648ea0fSBen Walker CU_ASSERT(pipe->read == 3); 2406648ea0fSBen Walker CU_ASSERT(pipe->full); 2416648ea0fSBen Walker 2426648ea0fSBen Walker pipe->write = 7; 2436648ea0fSBen Walker pipe->read = 3; 2446648ea0fSBen Walker pipe->full = false; 2456648ea0fSBen Walker 2466648ea0fSBen Walker /* Advance beyond the end */ 2476648ea0fSBen Walker rc = spdk_pipe_writer_advance(pipe, 7); 2486648ea0fSBen Walker CU_ASSERT(rc == -EINVAL); 249063252faSBen Walker CU_ASSERT(pipe->write == 7); 250063252faSBen Walker CU_ASSERT(pipe->read == 3); 2516648ea0fSBen Walker CU_ASSERT(!pipe->full); 252063252faSBen Walker 253063252faSBen Walker spdk_pipe_destroy(pipe); 254063252faSBen Walker } 255063252faSBen Walker 256063252faSBen Walker static void 257063252faSBen Walker test_read_get_buffer(void) 258063252faSBen Walker { 259063252faSBen Walker struct spdk_pipe *pipe; 260063252faSBen Walker uint8_t mem[10]; 261063252faSBen Walker struct iovec iovs[2]; 262063252faSBen Walker int rc; 263063252faSBen Walker 264063252faSBen Walker pipe = spdk_pipe_create(mem, sizeof(mem)); 265063252faSBen Walker SPDK_CU_ASSERT_FATAL(pipe != NULL); 266063252faSBen Walker 267063252faSBen Walker /* Set the write pointer to the end, making all data available. */ 268063252faSBen Walker pipe->write = 9; 269063252faSBen Walker 270063252faSBen Walker /* Get half the available memory. */ 271063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 5, iovs); 272063252faSBen Walker CU_ASSERT(rc == 5); 273063252faSBen Walker CU_ASSERT(iovs[0].iov_base == mem); 274063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 5); 275063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 276063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 277063252faSBen Walker CU_ASSERT(pipe->write == 9); 278063252faSBen Walker CU_ASSERT(pipe->read == 0); 279063252faSBen Walker 280063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 281063252faSBen Walker 282063252faSBen Walker /* Get 0 bytes. */ 283063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 0, iovs); 284063252faSBen Walker CU_ASSERT(rc == 0); 285063252faSBen Walker CU_ASSERT(iovs[0].iov_base == NULL); 286063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 0); 287063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 288063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 289063252faSBen Walker CU_ASSERT(pipe->write == 9); 290063252faSBen Walker CU_ASSERT(pipe->read == 0); 291063252faSBen Walker 292063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 293063252faSBen Walker 294063252faSBen Walker /* Get all available memory */ 295063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 9, iovs); 296063252faSBen Walker CU_ASSERT(rc == 9); 297063252faSBen Walker CU_ASSERT(iovs[0].iov_base == mem); 298063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 9); 299063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 300063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 301063252faSBen Walker CU_ASSERT(pipe->write == 9); 302063252faSBen Walker CU_ASSERT(pipe->read == 0); 303063252faSBen Walker 304063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 305063252faSBen Walker 306063252faSBen Walker /* Get more bytes than exist */ 307063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 10, iovs); 308063252faSBen Walker CU_ASSERT(rc == 9); 309063252faSBen Walker CU_ASSERT(iovs[0].iov_base == mem); 310063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 9); 311063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 312063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 313063252faSBen Walker CU_ASSERT(pipe->write == 9); 314063252faSBen Walker CU_ASSERT(pipe->read == 0); 315063252faSBen Walker 316063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 317063252faSBen Walker 318063252faSBen Walker /* Advance the read pointer 5 bytes in. */ 319063252faSBen Walker pipe->read = 5; 320063252faSBen Walker pipe->write = 0; 321063252faSBen Walker 322063252faSBen Walker /* Get all of the available memory. */ 323063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 5, iovs); 324063252faSBen Walker CU_ASSERT(rc == 5); 325063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 5)); 326063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 5); 327063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 328063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 329063252faSBen Walker CU_ASSERT(pipe->write == 0); 330063252faSBen Walker CU_ASSERT(pipe->read == 5); 331063252faSBen Walker 332063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 333063252faSBen Walker 334063252faSBen Walker /* Get more than the available memory */ 335063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 6, iovs); 336063252faSBen Walker CU_ASSERT(rc == 5); 337063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 5)); 338063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 5); 339063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 340063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 341063252faSBen Walker CU_ASSERT(pipe->write == 0); 342063252faSBen Walker CU_ASSERT(pipe->read == 5); 343063252faSBen Walker 344063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 345063252faSBen Walker 346063252faSBen Walker /* Invert the write and read pointers */ 347063252faSBen Walker pipe->read = 7; 348063252faSBen Walker pipe->write = 3; 349063252faSBen Walker 350063252faSBen Walker /* Get all of the available memory. */ 351063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 6, iovs); 352063252faSBen Walker CU_ASSERT(rc == 6); 353063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 354063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 3); 355063252faSBen Walker CU_ASSERT(iovs[1].iov_base == mem); 356063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 3); 357063252faSBen Walker CU_ASSERT(pipe->write == 3); 358063252faSBen Walker CU_ASSERT(pipe->read == 7); 359063252faSBen Walker 360063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 361063252faSBen Walker 362063252faSBen Walker /* Get more than the available memory */ 363063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 7, iovs); 364063252faSBen Walker CU_ASSERT(rc == 6); 365063252faSBen Walker CU_ASSERT(iovs[0].iov_base == (mem + 7)); 366063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 3); 367063252faSBen Walker CU_ASSERT(iovs[1].iov_base == mem); 368063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 3); 369063252faSBen Walker CU_ASSERT(pipe->write == 3); 370063252faSBen Walker CU_ASSERT(pipe->read == 7); 371063252faSBen Walker 372063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 373063252faSBen Walker 374063252faSBen Walker /* Empty the pipe */ 375063252faSBen Walker pipe->read = 8; 376063252faSBen Walker pipe->write = 8; 377063252faSBen Walker 378063252faSBen Walker /* Get data while the pipe is empty */ 379063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 1, iovs); 380063252faSBen Walker CU_ASSERT(rc == 0); 381063252faSBen Walker CU_ASSERT(iovs[0].iov_base == NULL); 382063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 0); 383063252faSBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 384063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 385063252faSBen Walker CU_ASSERT(pipe->write == 8); 386063252faSBen Walker CU_ASSERT(pipe->read == 8); 387063252faSBen Walker 388063252faSBen Walker spdk_pipe_destroy(pipe); 389063252faSBen Walker } 390063252faSBen Walker 391063252faSBen Walker static void 392063252faSBen Walker test_read_advance(void) 393063252faSBen Walker { 394063252faSBen Walker struct spdk_pipe *pipe; 395063252faSBen Walker uint8_t mem[10]; 396063252faSBen Walker int rc; 397063252faSBen Walker 398063252faSBen Walker pipe = spdk_pipe_create(mem, sizeof(mem)); 399063252faSBen Walker SPDK_CU_ASSERT_FATAL(pipe != NULL); 400063252faSBen Walker 401063252faSBen Walker pipe->read = 0; 402063252faSBen Walker pipe->write = 9; 403063252faSBen Walker 404063252faSBen Walker /* Advance half way through the pipe */ 405063252faSBen Walker rc = spdk_pipe_reader_advance(pipe, 5); 406063252faSBen Walker CU_ASSERT(rc == 0); 407063252faSBen Walker CU_ASSERT(pipe->read == 5); 408063252faSBen Walker CU_ASSERT(pipe->write == 9); 409063252faSBen Walker 410063252faSBen Walker pipe->read = 0; 411063252faSBen Walker pipe->write = 9; 412063252faSBen Walker 413f4cb9817SBen Walker /* Advance to the end of the pipe, which resets 414f4cb9817SBen Walker * it back to the beginning */ 415063252faSBen Walker rc = spdk_pipe_reader_advance(pipe, 9); 416063252faSBen Walker CU_ASSERT(rc == 0); 417f4cb9817SBen Walker CU_ASSERT(pipe->read == 0); 418f4cb9817SBen Walker CU_ASSERT(pipe->write == 0); 419063252faSBen Walker 420063252faSBen Walker pipe->read = 0; 421063252faSBen Walker pipe->write = 9; 422063252faSBen Walker 423063252faSBen Walker /* Advance beyond the end */ 424063252faSBen Walker rc = spdk_pipe_reader_advance(pipe, 10); 425063252faSBen Walker CU_ASSERT(rc == -EINVAL); 426063252faSBen Walker CU_ASSERT(pipe->read == 0); 427063252faSBen Walker CU_ASSERT(pipe->write == 9); 428063252faSBen Walker 429063252faSBen Walker /* Move the write pointer forward */ 430063252faSBen Walker pipe->read = 0; 431063252faSBen Walker pipe->write = 5; 432063252faSBen Walker 433f4cb9817SBen Walker /* Advance to the end of the pipe, which resets 434f4cb9817SBen Walker * it back to the beginning */ 435063252faSBen Walker rc = spdk_pipe_reader_advance(pipe, 5); 436063252faSBen Walker CU_ASSERT(rc == 0); 437f4cb9817SBen Walker CU_ASSERT(pipe->write == 0); 438f4cb9817SBen Walker CU_ASSERT(pipe->read == 0); 439063252faSBen Walker 440063252faSBen Walker pipe->read = 0; 441063252faSBen Walker pipe->write = 5; 442063252faSBen Walker 443063252faSBen Walker /* Advance beyond the end */ 444063252faSBen Walker rc = spdk_pipe_reader_advance(pipe, 6); 445063252faSBen Walker CU_ASSERT(rc == -EINVAL); 446063252faSBen Walker CU_ASSERT(pipe->read == 0); 447063252faSBen Walker CU_ASSERT(pipe->write == 5); 448063252faSBen Walker 449063252faSBen Walker /* Test wrap around */ 450063252faSBen Walker pipe->read = 7; 451063252faSBen Walker pipe->write = 3; 452063252faSBen Walker 453f4cb9817SBen Walker /* Advance to the end of the pipe, which resets 454f4cb9817SBen Walker * it back to the beginning */ 455063252faSBen Walker rc = spdk_pipe_reader_advance(pipe, 6); 456063252faSBen Walker CU_ASSERT(rc == 0); 457f4cb9817SBen Walker CU_ASSERT(pipe->read == 0); 458f4cb9817SBen Walker CU_ASSERT(pipe->write == 0); 459063252faSBen Walker 460063252faSBen Walker pipe->read = 7; 461063252faSBen Walker pipe->write = 3; 462063252faSBen Walker 463063252faSBen Walker /* Advance beyond the end */ 464063252faSBen Walker rc = spdk_pipe_writer_advance(pipe, 7); 465063252faSBen Walker CU_ASSERT(rc == -EINVAL); 466063252faSBen Walker CU_ASSERT(pipe->read == 7); 467063252faSBen Walker CU_ASSERT(pipe->write == 3); 468063252faSBen Walker 469063252faSBen Walker spdk_pipe_destroy(pipe); 470063252faSBen Walker } 471063252faSBen Walker 472063252faSBen Walker static void 473063252faSBen Walker test_data(void) 474063252faSBen Walker { 475063252faSBen Walker struct spdk_pipe *pipe; 476063252faSBen Walker uint8_t mem[10]; 477063252faSBen Walker struct iovec iovs[2]; 478063252faSBen Walker uint8_t *data; 479063252faSBen Walker int rc; 480063252faSBen Walker size_t i; 481063252faSBen Walker 482063252faSBen Walker memset(mem, 0, sizeof(mem)); 483063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 484063252faSBen Walker 485063252faSBen Walker pipe = spdk_pipe_create(mem, sizeof(mem)); 486063252faSBen Walker SPDK_CU_ASSERT_FATAL(pipe != NULL); 487063252faSBen Walker 488063252faSBen Walker /* Place 1 byte in the pipe */ 489063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 1, iovs); 490063252faSBen Walker CU_ASSERT(rc == 1); 491f4cb9817SBen Walker CU_ASSERT(iovs[0].iov_base == mem); 492063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 1); 493063252faSBen Walker 494063252faSBen Walker memset(iovs[0].iov_base, 'A', 1); 495063252faSBen Walker 496063252faSBen Walker rc = spdk_pipe_writer_advance(pipe, 1); 497063252faSBen Walker CU_ASSERT(rc == 0); 498063252faSBen Walker 499063252faSBen Walker CU_ASSERT(mem[0] == 'A'); 500063252faSBen Walker CU_ASSERT(mem[1] == 0); 501063252faSBen Walker CU_ASSERT(mem[2] == 0); 502063252faSBen Walker CU_ASSERT(mem[3] == 0); 503063252faSBen Walker CU_ASSERT(mem[4] == 0); 504063252faSBen Walker CU_ASSERT(mem[5] == 0); 505063252faSBen Walker CU_ASSERT(mem[6] == 0); 506063252faSBen Walker CU_ASSERT(mem[7] == 0); 507063252faSBen Walker CU_ASSERT(mem[8] == 0); 508063252faSBen Walker CU_ASSERT(mem[9] == 0); 509063252faSBen Walker 510063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 511063252faSBen Walker 512063252faSBen Walker /* Get 1 byte from the pipe */ 513063252faSBen Walker CU_ASSERT(spdk_pipe_reader_bytes_available(pipe) == 1); 514063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 10, iovs); 515063252faSBen Walker CU_ASSERT(rc == 1); 516063252faSBen Walker 517063252faSBen Walker data = iovs[0].iov_base; 518*75a12cbfSSlawomir Ptak CU_ASSERT(*data == 'A'); 519063252faSBen Walker 520063252faSBen Walker spdk_pipe_reader_advance(pipe, 1); 521063252faSBen Walker 522f4cb9817SBen Walker /* Put 9 more bytes in the pipe. The previous advance 523f4cb9817SBen Walker * should have reset the pipe to the beginning. */ 524063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 9, iovs); 525063252faSBen Walker CU_ASSERT(rc == 9); 526063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 9); 527063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 528063252faSBen Walker 529063252faSBen Walker memset(iovs[0].iov_base, 'B', iovs[0].iov_len); 530063252faSBen Walker 531063252faSBen Walker rc = spdk_pipe_writer_advance(pipe, 9); 532063252faSBen Walker CU_ASSERT(rc == 0); 533063252faSBen Walker 534f4cb9817SBen Walker CU_ASSERT(mem[0] == 'B'); 535063252faSBen Walker CU_ASSERT(mem[1] == 'B'); 536063252faSBen Walker CU_ASSERT(mem[2] == 'B'); 537063252faSBen Walker CU_ASSERT(mem[3] == 'B'); 538063252faSBen Walker CU_ASSERT(mem[4] == 'B'); 539063252faSBen Walker CU_ASSERT(mem[5] == 'B'); 540063252faSBen Walker CU_ASSERT(mem[6] == 'B'); 541063252faSBen Walker CU_ASSERT(mem[7] == 'B'); 542063252faSBen Walker CU_ASSERT(mem[8] == 'B'); 543f4cb9817SBen Walker CU_ASSERT(mem[9] == 0); 544063252faSBen Walker 545063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 546063252faSBen Walker 547063252faSBen Walker /* Get 7 bytes of the previously written 9. */ 548063252faSBen Walker CU_ASSERT(spdk_pipe_reader_bytes_available(pipe) == 9); 549063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 7, iovs); 550063252faSBen Walker CU_ASSERT(rc == 7); 551063252faSBen Walker 552063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 7); 553063252faSBen Walker data = iovs[0].iov_base; 554063252faSBen Walker for (i = 0; i < iovs[0].iov_len; i++) { 555063252faSBen Walker CU_ASSERT(data[i] == 'B'); 556063252faSBen Walker } 557063252faSBen Walker 558063252faSBen Walker spdk_pipe_reader_advance(pipe, 7); 559063252faSBen Walker 560063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 561063252faSBen Walker 562f4cb9817SBen Walker /* Put 1 more byte in the pipe */ 563063252faSBen Walker rc = spdk_pipe_writer_get_buffer(pipe, 1, iovs); 564063252faSBen Walker CU_ASSERT(rc == 1); 565063252faSBen Walker CU_ASSERT(iovs[0].iov_len == 1); 566063252faSBen Walker CU_ASSERT(iovs[1].iov_len == 0); 567063252faSBen Walker 568063252faSBen Walker memset(iovs[0].iov_base, 'C', iovs[0].iov_len); 569063252faSBen Walker 570063252faSBen Walker rc = spdk_pipe_writer_advance(pipe, 1); 571063252faSBen Walker CU_ASSERT(rc == 0); 572063252faSBen Walker 573f4cb9817SBen Walker CU_ASSERT(mem[0] == 'B'); 574063252faSBen Walker CU_ASSERT(mem[1] == 'B'); 575063252faSBen Walker CU_ASSERT(mem[2] == 'B'); 576063252faSBen Walker CU_ASSERT(mem[3] == 'B'); 577063252faSBen Walker CU_ASSERT(mem[4] == 'B'); 578063252faSBen Walker CU_ASSERT(mem[5] == 'B'); 579063252faSBen Walker CU_ASSERT(mem[6] == 'B'); 580063252faSBen Walker CU_ASSERT(mem[7] == 'B'); 581063252faSBen Walker CU_ASSERT(mem[8] == 'B'); 582f4cb9817SBen Walker CU_ASSERT(mem[9] == 'C'); 583063252faSBen Walker 584063252faSBen Walker memset(iovs, 0, sizeof(iovs)); 585063252faSBen Walker 586063252faSBen Walker /* Get all of the data out of the pipe */ 587063252faSBen Walker CU_ASSERT(spdk_pipe_reader_bytes_available(pipe) == 3); 588063252faSBen Walker rc = spdk_pipe_reader_get_buffer(pipe, 3, iovs); 589063252faSBen Walker CU_ASSERT(rc == 3); 590f4cb9817SBen Walker CU_ASSERT(iovs[0].iov_len == 3); 591f4cb9817SBen Walker CU_ASSERT(iovs[1].iov_len == 0); 592063252faSBen Walker 593063252faSBen Walker data = iovs[0].iov_base; 594063252faSBen Walker CU_ASSERT(data[0] == 'B'); 595063252faSBen Walker CU_ASSERT(data[1] == 'B'); 596f4cb9817SBen Walker CU_ASSERT(data[2] == 'C'); 597f4cb9817SBen Walker CU_ASSERT(iovs[1].iov_base == NULL); 598063252faSBen Walker 599063252faSBen Walker spdk_pipe_reader_advance(pipe, 3); 600063252faSBen Walker 601063252faSBen Walker spdk_pipe_destroy(pipe); 602063252faSBen Walker } 603063252faSBen Walker 604063252faSBen Walker int 605063252faSBen Walker main(int argc, char **argv) 606063252faSBen Walker { 607063252faSBen Walker CU_pSuite suite = NULL; 608063252faSBen Walker unsigned int num_failures; 609063252faSBen Walker 61078b696bcSVitaliy Mysak CU_initialize_registry(); 611063252faSBen Walker 612063252faSBen Walker suite = CU_add_suite("pipe", NULL, NULL); 613063252faSBen Walker 614dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_create_destroy); 615dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_get_buffer); 616dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_advance); 617dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_read_get_buffer); 618dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_read_advance); 619dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_data); 620063252faSBen Walker 621063252faSBen Walker 622ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL); 623063252faSBen Walker 624063252faSBen Walker CU_cleanup_registry(); 625063252faSBen Walker 626063252faSBen Walker return num_failures; 627063252faSBen Walker } 628