More functional virt_db filter. Removed p2_* source
[metaproxy-moved-to-github.git] / src / test_filter_virt_db.cpp
1 /* $Id: test_filter_virt_db.cpp,v 1.2 2005-10-25 11:48:30 adam 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_virt_db.hpp"
12 #include "filter_backend_test.hpp"
13 #include "filter_log.hpp"
14
15 #include "router.hpp"
16 #include "session.hpp"
17 #include "package.hpp"
18
19 #define BOOST_AUTO_TEST_MAIN
20 #include <boost/test/auto_unit_test.hpp>
21
22 #include <yaz/zgdu.h>
23 #include <yaz/pquery.h>
24 #include <yaz/otherinfo.h>
25 using namespace boost::unit_test;
26
27
28 BOOST_AUTO_TEST_CASE( test_filter_virt_db_1 )
29 {
30     try 
31     {
32         yp2::filter::Virt_db vdb;
33     }
34     catch ( ... ) {
35         BOOST_CHECK (false);
36     }
37 }
38
39 BOOST_AUTO_TEST_CASE( test_filter_virt_db_2 )
40 {
41     try 
42     {
43         yp2::RouterChain router;
44         
45         yp2::filter::Virt_db vdb;
46         
47         router.rule(vdb);
48         
49         // Create package with Z39.50 init request in it
50         // Since there is not vhost given, the virt will make its
51         // own init response (regardless of backend)
52         yp2::Package pack;
53         
54         ODR odr = odr_createmem(ODR_ENCODE);
55         Z_APDU *apdu = zget_APDU(odr, Z_APDU_initRequest);
56         
57         BOOST_CHECK(apdu);
58         
59         pack.request() = apdu;
60         odr_destroy(odr);
61         
62         // Put it in router
63         pack.router(router).move(); 
64         
65         // Inspect that we got Z39.50 init Response OK.
66         yazpp_1::GDU *gdu = &pack.response();
67         
68         BOOST_CHECK(!pack.session().is_closed()); 
69         
70         Z_GDU *z_gdu = gdu->get();
71         BOOST_CHECK(z_gdu);
72         if (z_gdu) {
73             BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
74             BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_initResponse);
75         }
76     }
77     catch ( ... ) {
78         BOOST_CHECK (false);
79     }
80 }
81
82
83 static void init(yp2::Package &pack, yp2::Router &router)
84 {
85     // Create package with Z39.50 init request in it
86     ODR odr = odr_createmem(ODR_ENCODE);
87     Z_APDU *apdu = zget_APDU(odr, Z_APDU_initRequest);
88     
89     BOOST_CHECK(apdu);
90     if (!apdu)
91         return;
92     
93     pack.request() = apdu;
94     odr_destroy(odr);
95     
96     // Put it in router
97     pack.router(router).move(); 
98     
99     // Inspect that we got Z39.50 init response
100     yazpp_1::GDU *gdu = &pack.response();
101     
102     BOOST_CHECK(!pack.session().is_closed()); 
103     
104     Z_GDU *z_gdu = gdu->get();
105     BOOST_CHECK(z_gdu);
106     if (!z_gdu)
107         return;
108     BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
109     BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_initResponse);
110 }
111                  
112 static void search(yp2::Package &pack, yp2::Router &router,
113                    const char *pqf_query, const char *db,
114                    const char *setname)
115 {
116     // Create package with Z39.50 search request in it
117             
118     ODR odr = odr_createmem(ODR_ENCODE);
119     Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchRequest);
120     
121     YAZ_PQF_Parser pqf_parser = yaz_pqf_create();
122     
123     Z_RPNQuery *rpn = yaz_pqf_parse(pqf_parser, odr, pqf_query);
124     BOOST_CHECK(rpn);
125     if (!rpn)
126         return;
127     Z_Query query;
128     query.which = Z_Query_type_1;
129     query.u.type_1 = rpn;
130     
131     apdu->u.searchRequest->resultSetName = odr_strdup(odr, setname);
132
133     apdu->u.searchRequest->query = &query;
134     
135     apdu->u.searchRequest->num_databaseNames = 1;
136     apdu->u.searchRequest->databaseNames = (char**)
137         odr_malloc(odr, sizeof(char *));
138     apdu->u.searchRequest->databaseNames[0] = odr_strdup(odr, db);
139     
140     BOOST_CHECK(apdu);
141     if (!apdu)
142         return;
143     
144     pack.request() = apdu;
145     
146     odr_destroy(odr);
147     
148     Z_GDU *gdu_test = pack.request().get();
149     BOOST_CHECK(gdu_test);
150     
151     // Put it in router
152     pack.router(router).move(); 
153     
154     // Inspect that we got Z39.50 search response
155     yazpp_1::GDU *gdu = &pack.response();
156     
157     BOOST_CHECK(!pack.session().is_closed()); 
158     
159     Z_GDU *z_gdu = gdu->get();
160     BOOST_CHECK(z_gdu);
161     if (!z_gdu)
162         return;
163     BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
164     BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_searchResponse);
165 }
166
167 static void present(yp2::Package &pack, yp2::Router &router,
168                     int start, int number,
169                     const char *setname)
170 {
171     // Create package with Z39.50 present request in it
172             
173     ODR odr = odr_createmem(ODR_ENCODE);
174     Z_APDU *apdu = zget_APDU(odr, Z_APDU_presentRequest);
175     
176     apdu->u.presentRequest->resultSetId  = odr_strdup(odr, setname);
177     *apdu->u.presentRequest->resultSetStartPoint = start;
178     *apdu->u.presentRequest->numberOfRecordsRequested = number;
179
180     BOOST_CHECK(apdu);
181     if (!apdu)
182         return;
183     
184     pack.request() = apdu;
185     
186     odr_destroy(odr);
187     
188     Z_GDU *gdu_test = pack.request().get();
189     BOOST_CHECK(gdu_test);
190     
191     // Put it in router
192     pack.router(router).move(); 
193     
194     // Inspect that we got Z39.50 present response
195     yazpp_1::GDU *gdu = &pack.response();
196     
197     BOOST_CHECK(!pack.session().is_closed()); 
198     
199     Z_GDU *z_gdu = gdu->get();
200     BOOST_CHECK(z_gdu);
201     if (!z_gdu)
202         return;
203     BOOST_CHECK_EQUAL(z_gdu->which, Z_GDU_Z3950);
204     BOOST_CHECK_EQUAL(z_gdu->u.z3950->which, Z_APDU_presentResponse);
205 }
206
207 BOOST_AUTO_TEST_CASE( test_filter_virt_db_3 )
208 {
209     try 
210     {
211         yp2::RouterChain router;
212
213 #if 0
214         yp2::filter::Log filter_log1;
215         filter_log1.set_prefix("FRONT");
216         router.rule(filter_log1);
217 #endif
218    
219         yp2::filter::Virt_db vdb;        
220         router.rule(vdb);
221         vdb.add_map_db2vhost("Default", "localhost:210");
222 #if 0
223         yp2::filter::Log filter_log2;
224         filter_log2.set_prefix("BACK");
225         router.rule(filter_log2);
226 #endif
227         yp2::filter::Backend_test btest;
228         router.rule(btest);
229
230         yp2::Session session1;
231         yp2::Origin origin1;
232         
233         {
234             yp2::Package pack(session1, origin1);
235             init(pack, router);
236         }
237         {
238             // search for database for which there is no map
239             yp2::Package pack(session1, origin1);
240             search(pack, router, "computer", "bad_database", "default");
241         }
242         {
243             // search for database for which there a map
244             yp2::Package pack(session1, origin1);
245             search(pack, router, "other", "Default", "default");
246         }
247         {
248             // present from last search
249             yp2::Package pack(session1, origin1);
250             present(pack, router, 1, 2, "default");
251         }
252     }
253     catch ( ... ) {
254         BOOST_CHECK (false);
255     }
256 }
257
258
259 /*
260  * Local variables:
261  * c-basic-offset: 4
262  * indent-tabs-mode: nil
263  * c-file-style: "stroustrup"
264  * End:
265  * vim: shiftwidth=4 tabstop=8 expandtab
266  */