From cb6e574cb86d4a97e7a9cc6ae79f181476188b21 Mon Sep 17 00:00:00 2001
From: mpi <>
Date: Tue, 1 Jan 2013 17:43:07 +0000
Subject: Simple tests for fmemopen(3) and open_memstream(3)

---
 src/regress/lib/libc/fmemopen/Makefile             |  5 ++
 src/regress/lib/libc/fmemopen/fmemopentest.c       | 68 +++++++++++++++
 src/regress/lib/libc/open_memstream/Makefile       |  5 ++
 .../lib/libc/open_memstream/open_memstreamtest.c   | 97 ++++++++++++++++++++++
 4 files changed, 175 insertions(+)
 create mode 100644 src/regress/lib/libc/fmemopen/Makefile
 create mode 100644 src/regress/lib/libc/fmemopen/fmemopentest.c
 create mode 100644 src/regress/lib/libc/open_memstream/Makefile
 create mode 100644 src/regress/lib/libc/open_memstream/open_memstreamtest.c

(limited to 'src')

diff --git a/src/regress/lib/libc/fmemopen/Makefile b/src/regress/lib/libc/fmemopen/Makefile
new file mode 100644
index 0000000000..9cfbfaa99c
--- /dev/null
+++ b/src/regress/lib/libc/fmemopen/Makefile
@@ -0,0 +1,5 @@
+#	$OpenBSD: Makefile,v 1.1 2013/01/01 17:43:07 mpi Exp $
+
+PROG=	fmemopentest
+
+.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/fmemopen/fmemopentest.c b/src/regress/lib/libc/fmemopen/fmemopentest.c
new file mode 100644
index 0000000000..ef7e9ff64f
--- /dev/null
+++ b/src/regress/lib/libc/fmemopen/fmemopentest.c
@@ -0,0 +1,68 @@
+/*	$OpenBSD: fmemopentest.c,v 1.1 2013/01/01 17:43:07 mpi Exp $ */
+/*
+ * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int
+main(void)
+{
+	FILE	*s1, *s2;
+	char	 c, string[] = "fmemopen test string!";
+	char	 buffer[1024], *buf = NULL;
+	size_t	 len;
+	int	 failures = 0;
+
+	s1 = fmemopen(string, strlen(string), "r");
+	if (s1 == NULL) {
+		warn("unable to open a stream s1");
+		return (1);
+	}
+
+	s2 = fmemopen(buf, 22, "w+");
+	if (s2 == NULL) {
+		warn("unable to create a stream s2");
+		fclose(s1);
+		return (1);
+	}
+
+	while ((c = fgetc(s1)) != EOF)
+		fputc(c, s2);
+
+	if (ftell(s2) != strlen(string)) {
+		warnx("failed copy test (1)");
+		failures++;
+	}
+	fclose(s1);
+
+	fseek(s2, 0, SEEK_SET);
+	if (ftell(s2) != 0) {
+		warnx("failed seek test (2)");
+		failures++;
+	}
+
+	len = fread(buffer, 1, sizeof(buffer) - 1, s2);
+	if (len != strlen(string)) {
+		warnx("failed read test (3)");
+		failures++;
+	}
+
+	return (failures);
+}
diff --git a/src/regress/lib/libc/open_memstream/Makefile b/src/regress/lib/libc/open_memstream/Makefile
new file mode 100644
index 0000000000..1b773a403d
--- /dev/null
+++ b/src/regress/lib/libc/open_memstream/Makefile
@@ -0,0 +1,5 @@
+#	$OpenBSD: Makefile,v 1.1 2013/01/01 17:43:07 mpi Exp $
+
+PROG=	open_memstreamtest	
+
+.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/open_memstream/open_memstreamtest.c b/src/regress/lib/libc/open_memstream/open_memstreamtest.c
new file mode 100644
index 0000000000..09194908e9
--- /dev/null
+++ b/src/regress/lib/libc/open_memstream/open_memstreamtest.c
@@ -0,0 +1,97 @@
+/*	$OpenBSD: open_memstreamtest.c,v 1.1 2013/01/01 17:43:07 mpi Exp $ */
+/*
+ * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define OFFSET 16384
+
+int
+main(void)
+{
+	FILE	*fp;
+	char	*buf = (char *)0xff;
+	size_t	 size = 0;
+	off_t	 off;
+	int	 i = 0, failures = 0;
+
+	if ((fp = open_memstream(&buf, &size)) == NULL) {
+		warn("open_memstream failed");
+		return (1);
+	}
+
+	off = ftello(fp);
+	if (off != 0) {
+		warnx("ftello failed. (1)");
+		failures++;
+	}
+
+	if (fflush(fp) != 0) {
+		warnx("fflush failed. (2)");
+		failures++;
+	}
+
+	if (size != 0) {
+		warnx("string should be empty. (3)");
+		failures++;
+	}
+
+	if (buf == (char *)0xff) {
+		warnx("buf not updated. (4)");
+		failures++;
+	}
+
+	if (fseek(fp, OFFSET, SEEK_SET) != 0) {
+		warnx("failed to fseek. (5)");
+		failures++;
+	}
+
+	if (fprintf(fp, "hello") == EOF) {
+		warnx("fprintf failed. (6)");
+		failures++;
+	}
+
+	if (fclose(fp) == EOF) {
+		warnx("fclose failed. (7)");
+		failures++;
+	}
+
+	if (size != OFFSET + 5) {
+		warnx("failed, size %zu should be %u\n", size, OFFSET + 5);
+		failures++;
+	}
+
+	/* Needed for sparse files */
+	while (i != OFFSET)
+		if (buf[i++] != '\0') {
+			warnx("failed, buffer non zero'ed (offset %d). (8)", i);
+			failures++;
+			break;
+		}
+
+	if (memcmp(buf + OFFSET, "hello", 5) != 0) {
+		warnx("written string incorrect. (9)");
+		failures++;
+	}
+
+	free(buf);
+
+	return (failures);
+}
-- 
cgit v1.2.3-55-g6feb