GPL v2.
[metaproxy-moved-to-github.git] / src / test_filter_query_rewrite.cpp
1 /* $Id: test_filter_query_rewrite.cpp,v 1.13 2007-05-09 21:23:09 adam Exp $
2    Copyright (c) 2005-2007, Index Data.
3
4 This file is part of Metaproxy.
5
6 Metaproxy is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
10
11 Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Metaproxy; see the file LICENSE.  If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.
20  */
21
22 #include "config.hpp"
23 #include <iostream>
24 #include <stdexcept>
25
26 #include "filter_query_rewrite.hpp"
27 #include "util.hpp"
28 #include "router_chain.hpp"
29 #include "session.hpp"
30 #include "package.hpp"
31
32 #define BOOST_AUTO_TEST_MAIN
33 #include <boost/test/auto_unit_test.hpp>
34
35 using namespace boost::unit_test;
36
37 namespace mp = metaproxy_1;
38 using namespace mp::util;
39
40 class FilterBounceZ3950: public mp::filter::Base {
41 public:
42     void process(mp::Package & package) const {
43         
44         if (package.session().is_closed())
45         {
46             std::cout << "Got Close.\n";
47             return;
48         }
49        
50         Z_GDU *gdu = package.request().get();
51         
52         if (gdu && gdu->which == Z_GDU_Z3950 
53             && gdu->u.z3950->which == Z_APDU_initRequest)
54         {
55             std::cout << "Got Z3950 Init PDU\n";         
56             //Z_InitRequest *req = gdu->u.z3950->u.initRequest;
57             //package.request() = gdu;
58             return;
59         } 
60         else if (gdu && gdu->which == Z_GDU_Z3950 
61                  && gdu->u.z3950->which == Z_APDU_searchRequest)
62         {
63             std::cout << "Got Z3950 Search PDU\n";   
64             //Z_SearchRequest *req = gdu->u.z3950->u.searchRequest;
65             //package.request() = gdu;
66             return;
67         } 
68         else if (gdu && gdu->which == Z_GDU_Z3950 
69                  && gdu->u.z3950->which == Z_APDU_scanRequest)
70         {
71             std::cout << "Got Z3950 Scan PDU\n";   
72             //Z_ScanRequest *req = gdu->u.z3950->u.scanRequest;
73             //package.request() = gdu;
74             return;
75         } 
76         
77         package.move();
78     };
79 };
80
81 void check_query_rewrite_init(mp::RouterChain &router)
82 {
83     //std::cout << "QUERY REWRITE INIT\n";
84
85     // Create package with Z39.50 init request in it
86     mp::Package pack;
87         
88     mp::odr odr;
89     Z_APDU *apdu = zget_APDU(odr, Z_APDU_initRequest);
90     
91     pack.request() = apdu;
92     // Done creating query.
93
94     // Put it in router
95     pack.router(router).move(); 
96     
97     // Inspect bounced back request
98     //yazpp_1::GDU *gdu = &pack.response();
99     yazpp_1::GDU *gdu = &pack.request();
100     
101     Z_GDU *z_gdu = gdu->get();
102
103     //std::cout << "Z_GDU " << z_gdu << "\n";
104     BOOST_CHECK(z_gdu);
105     if (z_gdu) {
106         BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
107         BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_initRequest);
108     }
109 }
110
111 void check_query_rewrite_search(mp::RouterChain &router, 
112                                 std::string query_in,
113                                 std::string query_expect)
114 {
115     //std::cout << "QUERY REWRITE SEARCH " 
116     //          << query_in << " " << query_expect << "\n";
117     
118     // Create package with Z39.50 search request in it
119     mp::Package pack;
120         
121     mp::odr odr;
122     Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchRequest);
123
124     // create package PQF query here    
125     mp::util::pqf(odr, apdu, query_in);
126
127     // create package PDF database info (needed!)
128     apdu->u.searchRequest->num_databaseNames = 1;
129     apdu->u.searchRequest->databaseNames 
130         = (char**)odr_malloc(odr, sizeof(char *));
131     apdu->u.searchRequest->databaseNames[0] = odr_strdup(odr, "Default");
132
133     // Done creating request package  
134     pack.request() = apdu;
135     
136     // Put it in router
137     pack.router(router).move(); 
138     
139     // Inspect bounced back request
140     //yazpp_1::GDU *gdu = &pack.response();
141     yazpp_1::GDU *gdu = &pack.request();
142     
143     Z_GDU *z_gdu = gdu->get();
144     //std::cout << "Z_GDU " << z_gdu << "\n";
145     
146     BOOST_CHECK(z_gdu);
147     if (z_gdu) {
148         BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
149         BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_searchRequest);
150
151         // take query out of package again and check rewrite
152         std::string query_changed 
153             = zQueryToString(z_gdu->u.z3950->u.searchRequest->query);
154         BOOST_CHECK_EQUAL(query_expect, query_changed);
155     }
156 }
157
158
159 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite_1 )
160 {
161     try 
162     {
163         mp::filter::QueryRewrite f_query_rewrite;
164     }
165     catch ( ... ) {
166         BOOST_CHECK (false);
167     }
168 }
169
170 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite2 )
171 {
172     try 
173     {
174         mp::RouterChain router;
175         
176         mp::filter::QueryRewrite f_query_rewrite;
177         //FilterBounceZ3950 f_bounce_z3950;
178         
179         router.append(f_query_rewrite);
180         //router.append(f_bounce_z3950);
181
182         check_query_rewrite_init(router);
183         check_query_rewrite_search(router, 
184                                    "@attrset Bib-1 @attr 1=4 the", 
185                                    "@attrset Bib-1 @attr 1=4 the");
186
187     }
188     catch ( ... ) {
189         BOOST_CHECK (false);
190     }
191 }
192
193
194 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite3 )
195 {
196     
197
198     try 
199     {
200         mp::RouterChain router;
201         
202
203         std::string xmlconf = 
204             "<?xml version='1.0'?>\n"
205             "<filter xmlns='http://indexdata.com/metaproxy'\n"
206             "        id='qrw1' type='query_rewrite'>\n"
207             "</filter>\n"
208             ;
209          
210         //std::cout << xmlconf  << std::endl;
211
212         // reading and parsing XML conf
213         xmlDocPtr doc = xmlParseMemory(xmlconf.c_str(), xmlconf.size());
214         BOOST_CHECK(doc);
215         xmlNode *root_element = xmlDocGetRootElement(doc);
216
217         // creating and configuring filter
218         mp::filter::QueryRewrite f_query_rewrite;
219         f_query_rewrite.configure(root_element);
220         
221         // remeber to free XML DOM
222         xmlFreeDoc(doc);
223         
224         // add only filter to router
225         router.append(f_query_rewrite);
226
227         // start testing
228         check_query_rewrite_init(router);
229         check_query_rewrite_search(router, 
230                                    "@attrset Bib-1 @attr 1=4 the", 
231                                    "@attrset Bib-1 @attr 1=4 the");
232
233     }
234
235     catch (std::exception &e) {
236         std::cout << e.what() << "\n";
237         BOOST_CHECK (false);
238     }
239
240     catch ( ... ) {
241         BOOST_CHECK (false);
242     }
243 }
244
245 /*
246  * Local variables:
247  * c-basic-offset: 4
248  * indent-tabs-mode: nil
249  * c-file-style: "stroustrup"
250  * End:
251  * vim: shiftwidth=4 tabstop=8 expandtab
252  */