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