2 #include <zypp/PoolQuery.h>
3 #include <zypp/PoolQueryUtil.tcc>
5 #define BOOST_TEST_MODULE PoolQuery
7 /////////////////////////////////////////////////////////////////////////////
8 static TestSetup test( TestSetup::initLater );
11 test = TestSetup( Arch_x86_64 );
13 // Abuse;) vbox as System repo:
14 test.loadTargetRepo( TESTS_SRC_DIR "/data/obs_virtualbox_11_1" );
15 test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" );
16 test.loadRepo( TESTS_SRC_DIR "/data/OBS_zypp_svn-11.1", "zyppsvn" );
18 dumpRange( USR, test.pool().knownRepositoriesBegin(),
19 test.pool().knownRepositoriesEnd() );
20 USR << "pool: " << test.pool() << endl;
22 ~TestInit() { test.reset(); }
24 BOOST_GLOBAL_FIXTURE( TestInit );
25 /////////////////////////////////////////////////////////////////////////////
27 static std::ofstream devNull;
32 PrintAndCount() : _count(0) {}
34 bool operator()( const sat::Solvable & solvable )
36 zypp::PoolItem pi( zypp::ResPool::instance().find( solvable ) );
37 COUT << pi.resolvable() << endl;
45 void dumpQ( std::ostream & str, const PoolQuery & q, bool verbose = true )
52 for_( it, q.begin(), q.end() )
58 str << "--> MATCHES: " << nc << endl;
64 BOOST_AUTO_TEST_CASE(pool_query_experiment)
66 cout << "****experiment****" << endl;
69 q.addString("zypper");
70 q.addAttribute(sat::SolvAttr::name);
72 // should list 1 selectable?
73 cout << "****selectables****" << endl;
74 for (PoolQuery::Selectable_iterator it = q.selectableBegin();
75 it != q.selectableEnd(); ++it)
77 ui::Selectable::Ptr s = *it;
78 cout << s->kind() << ":" << s->name() << " hasinstalled: " << s->installedEmpty() << endl;
80 cout << "****solvables****" << endl;
82 std::for_each(q.begin(), q.end(), cb);
86 /////////////////////////////////////////////////////////////////////////////
88 /////////////////////////////////////////////////////////////////////////////
90 // no conditions, default query
91 // result: all available resolvables
92 BOOST_AUTO_TEST_CASE(pool_query_000)
94 cout << "****000****" << endl;
96 cout << q.size() << endl;
97 BOOST_CHECK(q.size() == 3811);
99 /* dumpsolv repo1.solv repo2.solv repo3.solv | \
100 grep '^name:.*\(noarch\|x86_64\|i386\|i586\|i686\|src\)$' | wc -l */
103 // default query + one search string
104 // q.addString("foo");
105 // result: all resolvables having at least one attribute matching foo
106 BOOST_AUTO_TEST_CASE(pool_query_001)
108 cout << "****001****" << endl;
110 q.addString("zypper");
112 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 11);
115 // default query + one attribute + one string
116 // q.addAttribute(foo, bar);
117 // should be the same as
118 // q.addAttribute(foo); q.addString(bar);
119 // result: resolvables with foo containing bar
120 BOOST_AUTO_TEST_CASE(pool_query_002)
122 cout << "****002****" << endl;
124 q.addString("zypper");
125 q.addAttribute(sat::SolvAttr::name);
127 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 5);
132 q1.addAttribute(sat::SolvAttr::name, "zypper");
134 BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 5);
138 BOOST_AUTO_TEST_CASE(pool_query_003)
140 cout << "****003****" << endl;
142 q.addString("zypper");
143 q.addAttribute(sat::SolvAttr::name);
144 q.addKind(ResKind::package);
146 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 3);
150 BOOST_AUTO_TEST_CASE(pool_query_004)
152 cout << "****004****" << endl;
155 q.addAttribute(sat::SolvAttr::name);
158 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1);
161 q1.addString("zypp");
162 q1.addAttribute(sat::SolvAttr::name);
165 std::for_each(q1.begin(), q1.end(), PrintAndCount());
166 BOOST_CHECK(q1.empty());
170 BOOST_AUTO_TEST_CASE(pool_query_005)
172 cout << "****005.1****" << endl;
175 q.addAttribute(sat::SolvAttr::name);
178 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6);
180 cout << "****005.2****" << endl;
183 q1.addString("*zypp*");
184 q1.addAttribute(sat::SolvAttr::name);
187 BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 26);
189 cout << "****005.3****" << endl;
191 // should be the same as above
193 q2.addString("zypp");
194 q2.addAttribute(sat::SolvAttr::name);
196 BOOST_CHECK(q2.size() == 26);
200 BOOST_AUTO_TEST_CASE(pool_query_006)
202 cout << "****006.1***" << endl;
204 // should be the same as 005 1
206 q.addString("^z.p.*");
207 q.addAttribute(sat::SolvAttr::name);
210 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6);
212 cout << "****006.2***" << endl;
215 q1.addString("zypper|smart");
216 q1.addAttribute(sat::SolvAttr::name);
219 BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 8);
221 cout << "****006.3***" << endl;
225 q2.addString("zypp\\");
227 BOOST_CHECK_THROW(q2.begin(), Exception);
232 BOOST_AUTO_TEST_CASE(pool_query_007)
234 cout << "****007***" << endl;
238 q.addAttribute(sat::SolvAttr::name);
241 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6);
244 // match by installed status (basically by system vs. repo)
245 BOOST_AUTO_TEST_CASE(pool_query_050)
247 cout << "****050****" << endl;
250 q.addAttribute(sat::SolvAttr::name);
252 q.setInstalledOnly();
254 BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 4);
259 q1.addString("zypper");
260 q1.addAttribute(sat::SolvAttr::name);
262 q1.setUninstalledOnly();
263 BOOST_CHECK_EQUAL(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count, 5);
266 /////////////////////////////////////////////////////////////////////////////
267 // 1xx multiple attribute queries
268 /////////////////////////////////////////////////////////////////////////////
271 BOOST_AUTO_TEST_CASE(pool_query_100)
273 cout << "****100****" << endl;
275 /* This string is found sometimes only in only in summary (e.g. pgcalc)
276 and sometimes only in description (e.g. bc, lftp). We don't have
277 any package with 'revers' only in package name, but let's ignore this.
278 I didn't find a string with the same characteristics giving fewer matches
280 q.addString("revers");
281 q.addAttribute(sat::SolvAttr::name);
282 q.addAttribute(sat::SolvAttr::summary);
283 q.addAttribute(sat::SolvAttr::description);
285 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 5);
291 q1.addAttribute(sat::SolvAttr::name, "zypper");
292 BOOST_CHECK_EQUAL(q1.size(),5);
295 q2.addAttribute(sat::SolvAttr::summary,"samba");
296 BOOST_CHECK_EQUAL(q2.size(),13);
298 // now summary and name in one go:
299 q1.addAttribute(sat::SolvAttr::summary,"samba");
300 BOOST_CHECK_EQUAL(q1.size(),18);
305 // multi attr (same value) substring matching (case sensitive and insensitive)
306 BOOST_AUTO_TEST_CASE(pool_query_101)
308 cout << "****101****" << endl;
311 q.addString("RELAX");
312 q.addAttribute(sat::SolvAttr::name);
313 q.addAttribute(sat::SolvAttr::summary);
314 q.addAttribute(sat::SolvAttr::description);
316 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 7);
321 q2.addString("RELAX");
322 q2.addAttribute(sat::SolvAttr::name);
323 q2.addAttribute(sat::SolvAttr::summary);
324 q2.addAttribute(sat::SolvAttr::description);
325 q2.setCaseSensitive();
327 BOOST_CHECK(std::for_each(q2.begin(), q2.end(), PrintAndCount())._count == 4);
331 // multi attr (same value) glob matching (case sensitive and insensitive)
332 BOOST_AUTO_TEST_CASE(pool_query_102)
334 cout << "****102****" << endl;
336 q.addString("pack*");
337 q.addAttribute(sat::SolvAttr::name);
338 q.addAttribute(sat::SolvAttr::summary);
341 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 23);
345 // multi attr (same value via addAttribute())
346 BOOST_AUTO_TEST_CASE(pool_query_103)
348 cout << "****103.1****" << endl;
350 q.addAttribute(sat::SolvAttr::name, "rest");
351 q.addAttribute(sat::SolvAttr::summary, "rest");
353 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 14);
355 cout << "****103.2****" << endl;
358 q1.addString("rest");
359 q1.addAttribute(sat::SolvAttr::name);
360 q1.addAttribute(sat::SolvAttr::summary);
362 BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 14);
363 // BOOST_CHECK(q1.size() == 42);
368 // multiple attributes, different search strings (one string per attrbute)
369 BOOST_AUTO_TEST_CASE(pool_query_104)
371 cout << "****104****" << endl;
373 q.addAttribute(sat::SolvAttr::name, "zypper");
374 q.addAttribute(sat::SolvAttr::summary, "package management");
376 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 8);
379 // multiple attributes, different search strings (one string per attrbute), regex matching
380 BOOST_AUTO_TEST_CASE(pool_query_105)
382 cout << "****105****" << endl;
384 q.addAttribute(sat::SolvAttr::name, "zy..er");
385 q.addAttribute(sat::SolvAttr::summary, "package management");
388 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 8);
391 /////////////////////////////////////////////////////////////////////////////
392 // 3xx repo filter queries (addRepo(alias_str))
393 /////////////////////////////////////////////////////////////////////////////
395 // default query + one attribute(one string) + one repo
396 BOOST_AUTO_TEST_CASE(pool_query_300)
398 cout << "****300****" << endl;
400 q.addAttribute(sat::SolvAttr::name, "zypper");
401 q.addRepo("zyppsvn");
403 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 4);
406 // default query + one repo
407 BOOST_AUTO_TEST_CASE(pool_query_301)
409 cout << "****301****" << endl;
411 q.addRepo("zyppsvn");
413 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 42);
416 // multiple repos + one attribute
417 BOOST_AUTO_TEST_CASE(pool_query_302)
419 cout << "****302****" << endl;
421 q.addString("zypper");
422 q.addAttribute(sat::SolvAttr::name);
423 q.addRepo("opensuse");
424 q.addRepo("zyppsvn");
426 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 5);
429 /////////////////////////////////////////////////////////////////////////////
430 // 4xx kind queries (addKind(ResKind))
431 /////////////////////////////////////////////////////////////////////////////
433 BOOST_AUTO_TEST_CASE(pool_query_400)
435 cout << "****400****" << endl;
437 q.addString("lamp_server");
438 q.addAttribute(sat::SolvAttr::name);
439 q.addKind(ResKind::pattern);
442 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1);
445 // should find packages and patterns
446 BOOST_AUTO_TEST_CASE(pool_query_401)
448 cout << "****401****" << endl;
450 q.addString("mail*");
451 q.addAttribute(sat::SolvAttr::name);
454 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 4);
458 /////////////////////////////////////////////////////////////////////////////
459 // 5xx multiple string/attribute queries
460 /////////////////////////////////////////////////////////////////////////////
462 // multiple strings for one attribute
463 BOOST_AUTO_TEST_CASE(pool_query_500)
465 cout << "****500.1****" << endl;
467 q.addString("zypper");
468 q.addString("yast2-packager");
469 q.addAttribute(sat::SolvAttr::name);
471 // creates: ^(apt|zypper)$
472 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6);
474 cout << "****500.2****" << endl;
475 q.addString("*bzypp");
477 // creates: ^(.*zy.p|yast.*package.*|.*bzypp)$
478 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 11);
480 cout << "****500.3****" << endl;
482 q1.addString("^libsm[a-z]*[0-9]$");
483 q1.addAttribute(sat::SolvAttr::name, "bzypp$");
484 q1.addKind(ResKind::package);
486 // creates: (^libsm[a-z]*[0-9]$|bzypp$)
487 BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 5);
489 cout << "****500.4****" << endl;
491 q2.addString("Thunder");
492 q2.addAttribute(sat::SolvAttr::name, "sun");
493 q2.addKind(ResKind::package);
494 q2.addRepo("opensuse");
495 q2.setCaseSensitive();
496 // creates: (sun|Thunder)
497 BOOST_CHECK(std::for_each(q2.begin(), q2.end(), PrintAndCount())._count == 3);
499 cout << "****500.5****" << endl;
501 q3.addString("audio");
502 q3.addAttribute(sat::SolvAttr::name, "zip");
503 q3.addKind(ResKind::package);
504 q3.addRepo("opensuse");
506 // creates: \b(zip|audio)\b
507 BOOST_CHECK(std::for_each(q3.begin(), q3.end(), PrintAndCount())._count == 3);
510 // multiple strings, multiple attributes, same strings
511 BOOST_AUTO_TEST_CASE(pool_query_501)
513 cout << "****501****" << endl;
515 q.addString("Thunder");
516 q.addString("storm");
517 q.addAttribute(sat::SolvAttr::name);
518 q.addAttribute(sat::SolvAttr::description);
519 q.addKind(ResKind::package);
520 q.addRepo("opensuse");
522 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 14);
525 // multiple strings, multiple attributes, same strings
526 BOOST_AUTO_TEST_CASE(pool_query_502)
528 cout << "****502****" << endl;
530 q.addString("weather");
531 q.addAttribute(sat::SolvAttr::name, "thunder");
532 q.addAttribute(sat::SolvAttr::description, "storm");
533 q.addKind(ResKind::package);
534 q.addRepo("opensuse");
536 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 13);
539 /////////////////////////////////////////////////////////////////////////////
540 // 6xx queries with edition
541 /////////////////////////////////////////////////////////////////////////////
543 BOOST_AUTO_TEST_CASE(pool_query_X)
545 cout << "****600.1****" << endl;
547 q.addAttribute(sat::SolvAttr::name, "zypper");
549 q.setEdition(Edition("0.12.5"), Rel::GT);
551 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 4);
553 cout << "****600.2****" << endl;
554 q.setEdition(Edition("0.12.5"), Rel::LT);
556 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 0);
558 cout << "****600.3****" << endl;
559 q.setEdition(Edition("0.12.5"), Rel::LE);
561 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1);
563 cout << "****600.4****" << endl;
564 q.setEdition(Edition("0.12.5-5"), Rel::LT);
566 BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1);
569 BOOST_AUTO_TEST_CASE(pool_query_X1)
571 cout << "****601.****" << endl;
573 q.addString("zypper");
574 q.addAttribute(sat::SolvAttr::name );
575 BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 5);
577 q.setEdition(Edition("0.12.8"), Rel::GE);
578 BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 4);
581 BOOST_AUTO_TEST_CASE(pool_query_X2)
583 cout << "****X****" << endl;
586 q.addString("zypp*");
587 q.addAttribute(sat::SolvAttr::name);
589 BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 5);
593 BOOST_AUTO_TEST_CASE(pool_query_recovery)
595 Pathname testfile(TESTS_SRC_DIR);
596 testfile += "/zypp/data/PoolQuery/savedqueries";
597 cout << "****recovery****" << endl;
599 std::vector<PoolQuery> queries;
600 std::insert_iterator<std::vector<PoolQuery> > ii( queries,queries.begin());
601 readPoolQueriesFromFile(testfile,ii);
602 BOOST_REQUIRE_MESSAGE(queries.size() == 2, "Bad count of read queries.");
604 BOOST_CHECK_EQUAL(queries[0].size(), 8);
608 q.addRepo("opensuse");
609 q.addKind(ResKind::patch);
611 q.setCaseSensitive();
612 q.setUninstalledOnly();
613 q.setEdition(Edition("0.8.3"),Rel::NE);
614 BOOST_CHECK(q == queries[1]);
617 BOOST_AUTO_TEST_CASE(pool_predicated_matcher)
619 cout << "****predicated_matcher****" << endl;
624 q.addDependency( sat::SolvAttr::name, "zy*", Rel::ANY, Edition(), Arch_empty );
625 BOOST_CHECK_EQUAL( q.size(), 0 );
627 q.addDependency( sat::SolvAttr::name, "zy*", Rel::ANY, Edition(), Arch_empty, Match::GLOB );
628 BOOST_CHECK_EQUAL( q.size(), 5 ); // 5 more
630 q.addDependency( sat::SolvAttr::name, "^kde.*-zh", Rel::ANY, Edition(), Arch_noarch, Match::REGEX );
631 BOOST_CHECK_EQUAL( q.size(), 9 ); // 4 more
633 q.addDependency( sat::SolvAttr::name, "kde.*-zh", Rel::ANY, Edition(), Arch_noarch, Match::REGEX );
634 BOOST_CHECK_EQUAL( q.size(), 10 ); // 1 more
638 BOOST_AUTO_TEST_CASE(pool_query_serialize)
640 std::vector<PoolQuery> queries;
644 q.addAttribute( sat::SolvAttr::name );
645 q.addRepo( "factory-nonoss" );
646 q.addRepo( "zypp_svn" );
647 queries.push_back( q );
651 q.addAttribute( sat::SolvAttr::name, "ma" );
652 q.addRepo( "factory-nonoss" );
653 q.addRepo( "zypp_svn" );
654 queries.push_back( q );
659 q.addAttribute( sat::SolvAttr::name, "ma" );
660 q.addDependency( sat::SolvAttr::name, "nn", Rel::EQ, Edition("nne-nnr"), Arch_noarch );
661 q.addDependency( sat::SolvAttr::name, "nx", Rel::EQ, Edition("nxe-nxr"), Arch_noarch, Match::REGEX );
662 q.addDependency( sat::SolvAttr::requires, "rn", Rel::EQ, Edition("rne-rnr"), Arch_noarch );
663 q.addDependency( sat::SolvAttr::requires, "rx", Rel::EQ, Edition("rxe-rxr"), Arch_noarch, Match::GLOB );
664 queries.push_back( q );
667 cout << "****serialize****" << endl;
668 // filesystem::TmpFile testfile;
669 Pathname testfile( "/tmp/testfile" );
670 writePoolQueriesToFile( testfile, queries.begin(), queries.end() );
672 std::vector<PoolQuery> recovered;
673 std::insert_iterator<std::vector<PoolQuery>> ii( recovered, recovered.end() );
674 readPoolQueriesFromFile( testfile, ii );
676 BOOST_REQUIRE_EQUAL( queries.size(), recovered.size() );
677 for ( unsigned i = 0U; i < queries.size(); ++i )
679 BOOST_CHECK_EQUAL( queries[i], recovered[i] );
683 BOOST_AUTO_TEST_CASE(pool_query_equal)
685 cout << "****equal****" << endl;
686 std::vector<PoolQuery> v;
693 q.addAttribute( sat::SolvAttr::name, "zypper" );
695 q.setCaseSensitive(true);
700 q.addAttribute( sat::SolvAttr::name, "libzypp" ); // different
702 q.setCaseSensitive(true);
707 q.addAttribute( sat::SolvAttr::vendor, "zypper" ); // different
709 q.setCaseSensitive(true);
714 q.addAttribute( sat::SolvAttr::name, "zypper" );
716 q.setCaseSensitive(false); // different
721 q.addAttribute( sat::SolvAttr::name, "zypper" );
722 q.setMatchSubstring(); // different
723 q.setCaseSensitive(true);
728 q.addDependency( sat::SolvAttr::provides, "zypper" );
733 q.addDependency( sat::SolvAttr::provides, "zypper", Rel::GT, Edition("1.0") );
738 q.addDependency( sat::SolvAttr::provides, "zypper", Rel::GT, Edition("2.0") );
742 for (size_t li = 0; li < v.size(); ++li)
744 for (size_t ri = 0; ri < v.size(); ++ri)
746 COUT << li << " <> " << ri << endl;
747 bool equal( v[li] == v[ri] );
748 bool nequal( v[li] != v[ri] );
749 BOOST_CHECK_EQUAL( equal, li==ri );
750 BOOST_CHECK_EQUAL( equal, !nequal );
755 /////////////////////////////////////////////////////////////////////////////
757 /////////////////////////////////////////////////////////////////////////////
759 BOOST_AUTO_TEST_CASE(addDependency)
762 cout << "****addDependency1****" << endl;
764 q.setCaseSensitive( false );
765 q.setMatchSubstring();
766 q.addString( "libzypp" );
767 q.addDependency( sat::SolvAttr::provides, "FOO" ); // ! finds 'perl(CPAN::InfoObj)' 'foO'
768 std::for_each(q.begin(), q.end(), PrintAndCount());
769 //dumpQ( std::cout, q );
770 BOOST_CHECK_EQUAL( q.size(), 13 );
773 cout << "****addDependency2****" << endl;
775 q.setCaseSensitive( false );
776 q.setMatchSubstring();
777 q.addString( "libzypp" );
778 q.addDependency( sat::SolvAttr::provides, "FOO", Rel::GT, Edition("5.0") );
779 std::for_each(q.begin(), q.end(), PrintAndCount());
780 //dumpQ( std::cout, q );
781 BOOST_CHECK_EQUAL( q.size(), 7 );
784 cout << "****addDependency2a****" << endl;
786 q.setCaseSensitive( false );
787 q.setMatchSubstring();
788 q.addDependency( sat::SolvAttr::provides, "libzypp", Rel::GT, Edition("5.0") );
789 q.addAttribute( sat::SolvAttr::arch, Arch_i586.asString() ); // OR with arch i585
790 std::for_each(q.begin(), q.end(), PrintAndCount());
791 //dumpQ( std::cout, q );
792 BOOST_CHECK_EQUAL( q.size(), 66 );
795 cout << "****addDependency2b****" << endl;
797 q.setCaseSensitive( false );
798 q.setMatchSubstring();
799 // libzypp provides yast2-packagemanager...
800 q.addDependency( sat::SolvAttr::provides, "yast2-packagemanager", Rel::GT, Edition("5.0"), Arch_i586 ); // AND with arch i585
801 std::for_each(q.begin(), q.end(), PrintAndCount());
802 //dumpQ( std::cout, q );
803 BOOST_CHECK_EQUAL( q.size(), 2 );
806 cout << "****addDependency2c****" << endl;
808 q.setCaseSensitive( false );
809 q.setMatchSubstring();
810 // but no package named yast2-packagemanager
811 q.addDependency( sat::SolvAttr::name, "yast2-packagemanager", Rel::GT, Edition("5.0"), Arch_i586 ); // AND with arch i585
812 std::for_each(q.begin(), q.end(), PrintAndCount());
813 //dumpQ( std::cout, q );
814 BOOST_CHECK_EQUAL( q.size(), 0 );
817 cout << "****addDependency2d****" << endl;
819 q.setCaseSensitive( false );
820 q.setMatchSubstring();
821 // libzypp provides yast2-packagemanager...
822 q.addDependency( sat::SolvAttr::provides, "yast2-packagemanager", Arch_i586 ); // AND with arch i585
823 std::for_each(q.begin(), q.end(), PrintAndCount());
824 //dumpQ( std::cout, q );
825 BOOST_CHECK_EQUAL( q.size(), 2 );
828 cout << "****addDependency2e****" << endl;
830 q.setCaseSensitive( false );
831 q.setMatchSubstring();
832 // but no package named yast2-packagemanager
833 q.addDependency( sat::SolvAttr::name, "yast2-packagemanager", Arch_i586 ); // AND with arch i585
834 std::for_each(q.begin(), q.end(), PrintAndCount());
835 //dumpQ( std::cout, q );
836 BOOST_CHECK_EQUAL( q.size(), 0 );
840 cout << "****addDependency3****" << endl;
843 q.addDependency( sat::SolvAttr::provides, "kernel" );
844 std::for_each(q.begin(), q.end(), PrintAndCount());
845 //dumpQ( std::cout, q );
846 BOOST_CHECK_EQUAL( q.size(), 12 );
849 cout << "****addDependency4****" << endl;
852 q.addDependency( sat::SolvAttr::name, "kernel" );
853 std::for_each(q.begin(), q.end(), PrintAndCount());
854 //dumpQ( std::cout, q );
855 BOOST_CHECK_EQUAL( q.size(), 11 );
858 cout << "****addDependency5****" << endl;
860 // Capability always matches exact
861 q.addDependency( sat::SolvAttr::provides, Capability("kernel") );
862 std::for_each(q.begin(), q.end(), PrintAndCount());
863 //dumpQ( std::cout, q );
864 BOOST_CHECK_EQUAL( q.size(), 2 );
867 cout << "****addDependency6****" << endl;
869 // non dependecy + Capability matches solvable name!
870 q.addDependency( sat::SolvAttr::summary, Capability("kernel") );
871 std::for_each(q.begin(), q.end(), PrintAndCount());
872 //dumpQ( std::cout, q );
873 BOOST_CHECK_EQUAL( q.size(), 0 ); // non dependecy
879 std::string q2str( const PoolQuery & q_r )
882 q_r.serialize( s.stream() );
886 template <class OutputIterator>
887 void str2q( const std::string & s_r, OutputIterator out_r )
889 std::istringstream s( s_r );
892 if ( q.recover( s ) )
893 *out_r++ = std::move(q);
899 typedef std::set<PoolQuery> Pqs;
901 PoolQuery str2q( const std::string & s_r )
904 str2q( s_r, std::insert_iterator<Pqs>( ret, ret.end() ) );
909 std::string serialized( const std::string & arg_r )
910 { return "\n" + arg_r + "\n\n"; }
912 template <typename... Args>
913 std::string serialized( const std::string & arg_r, Args... args_r )
914 { return "\n" + arg_r + serialized( args_r... ); }
917 void testSerializeAndBack( const PoolQuery & q_r, const PoolQuery & expect_r, bool equal_r = true )
919 static unsigned i = 0;
921 std::string s { q2str( q_r ) };
922 PoolQuery q { str2q( s ) };
923 BOOST_CHECK_EQUAL( (q == expect_r), equal_r );
925 if ( ++i && (q == expect_r) != equal_r )
927 cout << "+++" << endl;
929 cout << "=== " << i << " ^v SerializeAndBack == " << equal_r << endl;
930 cout << expect_r << endl;
931 cout << "---" << endl;
936 BOOST_AUTO_TEST_CASE(zypperLocksSerialize)
938 // Fix/cleanup zypper locks (old style, new stule, complex) (bsc#1112911)
939 // As you may notice: locks (by now) ignore any arch component
940 cout << "****zypperLocksSerialize****" << endl;
941 std::string n { "n*" };
943 Edition e { "v", "r", 1 };
950 oldq.addAttribute( sat::SolvAttr::name, n );
951 testSerializeAndBack( oldq, oldq );
955 q.addDependency( sat::SolvAttr::name, n, Rel::ANY, Edition(), Arch_empty );
956 testSerializeAndBack( q, oldq );
959 { // new style + arch rule however stays complex
961 q.addDependency( sat::SolvAttr::name, n, Rel::ANY, Edition(), a );
962 testSerializeAndBack( q, oldq, false );
963 testSerializeAndBack( q, q );
972 oldq.addAttribute( sat::SolvAttr::name, n );
973 oldq.setEdition( e, o );
974 testSerializeAndBack( oldq, oldq );
978 q.addDependency( sat::SolvAttr::name, n, o, e, Arch_empty );
979 testSerializeAndBack( q, oldq );
982 { // new style + arch rule however stays complex
984 q.addDependency( sat::SolvAttr::name, n, o, e, a );
985 testSerializeAndBack( q, oldq, false );
986 testSerializeAndBack( q, q );