First code bits of record retrieval code
[yaz-moved-to-github.git] / test / tst_record_conv.c
1 /*
2  * Copyright (C) 2005-2006, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: tst_record_conv.c,v 1.4 2006-05-04 20:00:45 adam Exp $
6  *
7  */
8 #include <yaz/record_conv.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_record_conv_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_record_conv_t p = yaz_record_conv_create();
34
35         if (p)
36         {
37             const char *srcdir = getenv("srcdir");
38             if (srcdir)
39                 yaz_record_conv_set_path(p, srcdir);
40         }
41         if (!ptr)
42         {
43             wrbuf_printf(w, "xmlDocGetRootElement");
44             yaz_record_conv_destroy(p);
45             p = 0;
46         }
47         else if (!p)
48         {
49             wrbuf_printf(w, "yaz_record_conv_create");
50         }
51         else
52         {
53             int r = yaz_record_conv_configure(p, ptr);
54             
55             if (r)
56             {
57                 wrbuf_puts(w, yaz_record_conv_get_error(p));
58                 yaz_record_conv_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_record_conv_t *pt)
69 {
70     WRBUF w = wrbuf_alloc();
71     int ret;
72
73     yaz_record_conv_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_record_conv_destroy(p);
91         }
92         else
93         {
94             if (pt)
95                 *pt = p;
96             else
97                 yaz_record_conv_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", "xmlParseMemory", 0));
108     YAZ_CHECK(conv_configure_test("<bad/>", "Missing 'convert' element", 0));
109     YAZ_CHECK(conv_configure_test("<convert/>", 0, 0));
110     YAZ_CHECK(conv_configure_test("<convert><bad/></convert>",
111                                   "Bad element 'bad'."
112                                   "Expected marc, xslt, ..", 0));
113     YAZ_CHECK(conv_configure_test("<convert>"
114                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
115                                   "<marc"
116                                   " inputcharset=\"marc-8\""
117                                   " outputcharset=\"marc-8\""
118                                   "/>"
119                                   "</convert>",
120                                   "Attribute 'inputformat' required", 0));
121     YAZ_CHECK(conv_configure_test("<convert>"
122                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
123                                   "<marc"
124                                   " inputcharset=\"utf-8\""
125                                   " outputcharset=\"marc-8\""
126                                   " inputformat=\"xml\""
127                                   " outputformat=\"marc\""
128                                   "/>"
129                                   "</convert>",
130                                   0, 0));
131 }
132
133 static int conv_convert_test(yaz_record_conv_t p,
134                              const char *input_record,
135                              const char *output_expect_record)
136 {
137     int ret = 0;
138     if (!p)
139     {
140         YAZ_CHECK(ret);
141     }
142     else
143     {
144         WRBUF output_record = wrbuf_alloc();
145         int r = yaz_record_conv_record(p, input_record, output_record);
146         if (r)
147         {
148             if (output_expect_record)
149             {
150                 printf("yaz_record_conv error=%s\n",
151                        yaz_record_conv_get_error(p));
152                 ret = 0;
153             }
154             else
155                 ret = 1;
156         }
157         else
158         {
159             if (!output_expect_record)
160             {
161                 ret = 0;
162             }
163             else if (strlen(output_expect_record) != wrbuf_len(output_record))
164             {
165                 int expect_len = strlen(output_expect_record);
166                 ret = 0;
167                 printf("output_record expect-len=%d got-len=%d\n", expect_len,
168                        wrbuf_len(output_record));
169                 printf("got-output_record = %.*s\n",
170                        wrbuf_len(output_record), wrbuf_buf(output_record));
171                 printf("output_expect_record = %s\n",
172                        output_expect_record);
173             }
174             else if (memcmp(output_expect_record, wrbuf_buf(output_record),
175                             strlen(output_expect_record)))
176             {
177                 ret = 0;
178                 printf("got-output_record = %.*s\n",
179                        wrbuf_len(output_record), wrbuf_buf(output_record));
180                 printf("output_expect_record = %s\n",
181                        output_expect_record);
182             }
183             else
184             {
185                 ret = 1;
186             }
187         }
188         wrbuf_free(output_record, 1);
189     }
190     return ret;
191 }
192
193 static void tst_convert()
194 {
195     yaz_record_conv_t p = 0;
196     const char *marcxml_rec =
197         "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
198         "  <leader>00080nam a22000498a 4500</leader>\n"
199         "  <controlfield tag=\"001\">   11224466 </controlfield>\n"
200         "  <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
201         "    <subfield code=\"a\">   11224466 </subfield>\n"
202         "  </datafield>\n"
203         "</record>\n";
204     const char *iso2709_rec =
205         "\x30\x30\x30\x38\x30\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
206         "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
207         "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x37\x30\x30\x30\x31\x33"
208         "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
209         "\x1F\x61\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
210
211     YAZ_CHECK(conv_configure_test("<convert>"
212                                   "<marc"
213                                   " inputcharset=\"utf-8\""
214                                   " outputcharset=\"marc-8\""
215                                   " inputformat=\"xml\""
216                                   " outputformat=\"marc\""
217                                   "/>"
218                                   "</convert>",
219                                   0, &p));
220     YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
221
222     YAZ_CHECK(conv_configure_test("<convert>"
223                                   "<marc"
224                                   " outputcharset=\"utf-8\""
225                                   " inputcharset=\"marc-8\""
226                                   " outputformat=\"marcxml\""
227                                   " inputformat=\"marc\""
228                                   "/>"
229                                   "</convert>",
230                                   0, &p));
231     YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec));
232
233
234     YAZ_CHECK(conv_configure_test("<convert>"
235                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
236                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
237                                   "<marc"
238                                   " inputcharset=\"utf-8\""
239                                   " outputcharset=\"marc-8\""
240                                   " inputformat=\"xml\""
241                                   " outputformat=\"marc\""
242                                   "/>"
243                                   "<marc"
244                                   " outputcharset=\"utf-8\""
245                                   " inputcharset=\"marc-8\""
246                                   " outputformat=\"marcxml\""
247                                   " inputformat=\"marc\""
248                                   "/>"
249                                   "</convert>",
250                                   0, &p));
251     YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
252
253
254
255     YAZ_CHECK(conv_configure_test("<convert>"
256                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
257                                   "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
258                                   "<marc"
259                                   " outputcharset=\"marc-8\""
260                                   " inputformat=\"xml\""
261                                   " outputformat=\"marc\""
262                                   "/>"
263                                   "<marc"
264                                   " inputcharset=\"marc-8\""
265                                   " outputformat=\"marcxml\""
266                                   " inputformat=\"marc\""
267                                   "/>"
268                                   "</convert>",
269                                   0, &p));
270     YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
271 }
272
273 #endif
274
275 int main(int argc, char **argv)
276 {
277     YAZ_CHECK_INIT(argc, argv);
278 #if HAVE_XSLT
279     tst_configure();
280     tst_convert();
281 #endif
282     YAZ_CHECK_TERM;
283 }
284
285 /*
286  * Local variables:
287  * c-basic-offset: 4
288  * indent-tabs-mode: nil
289  * End:
290  * vim: shiftwidth=4 tabstop=8 expandtab
291  */
292