1 /* $Id: test_filter_query_rewrite.cpp,v 1.6 2006-01-23 08:13:11 mike Exp $
2 Copyright (c) 2005, Index Data.
11 #include "filter_query_rewrite.hpp"
13 #include "router_chain.hpp"
14 #include "session.hpp"
15 #include "package.hpp"
17 #define BOOST_AUTO_TEST_MAIN
18 #include <boost/test/auto_unit_test.hpp>
20 using namespace boost::unit_test;
21 using namespace yp2::util;
23 class FilterBounceZ3950: public yp2::filter::Base {
25 void process(yp2::Package & package) const {
27 if (package.session().is_closed())
29 std::cout << "Got Close.\n";
33 Z_GDU *gdu = package.request().get();
35 if (gdu && gdu->which == Z_GDU_Z3950
36 && gdu->u.z3950->which == Z_APDU_initRequest)
38 std::cout << "Got Z3950 Init PDU\n";
39 //Z_InitRequest *req = gdu->u.z3950->u.initRequest;
40 //package.request() = gdu;
43 else if (gdu && gdu->which == Z_GDU_Z3950
44 && gdu->u.z3950->which == Z_APDU_searchRequest)
46 std::cout << "Got Z3950 Search PDU\n";
47 //Z_SearchRequest *req = gdu->u.z3950->u.searchRequest;
48 //package.request() = gdu;
51 else if (gdu && gdu->which == Z_GDU_Z3950
52 && gdu->u.z3950->which == Z_APDU_scanRequest)
54 std::cout << "Got Z3950 Scan PDU\n";
55 //Z_ScanRequest *req = gdu->u.z3950->u.scanRequest;
56 //package.request() = gdu;
64 void check_query_rewrite_init(yp2::RouterChain &router)
66 //std::cout << "QUERY REWRITE INIT\n";
68 // Create package with Z39.50 init request in it
72 Z_APDU *apdu = zget_APDU(odr, Z_APDU_initRequest);
74 pack.request() = apdu;
75 // Done creating query.
78 pack.router(router).move();
80 // Inspect bounced back request
81 //yazpp_1::GDU *gdu = &pack.response();
82 yazpp_1::GDU *gdu = &pack.request();
84 Z_GDU *z_gdu = gdu->get();
86 //std::cout << "Z_GDU " << z_gdu << "\n";
89 BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
90 BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_initRequest);
94 void check_query_rewrite_search(yp2::RouterChain &router,
96 std::string query_expect)
98 //std::cout << "QUERY REWRITE SEARCH "
99 // << query_in << " " << query_expect << "\n";
101 // Create package with Z39.50 search request in it
105 Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchRequest);
107 // create package PQF query here
108 yp2::util::pqf(odr, apdu, query_in);
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");
116 // Done creating request package
117 pack.request() = apdu;
120 pack.router(router).move();
122 // Inspect bounced back request
123 //yazpp_1::GDU *gdu = &pack.response();
124 yazpp_1::GDU *gdu = &pack.request();
126 Z_GDU *z_gdu = gdu->get();
127 //std::cout << "Z_GDU " << z_gdu << "\n";
131 BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
132 BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_searchRequest);
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);
142 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite_1 )
146 yp2::filter::QueryRewrite f_query_rewrite;
153 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite2 )
157 yp2::RouterChain router;
159 yp2::filter::QueryRewrite f_query_rewrite;
160 //FilterBounceZ3950 f_bounce_z3950;
162 router.append(f_query_rewrite);
163 //router.append(f_bounce_z3950);
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");
177 BOOST_AUTO_UNIT_TEST( test_filter_query_rewrite3 )
183 yp2::RouterChain router;
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"
194 " <regex action='search'>\n"
195 " <expression>@attr 1=4</expression>\n"
196 " <format>@attr 1=4 @attr 4=2</format>\n"
198 " <regex action='search'>\n"
199 " <expression>fish</expression>\n"
200 " <format>cat</format>\n"
202 " <regex action='scan'>\n"
203 " <expression>@attr 1=4</expression>\n"
204 " <format>@attr 1=5 @attr 4=1</format>\n"
206 " <regex action='scan' stop='1'>\n"
207 " <expression>fish</expression>\n"
208 " <format>mouse</format>\n"
210 " <regex action='finally'>\n"
211 " <expression>^</expression>\n"
212 " <format>@and @attr1=9999 vdb</format>\n"
217 //std::cout << xmlconf << std::endl;
219 // reading and parsing XML conf
220 xmlDocPtr doc = xmlParseMemory(xmlconf.c_str(), xmlconf.size());
222 xmlNode *root_element = xmlDocGetRootElement(doc);
224 // creating and configuring filter
225 yp2::filter::QueryRewrite f_query_rewrite;
226 f_query_rewrite.configure(root_element);
228 // remeber to free XML DOM
231 // add only filter to router
232 router.append(f_query_rewrite);
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");
242 catch (std::exception &e) {
243 std::cout << e.what() << "\n";
255 * indent-tabs-mode: nil
256 * c-file-style: "stroustrup"
258 * vim: shiftwidth=4 tabstop=8 expandtab