1 /* GLIB - Library of useful routines for C programming 2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the 16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 * Boston, MA 02111-1307, USA. 18 */ 19 20 /* 21 * Modified by the GLib Team and others 1997-2000. See the AUTHORS 22 * file for a list of people on the GLib Team. See the ChangeLog 23 * files for a list of changes. These files are distributed with 24 * GLib at ftp://ftp.gtk.org/pub/gtk/. 25 */ 26 27 #include "config.h" 28 29 #undef G_DISABLE_ASSERT 30 #undef G_LOG_DOMAIN 31 32 #ifdef GLIB_COMPILATION 33 #undef GLIB_COMPILATION 34 #endif 35 36 #include <string.h> 37 38 #include <glib.h> 39 40 #include <gstdio.h> 41 42 #ifdef HAVE_UNISTD_H 43 #include <unistd.h> 44 #endif 45 46 #ifdef G_OS_WIN32 47 #include <io.h> /* For read(), write() etc */ 48 #endif 49 50 static void 51 test_mkstemp (void) 52 { 53 char template[32]; 54 int fd; 55 int i; 56 const char hello[] = "Hello, World"; 57 const int hellolen = sizeof (hello) - 1; 58 char chars[62]; 59 60 strcpy (template, "foobar"); 61 fd = g_mkstemp (template); 62 if (fd != -1) 63 g_warning ("g_mkstemp works even if template doesn't contain XXXXXX"); 64 close (fd); 65 66 strcpy (template, "foobarXXX"); 67 fd = g_mkstemp (template); 68 if (fd != -1) 69 g_warning ("g_mkstemp works even if template contains less than six X"); 70 close (fd); 71 72 strcpy (template, "fooXXXXXX"); 73 fd = g_mkstemp (template); 74 g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX"); 75 i = write (fd, hello, hellolen); 76 g_assert (i != -1 && "write() failed"); 77 g_assert (i == hellolen && "write() has written too few bytes"); 78 79 lseek (fd, 0, 0); 80 i = read (fd, chars, sizeof (chars)); 81 g_assert (i != -1 && "read() failed: %s"); 82 g_assert (i == hellolen && "read() has got wrong number of bytes"); 83 84 chars[i] = 0; 85 g_assert (strcmp (chars, hello) == 0 && "read() didn't get same string back"); 86 87 close (fd); 88 remove (template); 89 90 strcpy (template, "fooXXXXXX.pdf"); 91 fd = g_mkstemp (template); 92 g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX.pdf"); 93 94 close (fd); 95 remove (template); 96 } 97 98 static void 99 test_readlink (void) 100 { 101 #ifdef HAVE_SYMLINK 102 FILE *file; 103 int result; 104 char *filename = "file-test-data"; 105 char *link1 = "file-test-link1"; 106 char *link2 = "file-test-link2"; 107 char *link3 = "file-test-link3"; 108 char *data; 109 GError *error; 110 111 file = fopen (filename, "w"); 112 g_assert (file != NULL && "fopen() failed"); 113 fclose (file); 114 115 result = symlink (filename, link1); 116 g_assert (result == 0 && "symlink() failed"); 117 result = symlink (link1, link2); 118 g_assert (result == 0 && "symlink() failed"); 119 120 error = NULL; 121 data = g_file_read_link (link1, &error); 122 g_assert (data != NULL && "couldn't read link1"); 123 g_assert (strcmp (data, filename) == 0 && "link1 contains wrong data"); 124 g_free (data); 125 126 error = NULL; 127 data = g_file_read_link (link2, &error); 128 g_assert (data != NULL && "couldn't read link2"); 129 g_assert (strcmp (data, link1) == 0 && "link2 contains wrong data"); 130 g_free (data); 131 132 error = NULL; 133 data = g_file_read_link (link3, &error); 134 g_assert (data == NULL && "could read link3"); 135 g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); 136 137 error = NULL; 138 data = g_file_read_link (filename, &error); 139 g_assert (data == NULL && "could read regular file as link"); 140 g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL); 141 142 remove (filename); 143 remove (link1); 144 remove (link2); 145 #endif 146 } 147 148 static void 149 test_get_contents (void) 150 { 151 const gchar *text = "abcdefghijklmnopqrstuvwxyz"; 152 const gchar *filename = "file-test-get-contents"; 153 gchar *contents; 154 gsize len; 155 FILE *f; 156 GError *error = NULL; 157 158 f = g_fopen (filename, "w"); 159 fwrite (text, 1, strlen (text), f); 160 fclose (f); 161 162 g_assert (g_file_test (filename, G_FILE_TEST_IS_REGULAR)); 163 164 if (! g_file_get_contents (filename, &contents, &len, &error)) 165 g_error ("g_file_get_contents() failed: %s", error->message); 166 167 g_assert (strcmp (text, contents) == 0 && "content mismatch"); 168 169 g_free (contents); 170 } 171 172 int 173 main (int argc, char *argv[]) 174 { 175 test_mkstemp (); 176 test_readlink (); 177 test_get_contents (); 178 179 return 0; 180 } 181