1 /*
2  * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #include <err.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <unistd.h>
22 
23 const char *
_umem_debug_init(void)24 _umem_debug_init(void)
25 {
26 	return ("default,verbose");
27 }
28 
29 const char *
_umem_logging_init(void)30 _umem_logging_init(void)
31 {
32 	return ("fail,contents");
33 }
34 
35 int
simpletest(void)36 simpletest(void)
37 {
38 	FILE	*s1, *s2;
39 	char	 string[] = "fmemopen test string!";
40 	char	 buffer[1024], *buf = NULL;
41 	size_t	 len;
42 	int	 c, failures = 0;
43 
44 	s1 = fmemopen(string, strlen(string) + 1, "r");
45 	if (s1 == NULL) {
46 		warn("unable to open a stream s1");
47 		return (1);
48 	}
49 
50 	s2 = fmemopen(buf, 22, "w+");
51 	if (s2 == NULL) {
52 		warn("unable to create a stream s2");
53 		(void) fclose(s1);
54 		return (1);
55 	}
56 
57 	while ((c = fgetc(s1)) != EOF)
58 		(void) fputc(c, s2);
59 
60 	if (ftell(s2) != strlen(string) + 1) {
61 		warnx("failed copy test (1)");
62 		failures++;
63 	}
64 	(void) fclose(s1);
65 
66 	(void) fseek(s2, 0, SEEK_SET);
67 	if (ftell(s2) != 0) {
68 		warnx("failed seek test (2)");
69 		failures++;
70 	}
71 
72 	len = fread(buffer, 1, sizeof(buffer) - 1, s2);
73 	if (len != strlen(string) + 1) {
74 		warnx("failed read test (3) %zu != %zu",
75 		    len, strlen(string) + 1);
76 		failures++;
77 	}
78 
79 	return (failures);
80 }
81 
82 int
updatetest(void)83 updatetest(void)
84 {
85 	FILE	*s1;
86 	char	 string[] = "hello\0 test number 2";
87 	char	 buffer[256];
88 	size_t	 len;
89 	int	 failures = 0;
90 
91 	s1 = fmemopen(string, 19, "a+");
92 	if (s1 == NULL)
93 		return (1);
94 
95 	len = fwrite(" world", 1, 6, s1);
96 	if (len != 6) {
97 		warnx("failed write test (4)");
98 		failures++;
99 	}
100 
101 	(void) fseek(s1, 0, SEEK_SET);
102 	if (ftell(s1) != 0) {
103 		warnx("failed seek test (5)");
104 		failures++;
105 	}
106 
107 	len = fread(buffer, 1, sizeof(buffer) - 1, s1);
108 	if (strncmp(string, buffer, len)) {
109 		warnx("failed compare test (6)");
110 		failures++;
111 	}
112 
113 	if (strcmp(string, "hello world")) {
114 		warnx("failed compare test (7)");
115 		failures++;
116 	}
117 
118 	if (strcmp(string + strlen(string) + 1, "number 2")) {
119 		warnx("failed compare test (8)");
120 		failures++;
121 	}
122 
123 	return (failures);
124 }
125 
126 int
writetest(void)127 writetest(void)
128 {
129 	FILE	*s1;
130 	char	 string[] = "super test number 3";
131 	char	 buffer[256];
132 	size_t	 len, slen;
133 	int	 failures = 0;
134 
135 	slen = strlen(string) + 1;
136 
137 	s1 = fmemopen(string, slen, "w");
138 	if (s1 == NULL)
139 		return (1);
140 
141 	len = fwrite("short", 1, 5, s1);
142 	if (len != strlen("short")) {
143 		warnx("failed write test (9)");
144 		failures++;
145 	}
146 	(void) fclose(s1);
147 
148 	s1 = fmemopen(string, slen, "r");
149 	if (s1 == NULL) {
150 		warnx("failed open test (10)");
151 		failures++;
152 	}
153 
154 	len = fread(buffer, 1, sizeof(buffer) - 1, s1);
155 	if (strncmp(string, buffer, len)) {
156 		warnx("failed compare test (11)");
157 		failures++;
158 	}
159 
160 	if (strcmp(string, "short")) {
161 		warnx("failed compare test (12)");
162 		failures++;
163 	}
164 
165 	if (strcmp(string + strlen(string) + 1, "test number 3")) {
166 		warnx("failed compare test (13)");
167 		failures++;
168 	}
169 
170 	return (failures);
171 }
172 
173 int
seektest(void)174 seektest(void)
175 {
176 	FILE	*s1;
177 	char	 string[] = "long string for testing seek";
178 	size_t	 slen;
179 	int	 failures = 0;
180 
181 	slen = strlen(string) + 1;
182 
183 	s1 = fmemopen(string, slen, "r");
184 	if (s1 == NULL)
185 		return (1);
186 
187 	if (fseek(s1, 8, SEEK_SET) != 0) {
188 		warnx("failed to fseek. (14)");
189 		failures++;
190 	}
191 
192 	if (ftell(s1) != 8) {
193 		warnx("failed seek test. (15)");
194 		failures++;
195 	}
196 
197 	/* Try to seek backward */
198 	if (fseek(s1, -1, SEEK_CUR) != 0) {
199 		warnx("failed to fseek. (16)");
200 		failures++;
201 	}
202 
203 	if (ftell(s1) != 7) {
204 		warnx("failed seeking backward. (17)");
205 		failures++;
206 	}
207 
208 	return (failures);
209 }
210 
211 int
main(void)212 main(void)
213 {
214 	int	 failures = 0;
215 
216 	failures += simpletest();
217 	failures += updatetest();
218 	failures += writetest();
219 	failures += seektest();
220 
221 	return (failures);
222 }
223