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