iPXE
linebuf_test.c File Reference

Line buffer self-tests. More...

#include <string.h>
#include <assert.h>
#include <ipxe/linebuf.h>
#include <ipxe/test.h>

Go to the source code of this file.

Data Structures

struct  linebuf_test
 A line buffer test. More...

Macros

#define DATA(...)
 Define inline raw data.
#define LINES(...)
 Define inline lines.
#define LINEBUF_TEST(name, DATA, LINES)
 Define a line buffer test.
#define linebuf_init_ok(linebuf)
#define linebuf_consume_ok(test, linebuf)
#define linebuf_accumulated_ok(test, linebuf)
#define linebuf_empty_ok(linebuf)
#define linebuf_ok(test)

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 LINEBUF_TEST (simple,("HTTP/1.1 200 OK\r\n" "Content-Length: 123\r\n" "Content-Type: text/plain\r\n" "\r\n"), LINES("HTTP/1.1 200 OK", "Content-Length: 123", "Content-Type: text/plain", ""))
 Simple line buffer test.
 LINEBUF_TEST (mixed,("LF only\n" "CRLF\r\n" "\n" "\n" "\r\n" "\r\n" "CR only\r"), LINES("LF only", "CRLF", "", "", "", "", NULL))
 Mixed line terminators.
 LINEBUF_TEST (split_1,("This line was"), LINES(NULL))
 Split consumption: part 1.
 LINEBUF_TEST (split_2,(" split across"), LINES(NULL))
 Split consumption: part 2.
 LINEBUF_TEST (split_3,(" multiple calls\r\nand so was this one\r"), LINES("This line was split across multiple calls", NULL))
 Split consumption: part 3.
 LINEBUF_TEST (split_4,("\nbut not this one\r\n"), LINES("and so was this one", "but not this one"))
 Split consumption: part 4.
 LINEBUF_TEST (split_5,(""), LINES(NULL))
 Split consumption: part 5.
 LINEBUF_TEST (split_6,("This line came after a zero-length call\r\n"), LINES("This line came after a zero-length call"))
 Split consumption: part 6.
 LINEBUF_TEST (embedded_nuls,("This\r\ntest\r\nincludes\r\n\r\nsome\0binary\0data\r\n"), LINES("This", "test", "includes", "", linebuf_failure))
 Embedded NULs.
static void linebuf_init_okx (struct line_buffer *linebuf, const char *file, unsigned int line)
 Report line buffer initialisation test result.
static void linebuf_consume_okx (struct linebuf_test *test, struct line_buffer *linebuf, const char *file, unsigned int line)
 Report line buffer consumption test result.
static void linebuf_accumulated_okx (struct linebuf_test *test, struct line_buffer *linebuf, const char *file, unsigned int line)
 Report line buffer accumulation test result.
static void linebuf_empty_okx (struct line_buffer *linebuf, const char *file, unsigned int line)
 Report line buffer emptying test result.
static void linebuf_okx (struct linebuf_test *test, const char *file, unsigned int line)
 Report line buffer combined test result.
static void linebuf_test_exec (void)
 Perform line buffer self-tests.

Variables

static const char linebuf_failure [1]
 Line buffer test expected failure indicator.
struct self_test linebuf_test __self_test
 Line buffer self-test.

Detailed Description

Line buffer self-tests.

Definition in file linebuf_test.c.

Macro Definition Documentation

◆ DATA

#define DATA ( ...)
Value:
{ __VA_ARGS__ }

Define inline raw data.

Definition at line 41 of file linebuf_test.c.

◆ LINES

◆ LINEBUF_TEST

#define LINEBUF_TEST ( name,
DATA,
LINES )
Value:
static const char name ## _data[] = DATA; \
static const char * name ## _lines[] = LINES; \
static struct linebuf_test name = { \
.data = name ## _data, \
.len = ( sizeof ( name ## _data ) - 1 /* NUL */ ), \
.lines = name ## _lines, \
.count = ( sizeof ( name ## _lines ) / \
sizeof ( name ## _lines[0] ) ), \
}
#define DATA(...)
Define inline data.
Definition acpi_test.c:74
const char * name
Definition ath9k_hw.c:1986
static unsigned int count
Number of entries.
Definition dwmac.h:220
#define LINES(...)
Define inline lines.
A line buffer test.

Define a line buffer test.

Parameters
nameTest name
DATARaw data
LINESExpected sequence of lines
Return values
testLine buffer test

Definition at line 69 of file linebuf_test.c.

69#define LINEBUF_TEST( name, DATA, LINES ) \
70 static const char name ## _data[] = DATA; \
71 static const char * name ## _lines[] = LINES; \
72 static struct linebuf_test name = { \
73 .data = name ## _data, \
74 .len = ( sizeof ( name ## _data ) - 1 /* NUL */ ), \
75 .lines = name ## _lines, \
76 .count = ( sizeof ( name ## _lines ) / \
77 sizeof ( name ## _lines[0] ) ), \
78 }

◆ linebuf_init_ok

#define linebuf_init_ok ( linebuf)
Value:
linebuf_init_okx ( linebuf, __FILE__, __LINE__ )
static void linebuf_init_okx(struct line_buffer *linebuf, const char *file, unsigned int line)
Report line buffer initialisation test result.

Definition at line 146 of file linebuf_test.c.

146#define linebuf_init_ok( linebuf ) \
147 linebuf_init_okx ( linebuf, __FILE__, __LINE__ )

Referenced by linebuf_test_exec().

◆ linebuf_consume_ok

#define linebuf_consume_ok ( test,
linebuf )
Value:
linebuf_consume_okx ( test, linebuf, __FILE__, __LINE__ )
static int test
Definition epic100.c:73
static void linebuf_consume_okx(struct linebuf_test *test, struct line_buffer *linebuf, const char *file, unsigned int line)
Report line buffer consumption test result.

Definition at line 217 of file linebuf_test.c.

217#define linebuf_consume_ok( test, linebuf ) \
218 linebuf_consume_okx ( test, linebuf, __FILE__, __LINE__ )

Referenced by linebuf_test_exec().

◆ linebuf_accumulated_ok

#define linebuf_accumulated_ok ( test,
linebuf )
Value:
linebuf_accumulated_okx ( test, linebuf, __FILE__, __LINE__ )
static void linebuf_accumulated_okx(struct linebuf_test *test, struct line_buffer *linebuf, const char *file, unsigned int line)
Report line buffer accumulation test result.

Definition at line 252 of file linebuf_test.c.

252#define linebuf_accumulated_ok( test, linebuf ) \
253 linebuf_accumulated_okx ( test, linebuf, __FILE__, __LINE__ )

◆ linebuf_empty_ok

#define linebuf_empty_ok ( linebuf)
Value:
linebuf_empty_okx ( linebuf, __FILE__, __LINE__ )
static void linebuf_empty_okx(struct line_buffer *linebuf, const char *file, unsigned int line)
Report line buffer emptying test result.

Definition at line 269 of file linebuf_test.c.

269#define linebuf_empty_ok( linebuf ) \
270 linebuf_empty_okx ( linebuf, __FILE__, __LINE__ )

Referenced by linebuf_test_exec().

◆ linebuf_ok

#define linebuf_ok ( test)
Value:
linebuf_okx ( test, __FILE__, __LINE__ )
static void linebuf_okx(struct linebuf_test *test, const char *file, unsigned int line)
Report line buffer combined test result.

Definition at line 288 of file linebuf_test.c.

288#define linebuf_ok( test ) \
289 linebuf_okx ( test, __FILE__, __LINE__ )

Referenced by linebuf_test_exec().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ LINEBUF_TEST() [1/9]

LINEBUF_TEST ( simple ,
("HTTP/1.1 200 OK\r\n" "Content-Length: 123\r\n" "Content-Type: text/plain\r\n" "\r\n") ,
LINES("HTTP/1.1 200 OK", "Content-Length: 123", "Content-Type: text/plain", "")  )

Simple line buffer test.

References LINES.

◆ LINEBUF_TEST() [2/9]

LINEBUF_TEST ( mixed ,
("LF only\n" "CRLF\r\n" "\n" "\n" "\r\n" "\r\n" "CR only\r") ,
LINES("LF only", "CRLF", "", "", "", "", NULL)  )

Mixed line terminators.

References LINES, and NULL.

◆ LINEBUF_TEST() [3/9]

LINEBUF_TEST ( split_1 ,
("This line was") ,
LINES(NULL)  )

Split consumption: part 1.

References LINES, and NULL.

◆ LINEBUF_TEST() [4/9]

LINEBUF_TEST ( split_2 ,
(" split across") ,
LINES(NULL)  )

Split consumption: part 2.

References LINES, and NULL.

◆ LINEBUF_TEST() [5/9]

LINEBUF_TEST ( split_3 ,
(" multiple calls\r\nand so was this one\r") ,
LINES("This line was split across multiple calls", NULL)  )

Split consumption: part 3.

References LINES, and NULL.

◆ LINEBUF_TEST() [6/9]

LINEBUF_TEST ( split_4 ,
("\nbut not this one\r\n") ,
LINES("and so was this one", "but not this one")  )

Split consumption: part 4.

References LINES.

◆ LINEBUF_TEST() [7/9]

LINEBUF_TEST ( split_5 ,
("") ,
LINES(NULL)  )

Split consumption: part 5.

References LINES, and NULL.

◆ LINEBUF_TEST() [8/9]

LINEBUF_TEST ( split_6 ,
("This line came after a zero-length call\r\n") ,
LINES("This line came after a zero-length call")  )

Split consumption: part 6.

References LINES.

◆ LINEBUF_TEST() [9/9]

LINEBUF_TEST ( embedded_nuls ,
("This\r\ntest\r\nincludes\r\n\r\nsome\0binary\0data\r\n") ,
LINES("This", "test", "includes", "", linebuf_failure)  )

Embedded NULs.

References linebuf_failure, and LINES.

◆ linebuf_init_okx()

void linebuf_init_okx ( struct line_buffer * linebuf,
const char * file,
unsigned int line )
static

Report line buffer initialisation test result.

Parameters
linebufLine buffer
fileTest code file
lineTest code line

Definition at line 139 of file linebuf_test.c.

140 {
141
142 /* Initialise line buffer */
143 memset ( linebuf, 0, sizeof ( *linebuf ) );
144 okx ( buffered_line ( linebuf ) == NULL, file, line );
145}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
void * memset(void *dest, int character, size_t len) __nonnull
char * buffered_line(struct line_buffer *linebuf)
Retrieve buffered-up line.
Definition linebuf.c:46
#define okx(success, file, line)
Report test result.
Definition test.h:44

References buffered_line(), memset(), NULL, and okx.

Referenced by linebuf_okx().

◆ linebuf_consume_okx()

void linebuf_consume_okx ( struct linebuf_test * test,
struct line_buffer * linebuf,
const char * file,
unsigned int line )
static

Report line buffer consumption test result.

Parameters
testLine buffer test
linebufLine buffer
fileTest code file
lineTest code line

Definition at line 157 of file linebuf_test.c.

159 {
160 const char *data = test->data;
161 size_t remaining = test->len;
162 int len;
163 unsigned int i;
164 const char *expected;
165 char *actual;
166 int rc;
167
168 DBGC ( test, "LINEBUF %p:\n", test );
169 DBGC_HDA ( test, 0, data, remaining );
170
171 /* Consume data one line at a time */
172 for ( i = 0 ; i < test->count ; i++ ) {
173
174 /* Add data to line buffer */
175 len = line_buffer ( linebuf, data, remaining );
176
177 /* Get buffered line, if any */
178 actual = buffered_line ( linebuf );
179 if ( len < 0 ) {
180 rc = len;
181 DBGC ( test, "LINEBUF %p %s\n", test, strerror ( rc ) );
182 } else if ( actual != NULL ) {
183 DBGC ( test, "LINEBUF %p \"%s\" (consumed %d)\n",
184 test, actual, len );
185 } else {
186 DBGC ( test, "LINEBUF %p unterminated (consumed %d)\n",
187 test, len );
188 }
189
190 /* Check for success/failure */
191 expected = test->lines[i];
192 if ( expected == linebuf_failure ) {
193 rc = len;
194 okx ( rc < 0, file, line );
195 okx ( remaining > 0, file, line );
196 return;
197 }
198 okx ( len >= 0, file, line );
199 okx ( ( ( size_t ) len ) <= remaining, file, line );
200
201 /* Check expected result */
202 if ( expected == NULL ) {
203 okx ( actual == NULL, file, line );
204 } else {
205 okx ( actual != NULL, file, line );
206 okx ( strcmp ( actual, expected ) == 0, file, line );
207 }
208
209 /* Consume data */
210 data += len;
211 remaining -= len;
212 }
213
214 /* Check that all data was consumed */
215 okx ( remaining == 0, file, line );
216}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define DBGC(...)
Definition compiler.h:505
#define DBGC_HDA(...)
Definition compiler.h:506
int line_buffer(struct line_buffer *linebuf, const char *data, size_t len)
Buffer up received data by lines.
Definition linebuf.c:92
static const char linebuf_failure[1]
Line buffer test expected failure indicator.
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174

References buffered_line(), data, DBGC, DBGC_HDA, len, line_buffer(), linebuf_failure, NULL, okx, rc, strcmp(), strerror(), and test.

Referenced by linebuf_okx().

◆ linebuf_accumulated_okx()

void linebuf_accumulated_okx ( struct linebuf_test * test,
struct line_buffer * linebuf,
const char * file,
unsigned int line )
static

Report line buffer accumulation test result.

Parameters
testLine buffer test
linebufLine buffer
fileTest code file
lineTest code line

Definition at line 228 of file linebuf_test.c.

230 {
231 const char *actual;
232 const char *expected;
233 unsigned int i;
234
235 /* Check each accumulated line */
236 actual = linebuf->data;
237 for ( i = 0 ; i < test->count ; i++ ) {
238
239 /* Check accumulated line */
240 okx ( actual != NULL, file, line );
241 okx ( actual >= linebuf->data, file, line );
242 expected = test->lines[i];
243 if ( ( expected == NULL ) || ( expected == linebuf_failure ) )
244 return;
245 okx ( strcmp ( actual, expected ) == 0, file, line );
246
247 /* Move to next line */
248 actual += ( strlen ( actual ) + 1 /* NUL */ );
249 okx ( actual <= ( linebuf->data + linebuf->len ), file, line );
250 }
251}
size_t strlen(const char *src)
Get length of string.
Definition string.c:244
size_t len
Length of buffered data.
Definition linebuf.h:21
char * data
Data buffer.
Definition linebuf.h:19

References line_buffer::data, line_buffer::len, linebuf_failure, NULL, okx, strcmp(), strlen(), and test.

Referenced by linebuf_okx().

◆ linebuf_empty_okx()

void linebuf_empty_okx ( struct line_buffer * linebuf,
const char * file,
unsigned int line )
static

Report line buffer emptying test result.

Parameters
linebufLine buffer
fileTest code file
lineTest code line

Definition at line 262 of file linebuf_test.c.

263 {
264
265 /* Empty line buffer */
266 empty_line_buffer ( linebuf );
267 okx ( buffered_line ( linebuf ) == NULL, file, line );
268}
void empty_line_buffer(struct line_buffer *linebuf)
Discard line buffer contents.
Definition linebuf.c:66

References buffered_line(), empty_line_buffer(), NULL, and okx.

Referenced by linebuf_okx().

◆ linebuf_okx()

void linebuf_okx ( struct linebuf_test * test,
const char * file,
unsigned int line )
static

Report line buffer combined test result.

Parameters
testLine buffer test
fileTest code file
lineTest code line

Definition at line 279 of file linebuf_test.c.

280 {
281 struct line_buffer linebuf;
282
283 linebuf_init_okx ( &linebuf, file, line );
284 linebuf_consume_okx ( test, &linebuf, file, line );
285 linebuf_accumulated_okx ( test, &linebuf, file, line );
286 linebuf_empty_okx ( &linebuf, file, line );
287}
A line buffer.
Definition linebuf.h:17

References linebuf_accumulated_okx(), linebuf_consume_okx(), linebuf_empty_okx(), linebuf_init_okx(), and test.

◆ linebuf_test_exec()

void linebuf_test_exec ( void )
static

Perform line buffer self-tests.

Definition at line 295 of file linebuf_test.c.

295 {
296 struct line_buffer linebuf;
297
298 /* Basic tests */
299 linebuf_ok ( &simple );
300 linebuf_ok ( &mixed );
301
302 /* Split consumption test */
303 linebuf_init_ok ( &linebuf );
304 linebuf_consume_ok ( &split_1, &linebuf );
305 linebuf_consume_ok ( &split_2, &linebuf );
306 linebuf_consume_ok ( &split_3, &linebuf );
307 linebuf_consume_ok ( &split_4, &linebuf );
308 linebuf_consume_ok ( &split_5, &linebuf );
309 linebuf_consume_ok ( &split_6, &linebuf );
310 linebuf_empty_ok ( &linebuf );
311
312 /* Embedded NULs */
313 linebuf_ok ( &embedded_nuls );
314}
#define linebuf_empty_ok(linebuf)
#define linebuf_ok(test)
#define linebuf_consume_ok(test, linebuf)
#define linebuf_init_ok(linebuf)

References linebuf_consume_ok, linebuf_empty_ok, linebuf_init_ok, and linebuf_ok.

Variable Documentation

◆ linebuf_failure

const char linebuf_failure[1]
static

Line buffer test expected failure indicator.

Definition at line 59 of file linebuf_test.c.

Referenced by linebuf_accumulated_okx(), linebuf_consume_okx(), and LINEBUF_TEST().

◆ __self_test

struct self_test linebuf_test __self_test
Initial value:
= {
.name = "linebuf",
}
static void linebuf_test_exec(void)
Perform line buffer self-tests.

Line buffer self-test.

Definition at line 317 of file linebuf_test.c.

317 {
318 .name = "linebuf",
319 .exec = linebuf_test_exec,
320};