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