/ tests / netbsd_open_memstream.c
netbsd_open_memstream.c
 1  /*
 2   * Based on the OpenBSD test
 3   * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
 4   *
 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.
 8   *
 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.
16   */
17  
18  #include <sys/cdefs.h>
19  __RCSID("$NetBSD: t_open_memstream.c,v 1.2 2014/10/19 11:17:43 justin Exp $");
20  
21  #include <err.h>
22  #include <stdio.h>
23  #include <stdlib.h>
24  #include <string.h>
25  #include <unistd.h>
26  
27  #include <darwintest.h>
28  
29  #define OFFSET 16384
30  
31  static const char start[] = "start";
32  static const char hello[] = "hello";
33  
34  T_DECL(netbsd_open_memstream_test_open_memstream, "")
35  {
36  	FILE	*fp;
37  	char	*buf = (char *)0xff;
38  	size_t	 size = 0;
39  	off_t	 off;
40  	int	 i;
41  
42  	fp = open_memstream(&buf, &size);
43  	T_ASSERT_NOTNULL(fp, NULL);
44  
45  	off = ftello(fp);
46  	T_EXPECT_EQ(off, 0LL, NULL);
47  
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);
60  
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);
65  
66  	T_EXPECT_EQ(memcmp(buf + OFFSET, hello, sizeof(hello)-1), 0, NULL);
67  
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);
74  
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);
81  
82  	free(buf);
83  }