netbsd_open_memstream.c [plain text]
#include <sys/cdefs.h>
__RCSID("$NetBSD: t_open_memstream.c,v 1.2 2014/10/19 11:17:43 justin Exp $");
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <darwintest.h>
#define OFFSET 16384
static const char start[] = "start";
static const char hello[] = "hello";
T_DECL(netbsd_open_memstream_test_open_memstream, "")
{
FILE *fp;
char *buf = (char *)0xff;
size_t size = 0;
off_t off;
int i;
fp = open_memstream(&buf, &size);
T_ASSERT_NOTNULL(fp, NULL);
off = ftello(fp);
T_EXPECT_EQ(off, 0LL, NULL);
T_EXPECT_POSIX_ZERO(fflush(fp), NULL);
T_EXPECT_EQ(size, 0UL, NULL);
T_EXPECT_NE((void*)buf, (void *)0xff, NULL);
T_EXPECT_EQ(fseek(fp, -6, SEEK_SET), -1, NULL);
T_EXPECT_POSIX_ZERO(fseek(fp, OFFSET, SEEK_SET), NULL);
T_EXPECT_NE(fprintf(fp, hello), EOF, NULL);
T_EXPECT_NE(fflush(fp), EOF, NULL);
T_EXPECT_EQ(size, OFFSET + sizeof(hello)-1, NULL);
T_EXPECT_POSIX_ZERO(fseek(fp, 0, SEEK_SET), NULL);
T_EXPECT_NE(fprintf(fp, start), EOF, NULL);
T_EXPECT_NE(fflush(fp), EOF, NULL);
T_EXPECT_EQ(size, sizeof(start)-1, NULL);
T_EXPECT_EQ(strncmp(buf, start, sizeof(start)-1), 0, NULL);
for (i = sizeof(start)-1; i < OFFSET; i++)
T_EXPECT_EQ(buf[i], '\0', NULL);
T_EXPECT_EQ(memcmp(buf + OFFSET, hello, sizeof(hello)-1), 0, NULL);
T_EXPECT_POSIX_ZERO(fseek(fp, 100, SEEK_END), NULL);
T_EXPECT_NE(fflush(fp), EOF, NULL);
T_EXPECT_EQ(size, OFFSET + sizeof(hello)-1, NULL);
T_EXPECT_POSIX_ZERO(fseek(fp, 8, SEEK_SET), NULL);
T_EXPECT_EQ(ftell(fp), 8L, NULL);
T_EXPECT_POSIX_ZERO(fseek(fp, -1, SEEK_CUR), NULL);
T_EXPECT_EQ(ftell(fp), 7L, NULL);
T_EXPECT_POSIX_ZERO(fseek(fp, 5, SEEK_CUR), NULL);
T_EXPECT_NE(fclose(fp), EOF, NULL);
T_EXPECT_EQ(size, 12UL, NULL);
free(buf);
}