xref: /titanic_53/usr/src/test/libc-tests/tests/stdio/open_memstreamtest.c (revision f65a228f854974d51b13928c21fa0ae281aa80af)
1*f65a228fSRobert Mustacchi /*
2*f65a228fSRobert Mustacchi  * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
3*f65a228fSRobert Mustacchi  *
4*f65a228fSRobert Mustacchi  * Permission to use, copy, modify, and distribute this software for any
5*f65a228fSRobert Mustacchi  * purpose with or without fee is hereby granted, provided that the above
6*f65a228fSRobert Mustacchi  * copyright notice and this permission notice appear in all copies.
7*f65a228fSRobert Mustacchi  *
8*f65a228fSRobert Mustacchi  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*f65a228fSRobert Mustacchi  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*f65a228fSRobert Mustacchi  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*f65a228fSRobert Mustacchi  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*f65a228fSRobert Mustacchi  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*f65a228fSRobert Mustacchi  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*f65a228fSRobert Mustacchi  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*f65a228fSRobert Mustacchi  */
16*f65a228fSRobert Mustacchi 
17*f65a228fSRobert Mustacchi #include <err.h>
18*f65a228fSRobert Mustacchi #include <stdio.h>
19*f65a228fSRobert Mustacchi #include <stdlib.h>
20*f65a228fSRobert Mustacchi #include <string.h>
21*f65a228fSRobert Mustacchi #include <unistd.h>
22*f65a228fSRobert Mustacchi 
23*f65a228fSRobert Mustacchi #define OFFSET 16384
24*f65a228fSRobert Mustacchi 
25*f65a228fSRobert Mustacchi const char start[] = "start";
26*f65a228fSRobert Mustacchi const char hello[] = "hello";
27*f65a228fSRobert Mustacchi 
28*f65a228fSRobert Mustacchi const char *
_umem_debug_init(void)29*f65a228fSRobert Mustacchi _umem_debug_init(void)
30*f65a228fSRobert Mustacchi {
31*f65a228fSRobert Mustacchi 	return ("default,verbose");
32*f65a228fSRobert Mustacchi }
33*f65a228fSRobert Mustacchi 
34*f65a228fSRobert Mustacchi const char *
_umem_logging_init(void)35*f65a228fSRobert Mustacchi _umem_logging_init(void)
36*f65a228fSRobert Mustacchi {
37*f65a228fSRobert Mustacchi 	return ("fail,contents");
38*f65a228fSRobert Mustacchi }
39*f65a228fSRobert Mustacchi 
40*f65a228fSRobert Mustacchi int
main(void)41*f65a228fSRobert Mustacchi main(void)
42*f65a228fSRobert Mustacchi {
43*f65a228fSRobert Mustacchi 	FILE	*fp;
44*f65a228fSRobert Mustacchi 	char	*buf = (char *)0xff;
45*f65a228fSRobert Mustacchi 	size_t	 size = 0;
46*f65a228fSRobert Mustacchi 	off_t	 off;
47*f65a228fSRobert Mustacchi 	int	 i, failures = 0;
48*f65a228fSRobert Mustacchi 
49*f65a228fSRobert Mustacchi 	if ((fp = open_memstream(&buf, &size)) == NULL) {
50*f65a228fSRobert Mustacchi 		warn("open_memstream failed");
51*f65a228fSRobert Mustacchi 		return (1);
52*f65a228fSRobert Mustacchi 	}
53*f65a228fSRobert Mustacchi 
54*f65a228fSRobert Mustacchi 	off = ftello(fp);
55*f65a228fSRobert Mustacchi 	if (off != 0) {
56*f65a228fSRobert Mustacchi 		warnx("ftello failed. (1)");
57*f65a228fSRobert Mustacchi 		failures++;
58*f65a228fSRobert Mustacchi 	}
59*f65a228fSRobert Mustacchi 
60*f65a228fSRobert Mustacchi 	if (fflush(fp) != 0) {
61*f65a228fSRobert Mustacchi 		warnx("fflush failed. (2)");
62*f65a228fSRobert Mustacchi 		failures++;
63*f65a228fSRobert Mustacchi 	}
64*f65a228fSRobert Mustacchi 
65*f65a228fSRobert Mustacchi 	if (size != 0) {
66*f65a228fSRobert Mustacchi 		warnx("string should be empty. (3)");
67*f65a228fSRobert Mustacchi 		failures++;
68*f65a228fSRobert Mustacchi 	}
69*f65a228fSRobert Mustacchi 
70*f65a228fSRobert Mustacchi 	if (buf == (char *)0xff) {
71*f65a228fSRobert Mustacchi 		warnx("buf not updated. (4)");
72*f65a228fSRobert Mustacchi 		failures++;
73*f65a228fSRobert Mustacchi 	}
74*f65a228fSRobert Mustacchi 
75*f65a228fSRobert Mustacchi 	if (fseek(fp, OFFSET, SEEK_SET) != 0) {
76*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (5)");
77*f65a228fSRobert Mustacchi 		failures++;
78*f65a228fSRobert Mustacchi 	}
79*f65a228fSRobert Mustacchi 
80*f65a228fSRobert Mustacchi 	if (fprintf(fp, hello) == EOF) {
81*f65a228fSRobert Mustacchi 		warnx("fprintf failed. (6)");
82*f65a228fSRobert Mustacchi 		failures++;
83*f65a228fSRobert Mustacchi 	}
84*f65a228fSRobert Mustacchi 
85*f65a228fSRobert Mustacchi 	if (fflush(fp) == EOF) {
86*f65a228fSRobert Mustacchi 		warnx("fflush failed. (7)");
87*f65a228fSRobert Mustacchi 		failures++;
88*f65a228fSRobert Mustacchi 	}
89*f65a228fSRobert Mustacchi 
90*f65a228fSRobert Mustacchi 	if (size != OFFSET + sizeof(hello)-1) {
91*f65a228fSRobert Mustacchi 		warnx("failed, size %zu should be %zu. (8)",
92*f65a228fSRobert Mustacchi 		    size, OFFSET + sizeof(hello)-1);
93*f65a228fSRobert Mustacchi 		failures++;
94*f65a228fSRobert Mustacchi 	}
95*f65a228fSRobert Mustacchi 
96*f65a228fSRobert Mustacchi 	if (fseek(fp, 0, SEEK_SET) != 0) {
97*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (9)");
98*f65a228fSRobert Mustacchi 		failures++;
99*f65a228fSRobert Mustacchi 	}
100*f65a228fSRobert Mustacchi 
101*f65a228fSRobert Mustacchi 	if (fprintf(fp, start) == EOF) {
102*f65a228fSRobert Mustacchi 		warnx("fprintf failed. (10)");
103*f65a228fSRobert Mustacchi 		failures++;
104*f65a228fSRobert Mustacchi 	}
105*f65a228fSRobert Mustacchi 
106*f65a228fSRobert Mustacchi 	if (fflush(fp) == EOF) {
107*f65a228fSRobert Mustacchi 		warnx("fflush failed. (11)");
108*f65a228fSRobert Mustacchi 		failures++;
109*f65a228fSRobert Mustacchi 	}
110*f65a228fSRobert Mustacchi 
111*f65a228fSRobert Mustacchi 	if (size != sizeof(start)-1) {
112*f65a228fSRobert Mustacchi 		warnx("failed, size %zu should be %zu. (12)",
113*f65a228fSRobert Mustacchi 		    size, sizeof(start)-1);
114*f65a228fSRobert Mustacchi 		failures++;
115*f65a228fSRobert Mustacchi 	}
116*f65a228fSRobert Mustacchi 
117*f65a228fSRobert Mustacchi 	/* Needed for sparse files */
118*f65a228fSRobert Mustacchi 	if (strncmp(buf, start, sizeof(start)-1) != 0) {
119*f65a228fSRobert Mustacchi 		warnx("failed, buffer didn't start with '%s'. (13)", start);
120*f65a228fSRobert Mustacchi 		failures++;
121*f65a228fSRobert Mustacchi 	}
122*f65a228fSRobert Mustacchi 	for (i = sizeof(start)-1; i < OFFSET; i++)
123*f65a228fSRobert Mustacchi 		if (buf[i] != '\0') {
124*f65a228fSRobert Mustacchi 			warnx("failed, buffer non zero (offset %d). (14)", i);
125*f65a228fSRobert Mustacchi 			failures++;
126*f65a228fSRobert Mustacchi 			break;
127*f65a228fSRobert Mustacchi 		}
128*f65a228fSRobert Mustacchi 
129*f65a228fSRobert Mustacchi 	if (memcmp(buf + OFFSET, hello, sizeof(hello)-1) != 0) {
130*f65a228fSRobert Mustacchi 		warnx("written string incorrect. (15)");
131*f65a228fSRobert Mustacchi 		failures++;
132*f65a228fSRobert Mustacchi 	}
133*f65a228fSRobert Mustacchi 
134*f65a228fSRobert Mustacchi 	/* verify that simply seeking past the end doesn't increase the size */
135*f65a228fSRobert Mustacchi 	if (fseek(fp, 100, SEEK_END) != 0) {
136*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (16)");
137*f65a228fSRobert Mustacchi 		failures++;
138*f65a228fSRobert Mustacchi 	}
139*f65a228fSRobert Mustacchi 
140*f65a228fSRobert Mustacchi 	if (fflush(fp) == EOF) {
141*f65a228fSRobert Mustacchi 		warnx("fflush failed. (17)");
142*f65a228fSRobert Mustacchi 		failures++;
143*f65a228fSRobert Mustacchi 	}
144*f65a228fSRobert Mustacchi 
145*f65a228fSRobert Mustacchi 	if (size != OFFSET + sizeof(hello)-1) {
146*f65a228fSRobert Mustacchi 		warnx("failed, size %zu should be %zu. (18)",
147*f65a228fSRobert Mustacchi 		    size, OFFSET + sizeof(hello)-1);
148*f65a228fSRobert Mustacchi 		failures++;
149*f65a228fSRobert Mustacchi 	}
150*f65a228fSRobert Mustacchi 
151*f65a228fSRobert Mustacchi 	if (fseek(fp, -1, SEEK_END) != 0) {
152*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (19)");
153*f65a228fSRobert Mustacchi 		failures++;
154*f65a228fSRobert Mustacchi 	}
155*f65a228fSRobert Mustacchi 
156*f65a228fSRobert Mustacchi 	if (fseek(fp, 8, SEEK_SET) != 0) {
157*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (20)");
158*f65a228fSRobert Mustacchi 		failures++;
159*f65a228fSRobert Mustacchi 	}
160*f65a228fSRobert Mustacchi 
161*f65a228fSRobert Mustacchi 	if (ftell(fp) != 8) {
162*f65a228fSRobert Mustacchi 		warnx("failed seek test. (21)");
163*f65a228fSRobert Mustacchi 		failures++;
164*f65a228fSRobert Mustacchi 	}
165*f65a228fSRobert Mustacchi 
166*f65a228fSRobert Mustacchi 	/* Try to seek backward */
167*f65a228fSRobert Mustacchi 	if (fseek(fp, -1, SEEK_CUR) != 0) {
168*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (22)");
169*f65a228fSRobert Mustacchi 		failures++;
170*f65a228fSRobert Mustacchi 	}
171*f65a228fSRobert Mustacchi 
172*f65a228fSRobert Mustacchi 	if (ftell(fp) != 7) {
173*f65a228fSRobert Mustacchi 		warnx("failed seeking backward. (23)");
174*f65a228fSRobert Mustacchi 		failures++;
175*f65a228fSRobert Mustacchi 	}
176*f65a228fSRobert Mustacchi 
177*f65a228fSRobert Mustacchi 	if (fseek(fp, 5, SEEK_CUR) != 0) {
178*f65a228fSRobert Mustacchi 		warnx("failed to fseek. (24)");
179*f65a228fSRobert Mustacchi 		failures++;
180*f65a228fSRobert Mustacchi 	}
181*f65a228fSRobert Mustacchi 
182*f65a228fSRobert Mustacchi 	if (fclose(fp) == EOF) {
183*f65a228fSRobert Mustacchi 		warnx("fclose failed. (25)");
184*f65a228fSRobert Mustacchi 		failures++;
185*f65a228fSRobert Mustacchi 	}
186*f65a228fSRobert Mustacchi 
187*f65a228fSRobert Mustacchi 	if (size != 12) {
188*f65a228fSRobert Mustacchi 		warnx("failed, size %zu should be %u.  (26)",
189*f65a228fSRobert Mustacchi 		    size, 12);
190*f65a228fSRobert Mustacchi 		failures++;
191*f65a228fSRobert Mustacchi 	}
192*f65a228fSRobert Mustacchi 
193*f65a228fSRobert Mustacchi 	free(buf);
194*f65a228fSRobert Mustacchi 
195*f65a228fSRobert Mustacchi 	return (failures);
196*f65a228fSRobert Mustacchi }
197