freebsd_fmemopen.c [plain text]
#include <sys/cdefs.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <darwintest.h>
T_DECL(freebsd_fmemopen_test_preexisting, "")
{
char buf[512];
char buf2[512];
char str[] = "Test writing some stuff";
char str2[] = "AAAAAAAAA";
char str3[] = "AAAA writing some stuff";
FILE *fp;
size_t nofw, nofr;
int rc;
fp = fmemopen(buf, sizeof(buf), "w");
T_ASSERT_NOTNULL(fp, NULL);
nofw = fwrite(str, 1, sizeof(str), fp);
T_ASSERT_EQ(nofw, sizeof(str), NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
fp = fmemopen(buf, sizeof(buf), "r");
T_ASSERT_NOTNULL(fp, NULL);
bzero(buf2, sizeof(buf2));
nofr = fread(buf2, 1, sizeof(buf2), fp);
T_ASSERT_EQ(nofr, sizeof(buf2), NULL);
T_ASSERT_EQ_STR(str, buf2, NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
fp = fmemopen(str, 4, "w");
T_ASSERT_NOTNULL(fp, NULL);
nofw = fwrite(str2, 1, sizeof(str2), fp);
T_ASSERT_EQ(nofw, 4UL, NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
T_ASSERT_EQ_STR(str, str3, NULL);
}
T_DECL(freebsd_fmemopen_test_autoalloc, "")
{
FILE *fp;
long pos;
size_t nofw, i;
int rc;
fp = fmemopen(NULL, 512, "w+");
T_ASSERT_NOTNULL(fp, NULL);
for (i = 0; i < 512; i++) {
nofw = fwrite("a", 1, 1, fp);
T_ASSERT_EQ(nofw, 1UL, NULL);
}
pos = ftell(fp);
T_ASSERT_EQ(pos, 512L, NULL);
nofw = fwrite("a", 1, 1, fp);
T_ASSERT_POSIX_ZERO(nofw, NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
fp = fmemopen(NULL, 512, "r");
T_ASSERT_NULL(fp, NULL);
fp = fmemopen(NULL, 512, "w");
T_ASSERT_NULL(fp, NULL);
}
T_DECL(freebsd_fmemopen_test_data_length, "")
{
FILE *fp;
char buf[512] = {'\0'};
char str[] = "Test data length. ";
char str2[] = "Do we have two sentences?";
char str3[sizeof(str) + sizeof(str2) -1];
long pos;
size_t nofw, nofr;
int rc;
fp = fmemopen(buf, sizeof(buf), "w+");
T_ASSERT_NOTNULL(fp, NULL);
nofw = fwrite(str, 1, sizeof(str), fp);
T_ASSERT_EQ(nofw, sizeof(str), NULL);
rc = fseek(fp, 0, SEEK_END);
T_ASSERT_POSIX_ZERO(rc, NULL);
pos = ftell(fp);
T_ASSERT_EQ(pos, (long)sizeof(str), NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
fp = fmemopen(buf, sizeof(buf), "a+");
T_ASSERT_NOTNULL(fp, NULL);
nofw = fwrite(str2, 1, sizeof(str2), fp);
T_ASSERT_EQ(nofw, sizeof(str2), NULL);
rc = fseek(fp, 0, SEEK_SET);
T_ASSERT_POSIX_ZERO(rc, NULL);
pos = ftell(fp);
T_ASSERT_EQ(pos, 0L, NULL);
nofr = fread(str3, 1, sizeof(buf), fp);
T_ASSERT_EQ(nofr, sizeof(str3), NULL);
T_ASSERT_EQ(strncmp(str3, str, sizeof(str) - 1), 0, NULL);
T_ASSERT_EQ(strncmp(str3 + sizeof(str) - 1, str2, sizeof(str2)), 0, NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
}
T_DECL(freebsd_fmemopen_test_binary, "")
{
FILE *fp;
char buf[20];
char str[] = "Test";
size_t nofw;
int rc;
memset(buf, 'A', sizeof(buf));
fp = fmemopen(buf, sizeof(buf), "w+b");
T_ASSERT_NOTNULL(fp, NULL);
nofw = fwrite(str, 1, strlen(str), fp);
T_ASSERT_EQ(nofw, strlen(str), NULL);
for (size_t i = 0; i < sizeof(buf); i++)
T_ASSERT_NE(buf[i], '\0', NULL);
rc = fclose(fp);
T_ASSERT_POSIX_ZERO(rc, NULL);
}
T_DECL(freebsd_fmemopen_test_append_binary_pos, "")
{
FILE *fp;
fp = fmemopen(NULL, 16, "ab+");
T_ASSERT_NOTNULL(fp, NULL);
T_ASSERT_EQ(ftell(fp), 0L, NULL);
fclose(fp);
char buf[] = "Hello";
fp = fmemopen(buf, sizeof(buf), "ab+");
T_ASSERT_NOTNULL(fp, NULL);
T_ASSERT_EQ(ftell(fp), (long)strlen(buf), NULL);
fclose(fp);
}
T_DECL(freebsd_fmemopen_test_size_0, "")
{
FILE *fp;
fp = fmemopen(NULL, 0, "r+");
T_ASSERT_NULL(fp, NULL);
T_ASSERT_EQ(errno, EINVAL, NULL);
}