Added retrieval handling support in Generic Frontend Server to support
[yaz-moved-to-github.git] / test / tst_retrieval.c
1 /*
2  * Copyright (C) 2005-2006, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: tst_retrieval.c,v 1.3 2006-05-07 14:48:25 adam Exp $
6  *
7  */
8 #include <yaz/retrieval.h>
9 #include <yaz/test.h>
10 #include <yaz/wrbuf.h>
11 #include <string.h>
12
13 #if HAVE_CONFIG_H
14 #include <config.h>
15 #endif
16
17 #if HAVE_XSLT
18
19 #include <libxml/parser.h>
20 #include <libxml/tree.h>
21
22 yaz_retrieval_t conv_configure(const char *xmlstring, WRBUF w)
23 {
24     xmlDocPtr doc = xmlParseMemory(xmlstring, strlen(xmlstring));
25     if (!doc)
26     {
27         wrbuf_printf(w, "xmlParseMemory");
28         return 0;
29     }
30     else
31     {
32         xmlNodePtr ptr = xmlDocGetRootElement(doc);
33         yaz_retrieval_t p = yaz_retrieval_create();
34
35         if (p)
36         {
37             const char *srcdir = getenv("srcdir");
38             if (srcdir)
39                 yaz_retrieval_set_path(p, srcdir);
40         }
41         if (!ptr)
42         {
43             wrbuf_printf(w, "xmlDocGetRootElement");
44             yaz_retrieval_destroy(p);
45             p = 0;
46         }
47         else if (!p)
48         {
49             wrbuf_printf(w, "yaz_retrieval_create");
50         }
51         else
52         {
53             int r = yaz_retrieval_configure(p, ptr);
54             
55             if (r)
56             {
57                 wrbuf_puts(w, yaz_retrieval_get_error(p));
58                 yaz_retrieval_destroy(p);
59                 p = 0;
60             }
61         }
62         xmlFreeDoc(doc);
63         return p;
64     }    
65 }
66
67 int conv_configure_test(const char *xmlstring, const char *expect_error,
68                         yaz_retrieval_t *pt)
69 {
70     WRBUF w = wrbuf_alloc();
71     int ret;
72
73     yaz_retrieval_t p = conv_configure(xmlstring, w);
74
75     if (!p)
76     {
77         if (expect_error && !strcmp(wrbuf_buf(w), expect_error))
78             ret = 1;
79         else
80         {
81             ret = 0;
82             printf("%.*s\n", wrbuf_len(w), wrbuf_buf(w));
83         }
84     }
85     else
86     {
87         if (expect_error)
88         {
89             ret = 0;
90             yaz_retrieval_destroy(p);
91         }
92         else
93         {
94             if (pt)
95                 *pt = p;
96             else
97                 yaz_retrieval_destroy(p);
98             ret = 1;
99         }
100     }
101     wrbuf_free(w, 1);
102     return ret;
103 }
104
105 static void tst_configure()
106 {
107     YAZ_CHECK(conv_configure_test("<bad", 
108                                   "xmlParseMemory", 0));
109
110     YAZ_CHECK(conv_configure_test("<bad/>", 
111                                   "Missing 'retrievalinfo' element", 0));
112
113     YAZ_CHECK(conv_configure_test("<retrievalinfo/>", 0, 0));
114
115     YAZ_CHECK(conv_configure_test("<retrievalinfo><bad/></retrievalinfo>",
116                                   "Bad element 'bad'."
117                                   " Expected 'retrieval'", 0));
118
119     YAZ_CHECK(conv_configure_test("<retrievalinfo><retrieval/>"
120                                   "</retrievalinfo>", 0, 0));
121
122     YAZ_CHECK(conv_configure_test("<retrievalinfo>"
123                                   "<retrieval>\n"
124                                   "  "
125                                   "<convert>"
126                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
127                                   "<marc"
128                                   " inputcharset=\"utf-8\""
129                                   " outputcharset=\"marc-8\""
130                                   " inputformat=\"xml\""
131                                   " outputformat=\"marc\""
132                                   "/>"
133                                   "</convert>"
134                                   "</retrieval>"
135                                   "</retrievalinfo>",
136                                   0, 0));
137
138     YAZ_CHECK(conv_configure_test("<retrievalinfo>"
139                                   "<retrieval>"
140                                   "<convert>"
141                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
142                                   "<marc"
143                                   " inputcharset=\"utf-8\""
144                                   " outputcharset=\"marc-8\""
145                                   " inputformat=\"xml\""
146                                   " outputformat=\"marc\""
147                                   "/>"
148                                   "</convert>"
149                                   "</retrieval>"
150                                   "<retrieval>"
151                                   "<convert>"
152                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
153                                   "<marc"
154                                   " inputcharset=\"utf-8\""
155                                   " outputcharset=\"marc-8\""
156                                   " inputformat=\"xml\""
157                                   " outputformat=\"marc\""
158                                   "/>"
159                                   "</convert>"
160                                   "</retrieval>"
161                                   "</retrievalinfo>",
162                                   0, 0));
163
164
165     YAZ_CHECK(conv_configure_test("<retrievalinfo>"
166                                   "<retrieval" 
167                                   " syntax=\"usmarc\""
168                                   " schema=\"marcxml\"" 
169                                   " identifier=\"info:srw/schema/1/marcxml-v1.1\""
170                                   ">"
171                                   "<convert/>"
172                                   "</retrieval>"
173                                   "</retrievalinfo>",
174                                   0, 0));
175
176     YAZ_CHECK(conv_configure_test("<retrievalinfo>"
177                                   "<retrieval" 
178                                   " syntax=\"unknown_synt\""
179                                   ">"
180                                   "<convert/>"
181                                   "</retrieval>"
182                                   "</retrievalinfo>",
183                                   "Bad syntax 'unknown_synt'", 0));
184
185     YAZ_CHECK(conv_configure_test("<retrievalinfo>"
186                                   "<retrieval" 
187                                   " backendsyntax=\"unknown_synt\""
188                                   ">"
189                                   "<convert/>"
190                                   "</retrieval>"
191                                   "</retrievalinfo>",
192                                   "Bad backendsyntax 'unknown_synt'", 0));
193
194 }
195
196 #endif
197
198 int main(int argc, char **argv)
199 {
200     YAZ_CHECK_INIT(argc, argv);
201 #if HAVE_XSLT
202     tst_configure();
203 #endif
204     YAZ_CHECK_TERM;
205 }
206
207 /*
208  * Local variables:
209  * c-basic-offset: 4
210  * indent-tabs-mode: nil
211  * End:
212  * vim: shiftwidth=4 tabstop=8 expandtab
213  */
214