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.
4 This file is part of Metaproxy.
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
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
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
26 #include "filter_query_rewrite.hpp"
28 #include "router_chain.hpp"
29 #include "session.hpp"
30 #include "package.hpp"
32 #define BOOST_AUTO_TEST_MAIN
33 #include <boost/test/auto_unit_test.hpp>
35 using namespace boost::unit_test;
37 namespace mp = metaproxy_1;
38 using namespace mp::util;
40 class FilterBounceZ3950: public mp::filter::Base {
42 void process(mp::Package & package) const {
44 if (package.session().is_closed())
46 std::cout << "Got Close.\n";
50 Z_GDU *gdu = package.request().get();
52 if (gdu && gdu->which == Z_GDU_Z3950
53 && gdu->u.z3950->which == Z_APDU_initRequest)
55 std::cout << "Got Z3950 Init PDU\n";
56 //Z_InitRequest *req = gdu->u.z3950->u.initRequest;
57 //package.request() = gdu;
60 else if (gdu && gdu->which == Z_GDU_Z3950
61 && gdu->u.z3950->which == Z_APDU_searchRequest)
63 std::cout << "Got Z3950 Search PDU\n";
64 //Z_SearchRequest *req = gdu->u.z3950->u.searchRequest;
65 //package.request() = gdu;
68 else if (gdu && gdu->which == Z_GDU_Z3950
69 && gdu->u.z3950->which == Z_APDU_scanRequest)
71 std::cout << "Got Z3950 Scan PDU\n";
72 //Z_ScanRequest *req = gdu->u.z3950->u.scanRequest;
73 //package.request() = gdu;
81 void check_query_rewrite_init(mp::RouterChain &router)
83 //std::cout << "QUERY REWRITE INIT\n";
85 // Create package with Z39.50 init request in it
89 Z_APDU *apdu = zget_APDU(odr, Z_APDU_initRequest);
91 pack.request() = apdu;
92 // Done creating query.
95 pack.router(router).move();
97 // Inspect bounced back request
98 //yazpp_1::GDU *gdu = &pack.response();
99 yazpp_1::GDU *gdu = &pack.request();
101 Z_GDU *z_gdu = gdu->get();
103 //std::cout << "Z_GDU " << z_gdu << "\n";
106 BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
107 BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_initRequest);
111 void check_query_rewrite_search(mp::RouterChain &router,
112 std::string query_in,
113 std::string query_expect)
115 //std::cout << "QUERY REWRITE SEARCH "
116 // << query_in << " " << query_expect << "\n";
118 // Create package with Z39.50 search request in it
122 Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchRequest);
124 // create package PQF query here
125 mp::util::pqf(odr, apdu, query_in);
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");
133 // Done creating request package
134 pack.request() = apdu;
137 pack.router(router).move();
139 // Inspect bounced back request
140 //yazpp_1::GDU *gdu = &pack.response();
141 yazpp_1::GDU *gdu = &pack.request();
143 Z_GDU *z_gdu = gdu->get();
144 //std::cout << "Z_GDU " << z_gdu << "\n";
148 BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
149 BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_searchRequest);
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);
159 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite_1 )
163 mp::filter::QueryRewrite f_query_rewrite;
170 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite2 )
174 mp::RouterChain router;
176 mp::filter::QueryRewrite f_query_rewrite;
177 //FilterBounceZ3950 f_bounce_z3950;
179 router.append(f_query_rewrite);
180 //router.append(f_bounce_z3950);
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");
194 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite3 )
200 mp::RouterChain router;
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"
210 //std::cout << xmlconf << std::endl;
212 // reading and parsing XML conf
213 xmlDocPtr doc = xmlParseMemory(xmlconf.c_str(), xmlconf.size());
215 xmlNode *root_element = xmlDocGetRootElement(doc);
217 // creating and configuring filter
218 mp::filter::QueryRewrite f_query_rewrite;
219 f_query_rewrite.configure(root_element);
221 // remeber to free XML DOM
224 // add only filter to router
225 router.append(f_query_rewrite);
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");
235 catch (std::exception &e) {
236 std::cout << e.what() << "\n";
248 * indent-tabs-mode: nil
249 * c-file-style: "stroustrup"
251 * vim: shiftwidth=4 tabstop=8 expandtab