View | Details | Raw Unified | Return to bug 185813
Collapse All | Expand All

(-)sys/kern/tests/Makefile (+7 lines)
Line 0 Link Here
1
# $FreeBSD$
2
3
TESTSDIR=	${TESTSBASE}/sys/kern
4
5
ATF_TESTS_C=	unix_seqpacket
6
7
.include <atf.test.mk>
(-)sys/kern/tests/unix_seqpacket.c (+649 lines)
Line 0 Link Here
1
/*-
2
 * Copyright (c) 2014 Spectra Logic Corporation. All rights reserved.
3
 * Redistribution and use in source and binary forms, with or without
4
 * modification, are permitted provided that the following conditions
5
 * are met:
6
 * 1. Redistributions of source code must retain the above copyright
7
 *    notice, this list of conditions and the following disclaimer.
8
 * 2. Redistributions in binary form must reproduce the above copyright
9
 *    notice, this list of conditions and the following disclaimer in the
10
 *    documentation and/or other materials provided with the distribution.
11
 *
12
 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
16
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
 * SUCH DAMAGE.
23
 */
24
25
#include <sys/cdefs.h>
26
__FBSDID("$FreeBSD$");
27
28
#include <errno.h>
29
#include <fcntl.h>
30
#include <sys/socket.h>
31
#include <sys/un.h>
32
33
#include <stdio.h>
34
35
#include <atf-c.h>
36
37
/*
38
 * Helper functions
39
 */
40
41
#define MIN(x, y)	((x) < (y) ? (x) : (y))
42
#define MAX(x, y)	((x) > (y) ? (x) : (y))
43
44
void
45
do_socketpair(int *sv)
46
{
47
	int s;
48
	
49
	s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
50
	ATF_REQUIRE_EQ(0, s);
51
	ATF_REQUIRE(sv[0] >= 0);
52
	ATF_REQUIRE(sv[1] >= 0);
53
	ATF_REQUIRE(sv[0] != sv[1]);
54
}
55
56
void
57
do_socketpair_nonblocking(int *sv)
58
{
59
	int s;
60
	
61
	s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
62
	ATF_REQUIRE_EQ(0, s);
63
	ATF_REQUIRE(sv[0] >= 0);
64
	ATF_REQUIRE(sv[1] >= 0);
65
	ATF_REQUIRE(sv[0] != sv[1]);
66
	ATF_REQUIRE(-1 != fcntl(sv[0], F_SETFL, O_NONBLOCK));
67
	ATF_REQUIRE(-1 != fcntl(sv[1], F_SETFL, O_NONBLOCK));
68
}
69
70
/*
71
 * Parameterized test function bodies
72
 */
73
void
74
test_eagain(size_t sndbufsize, size_t rcvbufsize)
75
{
76
	int i;
77
	int sv[2];
78
	const size_t totalsize = (sndbufsize + rcvbufsize) * 2;
79
	const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
80
	char sndbuf[pktsize];
81
	char recv_buf[pktsize];
82
	ssize_t ssize, rsize;
83
84
	/* setup the socket pair */
85
	do_socketpair(sv);
86
	/* Setup the buffers */
87
	ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
88
	    sizeof(sndbufsize)));
89
	ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
90
	    sizeof(rcvbufsize)));
91
92
	bzero(sndbuf, pktsize);
93
	/* Send data until we get EAGAIN */
94
	for(i=0; i < totalsize / pktsize; i++) {
95
		ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
96
		if (ssize == -1) {
97
			if (errno == EAGAIN)
98
				atf_tc_pass();
99
			else {
100
				perror("send");
101
				atf_tc_fail("send returned < 0 but not EAGAIN");
102
			}
103
		}
104
	}
105
	atf_tc_fail("Never got EAGAIN");
106
}
107
108
void
109
test_nonblocking_symmetric_buffers(size_t bufsize) {
110
	int s;
111
	int sv[2];
112
	const size_t pktsize = bufsize / 2;
113
	char sndbuf[pktsize];
114
	char recv_buf[pktsize];
115
	ssize_t ssize, rsize;
116
117
	/* setup the socket pair */
118
	do_socketpair_nonblocking(sv);
119
	/* Setup the buffers */
120
	s = setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize));
121
	ATF_REQUIRE_EQ(0, s);
122
	s = setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));
123
	ATF_REQUIRE_EQ(0, s);
124
125
	/* Fill the send buffer */
126
	bzero(sndbuf, pktsize);
127
128
	/* send and receive the packet */
129
	ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
130
	if (ssize < 0) {
131
		perror("send");
132
		atf_tc_fail("send returned < 0");
133
	}
134
	ATF_CHECK_EQ_MSG(pktsize, ssize, "expected %zd=send(...) but got %zd",
135
	    pktsize, ssize);
136
137
	rsize = recv(sv[1], recv_buf, pktsize, MSG_WAITALL);
138
	if (rsize < 0) {
139
		perror("recv");
140
		atf_tc_fail("recv returned < 0");
141
	}
142
	ATF_CHECK_EQ_MSG(pktsize, rsize, "expected %zd=send(...) but got %zd",
143
	    pktsize, rsize);
144
}
145
146
void
147
test_pipe_simulator(size_t sndbufsize, size_t rcvbufsize)
148
{
149
	int s, num_sent, num_received;
150
	int sv[2];
151
	const size_t pktsize = MIN(sndbufsize, rcvbufsize) / 4;
152
	int numpkts;
153
	char sndbuf[pktsize];
154
	char rcvbuf[pktsize];
155
	char comparebuf[pktsize];
156
	ssize_t ssize, rsize;
157
	bool currently_sending = true;
158
159
	/* setup the socket pair */
160
	do_socketpair_nonblocking(sv);
161
	/* Setup the buffers */
162
	ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
163
	    sizeof(sndbufsize)));
164
	ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
165
	    sizeof(rcvbufsize)));
166
167
	/* Send a total amount of data comfortably greater than the buffers */
168
	numpkts = MAX(sndbufsize, rcvbufsize) * 8 / pktsize;
169
	for (num_sent=0, num_received=0;
170
	     num_sent < numpkts || num_received < numpkts; ) {
171
		if (currently_sending && num_sent < numpkts) {
172
			/* The simulated sending process */
173
			/* fill the buffer */
174
			memset(sndbuf, num_sent, pktsize);
175
			ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
176
			if (ssize < 0) {
177
				/* 
178
				 * XXX: This is bug-compatible with the kernel.
179
				 * The kernel returns EMSGSIZE when it should
180
				 * return EAGAIN
181
				 */
182
				if (errno == EAGAIN || errno == EMSGSIZE)
183
					currently_sending = false;
184
				else {
185
					perror("send");
186
					atf_tc_fail("send failed");
187
				}
188
			} else  {
189
				ATF_CHECK_EQ_MSG(pktsize, ssize,
190
				    "expected %zd=send(...) but got %zd",
191
				    pktsize, ssize);
192
				num_sent++;
193
			}
194
		} else {
195
			/* The simulated receiving process */
196
			rsize = recv(sv[1], rcvbuf, pktsize, MSG_WAITALL);
197
			if (rsize < 0) {
198
				if (errno == EAGAIN) {
199
					currently_sending = true;
200
					ATF_REQUIRE_MSG(num_sent < numpkts,
201
					    "Packets were lost!");
202
				}
203
				else {
204
					perror("recv");
205
					atf_tc_fail("recv failed");
206
				}
207
			} else  {
208
				ATF_CHECK_EQ_MSG(pktsize, rsize,
209
				    "expected %zd=recv(...) but got %zd",
210
				    pktsize, rsize);
211
				memset(comparebuf, num_received, pktsize);
212
				ATF_CHECK_EQ_MSG(0, memcmp(comparebuf, rcvbuf,
213
				    			   pktsize), 
214
				    "Received data miscompare");
215
				num_received++;
216
			}
217
		}
218
	}
219
}
220
221
222
/*
223
 * Test Cases
224
 */
225
226
/* Create a SEQPACKET socket */
227
ATF_TC_WITHOUT_HEAD(create_socket);
228
ATF_TC_BODY(create_socket, tc)
229
{
230
	int s;
231
232
	s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
233
	ATF_CHECK(s >= 0);
234
}
235
236
/* Create SEQPACKET sockets using socketpair(2) */
237
ATF_TC_WITHOUT_HEAD(create_socketpair);
238
ATF_TC_BODY(create_socketpair, tc)
239
{
240
	int sv[2];
241
	int s;
242
243
	s = socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv);
244
	ATF_CHECK_EQ(0, s);
245
	ATF_CHECK(sv[0] >= 0);
246
	ATF_CHECK(sv[1] >= 0);
247
	ATF_CHECK(sv[0] != sv[1]);
248
}
249
250
/* Call listen(2) without first calling bind(2).  It should fail */
251
ATF_TC_WITHOUT_HEAD(listen_unbound);
252
ATF_TC_BODY(listen_unbound, tc)
253
{
254
	int s, r;
255
256
	s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
257
	ATF_REQUIRE(s > 0);
258
	r = listen(s, -1);
259
	/* expect listen to fail since we haven't called bind(2) */
260
	ATF_CHECK(r != 0);
261
}
262
263
/* Bind the socket to a file */
264
ATF_TC_WITHOUT_HEAD(bind);
265
ATF_TC_BODY(bind, tc)
266
{
267
	struct sockaddr_un sun;
268
	/* ATF's isolation mechanisms will guarantee uniqueness of this file */
269
	const char *path = "sock";
270
	int s, r;
271
272
	s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
273
	ATF_REQUIRE(s >= 0);
274
275
	bzero(&sun, sizeof(sun));
276
	sun.sun_family = AF_LOCAL;
277
	sun.sun_len = sizeof(sun);
278
	strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
279
	r = bind(s, (struct sockaddr *)&sun, sizeof(sun));
280
	ATF_CHECK_EQ(0, r);
281
}
282
283
/* listen(2) a socket that is already bound(2) should succeed */
284
ATF_TC_WITHOUT_HEAD(listen_bound);
285
ATF_TC_BODY(listen_bound, tc)
286
{
287
	struct sockaddr_un sun;
288
	/* ATF's isolation mechanisms will guarantee uniqueness of this file */
289
	const char *path = "sock";
290
	int s, r, l;
291
292
	s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
293
	ATF_REQUIRE(s >= 0);
294
295
	bzero(&sun, sizeof(sun));
296
	sun.sun_family = AF_LOCAL;
297
	sun.sun_len = sizeof(sun);
298
	strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
299
	r = bind(s, (struct sockaddr *)&sun, sizeof(sun));
300
	l = listen(s, -1);
301
	ATF_CHECK_EQ(0, r);
302
	ATF_CHECK_EQ(0, l);
303
}
304
305
/* Set O_NONBLOCK on the socket */
306
ATF_TC_WITHOUT_HEAD(fcntl_nonblock);
307
ATF_TC_BODY(fcntl_nonblock, tc)
308
{
309
	int s;
310
311
	s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
312
	ATF_REQUIRE(s >= 0);
313
	if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) {
314
		perror("fcntl");
315
		atf_tc_fail("fcntl failed");
316
	}
317
}
318
319
/* Resize the send and receive buffers */
320
ATF_TC_WITHOUT_HEAD(resize_buffers);
321
ATF_TC_BODY(resize_buffers, tc)
322
{
323
	int s;
324
	int sndbuf = 8192;
325
	int rcvbuf = 8192;
326
327
	s = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
328
	ATF_REQUIRE(s >= 0);
329
	if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf)) != 0){
330
		perror("setsockopt");
331
		atf_tc_fail("setsockopt(SO_SNDBUF) failed");
332
	}
333
	if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &sndbuf, sizeof(sndbuf)) != 0){
334
		perror("setsockopt");
335
		atf_tc_fail("setsockopt(SO_RCVBUF) failed");
336
	}
337
}
338
339
/* send(2) and recv(2) a single short record */
340
ATF_TC_WITHOUT_HEAD(send_recv);
341
ATF_TC_BODY(send_recv, tc)
342
{
343
	int s;
344
	int sv[2];
345
	const int bufsize = 64;
346
	const char *data = "data";
347
	char recv_buf[bufsize];
348
	size_t datalen;
349
	ssize_t ssize, rsize;
350
351
	/* setup the socket pair */
352
	do_socketpair(sv);
353
354
	/* send and receive a small packet */
355
	datalen = strlen(data) + 1;	/* +1 for the null */
356
	ssize = send(sv[0], data, datalen, MSG_EOR);
357
	if (ssize < 0) {
358
		perror("send");
359
		atf_tc_fail("send returned < 0");
360
	}
361
	ATF_CHECK_EQ_MSG(datalen, ssize, "expected %zd=send(...) but got %zd",
362
	    datalen, ssize);
363
364
	rsize = recv(sv[1], recv_buf, bufsize, MSG_WAITALL);
365
	ATF_CHECK_EQ(datalen, rsize);
366
}
367
368
/* nonblocking send(2) and recv(2) a single short record */
369
ATF_TC_WITHOUT_HEAD(send_recv_nonblocking);
370
ATF_TC_BODY(send_recv_nonblocking, tc)
371
{
372
	int s;
373
	int sv[2];
374
	const int bufsize = 64;
375
	const char *data = "data";
376
	char recv_buf[bufsize];
377
	size_t datalen;
378
	ssize_t ssize, rsize;
379
380
	/* setup the socket pair */
381
	do_socketpair_nonblocking(sv);
382
383
	/* Verify that there is nothing to receive */
384
	rsize = recv(sv[1], recv_buf, bufsize, MSG_WAITALL);
385
	ATF_CHECK_EQ(EAGAIN, errno);
386
	ATF_CHECK_EQ(-1, rsize);
387
388
	/* send and receive a small packet */
389
	datalen = strlen(data) + 1;	/* +1 for the null */
390
	ssize = send(sv[0], data, datalen, MSG_EOR);
391
	if (ssize < 0) {
392
		perror("send");
393
		atf_tc_fail("send returned < 0");
394
	}
395
	ATF_CHECK_EQ_MSG(datalen, ssize, "expected %zd=send(...) but got %zd",
396
	    datalen, ssize);
397
398
	rsize = recv(sv[1], recv_buf, bufsize, MSG_WAITALL);
399
	ATF_CHECK_EQ(datalen, rsize);
400
}
401
402
/* 
403
 * We should get EMSGSIZE if we try to send a message larger than the socket
404
 * buffer, with blocking sockets
405
 */
406
ATF_TC_WITHOUT_HEAD(emsgsize);
407
ATF_TC_BODY(emsgsize, tc)
408
{
409
	int s;
410
	int sv[2];
411
	const size_t sndbufsize = 8192;
412
	const size_t rcvbufsize = 8192;
413
	const size_t pktsize = (sndbufsize + rcvbufsize) * 2;
414
	char sndbuf[pktsize];
415
	char recv_buf[pktsize];
416
	ssize_t ssize, rsize;
417
418
	/* setup the socket pair */
419
	do_socketpair(sv);
420
	/* Setup the buffers */
421
	ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
422
	    sizeof(sndbufsize)));
423
	ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
424
	    sizeof(rcvbufsize)));
425
426
	ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
427
	ATF_CHECK_EQ(EMSGSIZE, errno);
428
	ATF_CHECK_EQ(-1, ssize);
429
}
430
431
/* 
432
 * We should get EMSGSIZE if we try to send a message larger than the socket
433
 * buffer, with nonblocking sockets
434
 */
435
ATF_TC_WITHOUT_HEAD(emsgsize_nonblocking);
436
ATF_TC_BODY(emsgsize_nonblocking, tc)
437
{
438
	int s;
439
	int sv[2];
440
	const size_t sndbufsize = 8192;
441
	const size_t rcvbufsize = 8192;
442
	const size_t pktsize = (sndbufsize + rcvbufsize) * 2;
443
	char sndbuf[pktsize];
444
	char recv_buf[pktsize];
445
	ssize_t ssize, rsize;
446
447
	/* setup the socket pair */
448
	do_socketpair_nonblocking(sv);
449
	/* Setup the buffers */
450
	ATF_REQUIRE_EQ(0, setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &sndbufsize,
451
	    sizeof(sndbufsize)));
452
	ATF_REQUIRE_EQ(0, setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &rcvbufsize,
453
	    sizeof(rcvbufsize)));
454
455
	ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
456
	ATF_CHECK_EQ(EMSGSIZE, errno);
457
	ATF_CHECK_EQ(-1, ssize);
458
}
459
460
461
/* 
462
 * We should get EAGAIN if we try to send a message larger than the socket
463
 * buffer, with nonblocking sockets.  Test with several different sockbuf sizes
464
 */
465
ATF_TC_WITHOUT_HEAD(eagain_8k_8k);
466
ATF_TC_BODY(eagain_8k_8k, tc)
467
{
468
	test_eagain(8192, 8192);
469
}
470
ATF_TC_WITHOUT_HEAD(eagain_8k_128k);
471
ATF_TC_BODY(eagain_8k_128k, tc)
472
{
473
	test_eagain(8192, 131072);
474
}
475
ATF_TC_WITHOUT_HEAD(eagain_128k_8k);
476
ATF_TC_BODY(eagain_128k_8k, tc)
477
{
478
	test_eagain(131072, 8192);
479
}
480
ATF_TC_WITHOUT_HEAD(eagain_128k_128k);
481
ATF_TC_BODY(eagain_128k_128k, tc)
482
{
483
	test_eagain(131072, 131072);
484
}
485
486
487
/* 
488
 * nonblocking send(2) and recv(2) of several records, which should collectively
489
 * fill up the send buffer but not the receive buffer
490
 */
491
ATF_TC_WITHOUT_HEAD(rcvbuf_oversized);
492
ATF_TC_BODY(rcvbuf_oversized, tc)
493
{
494
	int s, i, j;
495
	int sv[2];
496
	const size_t sndbufsize = 8192;
497
	const size_t rcvbufsize = 131072;
498
	const size_t geom_mean_bufsize = 32768;
499
	const int pktsize = 1024;
500
	char sndbuf[pktsize];
501
	char recv_buf[pktsize];
502
	size_t datalen;
503
	ssize_t ssize, rsize;
504
505
	/* setup the socket pair */
506
	do_socketpair_nonblocking(sv);
507
508
	/* 
509
	 * Send and receive packets that are collectively greater than the send
510
	 * buffer, but less than the receive buffer
511
	 */
512
	for (i=0; i < geom_mean_bufsize / pktsize; i++) {
513
		/* Fill the buffer */
514
		memset(sndbuf, i, pktsize);
515
516
		/* send the packet */
517
		ssize = send(sv[0], sndbuf, pktsize, MSG_EOR);
518
		if (ssize < 0) {
519
			perror("send");
520
			atf_tc_fail("send returned < 0");
521
		}
522
		ATF_CHECK_EQ_MSG(pktsize, ssize,
523
		    "expected %zd=send(...) but got %zd", pktsize, ssize);
524
525
		/* Receive it */
526
527
		rsize = recv(sv[1], recv_buf, pktsize, MSG_WAITALL);
528
		if (rsize < 0) {
529
			perror("recv");
530
			atf_tc_fail("recv returned < 0");
531
		}
532
		ATF_CHECK_EQ_MSG(pktsize, rsize,
533
		    "expected %zd=send(...) but got %zd", pktsize, rsize);
534
535
		/* Verify the contents */
536
		ATF_CHECK_EQ_MSG(0, memcmp(sndbuf, recv_buf, pktsize), 
537
		    "Received data miscompare");
538
	}
539
540
	/* Trying to receive again should return EAGAIN */
541
	rsize = recv(sv[1], recv_buf, pktsize, MSG_WAITALL);
542
	ATF_CHECK_EQ(EAGAIN, errno);
543
	ATF_CHECK_EQ(-1, rsize);
544
}
545
546
/* 
547
 * Simulate the behavior of a blocking pipe.  The sender will send until his
548
 * buffer fills up, then we'll simulate a scheduler switch that will allow the
549
 * receiver to read until his buffer empties.  Repeat the process until the
550
 * transfer is complete.
551
 * Repeat the test with multiple send and receive buffer sizes
552
 */
553
ATF_TC_WITHOUT_HEAD(pipe_simulator_8k_8k);
554
ATF_TC_BODY(pipe_simulator_8k_8k, tc)
555
{
556
	test_pipe_simulator(8192, 8192);
557
}
558
559
ATF_TC_WITHOUT_HEAD(pipe_simulator_8k_128k);
560
ATF_TC_BODY(pipe_simulator_8k_128k, tc)
561
{
562
	test_pipe_simulator(8192, 131072);
563
}
564
565
ATF_TC_WITHOUT_HEAD(pipe_simulator_128k_8k);
566
ATF_TC_BODY(pipe_simulator_128k_8k, tc)
567
{
568
	test_pipe_simulator(131072, 8192);
569
}
570
571
ATF_TC_WITHOUT_HEAD(pipe_simulator_128k_128k);
572
ATF_TC_BODY(pipe_simulator_128k_128k, tc)
573
{
574
	test_pipe_simulator(131072, 131072);
575
}
576
577
/* Test nonblocking I/O with 8K buffers */
578
ATF_TC_WITHOUT_HEAD(sendrecv_8k_nonblocking);
579
ATF_TC_BODY(sendrecv_8k_nonblocking, tc)
580
{
581
	test_nonblocking_symmetric_buffers(8 * 1024);
582
}
583
584
/* Test nonblocking I/O with 16K buffers */
585
ATF_TC_WITHOUT_HEAD(sendrecv_16k_nonblocking);
586
ATF_TC_BODY(sendrecv_16k_nonblocking, tc)
587
{
588
	test_nonblocking_symmetric_buffers(16 * 1024);
589
}
590
591
/* Test nonblocking I/O with 32K buffers */
592
ATF_TC_WITHOUT_HEAD(sendrecv_32k_nonblocking);
593
ATF_TC_BODY(sendrecv_32k_nonblocking, tc)
594
{
595
	test_nonblocking_symmetric_buffers(32 * 1024);
596
}
597
598
/* Test nonblocking I/O with 64K buffers */
599
ATF_TC_WITHOUT_HEAD(sendrecv_64k_nonblocking);
600
ATF_TC_BODY(sendrecv_64k_nonblocking, tc)
601
{
602
	test_nonblocking_symmetric_buffers(64 * 1024);
603
}
604
605
/* Test nonblocking I/O with 128K buffers */
606
ATF_TC_WITHOUT_HEAD(sendrecv_128k_nonblocking);
607
ATF_TC_BODY(sendrecv_128k_nonblocking, tc)
608
{
609
	test_nonblocking_symmetric_buffers(128 * 1024);
610
}
611
612
613
/*
614
 * Main.
615
 */
616
617
ATF_TP_ADD_TCS(tp)
618
{
619
	/* Basic creation and connection tests */
620
	ATF_TP_ADD_TC(tp, create_socket);
621
	ATF_TP_ADD_TC(tp, create_socketpair);
622
	ATF_TP_ADD_TC(tp, listen_unbound);
623
	ATF_TP_ADD_TC(tp, bind);
624
	ATF_TP_ADD_TC(tp, listen_bound);
625
	ATF_TP_ADD_TC(tp, fcntl_nonblock);
626
	ATF_TP_ADD_TC(tp, resize_buffers);
627
628
	/* Unthreaded I/O tests */
629
	ATF_TP_ADD_TC(tp, send_recv);
630
	ATF_TP_ADD_TC(tp, send_recv_nonblocking);
631
	ATF_TP_ADD_TC(tp, emsgsize);
632
	ATF_TP_ADD_TC(tp, emsgsize_nonblocking);
633
	ATF_TP_ADD_TC(tp, eagain_8k_8k);
634
	ATF_TP_ADD_TC(tp, eagain_8k_128k);
635
	ATF_TP_ADD_TC(tp, eagain_128k_8k);
636
	ATF_TP_ADD_TC(tp, eagain_128k_128k);
637
	ATF_TP_ADD_TC(tp, sendrecv_8k_nonblocking);
638
	ATF_TP_ADD_TC(tp, sendrecv_16k_nonblocking);
639
	ATF_TP_ADD_TC(tp, sendrecv_32k_nonblocking);
640
	ATF_TP_ADD_TC(tp, sendrecv_64k_nonblocking);
641
	ATF_TP_ADD_TC(tp, sendrecv_128k_nonblocking);
642
	ATF_TP_ADD_TC(tp, rcvbuf_oversized);
643
	ATF_TP_ADD_TC(tp, pipe_simulator_8k_8k);
644
	ATF_TP_ADD_TC(tp, pipe_simulator_8k_128k);
645
	ATF_TP_ADD_TC(tp, pipe_simulator_128k_8k);
646
	ATF_TP_ADD_TC(tp, pipe_simulator_128k_128k);
647
648
	return atf_no_error();
649
}
(-)sys/tests/Makefile (+10 lines)
Line 0 Link Here
1
# $FreeBSD$
2
3
.include <bsd.own.mk>
4
5
TESTSDIR=	${TESTSBASE}/sys
6
7
.PATH:		${.CURDIR:H:H}/tests
8
KYUAFILE=	yes
9
10
.include <bsd.test.mk>
(-)etc/mtree/BSD.tests.dist (+4 lines)
Lines 78-83 Link Here
78
                ..
78
                ..
79
            ..
79
            ..
80
        ..
80
        ..
81
	sys
82
	    kern
83
	    ..
84
	..
81
        usr.bin
85
        usr.bin
82
            atf
86
            atf
83
                atf-sh
87
                atf-sh

Return to bug 185813