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