xref: /aosp_15_r20/external/libcups/scheduler/testspeed.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Scheduler speed test for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2014 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright 1997-2005 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 information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include <cups/string-private.h>
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/cups.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <cups/language.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <cups/debug-private.h>
18*5e7646d2SAndroid Build Coastguard Worker #include <sys/types.h>
19*5e7646d2SAndroid Build Coastguard Worker #include <sys/time.h>
20*5e7646d2SAndroid Build Coastguard Worker #include <sys/wait.h>
21*5e7646d2SAndroid Build Coastguard Worker 
22*5e7646d2SAndroid Build Coastguard Worker 
23*5e7646d2SAndroid Build Coastguard Worker /*
24*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
25*5e7646d2SAndroid Build Coastguard Worker  */
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker static int	do_test(const char *server, int port,
28*5e7646d2SAndroid Build Coastguard Worker 		        http_encryption_t encryption, int requests,
29*5e7646d2SAndroid Build Coastguard Worker 			const char *opstring, int verbose);
30*5e7646d2SAndroid Build Coastguard Worker static void	usage(void) _CUPS_NORETURN;
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker /*
34*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Send multiple IPP requests and report on the average response
35*5e7646d2SAndroid Build Coastguard Worker  *            time.
36*5e7646d2SAndroid Build Coastguard Worker  */
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker int
main(int argc,char * argv[])39*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line arguments */
40*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
41*5e7646d2SAndroid Build Coastguard Worker {
42*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
43*5e7646d2SAndroid Build Coastguard Worker   char		*server,		/* Server to use */
44*5e7646d2SAndroid Build Coastguard Worker 		*ptr;			/* Pointer to port in server */
45*5e7646d2SAndroid Build Coastguard Worker   int		port;			/* Port to use */
46*5e7646d2SAndroid Build Coastguard Worker   http_encryption_t encryption;		/* Encryption to use */
47*5e7646d2SAndroid Build Coastguard Worker   int		requests;		/* Number of requests to send */
48*5e7646d2SAndroid Build Coastguard Worker   int		children;		/* Number of children to fork */
49*5e7646d2SAndroid Build Coastguard Worker   int		good_children;		/* Number of children that exited normally */
50*5e7646d2SAndroid Build Coastguard Worker   int		pid;			/* Child PID */
51*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Child status */
52*5e7646d2SAndroid Build Coastguard Worker   time_t	start,			/* Start time */
53*5e7646d2SAndroid Build Coastguard Worker 		end;			/* End time */
54*5e7646d2SAndroid Build Coastguard Worker   double	elapsed;		/* Elapsed time */
55*5e7646d2SAndroid Build Coastguard Worker   int		verbose;		/* Verbosity */
56*5e7646d2SAndroid Build Coastguard Worker   const char	*opstring;		/* Operation name */
57*5e7646d2SAndroid Build Coastguard Worker 
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker  /*
60*5e7646d2SAndroid Build Coastguard Worker   * Parse command-line options...
61*5e7646d2SAndroid Build Coastguard Worker   */
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker   requests   = 100;
64*5e7646d2SAndroid Build Coastguard Worker   children   = 5;
65*5e7646d2SAndroid Build Coastguard Worker   server     = (char *)cupsServer();
66*5e7646d2SAndroid Build Coastguard Worker   port       = ippPort();
67*5e7646d2SAndroid Build Coastguard Worker   encryption = HTTP_ENCRYPT_IF_REQUESTED;
68*5e7646d2SAndroid Build Coastguard Worker   verbose    = 0;
69*5e7646d2SAndroid Build Coastguard Worker   opstring   = NULL;
70*5e7646d2SAndroid Build Coastguard Worker 
71*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
72*5e7646d2SAndroid Build Coastguard Worker     if (argv[i][0] == '-')
73*5e7646d2SAndroid Build Coastguard Worker     {
74*5e7646d2SAndroid Build Coastguard Worker       for (ptr = argv[i] + 1; *ptr; ptr ++)
75*5e7646d2SAndroid Build Coastguard Worker         switch (*ptr)
76*5e7646d2SAndroid Build Coastguard Worker 	{
77*5e7646d2SAndroid Build Coastguard Worker 	  case 'E' : /* Enable encryption */
78*5e7646d2SAndroid Build Coastguard Worker 	      encryption = HTTP_ENCRYPT_REQUIRED;
79*5e7646d2SAndroid Build Coastguard Worker 	      break;
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker 	  case 'c' : /* Number of children */
82*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
83*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
84*5e7646d2SAndroid Build Coastguard Worker 		usage();
85*5e7646d2SAndroid Build Coastguard Worker 
86*5e7646d2SAndroid Build Coastguard Worker 	      children = atoi(argv[i]);
87*5e7646d2SAndroid Build Coastguard Worker 	      break;
88*5e7646d2SAndroid Build Coastguard Worker 
89*5e7646d2SAndroid Build Coastguard Worker           case 'o' : /* Operation */
90*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
91*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
92*5e7646d2SAndroid Build Coastguard Worker 		usage();
93*5e7646d2SAndroid Build Coastguard Worker 
94*5e7646d2SAndroid Build Coastguard Worker 	      opstring = argv[i];
95*5e7646d2SAndroid Build Coastguard Worker 	      break;
96*5e7646d2SAndroid Build Coastguard Worker 
97*5e7646d2SAndroid Build Coastguard Worker           case 'r' : /* Number of requests */
98*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
99*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
100*5e7646d2SAndroid Build Coastguard Worker 		usage();
101*5e7646d2SAndroid Build Coastguard Worker 
102*5e7646d2SAndroid Build Coastguard Worker 	      requests = atoi(argv[i]);
103*5e7646d2SAndroid Build Coastguard Worker 	      break;
104*5e7646d2SAndroid Build Coastguard Worker 
105*5e7646d2SAndroid Build Coastguard Worker           case 'v' : /* Verbose logging */
106*5e7646d2SAndroid Build Coastguard Worker               verbose ++;
107*5e7646d2SAndroid Build Coastguard Worker 	      break;
108*5e7646d2SAndroid Build Coastguard Worker 
109*5e7646d2SAndroid Build Coastguard Worker           default :
110*5e7646d2SAndroid Build Coastguard Worker               usage();
111*5e7646d2SAndroid Build Coastguard Worker 	      break;
112*5e7646d2SAndroid Build Coastguard Worker         }
113*5e7646d2SAndroid Build Coastguard Worker     }
114*5e7646d2SAndroid Build Coastguard Worker     else
115*5e7646d2SAndroid Build Coastguard Worker     {
116*5e7646d2SAndroid Build Coastguard Worker       server = argv[i];
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker       if (server[0] != '/' && (ptr = strrchr(server, ':')) != NULL)
119*5e7646d2SAndroid Build Coastguard Worker       {
120*5e7646d2SAndroid Build Coastguard Worker         *ptr++ = '\0';
121*5e7646d2SAndroid Build Coastguard Worker 	port   = atoi(ptr);
122*5e7646d2SAndroid Build Coastguard Worker       }
123*5e7646d2SAndroid Build Coastguard Worker     }
124*5e7646d2SAndroid Build Coastguard Worker 
125*5e7646d2SAndroid Build Coastguard Worker  /*
126*5e7646d2SAndroid Build Coastguard Worker   * Then create child processes to act as clients...
127*5e7646d2SAndroid Build Coastguard Worker   */
128*5e7646d2SAndroid Build Coastguard Worker 
129*5e7646d2SAndroid Build Coastguard Worker   if (children > 0)
130*5e7646d2SAndroid Build Coastguard Worker   {
131*5e7646d2SAndroid Build Coastguard Worker     printf("testspeed: Simulating %d clients with %d requests to %s with "
132*5e7646d2SAndroid Build Coastguard Worker            "%sencryption...\n", children, requests, server,
133*5e7646d2SAndroid Build Coastguard Worker 	   encryption == HTTP_ENCRYPT_IF_REQUESTED ? "no " : "");
134*5e7646d2SAndroid Build Coastguard Worker   }
135*5e7646d2SAndroid Build Coastguard Worker 
136*5e7646d2SAndroid Build Coastguard Worker   start = time(NULL);
137*5e7646d2SAndroid Build Coastguard Worker 
138*5e7646d2SAndroid Build Coastguard Worker   if (children < 1)
139*5e7646d2SAndroid Build Coastguard Worker     return (do_test(server, port, encryption, requests, opstring, verbose));
140*5e7646d2SAndroid Build Coastguard Worker   else if (children == 1)
141*5e7646d2SAndroid Build Coastguard Worker     good_children = do_test(server, port, encryption, requests, opstring,
142*5e7646d2SAndroid Build Coastguard Worker                             verbose) ? 0 : 1;
143*5e7646d2SAndroid Build Coastguard Worker   else
144*5e7646d2SAndroid Build Coastguard Worker   {
145*5e7646d2SAndroid Build Coastguard Worker     char	options[255],		/* Command-line options for child */
146*5e7646d2SAndroid Build Coastguard Worker 		reqstr[255],		/* Requests string for child */
147*5e7646d2SAndroid Build Coastguard Worker 		serverstr[255];		/* Server:port string for child */
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker 
150*5e7646d2SAndroid Build Coastguard Worker     snprintf(reqstr, sizeof(reqstr), "%d", requests);
151*5e7646d2SAndroid Build Coastguard Worker 
152*5e7646d2SAndroid Build Coastguard Worker     if (port == 631 || server[0] == '/')
153*5e7646d2SAndroid Build Coastguard Worker       strlcpy(serverstr, server, sizeof(serverstr));
154*5e7646d2SAndroid Build Coastguard Worker     else
155*5e7646d2SAndroid Build Coastguard Worker       snprintf(serverstr, sizeof(serverstr), "%s:%d", server, port);
156*5e7646d2SAndroid Build Coastguard Worker 
157*5e7646d2SAndroid Build Coastguard Worker     strlcpy(options, "-cr", sizeof(options));
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker     if (encryption == HTTP_ENCRYPT_REQUIRED)
160*5e7646d2SAndroid Build Coastguard Worker       strlcat(options, "E", sizeof(options));
161*5e7646d2SAndroid Build Coastguard Worker 
162*5e7646d2SAndroid Build Coastguard Worker     if (verbose)
163*5e7646d2SAndroid Build Coastguard Worker       strlcat(options, "v", sizeof(options));
164*5e7646d2SAndroid Build Coastguard Worker 
165*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < children; i ++)
166*5e7646d2SAndroid Build Coastguard Worker     {
167*5e7646d2SAndroid Build Coastguard Worker       fflush(stdout);
168*5e7646d2SAndroid Build Coastguard Worker 
169*5e7646d2SAndroid Build Coastguard Worker       if ((pid = fork()) == 0)
170*5e7646d2SAndroid Build Coastguard Worker       {
171*5e7646d2SAndroid Build Coastguard Worker        /*
172*5e7646d2SAndroid Build Coastguard Worker 	* Child goes here...
173*5e7646d2SAndroid Build Coastguard Worker 	*/
174*5e7646d2SAndroid Build Coastguard Worker 
175*5e7646d2SAndroid Build Coastguard Worker         if (opstring)
176*5e7646d2SAndroid Build Coastguard Worker 	  execlp(argv[0], argv[0], options, "0", reqstr, "-o", opstring,
177*5e7646d2SAndroid Build Coastguard Worker 	         serverstr, (char *)NULL);
178*5e7646d2SAndroid Build Coastguard Worker         else
179*5e7646d2SAndroid Build Coastguard Worker 	  execlp(argv[0], argv[0], options, "0", reqstr, serverstr, (char *)NULL);
180*5e7646d2SAndroid Build Coastguard Worker 
181*5e7646d2SAndroid Build Coastguard Worker 	exit(errno);
182*5e7646d2SAndroid Build Coastguard Worker       }
183*5e7646d2SAndroid Build Coastguard Worker       else if (pid < 0)
184*5e7646d2SAndroid Build Coastguard Worker       {
185*5e7646d2SAndroid Build Coastguard Worker 	printf("testspeed: Fork failed: %s\n", strerror(errno));
186*5e7646d2SAndroid Build Coastguard Worker 	break;
187*5e7646d2SAndroid Build Coastguard Worker       }
188*5e7646d2SAndroid Build Coastguard Worker       else
189*5e7646d2SAndroid Build Coastguard Worker 	printf("testspeed: Started child %d...\n", pid);
190*5e7646d2SAndroid Build Coastguard Worker     }
191*5e7646d2SAndroid Build Coastguard Worker 
192*5e7646d2SAndroid Build Coastguard Worker    /*
193*5e7646d2SAndroid Build Coastguard Worker     * Wait for children to finish...
194*5e7646d2SAndroid Build Coastguard Worker     */
195*5e7646d2SAndroid Build Coastguard Worker 
196*5e7646d2SAndroid Build Coastguard Worker     puts("testspeed: Waiting for children to finish...");
197*5e7646d2SAndroid Build Coastguard Worker 
198*5e7646d2SAndroid Build Coastguard Worker     for (good_children = 0;;)
199*5e7646d2SAndroid Build Coastguard Worker     {
200*5e7646d2SAndroid Build Coastguard Worker       pid = wait(&status);
201*5e7646d2SAndroid Build Coastguard Worker 
202*5e7646d2SAndroid Build Coastguard Worker       if (pid < 0 && errno != EINTR)
203*5e7646d2SAndroid Build Coastguard Worker 	break;
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker       printf("testspeed: Ended child %d (%d)...\n", pid, status / 256);
206*5e7646d2SAndroid Build Coastguard Worker 
207*5e7646d2SAndroid Build Coastguard Worker       if (!status)
208*5e7646d2SAndroid Build Coastguard Worker         good_children ++;
209*5e7646d2SAndroid Build Coastguard Worker     }
210*5e7646d2SAndroid Build Coastguard Worker   }
211*5e7646d2SAndroid Build Coastguard Worker 
212*5e7646d2SAndroid Build Coastguard Worker  /*
213*5e7646d2SAndroid Build Coastguard Worker   * Compute the total run time...
214*5e7646d2SAndroid Build Coastguard Worker   */
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker   if (good_children > 0)
217*5e7646d2SAndroid Build Coastguard Worker   {
218*5e7646d2SAndroid Build Coastguard Worker     end     = time(NULL);
219*5e7646d2SAndroid Build Coastguard Worker     elapsed = end - start;
220*5e7646d2SAndroid Build Coastguard Worker     i       = good_children * requests;
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker     printf("testspeed: %dx%d=%d requests in %.1fs (%.3fs/r, %.1fr/s)\n",
223*5e7646d2SAndroid Build Coastguard Worker 	   good_children, requests, i, elapsed, elapsed / i, i / elapsed);
224*5e7646d2SAndroid Build Coastguard Worker   }
225*5e7646d2SAndroid Build Coastguard Worker 
226*5e7646d2SAndroid Build Coastguard Worker  /*
227*5e7646d2SAndroid Build Coastguard Worker   * Exit with no errors...
228*5e7646d2SAndroid Build Coastguard Worker   */
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker   return (0);
231*5e7646d2SAndroid Build Coastguard Worker }
232*5e7646d2SAndroid Build Coastguard Worker 
233*5e7646d2SAndroid Build Coastguard Worker 
234*5e7646d2SAndroid Build Coastguard Worker /*
235*5e7646d2SAndroid Build Coastguard Worker  * 'do_test()' - Run a test on a specific host...
236*5e7646d2SAndroid Build Coastguard Worker  */
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Exit status */
do_test(const char * server,int port,http_encryption_t encryption,int requests,const char * opstring,int verbose)239*5e7646d2SAndroid Build Coastguard Worker do_test(const char        *server,	/* I - Server to use */
240*5e7646d2SAndroid Build Coastguard Worker         int               port,		/* I - Port number to use */
241*5e7646d2SAndroid Build Coastguard Worker         http_encryption_t encryption,	/* I - Encryption to use */
242*5e7646d2SAndroid Build Coastguard Worker 	int               requests,	/* I - Number of requests to send */
243*5e7646d2SAndroid Build Coastguard Worker 	const char        *opstring,	/* I - Operation string */
244*5e7646d2SAndroid Build Coastguard Worker 	int               verbose)	/* I - Verbose output? */
245*5e7646d2SAndroid Build Coastguard Worker {
246*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
247*5e7646d2SAndroid Build Coastguard Worker   http_t	*http;			/* Connection to server */
248*5e7646d2SAndroid Build Coastguard Worker   ipp_t		*request;		/* IPP Request */
249*5e7646d2SAndroid Build Coastguard Worker   struct timeval start,			/* Start time */
250*5e7646d2SAndroid Build Coastguard Worker 		end;			/* End time */
251*5e7646d2SAndroid Build Coastguard Worker   double	reqtime,		/* Time for this request */
252*5e7646d2SAndroid Build Coastguard Worker 		elapsed;		/* Elapsed time */
253*5e7646d2SAndroid Build Coastguard Worker   int		op;			/* Current operation */
254*5e7646d2SAndroid Build Coastguard Worker   static ipp_op_t ops[5] =		/* Operations to test... */
255*5e7646d2SAndroid Build Coastguard Worker 		{
256*5e7646d2SAndroid Build Coastguard Worker 		  IPP_PRINT_JOB,
257*5e7646d2SAndroid Build Coastguard Worker 		  CUPS_GET_DEFAULT,
258*5e7646d2SAndroid Build Coastguard Worker 		  CUPS_GET_PRINTERS,
259*5e7646d2SAndroid Build Coastguard Worker 		  CUPS_GET_CLASSES,
260*5e7646d2SAndroid Build Coastguard Worker 		  IPP_GET_JOBS
261*5e7646d2SAndroid Build Coastguard Worker 		};
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker 
264*5e7646d2SAndroid Build Coastguard Worker  /*
265*5e7646d2SAndroid Build Coastguard Worker   * Connect to the server...
266*5e7646d2SAndroid Build Coastguard Worker   */
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker   if ((http = httpConnectEncrypt(server, port, encryption)) == NULL)
269*5e7646d2SAndroid Build Coastguard Worker   {
270*5e7646d2SAndroid Build Coastguard Worker     printf("testspeed(%d): unable to connect to server - %s\n", (int)getpid(),
271*5e7646d2SAndroid Build Coastguard Worker            strerror(errno));
272*5e7646d2SAndroid Build Coastguard Worker     return (1);
273*5e7646d2SAndroid Build Coastguard Worker   }
274*5e7646d2SAndroid Build Coastguard Worker 
275*5e7646d2SAndroid Build Coastguard Worker  /*
276*5e7646d2SAndroid Build Coastguard Worker   * Do multiple requests...
277*5e7646d2SAndroid Build Coastguard Worker   */
278*5e7646d2SAndroid Build Coastguard Worker 
279*5e7646d2SAndroid Build Coastguard Worker   for (elapsed = 0.0, i = 0; i < requests; i ++)
280*5e7646d2SAndroid Build Coastguard Worker   {
281*5e7646d2SAndroid Build Coastguard Worker    /*
282*5e7646d2SAndroid Build Coastguard Worker     * Build a request which requires the following attributes:
283*5e7646d2SAndroid Build Coastguard Worker     *
284*5e7646d2SAndroid Build Coastguard Worker     *    attributes-charset
285*5e7646d2SAndroid Build Coastguard Worker     *    attributes-natural-language
286*5e7646d2SAndroid Build Coastguard Worker     *
287*5e7646d2SAndroid Build Coastguard Worker     * In addition, IPP_GET_JOBS needs a printer-uri attribute.
288*5e7646d2SAndroid Build Coastguard Worker     */
289*5e7646d2SAndroid Build Coastguard Worker 
290*5e7646d2SAndroid Build Coastguard Worker     if (opstring)
291*5e7646d2SAndroid Build Coastguard Worker       op = ippOpValue(opstring);
292*5e7646d2SAndroid Build Coastguard Worker     else
293*5e7646d2SAndroid Build Coastguard Worker       op = ops[i % (int)(sizeof(ops) / sizeof(ops[0]))];
294*5e7646d2SAndroid Build Coastguard Worker 
295*5e7646d2SAndroid Build Coastguard Worker     request = ippNewRequest(op);
296*5e7646d2SAndroid Build Coastguard Worker 
297*5e7646d2SAndroid Build Coastguard Worker     gettimeofday(&start, NULL);
298*5e7646d2SAndroid Build Coastguard Worker 
299*5e7646d2SAndroid Build Coastguard Worker     if (verbose)
300*5e7646d2SAndroid Build Coastguard Worker       printf("testspeed(%d): %.6f %s ", (int)getpid(), elapsed,
301*5e7646d2SAndroid Build Coastguard Worker 	     ippOpString(op));
302*5e7646d2SAndroid Build Coastguard Worker 
303*5e7646d2SAndroid Build Coastguard Worker     switch (op)
304*5e7646d2SAndroid Build Coastguard Worker     {
305*5e7646d2SAndroid Build Coastguard Worker       case IPP_GET_JOBS :
306*5e7646d2SAndroid Build Coastguard Worker 	  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
307*5e7646d2SAndroid Build Coastguard Worker                        NULL, "ipp://localhost/printers/");
308*5e7646d2SAndroid Build Coastguard Worker 
309*5e7646d2SAndroid Build Coastguard Worker       default :
310*5e7646d2SAndroid Build Coastguard Worker 	  ippDelete(cupsDoRequest(http, request, "/"));
311*5e7646d2SAndroid Build Coastguard Worker           break;
312*5e7646d2SAndroid Build Coastguard Worker 
313*5e7646d2SAndroid Build Coastguard Worker       case IPP_PRINT_JOB :
314*5e7646d2SAndroid Build Coastguard Worker 	  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
315*5e7646d2SAndroid Build Coastguard Worker                        NULL, "ipp://localhost/printers/test");
316*5e7646d2SAndroid Build Coastguard Worker 	  ippDelete(cupsDoFileRequest(http, request, "/printers/test",
317*5e7646d2SAndroid Build Coastguard Worker 	                              "../data/testprint.ps"));
318*5e7646d2SAndroid Build Coastguard Worker           break;
319*5e7646d2SAndroid Build Coastguard Worker     }
320*5e7646d2SAndroid Build Coastguard Worker 
321*5e7646d2SAndroid Build Coastguard Worker     gettimeofday(&end, NULL);
322*5e7646d2SAndroid Build Coastguard Worker 
323*5e7646d2SAndroid Build Coastguard Worker     reqtime = (end.tv_sec - start.tv_sec) +
324*5e7646d2SAndroid Build Coastguard Worker               0.000001 * (end.tv_usec - start.tv_usec);
325*5e7646d2SAndroid Build Coastguard Worker     elapsed += reqtime;
326*5e7646d2SAndroid Build Coastguard Worker 
327*5e7646d2SAndroid Build Coastguard Worker     switch (cupsLastError())
328*5e7646d2SAndroid Build Coastguard Worker     {
329*5e7646d2SAndroid Build Coastguard Worker       case IPP_OK :
330*5e7646d2SAndroid Build Coastguard Worker       case IPP_NOT_FOUND :
331*5e7646d2SAndroid Build Coastguard Worker           if (verbose)
332*5e7646d2SAndroid Build Coastguard Worker 	  {
333*5e7646d2SAndroid Build Coastguard Worker 	    printf("succeeded: %s (%.6f)\n", cupsLastErrorString(), reqtime);
334*5e7646d2SAndroid Build Coastguard Worker 	    fflush(stdout);
335*5e7646d2SAndroid Build Coastguard Worker 	  }
336*5e7646d2SAndroid Build Coastguard Worker           break;
337*5e7646d2SAndroid Build Coastguard Worker 
338*5e7646d2SAndroid Build Coastguard Worker       default :
339*5e7646d2SAndroid Build Coastguard Worker           if (!verbose)
340*5e7646d2SAndroid Build Coastguard Worker 	    printf("testspeed(%d): %s ", (int)getpid(),
341*5e7646d2SAndroid Build Coastguard Worker 	           ippOpString(ops[i & 3]));
342*5e7646d2SAndroid Build Coastguard Worker 
343*5e7646d2SAndroid Build Coastguard Worker 	  printf("failed: %s\n", cupsLastErrorString());
344*5e7646d2SAndroid Build Coastguard Worker           httpClose(http);
345*5e7646d2SAndroid Build Coastguard Worker 	  return (1);
346*5e7646d2SAndroid Build Coastguard Worker     }
347*5e7646d2SAndroid Build Coastguard Worker   }
348*5e7646d2SAndroid Build Coastguard Worker 
349*5e7646d2SAndroid Build Coastguard Worker   httpClose(http);
350*5e7646d2SAndroid Build Coastguard Worker 
351*5e7646d2SAndroid Build Coastguard Worker   printf("testspeed(%d): %d requests in %.1fs (%.3fs/r, %.1fr/s)\n",
352*5e7646d2SAndroid Build Coastguard Worker          (int)getpid(), i, elapsed, elapsed / i, i / elapsed);
353*5e7646d2SAndroid Build Coastguard Worker 
354*5e7646d2SAndroid Build Coastguard Worker   return (0);
355*5e7646d2SAndroid Build Coastguard Worker }
356*5e7646d2SAndroid Build Coastguard Worker 
357*5e7646d2SAndroid Build Coastguard Worker 
358*5e7646d2SAndroid Build Coastguard Worker /*
359*5e7646d2SAndroid Build Coastguard Worker  * 'usage()' - Show program usage...
360*5e7646d2SAndroid Build Coastguard Worker  */
361*5e7646d2SAndroid Build Coastguard Worker 
362*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)363*5e7646d2SAndroid Build Coastguard Worker usage(void)
364*5e7646d2SAndroid Build Coastguard Worker {
365*5e7646d2SAndroid Build Coastguard Worker   puts("Usage: testspeed [-c children] [-h] [-o operation] [-r requests] [-v] "
366*5e7646d2SAndroid Build Coastguard Worker        "[-E] hostname[:port]");
367*5e7646d2SAndroid Build Coastguard Worker   exit(0);
368*5e7646d2SAndroid Build Coastguard Worker }
369