4 #include <boost/test/auto_unit_test.hpp>
7 #include "zypp/ZYppFactory.h"
8 #include "zypp/PoolQuery.h"
9 #include "zypp/PoolQueryUtil.tcc"
10 #include "zypp/TmpPath.h"
12 #define BOOST_TEST_MODULE PoolQuery
18 using namespace boost::unit_test;
20 bool result_cb( const sat::Solvable & solvable )
22 zypp::PoolItem pi( zypp::ResPool::instance().find( solvable ) );
23 cout << pi.resolvable() << endl;
24 // name: yast2-sound 2.16.2-9 i586
28 static void init_pool()
30 Pathname dir(TESTS_SRC_DIR);
31 dir += "/zypp/data/PoolQuery";
33 ZYpp::Ptr z = getZYpp();
34 ZConfig::instance().setSystemArchitecture(Arch("i586"));
36 RepoInfo i1; i1.setAlias("factory");
37 sat::Pool::instance().addRepoSolv(dir / "factory.solv", i1);
38 RepoInfo i2; i2.setAlias("factory-nonoss");
39 sat::Pool::instance().addRepoSolv(dir / "factory-nonoss.solv", i2);
40 RepoInfo i3; i3.setAlias("zypp_svn");
41 sat::Pool::instance().addRepoSolv(dir / "zypp_svn.solv", i3);
42 RepoInfo i4; i4.setAlias("@System");
43 sat::Pool::instance().addRepoSolv(dir / "@System.solv", i4);
46 BOOST_AUTO_TEST_CASE(pool_query_init)
51 BOOST_AUTO_TEST_CASE(pool_query_exp)
53 cout << "****exp****" << endl;
56 q.addString("zypper");
57 q.addAttribute(sat::SolvAttr::name);
59 // should list 2 selectables
60 for (PoolQuery::Selectable_iterator it = q.selectableBegin();
61 it != q.selectableEnd(); ++it)
63 ui::Selectable::Ptr s = *it;
64 cout << s->kind() << ":" << s->name() << " hasinstalled: " << s->installedEmpty() << endl;
67 std::for_each(q.begin(), q.end(), &result_cb);
70 /////////////////////////////////////////////////////////////////////////////
72 /////////////////////////////////////////////////////////////////////////////
74 // no conditions, default query
75 // result: all available resolvables
76 BOOST_AUTO_TEST_CASE(pool_query_000)
78 cout << "****000****" << endl;
80 cout << q.size() << endl;
81 BOOST_CHECK(q.size() == 11451);
82 /**!\todo should be 11453 probably according to:
83 * dumpsolv factory.solv factory-nonoss.solv zypp_svn.solv \@System.solv | \
84 * grep '^name:.*\(noarch\|i386\|i586\|i686\|src\)$' | wc -l
88 // default query + one search string
89 // q.addString("foo");
90 // result: all resolvables having at least one attribute matching foo
91 BOOST_AUTO_TEST_CASE(pool_query_001)
93 cout << "****001****" << endl;
95 q.addString("zypper");
97 std::for_each(q.begin(), q.end(), &result_cb);
98 BOOST_CHECK(q.size() == 16);
101 // default query + one attribute + one string
102 // q.addAttribute(foo, bar);
103 // should be the same as
104 // q.addAttribute(foo); q.addString(bar);
105 // result: resolvables with foo containing bar
106 BOOST_AUTO_TEST_CASE(pool_query_002)
108 cout << "****002****" << endl;
110 q.addString("zypper");
111 q.addAttribute(sat::SolvAttr::name);
113 std::for_each(q.begin(), q.end(), &result_cb);
114 BOOST_CHECK(q.size() == 6);
119 q1.addAttribute(sat::SolvAttr::name, "zypper");
121 std::for_each(q1.begin(), q1.end(), &result_cb);
122 BOOST_CHECK(q1.size() == 6);
126 BOOST_AUTO_TEST_CASE(pool_query_003)
128 cout << "****003****" << endl;
130 q.addString("zypper");
131 q.addAttribute(sat::SolvAttr::name);
132 q.addKind(ResTraits<Package>::kind);
134 std::for_each(q.begin(), q.end(), &result_cb);
135 BOOST_CHECK(q.size() == 3);
139 BOOST_AUTO_TEST_CASE(pool_query_004)
141 cout << "****004****" << endl;
144 q.addAttribute(sat::SolvAttr::name);
147 std::for_each(q.begin(), q.end(), &result_cb);
148 BOOST_CHECK(q.size() == 3);
151 q1.addString("zypp");
152 q1.addAttribute(sat::SolvAttr::name);
155 std::for_each(q1.begin(), q1.end(), &result_cb);
156 BOOST_CHECK(q1.empty());
160 BOOST_AUTO_TEST_CASE(pool_query_005)
162 cout << "****005.1****" << endl;
165 q.addAttribute(sat::SolvAttr::name);
168 std::for_each(q.begin(), q.end(), &result_cb);
169 BOOST_CHECK(q.size() == 11);
171 cout << "****005.2****" << endl;
174 q1.addString("*zypp*");
175 q1.addAttribute(sat::SolvAttr::name);
178 std::for_each(q1.begin(), q1.end(), &result_cb);
179 BOOST_CHECK(q1.size() == 28);
181 cout << "****005.3****" << endl;
183 // should be the same as above
185 q2.addString("zypp");
186 q2.addAttribute(sat::SolvAttr::name);
188 BOOST_CHECK(q2.size() == 28);
192 BOOST_AUTO_TEST_CASE(pool_query_006)
194 cout << "****006.1***" << endl;
196 // should be the same as 005 1
198 q.addString("^z.p.*");
199 q.addAttribute(sat::SolvAttr::name);
202 std::for_each(q.begin(), q.end(), &result_cb);
203 BOOST_CHECK(q.size() == 11);
205 cout << "****006.2***" << endl;
208 q1.addString("zypper|smart");
209 q1.addAttribute(sat::SolvAttr::name);
212 std::for_each(q1.begin(), q1.end(), &result_cb);
213 BOOST_CHECK(q1.size() == 21);
215 cout << "****006.3***" << endl;
219 q2.addString("zypp\\");
221 BOOST_CHECK_THROW(q2.size(), Exception);
225 // match by installed status (basically by system vs. repo)
226 BOOST_AUTO_TEST_CASE(pool_query_050)
228 cout << "****050****" << endl;
230 q.addString("zypper");
231 q.addAttribute(sat::SolvAttr::name);
233 q.setInstalledOnly();
235 std::for_each(q.begin(), q.end(), &result_cb);
236 BOOST_CHECK(q.size() == 1);
241 q1.addString("zypper");
242 q1.addAttribute(sat::SolvAttr::name);
244 q1.setUninstalledOnly();
246 std::for_each(q1.begin(), q1.end(), &result_cb);
247 BOOST_CHECK(q1.size() == 5);
251 /////////////////////////////////////////////////////////////////////////////
252 // 1xx multiple attribute queries
253 /////////////////////////////////////////////////////////////////////////////
256 BOOST_AUTO_TEST_CASE(pool_query_100)
258 cout << "****100****" << endl;
260 /* This string is found sometimes only in solvable names (e.g. novell-lum),
261 sometimes only in summary (e.g. yast2-casa-ats) and sometimes only
262 in descriptions (e.g. beagle-quickfinder). novell-lum doesn't exist
263 in our test solv file, but let's ignore this. I didn't find a string
264 with the same characteristics giving fewer matches :-/ */
265 q.addString("novell");
266 q.addAttribute(sat::SolvAttr::name);
267 q.addAttribute(sat::SolvAttr::summary);
268 q.addAttribute(sat::SolvAttr::description);
270 std::for_each(q.begin(), q.end(), &result_cb);
271 BOOST_CHECK(q.size() == 74);
277 q1.addAttribute(sat::SolvAttr::name);
279 std::for_each(q1.begin(), q1.end(), &result_cb);
280 BOOST_CHECK(q1.size() == 7);
284 // multi attr (same value) substring matching (case sensitive and insensitive)
285 BOOST_AUTO_TEST_CASE(pool_query_101)
287 cout << "****101****" << endl;
291 q.addAttribute(sat::SolvAttr::name);
292 q.addAttribute(sat::SolvAttr::summary);
293 q.addAttribute(sat::SolvAttr::description);
295 std::for_each(q.begin(), q.end(), &result_cb);
296 BOOST_CHECK(q.size() == 30);
301 q2.addString("ZYpp");
302 q2.addAttribute(sat::SolvAttr::name);
303 q2.addAttribute(sat::SolvAttr::summary);
304 q2.addAttribute(sat::SolvAttr::description);
305 q2.setCaseSensitive();
307 std::for_each(q2.begin(), q2.end(), &result_cb);
308 BOOST_CHECK(q2.size() == 2);
312 // multi attr (same value) glob matching (case sensitive and insensitive)
313 BOOST_AUTO_TEST_CASE(pool_query_102)
315 cout << "****102****" << endl;
317 q.addString("pack*");
318 q.addAttribute(sat::SolvAttr::name);
319 q.addAttribute(sat::SolvAttr::summary);
322 std::for_each(q.begin(), q.end(), &result_cb);
323 BOOST_CHECK(q.size() == 35);
327 // multi attr (same value via addAttribute())
328 BOOST_AUTO_TEST_CASE(pool_query_103)
330 cout << "****103.1****" << endl;
332 q.addAttribute(sat::SolvAttr::name, "novell");
333 q.addAttribute(sat::SolvAttr::summary, "novell");
335 // std::for_each(q.begin(), q.end(), &result_cb);
336 BOOST_CHECK(q.size() == 42);
338 cout << "****103.2****" << endl;
341 q1.addString("novell");
342 q1.addAttribute(sat::SolvAttr::name);
343 q1.addAttribute(sat::SolvAttr::summary);
345 // std::for_each(q1.begin(), q1.end(), &result_cb);
346 BOOST_CHECK(q1.size() == 42);
351 // multiple attributes, different search strings (one string per attrbute)
352 BOOST_AUTO_TEST_CASE(pool_query_104)
354 cout << "****104****" << endl;
356 q.addAttribute(sat::SolvAttr::name, "novell");
357 q.addAttribute(sat::SolvAttr::summary, "package management");
359 std::for_each(q.begin(), q.end(), &result_cb);
360 BOOST_CHECK(q.size() == 22);
363 // multiple attributes, different search strings (one string per attrbute), regex matching
364 BOOST_AUTO_TEST_CASE(pool_query_105)
366 cout << "****105****" << endl;
368 q.addAttribute(sat::SolvAttr::name, "no.ell");
369 q.addAttribute(sat::SolvAttr::summary, "package management");
372 std::for_each(q.begin(), q.end(), &result_cb);
373 BOOST_CHECK(q.size() == 22);
376 /////////////////////////////////////////////////////////////////////////////
377 // 3xx repo filter queries (addRepo(alias_str))
378 /////////////////////////////////////////////////////////////////////////////
380 // default query + one attribute(one string) + one repo
381 BOOST_AUTO_TEST_CASE(pool_query_300)
383 cout << "****300****" << endl;
385 q.addAttribute(sat::SolvAttr::name, "zypper");
386 q.addRepo("zypp_svn");
388 std::for_each(q.begin(), q.end(), &result_cb);
389 BOOST_CHECK(q.size() == 3);
392 // default query + one repo
393 BOOST_AUTO_TEST_CASE(pool_query_301)
395 cout << "****301****" << endl;
397 q.addRepo("zypp_svn");
399 std::for_each(q.begin(), q.end(), &result_cb);
400 BOOST_CHECK(q.size() == 21);
403 // multiple repos + one attribute
404 BOOST_AUTO_TEST_CASE(pool_query_302)
406 cout << "****302****" << endl;
409 q.addAttribute(sat::SolvAttr::name);
410 q.addRepo("factory-nonoss");
411 q.addRepo("zypp_svn");
413 std::for_each(q.begin(), q.end(), &result_cb);
414 BOOST_CHECK(q.size() == 8);
418 BOOST_AUTO_TEST_CASE(pool_query_X)
420 cout << "****X****" << endl;
422 q.addString("pack*");
423 q.addAttribute(sat::SolvAttr::name);
425 std::for_each(q.begin(), q.end(), &result_cb);
426 BOOST_CHECK(q.size() == 28);
431 BOOST_AUTO_TEST_CASE(pool_query_equal)
433 cout << "****equal****" << endl;
436 q.addAttribute(sat::SolvAttr::name);
439 q2.addString("zypp");
440 q2.addAttribute(sat::SolvAttr::name);
443 q3.addString("zypp");
444 q3.addAttribute(sat::SolvAttr::name);
446 q3.setRequireAll(true);
448 q4.addAttribute(sat::SolvAttr::name,"zypp");
458 BOOST_AUTO_TEST_CASE(pool_query_save_restore)
460 #warning CAN NOT USE A FIX SOLV FILE
461 // must store some raw metadata and generate the solv file
462 // otherwise trestcases break whenever the solv format changes
464 Pathname dir(TESTS_SRC_DIR);
465 dir += "/zypp/data/PoolQuery";
467 ZYpp::Ptr z = getZYpp();
469 sat::Pool::instance().addRepoSolv(dir + "foo.solv");
472 //query.setInstalledOnly();
473 query.execute("kde", &result_cb);
475 cout << "search done." << endl;
477 query.setMatchExact(true);
478 query.execute("kde", &result_cb);
480 cout << "search done." << endl;
483 //test recovery from file
484 Pathname pathToQueries(TESTS_SRC_DIR);
485 pathToQueries += "/zypp/data/PoolQuery/savedqueries";
487 std::list<PoolQuery> savedQueries;
489 std::insert_iterator<std::list<PoolQuery> > ii(savedQueries, savedQueries.end());
490 readPoolQueriesFromFile(pathToQueries,ii);
491 BOOST_CHECK( savedQueries.size() == 2 );
493 filesystem::TmpFile tmp;
494 Pathname tmpPath = tmp.path();
496 savedQueries.clear();
501 q1.addKind( Resolvable::Kind::patch );
502 q2.addKind( Resolvable::Kind::patch );
503 q2.addKind( Resolvable::Kind::pattern );
505 savedQueries.push_front( q1 );
506 savedQueries.push_front( q2 );
508 writePoolQueriesToFile ( tmpPath, savedQueries.begin(), savedQueries.end() );
509 std::insert_iterator<std::list<PoolQuery> > ii2(savedQueries,
511 //reread writed queries
512 readPoolQueriesFromFile( tmpPath, ii2);
513 //TODO test if 0==2 and 1==3
514 BOOST_CHECK( savedQueries.size() == 4 );