source: trunk/third/gnome-vfs/test/test-seek.c @ 15497

Revision 15497, 6.0 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15496, which included commits to RCS files with non-trunk default branches.
RevLine 
[15496]1/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2/* test-seek.c - Test for the seek emulation functionality of the GNOME Virtual
3   File System library.
4
5   Copyright (C) 1999 Free Software Foundation
6
7   The Gnome Library is free software; you can redistribute it and/or
8   modify it under the terms of the GNU Library General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   The Gnome Library is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15   Library General Public License for more details.
16
17   You should have received a copy of the GNU Library General Public
18   License along with the Gnome Library; see the file COPYING.LIB.  If not,
19   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20   Boston, MA 02111-1307, USA.
21
22   Author: Michael Meeks <michael@imaginator.com> */
23
24#ifdef HAVE_CONFIG_H
25#include <config.h>
26#endif
27
28#include <stdio.h>
29#include <stdlib.h>
30#include <errno.h>
31
32#include <glib.h>
33
34#include "gnome-vfs.h"
35
36static void
37show_result (GnomeVFSResult result, const gchar *what, const gchar *text_uri)
38{
39        fprintf (stderr, "%s `%s': %s\n",
40                 what, text_uri, gnome_vfs_result_to_string (result));
41        if (result != GNOME_VFS_OK)
42                exit (1);
43}
44
45static gboolean
46show_if_error (GnomeVFSResult result, const gchar *what)
47{
48        if (result != GNOME_VFS_OK) {
49                fprintf (stderr, "%s: `%s'\n",
50                         what, gnome_vfs_result_to_string (result));
51                return TRUE;
52        } else
53                return FALSE;
54}
55
56static const char *
57translate_vfs_seek_pos (GnomeVFSSeekPosition whence, int *unix_whence)
58{
59        const char *txt;
60        int         ref_whence;
61
62        switch (whence) {
63        case GNOME_VFS_SEEK_START:
64                txt = "seek_start";
65                ref_whence = SEEK_SET;
66                break;
67        case GNOME_VFS_SEEK_CURRENT:
68                txt = "seek_current";
69                ref_whence = SEEK_CUR;
70                break;
71        case GNOME_VFS_SEEK_END:
72                txt = "seek_end";
73                ref_whence = SEEK_END;
74                break;
75        default:
76                txt = "unknown seek type";
77                ref_whence = SEEK_SET;
78                g_warning ("Unknown seek type");
79        }
80        if (unix_whence)
81                *unix_whence = ref_whence;
82
83        return txt;     
84}
85
86static gboolean
87seek_test_chunk (GnomeVFSHandle      *handle,
88                 FILE                *ref,
89                 GnomeVFSFileOffset   vfs_offset,
90                 GnomeVFSSeekPosition whence,
91                 GnomeVFSFileSize     length)
92{
93        GnomeVFSResult result;
94        int            ref_whence;
95       
96        translate_vfs_seek_pos (whence, &ref_whence);
97
98        { /* Preliminary tell */
99                GnomeVFSFileSize offset = 0;
100                long ref_off;
101                result  = gnome_vfs_tell (handle, &offset);
102                if (show_if_error (result, "head gnome_vfs_tell"))
103                        return FALSE;
104
105                ref_off = ftell (ref);
106                if (ref_off < 0) {
107                        g_warning ("Wierd ftell failure");
108                        return FALSE;
109                }
110
111                if (ref_off != offset) {
112                        g_warning ("Offset mismatch %d should be %d", (int)offset, (int)ref_off);
113                        return FALSE;
114                }
115        }
116
117        { /* seek */
118                int fseekres;
119                result   = gnome_vfs_seek (handle, whence, vfs_offset);
120                fseekres = fseek (ref, vfs_offset, ref_whence);
121
122                if (fseekres == 0 &&
123                    result != GNOME_VFS_OK) {
124                        g_warning ("seek success difference '%d - %d' - '%s'",
125                                   fseekres, errno, gnome_vfs_result_to_string (result));
126                        return FALSE;
127                }
128        }
129
130        { /* read - leaks like a sieve on error =] */
131                guint8 *data, *data_ref;
132                int     bytes_read_ref;
133                GnomeVFSFileSize bytes_read;
134
135                data     = g_new (guint8, length);
136                data_ref = g_new (guint8, length);
137               
138                result = gnome_vfs_read (handle, data, length, &bytes_read);
139                bytes_read_ref = fread (data_ref, 1, length, ref);
140
141                if (bytes_read_ref != bytes_read) {
142                        g_warning ("read failure: vfs read %d and fread %d bytes ('%s')",
143                                   (int)bytes_read, bytes_read_ref,
144                                   gnome_vfs_result_to_string (result));
145                        return FALSE;
146                }
147                if (result != GNOME_VFS_OK) {
148                        g_warning ("VFS read failed with '%s'",
149                                   gnome_vfs_result_to_string (result));
150                        return FALSE;
151                }
152               
153                { /* Compare the data */
154                        int i;
155                        for (i = 0; i < bytes_read; i++)
156                                if (data[i] != data_ref[i]) {
157                                        g_warning ("vfs read data mismatch at byte %d, '%d' != '%d'",
158                                                   i, data[i], data_ref[i]);
159                                        return FALSE;
160                                }
161                }
162
163                g_free (data_ref);
164                g_free (data);
165        }
166       
167        { /* Tail tell */
168                GnomeVFSFileSize offset;
169                long ref_off;
170                result  = gnome_vfs_tell (handle, &offset);
171                if (show_if_error (result, "tail gnome_vfs_tell"))
172                        return FALSE;
173
174                ref_off = ftell (ref);
175                if (ref_off < 0) {
176                        g_warning ("Wierd ftell failure");
177                        return FALSE;
178                }
179
180                if (ref_off != offset) {
181                        g_warning ("Offset mismatch %d should be %d", (int)offset, (int)ref_off);
182                        return FALSE;
183                }
184        }
185
186        return TRUE;
187}
188
189int
190main (int argc, char **argv)
191{
192        GnomeVFSResult result;
193        GnomeVFSHandle *handle;
194        FILE *ref;
195        int i, failures;
196
197        if (! gnome_vfs_init ()) {
198                fprintf (stderr, "Cannot initialize gnome-vfs.\n");
199                return 1;
200        }
201
202        if (argc != 3) {
203                fprintf (stderr, "This is a program to test seek emulation on linear filesystems\n");
204                fprintf (stderr, "Usage: %s <source file uri> <seekable local reference fname>\n",
205                         argv[0]);
206                return 1;
207        }
208
209        result = gnome_vfs_open (&handle, argv[1], GNOME_VFS_OPEN_READ|GNOME_VFS_OPEN_RANDOM);
210        show_result (result, "gnome_vfs_open", argv[1]);
211
212        if (!(ref = fopen (argv[2], "r"))) {
213                fprintf (stderr, "Failed to open '%s' to compare seek history\n", argv[2]);
214                exit (1);
215        }
216
217        failures = 0;
218        for (i = 0; i < 10; i++) {
219                GnomeVFSFileSize     length  = (1000.0 * rand () / (RAND_MAX + 1.0));
220                GnomeVFSFileOffset   seekpos = (1000.0 * rand () / (RAND_MAX + 1.0));
221                GnomeVFSSeekPosition w = (int)(2.0 * rand () / (RAND_MAX + 1.0));
222
223                if (!seek_test_chunk (handle, ref, seekpos, w, length)) {
224                        printf ("Failed: seek (offset %d, whence '%s'), read (length %d), tell = %ld\n",
225                                (int)seekpos, translate_vfs_seek_pos (w, NULL),
226                                (int)length, ftell (ref));
227                        failures++;
228                }
229        }
230        if (failures)
231                printf ("%d tests failed\n", failures);
232        else
233                printf ("All test successful\n");
234
235        result = gnome_vfs_close (handle);
236        show_result (result, "gnome_vfs_close", argv[1]);
237       
238        return 0;
239}
Note: See TracBrowser for help on using the repository browser.