Added -e command line option to expect a given number of hits, and return
[idzebra-moved-to-github.git] / test / testclient.c
1 /*
2  * $Id: testclient.c,v 1.6 2002-11-11 15:19:25 heikki Exp $
3  *
4  * Z39.50 client specifically for Zebra testing.
5  */
6
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <yaz/xmalloc.h>
10 #include <yaz/options.h>
11 #include <yaz/zoom.h>
12
13 char *prog = "testclient";
14
15 int main(int argc, char **argv)
16 {
17     ZOOM_connection z;
18     ZOOM_resultset r;
19     int error;
20     const char *errmsg, *addinfo;
21     char *query = 0;
22     char *target = 0;
23     char *arg;
24     int delay_sec = 0;
25     int expected_hits=-1;
26     int ret;
27     int retrieve_number = 0;
28     int retrieve_offset = 0;
29     char *format = 0;
30     int pos;
31     int check_count = -1;
32     int exit_code = 0;
33
34     while ((ret = options("d:n:o:f:c:e:", argv, argc, &arg)) != -2)
35     {
36         switch (ret)
37         {
38         case 0:
39             if (!target)
40                 target = xstrdup(arg);
41             else if (!query)
42                 query = xstrdup(arg);
43             break;
44         case 'd':
45             delay_sec = atoi(arg);
46             break;
47         case 'n':
48             retrieve_number = atoi(arg);
49             break;
50         case 'o':
51             retrieve_offset = atoi(arg);
52             break;
53         case 'f':
54             format = xstrdup(arg);
55             break;
56         case 'c':
57             check_count = atoi(arg);
58             break;
59         case 'e':
60             expected_hits = atoi(arg);
61             break;
62         default:
63             printf ("%s: unknown option %s\n", prog, arg);
64             printf ("usage:\n%s [options] target query \n", prog);
65             printf (" eg.  bagel.indexdata.dk/gils computer\n");
66             exit (1);
67         }
68     }
69
70     if (!target || !target)
71     {
72         printf ("%s: missing target/query\n", prog);
73         printf ("usage:\n%s [options] target query \n", prog);
74         printf (" eg.  bagel.indexdata.dk/gils computer\n");
75         printf ("Options:\n");
76         printf (" -n num       number of records to fetch. Default: 0.\n");
77         printf (" -o off       offset for records - counting from 0.\n");
78         printf (" -f format    set record syntax. Default: none\n");
79         printf (" -d sec       delay a number of seconds before exit.\n");
80         printf ("Options\n");
81         exit (3);
82     }
83     z = ZOOM_connection_new (target, 0);
84     
85     if ((error = ZOOM_connection_error(z, &errmsg, &addinfo)))
86     {
87         printf ("Error: %s (%d) %s\n", errmsg, error, addinfo);
88         exit (2);
89     }
90
91     r = ZOOM_connection_search_pqf (z, query);
92     if ((error = ZOOM_connection_error(z, &errmsg, &addinfo)))
93     {
94         printf ("Error: %s (%d) %s\n", errmsg, error, addinfo);
95         if (check_count != -1)
96             exit_code = 10;
97     }
98     else
99     {
100         printf ("Result count: %d\n", ZOOM_resultset_size(r));
101         if (check_count != -1 && check_count != ZOOM_resultset_size(r))
102             exit_code = 10;
103         if ((expected_hits!=-1) && (ZOOM_resultset_size(r) != expected_hits))
104         {
105             printf("Wrong number of hits, expected %d, got %d\n",
106                             expected_hits, ZOOM_resultset_size(r) );
107             exit(3);
108         }
109     }
110     if (format)
111         ZOOM_resultset_option_set(r, "preferredRecordSyntax", format);
112     for (pos = 0; pos < retrieve_number; pos++)
113     {
114         size_t len;
115         const char *rec =
116             ZOOM_record_get(
117                 ZOOM_resultset_record(r, pos + retrieve_offset),
118                 "render", &len);
119         
120         if (rec)
121             fwrite (rec, 1, len, stdout);
122     }
123     if (delay_sec > 0)
124         sleep(delay_sec);
125     ZOOM_resultset_destroy (r);
126     ZOOM_connection_destroy (z);
127     exit (0);
128 }