- by-status filter re-enabled
[platform/upstream/libzypp.git] / tests / zypp / PoolQuery_test.cc
1 #include <stdio.h>
2 #include <iostream>
3 #include <iterator>
4 #include <boost/test/auto_unit_test.hpp>
5 #include <list>
6
7 #include "zypp/ZYppFactory.h"
8 #include "zypp/PoolQuery.h"
9 #include "zypp/PoolQueryUtil.tcc"
10 #include "zypp/TmpPath.h"
11
12 #define BOOST_TEST_MODULE PoolQuery
13
14 using std::cout;
15 using std::endl;
16 using std::string;
17 using namespace zypp;
18 using namespace boost::unit_test;
19
20 bool result_cb( const sat::Solvable & solvable )
21 {
22   zypp::PoolItem pi( zypp::ResPool::instance().find( solvable ) );
23   cout << pi.resolvable() << endl;
24   // name: yast2-sound 2.16.2-9 i586
25   return true;
26 }
27
28 static void init_pool()
29 {
30   Pathname dir(TESTS_SRC_DIR);
31   dir += "/zypp/data/PoolQuery";
32
33   ZYpp::Ptr z = getZYpp();
34   ZConfig::instance().setSystemArchitecture(Arch("i586"));
35
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);
44 }
45
46 BOOST_AUTO_TEST_CASE(pool_query_init)
47 {
48   init_pool();
49 }
50
51 // no conditions, default query
52 // result: all available resolvables
53 BOOST_AUTO_TEST_CASE(pool_query_1)
54 {
55   cout << "****1****"  << endl;
56   PoolQuery q;
57   cout << q.size() << endl;
58   BOOST_CHECK(q.size() == 11451);
59   //!\todo should be 11453 probably according to:
60   // dumpsolv factory.solv factory-nonoss.solv zypp_svn.solv \@System.solv | \
61   // grep '^name:.*\(noarch\|i386\|i586\|i686\|src\)$' | wc -l
62 }
63
64 // default query + one search string
65 // q.addString("foo");
66 // result: all resolvables having at least one attribute matching foo
67 BOOST_AUTO_TEST_CASE(pool_query_2)
68 {
69   cout << "****2****"  << endl;
70   PoolQuery q;
71   q.addString("zypper");
72
73   std::for_each(q.begin(), q.end(), &result_cb);
74   BOOST_CHECK(q.size() == 16);
75 }
76
77 // default query + one attribute + one string
78 // q.addAttribute(foo, bar);
79 // should be the same as
80 // q.addAttribute(foo); q.addString(bar);
81 // result: resolvables with foo containing bar
82 BOOST_AUTO_TEST_CASE(pool_query_3)
83 {
84   cout << "****3****"  << endl;
85   PoolQuery q;
86   q.addString("zypper");
87   q.addAttribute(sat::SolvAttr::name);
88
89   std::for_each(q.begin(), q.end(), &result_cb);
90   BOOST_CHECK(q.size() == 6);
91
92   cout << endl;
93
94   PoolQuery q1;
95   q1.addAttribute(sat::SolvAttr::name, "zypper");
96
97   std::for_each(q1.begin(), q1.end(), &result_cb);
98   BOOST_CHECK(q1.size() == 6);
99 }
100
101
102 // default query + one attribute(one string) + one repo
103 // q.addRepo(foorepo);
104 // q.addAttribute(solvable:name, foo);
105 // FAILS
106 BOOST_AUTO_TEST_CASE(pool_query_4)
107 {
108   cout << "****4****"  << endl;
109   PoolQuery q;
110   q.addAttribute(sat::SolvAttr::name, "zypper");
111   q.addRepo("zypp_svn");
112
113   std::for_each(q.begin(), q.end(), &result_cb);
114   BOOST_CHECK(q.size() == 3);
115 }
116
117 BOOST_AUTO_TEST_CASE(pool_query_5)
118 {
119   cout << "****5****"  << endl;
120   PoolQuery q;
121   q.addRepo("zypp_svn");
122
123   std::for_each(q.begin(), q.end(), &result_cb);
124   BOOST_CHECK(q.size() == 21);
125 }
126
127 BOOST_AUTO_TEST_CASE(pool_query_6)
128 {
129   cout << "****6****"  << endl;
130   PoolQuery q;
131   q.addString("browser");
132   q.addAttribute(sat::SolvAttr::name);
133   q.addAttribute(sat::SolvAttr::summary);
134   q.addAttribute(sat::SolvAttr::description);
135
136   std::for_each(q.begin(), q.end(), &result_cb);
137   BOOST_CHECK(q.size() == 15);
138
139   cout << endl;
140
141   PoolQuery q1;
142   q1.addString("browser");
143   q1.addAttribute(sat::SolvAttr::name);
144
145   std::for_each(q1.begin(), q1.end(), &result_cb);
146   BOOST_CHECK(q1.size() == 5);
147 }
148
149 // match exact
150 BOOST_AUTO_TEST_CASE(pool_query_7)
151 {
152   cout << "****7****"  << endl;
153   PoolQuery q;
154   q.addString("vim");
155   q.addAttribute(sat::SolvAttr::name);
156   q.setMatchExact();
157
158   std::for_each(q.begin(), q.end(), &result_cb);
159   BOOST_CHECK(q.size() == 3);
160
161   PoolQuery q1;
162   q1.addString("zypp");
163   q1.addAttribute(sat::SolvAttr::name);
164   q1.setMatchExact();
165
166   std::for_each(q1.begin(), q1.end(), &result_cb);
167   BOOST_CHECK(q1.empty());
168 }
169
170 // match by installed status (basically by system vs. repo)
171 BOOST_AUTO_TEST_CASE(pool_query_8)
172 {
173   cout << "****8****"  << endl;
174   PoolQuery q;
175   q.addString("zypper");
176   q.addAttribute(sat::SolvAttr::name);
177   q.setMatchExact();
178   q.setInstalledOnly();
179
180   std::for_each(q.begin(), q.end(), &result_cb);
181   BOOST_CHECK(q.size() == 1);
182
183   cout << endl;
184
185   PoolQuery q1;
186   q1.addString("zypper");
187   q1.addAttribute(sat::SolvAttr::name);
188   q1.setMatchExact();
189   q1.setUninstalledOnly();
190
191   std::for_each(q1.begin(), q1.end(), &result_cb);
192   BOOST_CHECK(q1.size() == 5);
193 }
194
195 BOOST_AUTO_TEST_CASE(pool_query_save_restore)
196 {
197 #warning CAN NOT USE A FIX SOLV FILE
198 // must store some raw metadata and generate the solv file
199 // otherwise trestcases break whenever the solv format changes
200 #if 0
201   Pathname dir(TESTS_SRC_DIR);
202   dir += "/zypp/data/PoolQuery";
203
204   ZYpp::Ptr z = getZYpp();
205
206   sat::Pool::instance().addRepoSolv(dir + "foo.solv");
207
208   PoolQuery query;
209   //query.setInstalledOnly();
210   query.execute("kde", &result_cb);
211
212   cout << "search done." << endl;
213
214   query.setMatchExact(true);
215   query.execute("kde", &result_cb);
216
217   cout << "search done." << endl;
218 #endif
219
220 //test recovery from file
221   Pathname pathToQueries(TESTS_SRC_DIR);
222   pathToQueries += "/zypp/data/PoolQuery/savedqueries";
223
224   std::list<PoolQuery> savedQueries;
225
226   std::insert_iterator<std::list<PoolQuery> > ii(savedQueries, savedQueries.end());
227   readPoolQueriesFromFile(pathToQueries,ii);
228   BOOST_CHECK( savedQueries.size() == 2 );
229
230   filesystem::TmpFile tmp;
231   Pathname tmpPath = tmp.path();
232
233   savedQueries.clear();
234
235   PoolQuery q1;
236   PoolQuery q2;
237
238   q1.addKind( Resolvable::Kind::patch );
239   q2.addKind( Resolvable::Kind::patch );
240   q2.addKind( Resolvable::Kind::pattern );
241
242   savedQueries.push_front( q1 );
243   savedQueries.push_front( q2 );
244
245   writePoolQueriesToFile ( tmpPath, savedQueries.begin(), savedQueries.end() );
246   std::insert_iterator<std::list<PoolQuery> > ii2(savedQueries,
247       savedQueries.end());
248   //reread writed queries
249   readPoolQueriesFromFile( tmpPath, ii2);
250   //TODO test if 0==2 and 1==3
251   BOOST_CHECK( savedQueries.size() == 4 );
252
253 }