xref: /aosp_15_r20/external/libcups/cups/testfile.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * File test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 1997-2007 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker  *
7*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker  * information.
9*5e7646d2SAndroid Build Coastguard Worker  */
10*5e7646d2SAndroid Build Coastguard Worker 
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker  */
14*5e7646d2SAndroid Build Coastguard Worker 
15*5e7646d2SAndroid Build Coastguard Worker #include "string-private.h"
16*5e7646d2SAndroid Build Coastguard Worker #include "debug-private.h"
17*5e7646d2SAndroid Build Coastguard Worker #include "file.h"
18*5e7646d2SAndroid Build Coastguard Worker #include <stdlib.h>
19*5e7646d2SAndroid Build Coastguard Worker #include <time.h>
20*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
21*5e7646d2SAndroid Build Coastguard Worker #  include <io.h>
22*5e7646d2SAndroid Build Coastguard Worker #else
23*5e7646d2SAndroid Build Coastguard Worker #  include <unistd.h>
24*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
25*5e7646d2SAndroid Build Coastguard Worker #include <fcntl.h>
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker 
28*5e7646d2SAndroid Build Coastguard Worker /*
29*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
30*5e7646d2SAndroid Build Coastguard Worker  */
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker static int	count_lines(cups_file_t *fp);
33*5e7646d2SAndroid Build Coastguard Worker static int	random_tests(void);
34*5e7646d2SAndroid Build Coastguard Worker static int	read_write_tests(int compression);
35*5e7646d2SAndroid Build Coastguard Worker 
36*5e7646d2SAndroid Build Coastguard Worker 
37*5e7646d2SAndroid Build Coastguard Worker /*
38*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Main entry.
39*5e7646d2SAndroid Build Coastguard Worker  */
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker int					/* O - Exit status */
main(int argc,char * argv[])42*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line arguments */
43*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
44*5e7646d2SAndroid Build Coastguard Worker {
45*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Exit status */
46*5e7646d2SAndroid Build Coastguard Worker   char		filename[1024];		/* Filename buffer */
47*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fp;			/* File pointer */
48*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
49*5e7646d2SAndroid Build Coastguard Worker   int		fds[2];			/* Open file descriptors */
50*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fdfile;		/* File opened with cupsFileOpenFd() */
51*5e7646d2SAndroid Build Coastguard Worker #endif /* !_WIN32 */
52*5e7646d2SAndroid Build Coastguard Worker   int		count;			/* Number of lines in file */
53*5e7646d2SAndroid Build Coastguard Worker 
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker   if (argc == 1)
56*5e7646d2SAndroid Build Coastguard Worker   {
57*5e7646d2SAndroid Build Coastguard Worker    /*
58*5e7646d2SAndroid Build Coastguard Worker     * Do uncompressed file tests...
59*5e7646d2SAndroid Build Coastguard Worker     */
60*5e7646d2SAndroid Build Coastguard Worker 
61*5e7646d2SAndroid Build Coastguard Worker     status = read_write_tests(0);
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LIBZ
64*5e7646d2SAndroid Build Coastguard Worker    /*
65*5e7646d2SAndroid Build Coastguard Worker     * Do compressed file tests...
66*5e7646d2SAndroid Build Coastguard Worker     */
67*5e7646d2SAndroid Build Coastguard Worker 
68*5e7646d2SAndroid Build Coastguard Worker     putchar('\n');
69*5e7646d2SAndroid Build Coastguard Worker 
70*5e7646d2SAndroid Build Coastguard Worker     status += read_write_tests(1);
71*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LIBZ */
72*5e7646d2SAndroid Build Coastguard Worker 
73*5e7646d2SAndroid Build Coastguard Worker    /*
74*5e7646d2SAndroid Build Coastguard Worker     * Do uncompressed random I/O tests...
75*5e7646d2SAndroid Build Coastguard Worker     */
76*5e7646d2SAndroid Build Coastguard Worker 
77*5e7646d2SAndroid Build Coastguard Worker     status += random_tests();
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
80*5e7646d2SAndroid Build Coastguard Worker    /*
81*5e7646d2SAndroid Build Coastguard Worker     * Test fdopen and close without reading...
82*5e7646d2SAndroid Build Coastguard Worker     */
83*5e7646d2SAndroid Build Coastguard Worker 
84*5e7646d2SAndroid Build Coastguard Worker     pipe(fds);
85*5e7646d2SAndroid Build Coastguard Worker     close(fds[1]);
86*5e7646d2SAndroid Build Coastguard Worker 
87*5e7646d2SAndroid Build Coastguard Worker     fputs("\ncupsFileOpenFd(fd, \"r\"): ", stdout);
88*5e7646d2SAndroid Build Coastguard Worker     fflush(stdout);
89*5e7646d2SAndroid Build Coastguard Worker 
90*5e7646d2SAndroid Build Coastguard Worker     if ((fdfile = cupsFileOpenFd(fds[0], "r")) == NULL)
91*5e7646d2SAndroid Build Coastguard Worker     {
92*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL");
93*5e7646d2SAndroid Build Coastguard Worker       status ++;
94*5e7646d2SAndroid Build Coastguard Worker     }
95*5e7646d2SAndroid Build Coastguard Worker     else
96*5e7646d2SAndroid Build Coastguard Worker     {
97*5e7646d2SAndroid Build Coastguard Worker      /*
98*5e7646d2SAndroid Build Coastguard Worker       * Able to open file, now close without reading.  If we don't return
99*5e7646d2SAndroid Build Coastguard Worker       * before the alarm fires, that is a failure and we will crash on the
100*5e7646d2SAndroid Build Coastguard Worker       * alarm signal...
101*5e7646d2SAndroid Build Coastguard Worker       */
102*5e7646d2SAndroid Build Coastguard Worker 
103*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
104*5e7646d2SAndroid Build Coastguard Worker       fputs("cupsFileClose(no read): ", stdout);
105*5e7646d2SAndroid Build Coastguard Worker       fflush(stdout);
106*5e7646d2SAndroid Build Coastguard Worker 
107*5e7646d2SAndroid Build Coastguard Worker       alarm(5);
108*5e7646d2SAndroid Build Coastguard Worker       cupsFileClose(fdfile);
109*5e7646d2SAndroid Build Coastguard Worker       alarm(0);
110*5e7646d2SAndroid Build Coastguard Worker 
111*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
112*5e7646d2SAndroid Build Coastguard Worker     }
113*5e7646d2SAndroid Build Coastguard Worker #endif /* !_WIN32 */
114*5e7646d2SAndroid Build Coastguard Worker 
115*5e7646d2SAndroid Build Coastguard Worker    /*
116*5e7646d2SAndroid Build Coastguard Worker     * Count lines in test file, rewind, then count again.
117*5e7646d2SAndroid Build Coastguard Worker     */
118*5e7646d2SAndroid Build Coastguard Worker 
119*5e7646d2SAndroid Build Coastguard Worker     fputs("\ncupsFileOpen(\"testfile.txt\", \"r\"): ", stdout);
120*5e7646d2SAndroid Build Coastguard Worker 
121*5e7646d2SAndroid Build Coastguard Worker     if ((fp = cupsFileOpen("testfile.txt", "r")) == NULL)
122*5e7646d2SAndroid Build Coastguard Worker     {
123*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL");
124*5e7646d2SAndroid Build Coastguard Worker       status ++;
125*5e7646d2SAndroid Build Coastguard Worker     }
126*5e7646d2SAndroid Build Coastguard Worker     else
127*5e7646d2SAndroid Build Coastguard Worker     {
128*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
129*5e7646d2SAndroid Build Coastguard Worker       fputs("cupsFileGets: ", stdout);
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker       if ((count = count_lines(fp)) != 477)
132*5e7646d2SAndroid Build Coastguard Worker       {
133*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (got %d lines, expected 477)\n", count);
134*5e7646d2SAndroid Build Coastguard Worker 	status ++;
135*5e7646d2SAndroid Build Coastguard Worker       }
136*5e7646d2SAndroid Build Coastguard Worker       else
137*5e7646d2SAndroid Build Coastguard Worker       {
138*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
139*5e7646d2SAndroid Build Coastguard Worker 	fputs("cupsFileRewind: ", stdout);
140*5e7646d2SAndroid Build Coastguard Worker 
141*5e7646d2SAndroid Build Coastguard Worker 	if (cupsFileRewind(fp) != 0)
142*5e7646d2SAndroid Build Coastguard Worker 	{
143*5e7646d2SAndroid Build Coastguard Worker 	  puts("FAIL");
144*5e7646d2SAndroid Build Coastguard Worker 	  status ++;
145*5e7646d2SAndroid Build Coastguard Worker 	}
146*5e7646d2SAndroid Build Coastguard Worker 	else
147*5e7646d2SAndroid Build Coastguard Worker 	{
148*5e7646d2SAndroid Build Coastguard Worker 	  puts("PASS");
149*5e7646d2SAndroid Build Coastguard Worker 	  fputs("cupsFileGets: ", stdout);
150*5e7646d2SAndroid Build Coastguard Worker 
151*5e7646d2SAndroid Build Coastguard Worker 	  if ((count = count_lines(fp)) != 477)
152*5e7646d2SAndroid Build Coastguard Worker 	  {
153*5e7646d2SAndroid Build Coastguard Worker 	    printf("FAIL (got %d lines, expected 477)\n", count);
154*5e7646d2SAndroid Build Coastguard Worker 	    status ++;
155*5e7646d2SAndroid Build Coastguard Worker 	  }
156*5e7646d2SAndroid Build Coastguard Worker 	  else
157*5e7646d2SAndroid Build Coastguard Worker 	    puts("PASS");
158*5e7646d2SAndroid Build Coastguard Worker         }
159*5e7646d2SAndroid Build Coastguard Worker       }
160*5e7646d2SAndroid Build Coastguard Worker 
161*5e7646d2SAndroid Build Coastguard Worker       cupsFileClose(fp);
162*5e7646d2SAndroid Build Coastguard Worker     }
163*5e7646d2SAndroid Build Coastguard Worker 
164*5e7646d2SAndroid Build Coastguard Worker    /*
165*5e7646d2SAndroid Build Coastguard Worker     * Test path functions...
166*5e7646d2SAndroid Build Coastguard Worker     */
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker     fputs("\ncupsFileFind: ", stdout);
169*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
170*5e7646d2SAndroid Build Coastguard Worker     if (cupsFileFind("notepad.exe", "C:/WINDOWS", 1, filename, sizeof(filename)) &&
171*5e7646d2SAndroid Build Coastguard Worker 	cupsFileFind("notepad.exe", "C:/WINDOWS;C:/WINDOWS/SYSTEM32", 1, filename, sizeof(filename)))
172*5e7646d2SAndroid Build Coastguard Worker #else
173*5e7646d2SAndroid Build Coastguard Worker     if (cupsFileFind("cat", "/bin", 1, filename, sizeof(filename)) &&
174*5e7646d2SAndroid Build Coastguard Worker 	cupsFileFind("cat", "/bin:/usr/bin", 1, filename, sizeof(filename)))
175*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
176*5e7646d2SAndroid Build Coastguard Worker       printf("PASS (%s)\n", filename);
177*5e7646d2SAndroid Build Coastguard Worker     else
178*5e7646d2SAndroid Build Coastguard Worker     {
179*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL");
180*5e7646d2SAndroid Build Coastguard Worker       status ++;
181*5e7646d2SAndroid Build Coastguard Worker     }
182*5e7646d2SAndroid Build Coastguard Worker 
183*5e7646d2SAndroid Build Coastguard Worker    /*
184*5e7646d2SAndroid Build Coastguard Worker     * Summarize the results and return...
185*5e7646d2SAndroid Build Coastguard Worker     */
186*5e7646d2SAndroid Build Coastguard Worker 
187*5e7646d2SAndroid Build Coastguard Worker     if (!status)
188*5e7646d2SAndroid Build Coastguard Worker       puts("\nALL TESTS PASSED!");
189*5e7646d2SAndroid Build Coastguard Worker     else
190*5e7646d2SAndroid Build Coastguard Worker       printf("\n%d TEST(S) FAILED!\n", status);
191*5e7646d2SAndroid Build Coastguard Worker   }
192*5e7646d2SAndroid Build Coastguard Worker   else
193*5e7646d2SAndroid Build Coastguard Worker   {
194*5e7646d2SAndroid Build Coastguard Worker    /*
195*5e7646d2SAndroid Build Coastguard Worker     * Cat the filename on the command-line...
196*5e7646d2SAndroid Build Coastguard Worker     */
197*5e7646d2SAndroid Build Coastguard Worker 
198*5e7646d2SAndroid Build Coastguard Worker     char	line[8192];		/* Line from file */
199*5e7646d2SAndroid Build Coastguard Worker 
200*5e7646d2SAndroid Build Coastguard Worker     if ((fp = cupsFileOpen(argv[1], "r")) == NULL)
201*5e7646d2SAndroid Build Coastguard Worker     {
202*5e7646d2SAndroid Build Coastguard Worker       perror(argv[1]);
203*5e7646d2SAndroid Build Coastguard Worker       status = 1;
204*5e7646d2SAndroid Build Coastguard Worker     }
205*5e7646d2SAndroid Build Coastguard Worker     else if (argc == 2)
206*5e7646d2SAndroid Build Coastguard Worker     {
207*5e7646d2SAndroid Build Coastguard Worker       status = 0;
208*5e7646d2SAndroid Build Coastguard Worker 
209*5e7646d2SAndroid Build Coastguard Worker       while (cupsFileGets(fp, line, sizeof(line)))
210*5e7646d2SAndroid Build Coastguard Worker         puts(line);
211*5e7646d2SAndroid Build Coastguard Worker 
212*5e7646d2SAndroid Build Coastguard Worker       if (!cupsFileEOF(fp))
213*5e7646d2SAndroid Build Coastguard Worker         perror(argv[1]);
214*5e7646d2SAndroid Build Coastguard Worker 
215*5e7646d2SAndroid Build Coastguard Worker       cupsFileClose(fp);
216*5e7646d2SAndroid Build Coastguard Worker     }
217*5e7646d2SAndroid Build Coastguard Worker     else
218*5e7646d2SAndroid Build Coastguard Worker     {
219*5e7646d2SAndroid Build Coastguard Worker       status = 0;
220*5e7646d2SAndroid Build Coastguard Worker       ssize_t bytes;
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker       while ((bytes = cupsFileRead(fp, line, sizeof(line))) > 0)
223*5e7646d2SAndroid Build Coastguard Worker         printf("%s: %d bytes\n", argv[1], (int)bytes);
224*5e7646d2SAndroid Build Coastguard Worker 
225*5e7646d2SAndroid Build Coastguard Worker       if (cupsFileEOF(fp))
226*5e7646d2SAndroid Build Coastguard Worker         printf("%s: EOF\n", argv[1]);
227*5e7646d2SAndroid Build Coastguard Worker       else
228*5e7646d2SAndroid Build Coastguard Worker         perror(argv[1]);
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker       cupsFileClose(fp);
231*5e7646d2SAndroid Build Coastguard Worker     }
232*5e7646d2SAndroid Build Coastguard Worker   }
233*5e7646d2SAndroid Build Coastguard Worker 
234*5e7646d2SAndroid Build Coastguard Worker   return (status);
235*5e7646d2SAndroid Build Coastguard Worker }
236*5e7646d2SAndroid Build Coastguard Worker 
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker /*
239*5e7646d2SAndroid Build Coastguard Worker  * 'count_lines()' - Count the number of lines in a file.
240*5e7646d2SAndroid Build Coastguard Worker  */
241*5e7646d2SAndroid Build Coastguard Worker 
242*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Number of lines */
count_lines(cups_file_t * fp)243*5e7646d2SAndroid Build Coastguard Worker count_lines(cups_file_t *fp)		/* I - File to read from */
244*5e7646d2SAndroid Build Coastguard Worker {
245*5e7646d2SAndroid Build Coastguard Worker   int	count;				/* Number of lines */
246*5e7646d2SAndroid Build Coastguard Worker   char	line[1024];			/* Line buffer */
247*5e7646d2SAndroid Build Coastguard Worker 
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker   for (count = 0; cupsFileGets(fp, line, sizeof(line)); count ++);
250*5e7646d2SAndroid Build Coastguard Worker 
251*5e7646d2SAndroid Build Coastguard Worker   return (count);
252*5e7646d2SAndroid Build Coastguard Worker }
253*5e7646d2SAndroid Build Coastguard Worker 
254*5e7646d2SAndroid Build Coastguard Worker 
255*5e7646d2SAndroid Build Coastguard Worker /*
256*5e7646d2SAndroid Build Coastguard Worker  * 'random_tests()' - Do random access tests.
257*5e7646d2SAndroid Build Coastguard Worker  */
258*5e7646d2SAndroid Build Coastguard Worker 
259*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Status */
random_tests(void)260*5e7646d2SAndroid Build Coastguard Worker random_tests(void)
261*5e7646d2SAndroid Build Coastguard Worker {
262*5e7646d2SAndroid Build Coastguard Worker   int		status,			/* Status of tests */
263*5e7646d2SAndroid Build Coastguard Worker 		pass,			/* Current pass */
264*5e7646d2SAndroid Build Coastguard Worker 		count,			/* Number of records read */
265*5e7646d2SAndroid Build Coastguard Worker 		record,			/* Current record */
266*5e7646d2SAndroid Build Coastguard Worker 		num_records;		/* Number of records */
267*5e7646d2SAndroid Build Coastguard Worker   off_t		pos;			/* Position in file */
268*5e7646d2SAndroid Build Coastguard Worker   ssize_t	expected;		/* Expected position in file */
269*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fp;			/* File */
270*5e7646d2SAndroid Build Coastguard Worker   char		buffer[512];		/* Data buffer */
271*5e7646d2SAndroid Build Coastguard Worker 
272*5e7646d2SAndroid Build Coastguard Worker 
273*5e7646d2SAndroid Build Coastguard Worker  /*
274*5e7646d2SAndroid Build Coastguard Worker   * Run 4 passes, each time appending to a data file and then reopening the
275*5e7646d2SAndroid Build Coastguard Worker   * file for reading to validate random records in the file.
276*5e7646d2SAndroid Build Coastguard Worker   */
277*5e7646d2SAndroid Build Coastguard Worker 
278*5e7646d2SAndroid Build Coastguard Worker   for (status = 0, pass = 0; pass < 4; pass ++)
279*5e7646d2SAndroid Build Coastguard Worker   {
280*5e7646d2SAndroid Build Coastguard Worker    /*
281*5e7646d2SAndroid Build Coastguard Worker     * cupsFileOpen(append)
282*5e7646d2SAndroid Build Coastguard Worker     */
283*5e7646d2SAndroid Build Coastguard Worker 
284*5e7646d2SAndroid Build Coastguard Worker     printf("\ncupsFileOpen(append %d): ", pass);
285*5e7646d2SAndroid Build Coastguard Worker 
286*5e7646d2SAndroid Build Coastguard Worker     if ((fp = cupsFileOpen("testfile.dat", "a")) == NULL)
287*5e7646d2SAndroid Build Coastguard Worker     {
288*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
289*5e7646d2SAndroid Build Coastguard Worker       status ++;
290*5e7646d2SAndroid Build Coastguard Worker       break;
291*5e7646d2SAndroid Build Coastguard Worker     }
292*5e7646d2SAndroid Build Coastguard Worker     else
293*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
294*5e7646d2SAndroid Build Coastguard Worker 
295*5e7646d2SAndroid Build Coastguard Worker    /*
296*5e7646d2SAndroid Build Coastguard Worker     * cupsFileTell()
297*5e7646d2SAndroid Build Coastguard Worker     */
298*5e7646d2SAndroid Build Coastguard Worker 
299*5e7646d2SAndroid Build Coastguard Worker     expected = 256 * (ssize_t)sizeof(buffer) * pass;
300*5e7646d2SAndroid Build Coastguard Worker 
301*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileTell(): ", stdout);
302*5e7646d2SAndroid Build Coastguard Worker     if ((pos = cupsFileTell(fp)) != (off_t)expected)
303*5e7646d2SAndroid Build Coastguard Worker     {
304*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
305*5e7646d2SAndroid Build Coastguard Worker 	     CUPS_LLCAST pos, CUPS_LLCAST expected);
306*5e7646d2SAndroid Build Coastguard Worker       status ++;
307*5e7646d2SAndroid Build Coastguard Worker       break;
308*5e7646d2SAndroid Build Coastguard Worker     }
309*5e7646d2SAndroid Build Coastguard Worker     else
310*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
311*5e7646d2SAndroid Build Coastguard Worker 
312*5e7646d2SAndroid Build Coastguard Worker    /*
313*5e7646d2SAndroid Build Coastguard Worker     * cupsFileWrite()
314*5e7646d2SAndroid Build Coastguard Worker     */
315*5e7646d2SAndroid Build Coastguard Worker 
316*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileWrite(256 512-byte records): ", stdout);
317*5e7646d2SAndroid Build Coastguard Worker     for (record = 0; record < 256; record ++)
318*5e7646d2SAndroid Build Coastguard Worker     {
319*5e7646d2SAndroid Build Coastguard Worker       memset(buffer, record, sizeof(buffer));
320*5e7646d2SAndroid Build Coastguard Worker       if (cupsFileWrite(fp, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer))
321*5e7646d2SAndroid Build Coastguard Worker         break;
322*5e7646d2SAndroid Build Coastguard Worker     }
323*5e7646d2SAndroid Build Coastguard Worker 
324*5e7646d2SAndroid Build Coastguard Worker     if (record < 256)
325*5e7646d2SAndroid Build Coastguard Worker     {
326*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d: %s)\n", record, strerror(errno));
327*5e7646d2SAndroid Build Coastguard Worker       status ++;
328*5e7646d2SAndroid Build Coastguard Worker       break;
329*5e7646d2SAndroid Build Coastguard Worker     }
330*5e7646d2SAndroid Build Coastguard Worker     else
331*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
332*5e7646d2SAndroid Build Coastguard Worker 
333*5e7646d2SAndroid Build Coastguard Worker    /*
334*5e7646d2SAndroid Build Coastguard Worker     * cupsFileTell()
335*5e7646d2SAndroid Build Coastguard Worker     */
336*5e7646d2SAndroid Build Coastguard Worker 
337*5e7646d2SAndroid Build Coastguard Worker     expected += 256 * (ssize_t)sizeof(buffer);
338*5e7646d2SAndroid Build Coastguard Worker 
339*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileTell(): ", stdout);
340*5e7646d2SAndroid Build Coastguard Worker     if ((pos = cupsFileTell(fp)) != (off_t)expected)
341*5e7646d2SAndroid Build Coastguard Worker     {
342*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
343*5e7646d2SAndroid Build Coastguard Worker              CUPS_LLCAST pos, CUPS_LLCAST expected);
344*5e7646d2SAndroid Build Coastguard Worker       status ++;
345*5e7646d2SAndroid Build Coastguard Worker       break;
346*5e7646d2SAndroid Build Coastguard Worker     }
347*5e7646d2SAndroid Build Coastguard Worker     else
348*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
349*5e7646d2SAndroid Build Coastguard Worker 
350*5e7646d2SAndroid Build Coastguard Worker     cupsFileClose(fp);
351*5e7646d2SAndroid Build Coastguard Worker 
352*5e7646d2SAndroid Build Coastguard Worker    /*
353*5e7646d2SAndroid Build Coastguard Worker     * cupsFileOpen(read)
354*5e7646d2SAndroid Build Coastguard Worker     */
355*5e7646d2SAndroid Build Coastguard Worker 
356*5e7646d2SAndroid Build Coastguard Worker     printf("\ncupsFileOpen(read %d): ", pass);
357*5e7646d2SAndroid Build Coastguard Worker 
358*5e7646d2SAndroid Build Coastguard Worker     if ((fp = cupsFileOpen("testfile.dat", "r")) == NULL)
359*5e7646d2SAndroid Build Coastguard Worker     {
360*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
361*5e7646d2SAndroid Build Coastguard Worker       status ++;
362*5e7646d2SAndroid Build Coastguard Worker       break;
363*5e7646d2SAndroid Build Coastguard Worker     }
364*5e7646d2SAndroid Build Coastguard Worker     else
365*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
366*5e7646d2SAndroid Build Coastguard Worker 
367*5e7646d2SAndroid Build Coastguard Worker    /*
368*5e7646d2SAndroid Build Coastguard Worker     * cupsFileSeek, cupsFileRead
369*5e7646d2SAndroid Build Coastguard Worker     */
370*5e7646d2SAndroid Build Coastguard Worker 
371*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileSeek(), cupsFileRead(): ", stdout);
372*5e7646d2SAndroid Build Coastguard Worker 
373*5e7646d2SAndroid Build Coastguard Worker     for (num_records = (pass + 1) * 256, count = (pass + 1) * 256, record = ((int)CUPS_RAND() & 65535) % num_records;
374*5e7646d2SAndroid Build Coastguard Worker          count > 0;
375*5e7646d2SAndroid Build Coastguard Worker 	 count --, record = (record + ((int)CUPS_RAND() & 31) - 16 + num_records) % num_records)
376*5e7646d2SAndroid Build Coastguard Worker     {
377*5e7646d2SAndroid Build Coastguard Worker      /*
378*5e7646d2SAndroid Build Coastguard Worker       * The last record is always the first...
379*5e7646d2SAndroid Build Coastguard Worker       */
380*5e7646d2SAndroid Build Coastguard Worker 
381*5e7646d2SAndroid Build Coastguard Worker       if (count == 1)
382*5e7646d2SAndroid Build Coastguard Worker         record = 0;
383*5e7646d2SAndroid Build Coastguard Worker 
384*5e7646d2SAndroid Build Coastguard Worker      /*
385*5e7646d2SAndroid Build Coastguard Worker       * Try reading the data for the specified record, and validate the
386*5e7646d2SAndroid Build Coastguard Worker       * contents...
387*5e7646d2SAndroid Build Coastguard Worker       */
388*5e7646d2SAndroid Build Coastguard Worker 
389*5e7646d2SAndroid Build Coastguard Worker       expected = (ssize_t)sizeof(buffer) * record;
390*5e7646d2SAndroid Build Coastguard Worker 
391*5e7646d2SAndroid Build Coastguard Worker       if ((pos = cupsFileSeek(fp, expected)) != expected)
392*5e7646d2SAndroid Build Coastguard Worker       {
393*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
394*5e7646d2SAndroid Build Coastguard Worker 	       CUPS_LLCAST pos, CUPS_LLCAST expected);
395*5e7646d2SAndroid Build Coastguard Worker         status ++;
396*5e7646d2SAndroid Build Coastguard Worker 	break;
397*5e7646d2SAndroid Build Coastguard Worker       }
398*5e7646d2SAndroid Build Coastguard Worker       else
399*5e7646d2SAndroid Build Coastguard Worker       {
400*5e7646d2SAndroid Build Coastguard Worker 	if (cupsFileRead(fp, buffer, sizeof(buffer)) != sizeof(buffer))
401*5e7646d2SAndroid Build Coastguard Worker 	{
402*5e7646d2SAndroid Build Coastguard Worker 	  printf("FAIL (%s)\n", strerror(errno));
403*5e7646d2SAndroid Build Coastguard Worker 	  status ++;
404*5e7646d2SAndroid Build Coastguard Worker 	  break;
405*5e7646d2SAndroid Build Coastguard Worker 	}
406*5e7646d2SAndroid Build Coastguard Worker 	else if ((buffer[0] & 255) != (record & 255) ||
407*5e7646d2SAndroid Build Coastguard Worker 	         memcmp(buffer, buffer + 1, sizeof(buffer) - 1))
408*5e7646d2SAndroid Build Coastguard Worker 	{
409*5e7646d2SAndroid Build Coastguard Worker 	  printf("FAIL (Bad Data - %d instead of %d)\n", buffer[0] & 255,
410*5e7646d2SAndroid Build Coastguard Worker 	         record & 255);
411*5e7646d2SAndroid Build Coastguard Worker 	  status ++;
412*5e7646d2SAndroid Build Coastguard Worker 	  break;
413*5e7646d2SAndroid Build Coastguard Worker 	}
414*5e7646d2SAndroid Build Coastguard Worker       }
415*5e7646d2SAndroid Build Coastguard Worker     }
416*5e7646d2SAndroid Build Coastguard Worker 
417*5e7646d2SAndroid Build Coastguard Worker     if (count == 0)
418*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
419*5e7646d2SAndroid Build Coastguard Worker 
420*5e7646d2SAndroid Build Coastguard Worker     cupsFileClose(fp);
421*5e7646d2SAndroid Build Coastguard Worker   }
422*5e7646d2SAndroid Build Coastguard Worker 
423*5e7646d2SAndroid Build Coastguard Worker  /*
424*5e7646d2SAndroid Build Coastguard Worker   * Remove the test file...
425*5e7646d2SAndroid Build Coastguard Worker   */
426*5e7646d2SAndroid Build Coastguard Worker 
427*5e7646d2SAndroid Build Coastguard Worker   unlink("testfile.dat");
428*5e7646d2SAndroid Build Coastguard Worker 
429*5e7646d2SAndroid Build Coastguard Worker  /*
430*5e7646d2SAndroid Build Coastguard Worker   * Return the test status...
431*5e7646d2SAndroid Build Coastguard Worker   */
432*5e7646d2SAndroid Build Coastguard Worker 
433*5e7646d2SAndroid Build Coastguard Worker   return (status);
434*5e7646d2SAndroid Build Coastguard Worker }
435*5e7646d2SAndroid Build Coastguard Worker 
436*5e7646d2SAndroid Build Coastguard Worker 
437*5e7646d2SAndroid Build Coastguard Worker /*
438*5e7646d2SAndroid Build Coastguard Worker  * 'read_write_tests()' - Perform read/write tests.
439*5e7646d2SAndroid Build Coastguard Worker  */
440*5e7646d2SAndroid Build Coastguard Worker 
441*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Status */
read_write_tests(int compression)442*5e7646d2SAndroid Build Coastguard Worker read_write_tests(int compression)	/* I - Use compression? */
443*5e7646d2SAndroid Build Coastguard Worker {
444*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
445*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fp;			/* File */
446*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Exit status */
447*5e7646d2SAndroid Build Coastguard Worker   char		line[1024],		/* Line from file */
448*5e7646d2SAndroid Build Coastguard Worker 		*value;			/* Directive value from line */
449*5e7646d2SAndroid Build Coastguard Worker   int		linenum;		/* Line number */
450*5e7646d2SAndroid Build Coastguard Worker   unsigned char	readbuf[8192],		/* Read buffer */
451*5e7646d2SAndroid Build Coastguard Worker 		writebuf[8192];		/* Write buffer */
452*5e7646d2SAndroid Build Coastguard Worker   int		byte;			/* Byte from file */
453*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Number of bytes read/written */
454*5e7646d2SAndroid Build Coastguard Worker   off_t		length;			/* Length of file */
455*5e7646d2SAndroid Build Coastguard Worker   static const char *partial_line = "partial line";
456*5e7646d2SAndroid Build Coastguard Worker 					/* Partial line */
457*5e7646d2SAndroid Build Coastguard Worker 
458*5e7646d2SAndroid Build Coastguard Worker 
459*5e7646d2SAndroid Build Coastguard Worker  /*
460*5e7646d2SAndroid Build Coastguard Worker   * No errors so far...
461*5e7646d2SAndroid Build Coastguard Worker   */
462*5e7646d2SAndroid Build Coastguard Worker 
463*5e7646d2SAndroid Build Coastguard Worker   status = 0;
464*5e7646d2SAndroid Build Coastguard Worker 
465*5e7646d2SAndroid Build Coastguard Worker  /*
466*5e7646d2SAndroid Build Coastguard Worker   * Initialize the write buffer with random data...
467*5e7646d2SAndroid Build Coastguard Worker   */
468*5e7646d2SAndroid Build Coastguard Worker 
469*5e7646d2SAndroid Build Coastguard Worker   CUPS_SRAND((unsigned)time(NULL));
470*5e7646d2SAndroid Build Coastguard Worker 
471*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < (int)sizeof(writebuf); i ++)
472*5e7646d2SAndroid Build Coastguard Worker     writebuf[i] = (unsigned char)CUPS_RAND();
473*5e7646d2SAndroid Build Coastguard Worker 
474*5e7646d2SAndroid Build Coastguard Worker  /*
475*5e7646d2SAndroid Build Coastguard Worker   * cupsFileOpen(write)
476*5e7646d2SAndroid Build Coastguard Worker   */
477*5e7646d2SAndroid Build Coastguard Worker 
478*5e7646d2SAndroid Build Coastguard Worker   printf("cupsFileOpen(write%s): ", compression ? " compressed" : "");
479*5e7646d2SAndroid Build Coastguard Worker 
480*5e7646d2SAndroid Build Coastguard Worker   fp = cupsFileOpen(compression ? "testfile.dat.gz" : "testfile.dat",
481*5e7646d2SAndroid Build Coastguard Worker                     compression ? "w9" : "w");
482*5e7646d2SAndroid Build Coastguard Worker   if (fp)
483*5e7646d2SAndroid Build Coastguard Worker   {
484*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
485*5e7646d2SAndroid Build Coastguard Worker 
486*5e7646d2SAndroid Build Coastguard Worker    /*
487*5e7646d2SAndroid Build Coastguard Worker     * cupsFileCompression()
488*5e7646d2SAndroid Build Coastguard Worker     */
489*5e7646d2SAndroid Build Coastguard Worker 
490*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileCompression(): ", stdout);
491*5e7646d2SAndroid Build Coastguard Worker 
492*5e7646d2SAndroid Build Coastguard Worker     if (cupsFileCompression(fp) == compression)
493*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
494*5e7646d2SAndroid Build Coastguard Worker     else
495*5e7646d2SAndroid Build Coastguard Worker     {
496*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Got %d, expected %d)\n", cupsFileCompression(fp),
497*5e7646d2SAndroid Build Coastguard Worker              compression);
498*5e7646d2SAndroid Build Coastguard Worker       status ++;
499*5e7646d2SAndroid Build Coastguard Worker     }
500*5e7646d2SAndroid Build Coastguard Worker 
501*5e7646d2SAndroid Build Coastguard Worker    /*
502*5e7646d2SAndroid Build Coastguard Worker     * cupsFilePuts()
503*5e7646d2SAndroid Build Coastguard Worker     */
504*5e7646d2SAndroid Build Coastguard Worker 
505*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFilePuts(): ", stdout);
506*5e7646d2SAndroid Build Coastguard Worker 
507*5e7646d2SAndroid Build Coastguard Worker     if (cupsFilePuts(fp, "# Hello, World\n") > 0)
508*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
509*5e7646d2SAndroid Build Coastguard Worker     else
510*5e7646d2SAndroid Build Coastguard Worker     {
511*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
512*5e7646d2SAndroid Build Coastguard Worker       status ++;
513*5e7646d2SAndroid Build Coastguard Worker     }
514*5e7646d2SAndroid Build Coastguard Worker 
515*5e7646d2SAndroid Build Coastguard Worker    /*
516*5e7646d2SAndroid Build Coastguard Worker     * cupsFilePrintf()
517*5e7646d2SAndroid Build Coastguard Worker     */
518*5e7646d2SAndroid Build Coastguard Worker 
519*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFilePrintf(): ", stdout);
520*5e7646d2SAndroid Build Coastguard Worker 
521*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < 1000; i ++)
522*5e7646d2SAndroid Build Coastguard Worker       if (cupsFilePrintf(fp, "TestLine %03d\n", i) < 0)
523*5e7646d2SAndroid Build Coastguard Worker         break;
524*5e7646d2SAndroid Build Coastguard Worker 
525*5e7646d2SAndroid Build Coastguard Worker     if (i >= 1000)
526*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
527*5e7646d2SAndroid Build Coastguard Worker     else
528*5e7646d2SAndroid Build Coastguard Worker     {
529*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
530*5e7646d2SAndroid Build Coastguard Worker       status ++;
531*5e7646d2SAndroid Build Coastguard Worker     }
532*5e7646d2SAndroid Build Coastguard Worker 
533*5e7646d2SAndroid Build Coastguard Worker    /*
534*5e7646d2SAndroid Build Coastguard Worker     * cupsFilePutChar()
535*5e7646d2SAndroid Build Coastguard Worker     */
536*5e7646d2SAndroid Build Coastguard Worker 
537*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFilePutChar(): ", stdout);
538*5e7646d2SAndroid Build Coastguard Worker 
539*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < 256; i ++)
540*5e7646d2SAndroid Build Coastguard Worker       if (cupsFilePutChar(fp, i) < 0)
541*5e7646d2SAndroid Build Coastguard Worker         break;
542*5e7646d2SAndroid Build Coastguard Worker 
543*5e7646d2SAndroid Build Coastguard Worker     if (i >= 256)
544*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
545*5e7646d2SAndroid Build Coastguard Worker     else
546*5e7646d2SAndroid Build Coastguard Worker     {
547*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
548*5e7646d2SAndroid Build Coastguard Worker       status ++;
549*5e7646d2SAndroid Build Coastguard Worker     }
550*5e7646d2SAndroid Build Coastguard Worker 
551*5e7646d2SAndroid Build Coastguard Worker    /*
552*5e7646d2SAndroid Build Coastguard Worker     * cupsFileWrite()
553*5e7646d2SAndroid Build Coastguard Worker     */
554*5e7646d2SAndroid Build Coastguard Worker 
555*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileWrite(): ", stdout);
556*5e7646d2SAndroid Build Coastguard Worker 
557*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < 10000; i ++)
558*5e7646d2SAndroid Build Coastguard Worker       if (cupsFileWrite(fp, (char *)writebuf, sizeof(writebuf)) < 0)
559*5e7646d2SAndroid Build Coastguard Worker         break;
560*5e7646d2SAndroid Build Coastguard Worker 
561*5e7646d2SAndroid Build Coastguard Worker     if (i >= 10000)
562*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
563*5e7646d2SAndroid Build Coastguard Worker     else
564*5e7646d2SAndroid Build Coastguard Worker     {
565*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
566*5e7646d2SAndroid Build Coastguard Worker       status ++;
567*5e7646d2SAndroid Build Coastguard Worker     }
568*5e7646d2SAndroid Build Coastguard Worker 
569*5e7646d2SAndroid Build Coastguard Worker    /*
570*5e7646d2SAndroid Build Coastguard Worker     * cupsFilePuts() with partial line...
571*5e7646d2SAndroid Build Coastguard Worker     */
572*5e7646d2SAndroid Build Coastguard Worker 
573*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFilePuts(\"partial line\"): ", stdout);
574*5e7646d2SAndroid Build Coastguard Worker 
575*5e7646d2SAndroid Build Coastguard Worker     if (cupsFilePuts(fp, partial_line) > 0)
576*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
577*5e7646d2SAndroid Build Coastguard Worker     else
578*5e7646d2SAndroid Build Coastguard Worker     {
579*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
580*5e7646d2SAndroid Build Coastguard Worker       status ++;
581*5e7646d2SAndroid Build Coastguard Worker     }
582*5e7646d2SAndroid Build Coastguard Worker 
583*5e7646d2SAndroid Build Coastguard Worker    /*
584*5e7646d2SAndroid Build Coastguard Worker     * cupsFileTell()
585*5e7646d2SAndroid Build Coastguard Worker     */
586*5e7646d2SAndroid Build Coastguard Worker 
587*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileTell(): ", stdout);
588*5e7646d2SAndroid Build Coastguard Worker 
589*5e7646d2SAndroid Build Coastguard Worker     if ((length = cupsFileTell(fp)) == 81933283)
590*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
591*5e7646d2SAndroid Build Coastguard Worker     else
592*5e7646d2SAndroid Build Coastguard Worker     {
593*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (" CUPS_LLFMT " instead of 81933283)\n", CUPS_LLCAST length);
594*5e7646d2SAndroid Build Coastguard Worker       status ++;
595*5e7646d2SAndroid Build Coastguard Worker     }
596*5e7646d2SAndroid Build Coastguard Worker 
597*5e7646d2SAndroid Build Coastguard Worker    /*
598*5e7646d2SAndroid Build Coastguard Worker     * cupsFileClose()
599*5e7646d2SAndroid Build Coastguard Worker     */
600*5e7646d2SAndroid Build Coastguard Worker 
601*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileClose(): ", stdout);
602*5e7646d2SAndroid Build Coastguard Worker 
603*5e7646d2SAndroid Build Coastguard Worker     if (!cupsFileClose(fp))
604*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
605*5e7646d2SAndroid Build Coastguard Worker     else
606*5e7646d2SAndroid Build Coastguard Worker     {
607*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
608*5e7646d2SAndroid Build Coastguard Worker       status ++;
609*5e7646d2SAndroid Build Coastguard Worker     }
610*5e7646d2SAndroid Build Coastguard Worker   }
611*5e7646d2SAndroid Build Coastguard Worker   else
612*5e7646d2SAndroid Build Coastguard Worker   {
613*5e7646d2SAndroid Build Coastguard Worker     printf("FAIL (%s)\n", strerror(errno));
614*5e7646d2SAndroid Build Coastguard Worker     status ++;
615*5e7646d2SAndroid Build Coastguard Worker   }
616*5e7646d2SAndroid Build Coastguard Worker 
617*5e7646d2SAndroid Build Coastguard Worker  /*
618*5e7646d2SAndroid Build Coastguard Worker   * cupsFileOpen(read)
619*5e7646d2SAndroid Build Coastguard Worker   */
620*5e7646d2SAndroid Build Coastguard Worker 
621*5e7646d2SAndroid Build Coastguard Worker   fputs("\ncupsFileOpen(read): ", stdout);
622*5e7646d2SAndroid Build Coastguard Worker 
623*5e7646d2SAndroid Build Coastguard Worker   fp = cupsFileOpen(compression ? "testfile.dat.gz" : "testfile.dat", "r");
624*5e7646d2SAndroid Build Coastguard Worker   if (fp)
625*5e7646d2SAndroid Build Coastguard Worker   {
626*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
627*5e7646d2SAndroid Build Coastguard Worker 
628*5e7646d2SAndroid Build Coastguard Worker    /*
629*5e7646d2SAndroid Build Coastguard Worker     * cupsFileGets()
630*5e7646d2SAndroid Build Coastguard Worker     */
631*5e7646d2SAndroid Build Coastguard Worker 
632*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileGets(): ", stdout);
633*5e7646d2SAndroid Build Coastguard Worker 
634*5e7646d2SAndroid Build Coastguard Worker     if (cupsFileGets(fp, line, sizeof(line)))
635*5e7646d2SAndroid Build Coastguard Worker     {
636*5e7646d2SAndroid Build Coastguard Worker       if (line[0] == '#')
637*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
638*5e7646d2SAndroid Build Coastguard Worker       else
639*5e7646d2SAndroid Build Coastguard Worker       {
640*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (Got line \"%s\", expected comment line)\n", line);
641*5e7646d2SAndroid Build Coastguard Worker 	status ++;
642*5e7646d2SAndroid Build Coastguard Worker       }
643*5e7646d2SAndroid Build Coastguard Worker     }
644*5e7646d2SAndroid Build Coastguard Worker     else
645*5e7646d2SAndroid Build Coastguard Worker     {
646*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
647*5e7646d2SAndroid Build Coastguard Worker       status ++;
648*5e7646d2SAndroid Build Coastguard Worker     }
649*5e7646d2SAndroid Build Coastguard Worker 
650*5e7646d2SAndroid Build Coastguard Worker    /*
651*5e7646d2SAndroid Build Coastguard Worker     * cupsFileCompression()
652*5e7646d2SAndroid Build Coastguard Worker     */
653*5e7646d2SAndroid Build Coastguard Worker 
654*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileCompression(): ", stdout);
655*5e7646d2SAndroid Build Coastguard Worker 
656*5e7646d2SAndroid Build Coastguard Worker     if (cupsFileCompression(fp) == compression)
657*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
658*5e7646d2SAndroid Build Coastguard Worker     else
659*5e7646d2SAndroid Build Coastguard Worker     {
660*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Got %d, expected %d)\n", cupsFileCompression(fp),
661*5e7646d2SAndroid Build Coastguard Worker              compression);
662*5e7646d2SAndroid Build Coastguard Worker       status ++;
663*5e7646d2SAndroid Build Coastguard Worker     }
664*5e7646d2SAndroid Build Coastguard Worker 
665*5e7646d2SAndroid Build Coastguard Worker    /*
666*5e7646d2SAndroid Build Coastguard Worker     * cupsFileGetConf()
667*5e7646d2SAndroid Build Coastguard Worker     */
668*5e7646d2SAndroid Build Coastguard Worker 
669*5e7646d2SAndroid Build Coastguard Worker     linenum = 1;
670*5e7646d2SAndroid Build Coastguard Worker 
671*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileGetConf(): ", stdout);
672*5e7646d2SAndroid Build Coastguard Worker 
673*5e7646d2SAndroid Build Coastguard Worker     for (i = 0, value = NULL; i < 1000; i ++)
674*5e7646d2SAndroid Build Coastguard Worker       if (!cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
675*5e7646d2SAndroid Build Coastguard Worker         break;
676*5e7646d2SAndroid Build Coastguard Worker       else if (_cups_strcasecmp(line, "TestLine") || !value || atoi(value) != i ||
677*5e7646d2SAndroid Build Coastguard Worker                linenum != (i + 2))
678*5e7646d2SAndroid Build Coastguard Worker         break;
679*5e7646d2SAndroid Build Coastguard Worker 
680*5e7646d2SAndroid Build Coastguard Worker     if (i >= 1000)
681*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
682*5e7646d2SAndroid Build Coastguard Worker     else if (line[0])
683*5e7646d2SAndroid Build Coastguard Worker     {
684*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Line %d, directive \"%s\", value \"%s\")\n", linenum,
685*5e7646d2SAndroid Build Coastguard Worker              line, value ? value : "(null)");
686*5e7646d2SAndroid Build Coastguard Worker       status ++;
687*5e7646d2SAndroid Build Coastguard Worker     }
688*5e7646d2SAndroid Build Coastguard Worker     else
689*5e7646d2SAndroid Build Coastguard Worker     {
690*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
691*5e7646d2SAndroid Build Coastguard Worker       status ++;
692*5e7646d2SAndroid Build Coastguard Worker     }
693*5e7646d2SAndroid Build Coastguard Worker 
694*5e7646d2SAndroid Build Coastguard Worker    /*
695*5e7646d2SAndroid Build Coastguard Worker     * cupsFileGetChar()
696*5e7646d2SAndroid Build Coastguard Worker     */
697*5e7646d2SAndroid Build Coastguard Worker 
698*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileGetChar(): ", stdout);
699*5e7646d2SAndroid Build Coastguard Worker 
700*5e7646d2SAndroid Build Coastguard Worker     for (i = 0, byte = 0; i < 256; i ++)
701*5e7646d2SAndroid Build Coastguard Worker       if ((byte = cupsFileGetChar(fp)) != i)
702*5e7646d2SAndroid Build Coastguard Worker         break;
703*5e7646d2SAndroid Build Coastguard Worker 
704*5e7646d2SAndroid Build Coastguard Worker     if (i >= 256)
705*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
706*5e7646d2SAndroid Build Coastguard Worker     else if (byte >= 0)
707*5e7646d2SAndroid Build Coastguard Worker     {
708*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Got %d, expected %d)\n", byte, i);
709*5e7646d2SAndroid Build Coastguard Worker       status ++;
710*5e7646d2SAndroid Build Coastguard Worker     }
711*5e7646d2SAndroid Build Coastguard Worker     else
712*5e7646d2SAndroid Build Coastguard Worker     {
713*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
714*5e7646d2SAndroid Build Coastguard Worker       status ++;
715*5e7646d2SAndroid Build Coastguard Worker     }
716*5e7646d2SAndroid Build Coastguard Worker 
717*5e7646d2SAndroid Build Coastguard Worker    /*
718*5e7646d2SAndroid Build Coastguard Worker     * cupsFileRead()
719*5e7646d2SAndroid Build Coastguard Worker     */
720*5e7646d2SAndroid Build Coastguard Worker 
721*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileRead(): ", stdout);
722*5e7646d2SAndroid Build Coastguard Worker 
723*5e7646d2SAndroid Build Coastguard Worker     for (i = 0, bytes = 0; i < 10000; i ++)
724*5e7646d2SAndroid Build Coastguard Worker       if ((bytes = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0)
725*5e7646d2SAndroid Build Coastguard Worker         break;
726*5e7646d2SAndroid Build Coastguard Worker       else if (memcmp(readbuf, writebuf, sizeof(readbuf)))
727*5e7646d2SAndroid Build Coastguard Worker         break;
728*5e7646d2SAndroid Build Coastguard Worker 
729*5e7646d2SAndroid Build Coastguard Worker     if (i >= 10000)
730*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
731*5e7646d2SAndroid Build Coastguard Worker     else if (bytes > 0)
732*5e7646d2SAndroid Build Coastguard Worker     {
733*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Pass %d, ", i);
734*5e7646d2SAndroid Build Coastguard Worker 
735*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < (int)sizeof(readbuf); i ++)
736*5e7646d2SAndroid Build Coastguard Worker         if (readbuf[i] != writebuf[i])
737*5e7646d2SAndroid Build Coastguard Worker 	  break;
738*5e7646d2SAndroid Build Coastguard Worker 
739*5e7646d2SAndroid Build Coastguard Worker       printf("match failed at offset %d - got %02X, expected %02X)\n",
740*5e7646d2SAndroid Build Coastguard Worker              i, readbuf[i], writebuf[i]);
741*5e7646d2SAndroid Build Coastguard Worker     }
742*5e7646d2SAndroid Build Coastguard Worker     else
743*5e7646d2SAndroid Build Coastguard Worker     {
744*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
745*5e7646d2SAndroid Build Coastguard Worker       status ++;
746*5e7646d2SAndroid Build Coastguard Worker     }
747*5e7646d2SAndroid Build Coastguard Worker 
748*5e7646d2SAndroid Build Coastguard Worker    /*
749*5e7646d2SAndroid Build Coastguard Worker     * cupsFileGetChar() with partial line...
750*5e7646d2SAndroid Build Coastguard Worker     */
751*5e7646d2SAndroid Build Coastguard Worker 
752*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileGetChar(partial line): ", stdout);
753*5e7646d2SAndroid Build Coastguard Worker 
754*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < (int)strlen(partial_line); i ++)
755*5e7646d2SAndroid Build Coastguard Worker       if ((byte = cupsFileGetChar(fp)) < 0)
756*5e7646d2SAndroid Build Coastguard Worker         break;
757*5e7646d2SAndroid Build Coastguard Worker       else if (byte != partial_line[i])
758*5e7646d2SAndroid Build Coastguard Worker         break;
759*5e7646d2SAndroid Build Coastguard Worker 
760*5e7646d2SAndroid Build Coastguard Worker     if (!partial_line[i])
761*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
762*5e7646d2SAndroid Build Coastguard Worker     else
763*5e7646d2SAndroid Build Coastguard Worker     {
764*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (got '%c', expected '%c')\n", byte, partial_line[i]);
765*5e7646d2SAndroid Build Coastguard Worker       status ++;
766*5e7646d2SAndroid Build Coastguard Worker     }
767*5e7646d2SAndroid Build Coastguard Worker 
768*5e7646d2SAndroid Build Coastguard Worker    /*
769*5e7646d2SAndroid Build Coastguard Worker     * cupsFileTell()
770*5e7646d2SAndroid Build Coastguard Worker     */
771*5e7646d2SAndroid Build Coastguard Worker 
772*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileTell(): ", stdout);
773*5e7646d2SAndroid Build Coastguard Worker 
774*5e7646d2SAndroid Build Coastguard Worker     if ((length = cupsFileTell(fp)) == 81933283)
775*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
776*5e7646d2SAndroid Build Coastguard Worker     else
777*5e7646d2SAndroid Build Coastguard Worker     {
778*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (" CUPS_LLFMT " instead of 81933283)\n", CUPS_LLCAST length);
779*5e7646d2SAndroid Build Coastguard Worker       status ++;
780*5e7646d2SAndroid Build Coastguard Worker     }
781*5e7646d2SAndroid Build Coastguard Worker 
782*5e7646d2SAndroid Build Coastguard Worker    /*
783*5e7646d2SAndroid Build Coastguard Worker     * cupsFileClose()
784*5e7646d2SAndroid Build Coastguard Worker     */
785*5e7646d2SAndroid Build Coastguard Worker 
786*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsFileClose(): ", stdout);
787*5e7646d2SAndroid Build Coastguard Worker 
788*5e7646d2SAndroid Build Coastguard Worker     if (!cupsFileClose(fp))
789*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
790*5e7646d2SAndroid Build Coastguard Worker     else
791*5e7646d2SAndroid Build Coastguard Worker     {
792*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
793*5e7646d2SAndroid Build Coastguard Worker       status ++;
794*5e7646d2SAndroid Build Coastguard Worker     }
795*5e7646d2SAndroid Build Coastguard Worker   }
796*5e7646d2SAndroid Build Coastguard Worker   else
797*5e7646d2SAndroid Build Coastguard Worker   {
798*5e7646d2SAndroid Build Coastguard Worker     printf("FAIL (%s)\n", strerror(errno));
799*5e7646d2SAndroid Build Coastguard Worker     status ++;
800*5e7646d2SAndroid Build Coastguard Worker   }
801*5e7646d2SAndroid Build Coastguard Worker 
802*5e7646d2SAndroid Build Coastguard Worker  /*
803*5e7646d2SAndroid Build Coastguard Worker   * Remove the test file...
804*5e7646d2SAndroid Build Coastguard Worker   */
805*5e7646d2SAndroid Build Coastguard Worker 
806*5e7646d2SAndroid Build Coastguard Worker   if (!status)
807*5e7646d2SAndroid Build Coastguard Worker     unlink(compression ? "testfile.dat.gz" : "testfile.dat");
808*5e7646d2SAndroid Build Coastguard Worker 
809*5e7646d2SAndroid Build Coastguard Worker  /*
810*5e7646d2SAndroid Build Coastguard Worker   * Return the test status...
811*5e7646d2SAndroid Build Coastguard Worker   */
812*5e7646d2SAndroid Build Coastguard Worker 
813*5e7646d2SAndroid Build Coastguard Worker   return (status);
814*5e7646d2SAndroid Build Coastguard Worker }
815