2 * Based on the OpenBSD test
3 * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include <sys/cdefs.h>
19 __RCSID("$NetBSD: t_open_memstream.c,v 1.2 2014/10/19 11:17:43 justin Exp $");
27 #include <darwintest.h>
31 static const char start
[] = "start";
32 static const char hello
[] = "hello";
34 T_DECL(netbsd_open_memstream_test_open_memstream
, "")
37 char *buf
= (char *)0xff;
42 fp
= open_memstream(&buf
, &size
);
43 T_ASSERT_NOTNULL(fp
, NULL
);
46 T_EXPECT_EQ(off
, 0LL, NULL
);
48 T_EXPECT_POSIX_ZERO(fflush(fp
), NULL
);
49 T_EXPECT_EQ(size
, 0UL, NULL
);
50 T_EXPECT_NE((void*)buf
, (void *)0xff, NULL
);
51 T_EXPECT_EQ(fseek(fp
, -6, SEEK_SET
), -1, NULL
);
52 T_EXPECT_POSIX_ZERO(fseek(fp
, OFFSET
, SEEK_SET
), NULL
);
53 T_EXPECT_NE(fprintf(fp
, hello
), EOF
, NULL
);
54 T_EXPECT_NE(fflush(fp
), EOF
, NULL
);
55 T_EXPECT_EQ(size
, OFFSET
+ sizeof(hello
)-1, NULL
);
56 T_EXPECT_POSIX_ZERO(fseek(fp
, 0, SEEK_SET
), NULL
);
57 T_EXPECT_NE(fprintf(fp
, start
), EOF
, NULL
);
58 T_EXPECT_NE(fflush(fp
), EOF
, NULL
);
59 T_EXPECT_EQ(size
, sizeof(start
)-1, NULL
);
61 /* Needed for sparse files */
62 T_EXPECT_EQ(strncmp(buf
, start
, sizeof(start
)-1), 0, NULL
);
63 for (i
= sizeof(start
)-1; i
< OFFSET
; i
++)
64 T_EXPECT_EQ(buf
[i
], '\0', NULL
);
66 T_EXPECT_EQ(memcmp(buf
+ OFFSET
, hello
, sizeof(hello
)-1), 0, NULL
);
68 /* verify that simply seeking past the end doesn't increase the size */
69 T_EXPECT_POSIX_ZERO(fseek(fp
, 100, SEEK_END
), NULL
);
70 T_EXPECT_NE(fflush(fp
), EOF
, NULL
);
71 T_EXPECT_EQ(size
, OFFSET
+ sizeof(hello
)-1, NULL
);
72 T_EXPECT_POSIX_ZERO(fseek(fp
, 8, SEEK_SET
), NULL
);
73 T_EXPECT_EQ(ftell(fp
), 8L, NULL
);
75 /* Try to seek backward */
76 T_EXPECT_POSIX_ZERO(fseek(fp
, -1, SEEK_CUR
), NULL
);
77 T_EXPECT_EQ(ftell(fp
), 7L, NULL
);
78 T_EXPECT_POSIX_ZERO(fseek(fp
, 5, SEEK_CUR
), NULL
);
79 T_EXPECT_NE(fclose(fp
), EOF
, NULL
);
80 T_EXPECT_EQ(size
, 12UL, NULL
);