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