1 /*
2  * Copyright (C) 2012-2014 Red Hat, Inc.
3  *
4  * Licensed under the GNU Lesser General Public License Version 2.1
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 
22 #include <solv/util.h>
23 
24 
25 #include "libdnf/dnf-advisory.h"
26 #include "libdnf/hy-package.h"
27 #include "libdnf/hy-package-private.hpp"
28 #include "libdnf/hy-query.h"
29 #include "libdnf/dnf-reldep.h"
30 #include "libdnf/dnf-reldep-list.h"
31 #include "libdnf/dnf-sack-private.hpp"
32 #include "libdnf/hy-util.h"
33 #include "fixtures.h"
34 #include "test_suites.h"
35 #include "testsys.h"
36 
37 #include "libdnf/repo/solvable/Dependency.hpp"
38 #include "libdnf/repo/solvable/DependencyContainer.hpp"
39 
START_TEST(test_package_summary)40 START_TEST(test_package_summary)
41 {
42     DnfPackage *pkg = by_name(test_globals.sack, "penny-lib");
43     fail_if(strcmp(dnf_package_get_summary(pkg), "in my ears"));
44     g_object_unref(pkg);
45 }
46 END_TEST
47 
START_TEST(test_identical)48 START_TEST(test_identical)
49 {
50     DnfSack *sack = test_globals.sack;
51     DnfPackage *pkg1 = by_name(sack, "penny-lib");
52     DnfPackage *pkg2 = by_name(sack, "flying");
53     DnfPackage *pkg3 = by_name(sack, "penny-lib");
54 
55     fail_unless(dnf_package_get_identical(pkg1, pkg3));
56     fail_if(dnf_package_get_identical(pkg2, pkg3));
57 
58     g_object_unref(pkg1);
59     g_object_unref(pkg2);
60     g_object_unref(pkg3);
61 }
62 END_TEST
63 
START_TEST(test_versions)64 START_TEST(test_versions)
65 {
66     DnfSack *sack = test_globals.sack;
67     unsigned epoch;
68     const char *version, *release;
69     DnfPackage *pkg;
70 
71     pkg = by_name(sack, "baby");
72     ck_assert_str_eq(dnf_package_get_evr(pkg), "6:5.0-11");
73     epoch = dnf_package_get_epoch(pkg);
74     fail_unless(epoch == 6);
75     version = dnf_package_get_version(pkg);
76     ck_assert_str_eq(version, "5.0");
77     release = dnf_package_get_release(pkg);
78     ck_assert_str_eq(release, "11");
79     g_object_unref(pkg);
80 
81     pkg = by_name(sack, "jay");
82     // epoch missing if it's 0:
83     ck_assert_str_eq(dnf_package_get_evr(pkg), "5.0-0");
84     epoch = dnf_package_get_epoch(pkg);
85     fail_unless(epoch == 0);
86     version = dnf_package_get_version(pkg);
87     ck_assert_str_eq(version, "5.0");
88     release = dnf_package_get_release(pkg);
89     ck_assert_str_eq(release, "0");
90     g_object_unref(pkg);
91 }
92 END_TEST
93 
START_TEST(test_vendor)94 START_TEST(test_vendor)
95 {
96     DnfSack *sack = test_globals.sack;
97     DnfPackage *pkg = by_name_repo(sack, "foolish-grin", "vendor");
98     fail_if(pkg == NULL);
99     const char *vendor = dnf_package_get_vendor(pkg);
100 
101     ck_assert_str_eq(vendor, "PerfectlyLoud");
102     g_object_unref(pkg);
103 }
104 END_TEST
105 
START_TEST(test_no_sourcerpm)106 START_TEST(test_no_sourcerpm)
107 {
108     DnfSack *sack = test_globals.sack;
109     DnfPackage *pkg = by_name(sack, "baby");
110     const char *src = dnf_package_get_sourcerpm(pkg);
111 
112     fail_unless(src == NULL);
113     g_object_unref(pkg);
114 }
115 END_TEST
116 
START_TEST(test_get_requires)117 START_TEST(test_get_requires)
118 {
119     DnfSack *sack = test_globals.sack;
120     DnfPackage *pkg = by_name(sack, "flying");
121     DnfReldepList *reldeplist = dnf_package_get_requires(pkg);
122 
123     fail_unless(dnf_reldep_list_count (reldeplist) == 1);
124     DnfReldep *reldep = dnf_reldep_list_index (reldeplist, 0);
125 
126     const char *depstr = dnf_reldep_to_string (reldep);
127     ck_assert_str_eq(depstr, "P-lib >= 3");
128 
129     delete reldep;
130     delete reldeplist;
131     g_object_unref(pkg);
132 }
133 END_TEST
134 
START_TEST(test_get_more_requires)135 START_TEST(test_get_more_requires)
136 {
137     DnfSack *sack = test_globals.sack;
138     DnfPackage *pkg = by_name(sack, "walrus");
139     DnfReldepList *reldeplist = dnf_package_get_requires(pkg);
140 
141     fail_unless(dnf_reldep_list_count (reldeplist) == 2);
142     delete reldeplist;
143     g_object_unref(pkg);
144 }
145 END_TEST
146 
START_TEST(test_chksum_fail)147 START_TEST(test_chksum_fail)
148 {
149     DnfSack *sack = test_globals.sack;
150     DnfPackage *pkg = by_name(sack, "walrus");
151     int type;
152 
153     const unsigned char *chksum = dnf_package_get_chksum(pkg, &type);
154     fail_unless(chksum == NULL);
155     chksum = dnf_package_get_hdr_chksum(pkg, &type);
156     fail_unless(chksum == NULL);
157     g_object_unref(pkg);
158 }
159 END_TEST
160 
START_TEST(test_checksums)161 START_TEST(test_checksums)
162 {
163     DnfPackage *pkg = by_name(test_globals.sack, "mystery-devel");
164     int i;
165     HyChecksum *csum = dnf_package_get_chksum(pkg, &i);
166     fail_unless(i == G_CHECKSUM_SHA256);
167     // Check the first and last bytes. Those need to match against information
168     // in primary.xml.gz.
169     fail_unless(csum[0] == 0x2e);
170     fail_unless(csum[31] == 0xf5);
171 
172     g_object_unref(pkg);
173 }
174 END_TEST
175 
START_TEST(test_get_files)176 START_TEST(test_get_files)
177 {
178     DnfSack *sack = test_globals.sack;
179 
180     DnfPackage *pkg = by_name(sack, "tour");
181     gchar **files = dnf_package_get_files(pkg);
182     int i = 0;
183     char **iter;
184 
185     for (iter = files; iter && *iter; iter++)
186         i++;
187     g_assert_cmpint(i, ==, 6);
188     g_strfreev(files);
189     g_object_unref(pkg);
190 }
191 END_TEST
192 
START_TEST(test_get_advisories)193 START_TEST(test_get_advisories)
194 {
195     GPtrArray *advisories;
196     DnfSack *sack = test_globals.sack;
197     DnfPackage *pkg = by_name(sack, "tour");
198 
199     advisories = dnf_package_get_advisories(pkg, HY_GT);
200     fail_unless(advisories != NULL);
201     ck_assert_int_eq(advisories->len, 1);
202     auto advisory = static_cast<DnfAdvisory *>(g_ptr_array_index(advisories, 0));
203     ck_assert_str_eq(dnf_advisory_get_id(advisory), "FEDORA-2008-9969");
204     g_ptr_array_unref(advisories);
205     g_object_unref(pkg);
206 }
207 END_TEST
208 
START_TEST(test_get_advisories_none)209 START_TEST(test_get_advisories_none)
210 {
211     GPtrArray *advisories;
212     DnfSack *sack = test_globals.sack;
213     DnfPackage *pkg = by_name(sack, "mystery-devel");
214 
215     advisories = dnf_package_get_advisories(pkg, HY_GT|HY_EQ);
216     fail_unless(advisories != NULL);
217     ck_assert_int_eq(advisories->len, 1);
218     g_ptr_array_unref(advisories);
219 
220     advisories = dnf_package_get_advisories(pkg, HY_LT|HY_EQ);
221     fail_unless(advisories != NULL);
222     ck_assert_int_eq(advisories->len, 1);
223     g_ptr_array_unref(advisories);
224 
225     g_object_unref(pkg);
226 }
227 END_TEST
228 
START_TEST(test_lookup_num)229 START_TEST(test_lookup_num)
230 {
231     DnfPackage *pkg = by_name(test_globals.sack, "tour");
232     guint64 buildtime = dnf_package_get_buildtime(pkg);
233     fail_unless(buildtime > 1330473600); // after 2012-02-29
234     fail_unless(buildtime < 1456704000); // before 2016-02-29
235 
236     g_object_unref(pkg);
237 }
238 END_TEST
239 
START_TEST(test_installed)240 START_TEST(test_installed)
241 {
242     DnfPackage *pkg1 = by_name_repo(test_globals.sack, "penny-lib", "main");
243     DnfPackage *pkg2 = by_name_repo(test_globals.sack,
244                                   "penny-lib", HY_SYSTEM_REPO_NAME);
245     int installed1 = dnf_package_installed(pkg1);
246     int installed2 = dnf_package_installed(pkg2);
247     fail_unless(installed1 == 0);
248     fail_unless(installed2 == 1);
249 
250     g_object_unref(pkg1);
251     g_object_unref(pkg2);
252 }
253 END_TEST
254 
START_TEST(test_two_sacks)255 START_TEST(test_two_sacks)
256 {
257     /* This clumsily mimics create_ut_sack() and setup_with() to
258      * create a second DnfSack. */
259     char *tmpdir = solv_dupjoin(test_globals.tmpdir, "/tmp", NULL);
260     DnfSack *sack1 = dnf_sack_new();
261     dnf_sack_set_arch(sack1, TEST_FIXED_ARCH, NULL);
262     dnf_sack_set_cachedir(sack1, tmpdir);
263     fail_unless(dnf_sack_setup(sack1, DNF_SACK_SETUP_FLAG_MAKE_CACHE_DIR, NULL));
264     Pool *pool1 = dnf_sack_get_pool(sack1);
265     const char *path = pool_tmpjoin(pool1, test_globals.repo_dir,
266                                     "change.repo", NULL);
267     fail_if(load_repo(pool1, "change", path, 0));
268     DnfPackage *pkg1 = by_name(sack1, "penny-lib");
269     fail_if(pkg1 == NULL);
270 
271     DnfSack *sack2 = test_globals.sack;
272     Pool *pool2 = dnf_sack_get_pool(sack2);
273     DnfPackage *pkg2 = by_name(sack2, "penny-lib");
274     fail_if(pkg2 == NULL);
275 
276     /* "penny-lib" is in both pools but at different offsets */
277     Solvable *s1 = pool_id2solvable(pool1, dnf_package_get_id(pkg1));
278     Solvable *s2 = pool_id2solvable(pool2, dnf_package_get_id(pkg2));
279     fail_if(s1->name == s2->name);
280 
281     fail_if(dnf_package_cmp(pkg1, pkg2) != 0);
282 
283     g_object_unref(pkg1);
284     g_object_unref(pkg2);
285 
286     g_object_unref(sack1);
287     g_free(tmpdir);
288 }
289 END_TEST
290 
START_TEST(test_packager)291 START_TEST(test_packager)
292 {
293     DnfPackage *pkg = by_name(test_globals.sack, "tour");
294     ck_assert_str_eq(dnf_package_get_packager(pkg), "roll up <roll@up.net>");
295     g_object_unref(pkg);
296 }
297 END_TEST
298 
START_TEST(test_sourcerpm)299 START_TEST(test_sourcerpm)
300 {
301     DnfPackage *pkg = by_name(test_globals.sack, "tour");
302     const char *sourcerpm = dnf_package_get_sourcerpm(pkg);
303 
304     ck_assert_str_eq(sourcerpm, "tour-4-6.src.rpm");
305     g_object_unref(pkg);
306 
307     pkg = by_name(test_globals.sack, "mystery-devel");
308     sourcerpm = dnf_package_get_sourcerpm(pkg);
309     ck_assert_str_eq(sourcerpm, "mystery-19.67-1.src.rpm");
310     g_object_unref(pkg);
311 }
312 END_TEST
313 
314 #define TOUR_45_46_DRPM_CHKSUM "\xc3\xc3\xd5\x72\xa4\x6b"\
315     "\x1a\x66\x90\x6d\x42\xca\x17\x63\xef\x36\x20\xf7\x02"\
316     "\x58\xaa\xac\x4c\x14\xbf\x46\x3e\xd5\x37\x16\xd4\x44"
317 
START_TEST(test_presto)318 START_TEST(test_presto)
319 {
320     DnfSack *sack = test_globals.sack;
321     DnfPackage *tour = by_name(sack, "tour");
322     fail_if(tour == NULL);
323 
324     DnfPackageDelta *delta = dnf_package_get_delta_from_evr(tour, "4-5");
325     const char *location = dnf_packagedelta_get_location(delta);
326     ck_assert_str_eq(location, "drpms/tour-4-5_4-6.noarch.drpm");
327     const char *baseurl = dnf_packagedelta_get_baseurl(delta);
328     fail_unless(baseurl == NULL);
329     guint64 size = dnf_packagedelta_get_downloadsize(delta);
330     ck_assert_int_eq(size, 3132);
331     int type;
332     HyChecksum *csum = dnf_packagedelta_get_chksum(delta, &type);
333     fail_unless(type == G_CHECKSUM_SHA256);
334     ck_assert(!memcmp(csum, TOUR_45_46_DRPM_CHKSUM, 32));
335     g_object_unref(delta);
336     g_object_unref(tour);
337 }
338 END_TEST
339 
START_TEST(test_get_files_cmdline)340 START_TEST(test_get_files_cmdline)
341 {
342     DnfSack *sack = test_globals.sack;
343 
344     DnfPackage *pkg = by_name(sack, "tour");
345     gchar **files;
346 
347     files = dnf_package_get_files(pkg);
348     g_assert_cmpint (6, ==, g_strv_length(files));
349     g_strfreev(files);
350     g_object_unref(pkg);
351 }
352 END_TEST
353 
354 Suite *
package_suite(void)355 package_suite(void)
356 {
357     Suite *s = suite_create("Package");
358     TCase *tc;
359 
360     tc = tcase_create("Core");
361     tcase_add_unchecked_fixture(tc, fixture_system_only, teardown);
362     tcase_add_test(tc, test_package_summary);
363     tcase_add_test(tc, test_identical);
364     tcase_add_test(tc, test_versions);
365     tcase_add_test(tc, test_no_sourcerpm);
366     suite_add_tcase(s, tc);
367 
368     tc = tcase_create("Requires");
369     tcase_add_unchecked_fixture(tc, fixture_with_main, teardown);
370     tcase_add_test(tc, test_get_requires);
371     tcase_add_test(tc, test_get_more_requires);
372     tcase_add_test(tc, test_chksum_fail);
373     tcase_add_test(tc, test_installed);
374     tcase_add_test(tc, test_two_sacks);
375     suite_add_tcase(s, tc);
376 
377     tc = tcase_create("WithRealRepo");
378     tcase_add_unchecked_fixture(tc, fixture_yum, teardown);
379     tcase_add_test(tc, test_checksums);
380     tcase_add_test(tc, test_get_files);
381     tcase_add_test(tc, test_get_advisories);
382     tcase_add_test(tc, test_get_advisories_none);
383     tcase_add_test(tc, test_lookup_num);
384     tcase_add_test(tc, test_packager);
385     tcase_add_test(tc, test_sourcerpm);
386     tcase_add_test(tc, test_presto);
387     suite_add_tcase(s, tc);
388 
389     tc = tcase_create("WithCmdlinePackage");
390     tcase_add_unchecked_fixture(tc, fixture_cmdline_only, teardown);
391     tcase_add_test(tc, test_get_files_cmdline);
392     suite_add_tcase(s, tc);
393 
394     tc = tcase_create("Vendor");
395     tcase_add_unchecked_fixture(tc, fixture_with_vendor, teardown);
396     tcase_add_test(tc, test_vendor);
397     suite_add_tcase(s, tc);
398 
399     return s;
400 }
401