xref: /spdk/test/unit/lib/util/pipe.c/pipe_ut.c (revision 75a12cbf919f9587b358cb1dd70e812f2c93a261)
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