2 * Copyright (C) 2016 J. Ali Harlow <ali@juiblex.co.uk>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <plover/plover.h>
22 #include <plover/package.h>
24 struct razor_set *test_set=NULL;
25 struct razor_package *test_pkg=NULL;
27 static void finalize(void)
30 razor_set_unref(test_set);
33 void import_properties(struct razor_importer *importer,
34 struct razor_set *set,struct razor_package *pkg)
36 struct razor_property_iterator *iter;
37 struct razor_property *prop;
39 const char *name,*version;
40 iter=razor_property_iterator_create(set,pkg);
41 while(razor_property_iterator_next(iter,&prop,&name,&flags,&version))
42 razor_importer_add_property(importer,name,flags,version);
43 razor_property_iterator_destroy(iter);
46 void import_files(struct razor_importer *importer,
47 struct razor_set *set,struct razor_package *pkg)
49 struct razor_file_iterator *iter;
51 iter=razor_file_iterator_create(set,pkg,FALSE);
52 while(razor_file_iterator_next(iter,&name))
53 razor_importer_add_file(importer,name);
54 razor_file_iterator_destroy(iter);
57 gboolean import_rpm(struct razor_rpm *rpm)
60 struct razor_importer *importer;
61 struct razor_package_iterator *iter;
62 struct razor_set *set;
63 struct razor_package *pkg=NULL;
64 const char *name,*version,*arch,*summary,*description,*url,*license;
65 const char *s,*pkg_name;
66 const char *const *prefixes;
68 * First pass: get a razor_set and razor_package with everything
69 * except the prefixes.
71 importer=razor_importer_create();
72 if (razor_importer_add_rpm(importer,rpm))
73 g_error("../yum-repo-test-dir: Failed to add rpm");
74 set=razor_importer_finish(importer);
76 g_error("../yum-repo-test-dir: Failed to import");
77 iter=razor_package_iterator_create(set);
79 razor_rpm_get_details(rpm,RAZOR_DETAIL_NAME,&pkg_name,RAZOR_DETAIL_LAST);
80 while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_NAME,&s,
82 if (!strcmp(s,pkg_name))
84 razor_package_iterator_destroy(iter);
91 * Second pass: use the information from the first pass plus the
92 * prefixes to create a final razor_set and razor_package.
94 importer=razor_importer_create();
95 razor_package_get_details(set,pkg,RAZOR_DETAIL_NAME,&name,
96 RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
97 RAZOR_DETAIL_SUMMARY,&summary,RAZOR_DETAIL_DESCRIPTION,&description,
98 RAZOR_DETAIL_URL,&url,RAZOR_DETAIL_LICENSE,&license,RAZOR_DETAIL_LAST);
99 razor_importer_begin_package(importer,name,version,arch);
100 razor_importer_add_details(importer,summary,description,url,license);
101 import_properties(importer,set,pkg);
102 import_files(importer,set,pkg);
103 razor_rpm_get_details(rpm,RAZOR_DETAIL_PREFIXES,&prefixes,
105 for(i=0;prefixes && prefixes[i];i++)
106 razor_importer_add_install_prefix(importer,prefixes[i]);
107 razor_importer_finish_package(importer);
108 razor_set_unref(set);
109 test_set=razor_importer_finish(importer);
110 g_assert(test_set != NULL);
111 iter=razor_package_iterator_create(test_set);
113 while(razor_package_iterator_next(iter,&test_pkg,RAZOR_DETAIL_NAME,&s,
115 if (!strcmp(s,pkg_name))
117 razor_package_iterator_destroy(iter);
121 static PloverPackage *package_getref(const char *name,const char *version)
123 struct razor_rpm *rpm;
124 PloverPackage *package=NULL;
125 struct razor_error *err=NULL;
129 razor_set_unref(test_set);
133 * yum metadata doesn't include all the information included in
134 * a rpm file, so do this the hard way. Unfortunately,
135 * razor_importer_add_rpm() doesn't support prefixes so we have
136 * to do it the really hard way.
138 filename=g_strconcat("../yum-repo-test-dir/rpms/",name,"-",version,
140 rpm=razor_rpm_open(filename,&err);
142 g_error("%s: %s",filename,razor_error_get_msg(err));
145 package=plover_package_new(test_set,test_pkg);
148 razor_rpm_close(rpm);
152 static void test_basic_properties(void)
154 PloverPackage *package;
155 package=package_getref("zsh","1-1");
156 g_assert(package != NULL);
157 g_assert(plover_package_get_razor_set(package) == test_set);
158 g_assert(plover_package_get_razor_package(package) == test_pkg);
159 g_assert_cmpstr(plover_package_get_name(package),==,"zsh");
160 g_assert_cmpstr(plover_package_get_summary(package),==,"Test package");
161 g_assert_cmpstr(plover_package_get_version(package),==,"1-1");
162 g_assert_cmpstr(plover_package_get_license(package),==,"GPL");
163 g_assert_cmpstr(plover_package_get_arch(package),==,"noarch");
164 g_assert_cmpstr(plover_package_get_description(package),==,"Test package");
165 g_assert_cmpstr(plover_package_get_URL(package),==,
166 "http://www.juiblex.co.uk/beach");
167 g_object_unref(package);
170 static void test_package_properties(void)
172 PloverPackage *package;
173 struct razor_property_iterator *iter;
174 struct razor_property *prop;
176 const char *s,*name,*version;
178 GList *expected,*lnk;
179 package=package_getref("zsh","1-1");
180 g_assert(package != NULL);
181 expected=g_list_prepend(NULL,
182 (gpointer)g_intern_string("requires(pre,postun): zip"));
183 expected=g_list_prepend(expected,
184 (gpointer)g_intern_string("requires: zip"));
185 expected=g_list_prepend(expected,
186 (gpointer)g_intern_string("provides: zsh = 1-1"));
187 iter=plover_package_property_iterator_create(package);
188 g_assert(iter != NULL);
189 while(razor_property_iterator_next(iter,&prop,&name,&flags,&version))
191 if (g_str_has_prefix(name,"rpmlib("))
193 s=razor_property_type_to_string(prop);
196 if (flags&RAZOR_PROPERTY_SCRIPT_MASK)
198 g_string_append_c(str,'(');
199 if (flags&RAZOR_PROPERTY_PRE)
200 g_string_append(str,"pre");
201 if (flags&RAZOR_PROPERTY_POST)
203 if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
204 g_string_append_c(str,',');
205 g_string_append(str,"post");
207 if (flags&RAZOR_PROPERTY_PREUN)
209 if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
210 g_string_append_c(str,',');
211 g_string_append(str,"preun");
213 if (flags&RAZOR_PROPERTY_POSTUN)
215 if (str->str[str->len-1]!='(' && str->str[str->len-1]!=',')
216 g_string_append_c(str,',');
217 g_string_append(str,"postun");
219 g_string_append_c(str,')');
221 g_string_append(str,": ");
222 g_string_append(str,name);
225 g_string_append_c(str,' ');
226 g_string_append(str,razor_property_relation_to_string(prop));
227 g_string_append_c(str,' ');
228 g_string_append(str,version);
230 lnk=g_list_find(expected,g_intern_string(str->str));
232 g_warning("Unexpected property in zsh package: %s",str->str);
234 expected=g_list_delete_link(expected,lnk);
235 g_string_free(str,TRUE);
237 razor_property_iterator_destroy(iter);
239 g_warning("%d missing propert%s in set, including %s",
240 g_list_length(expected),g_list_length(expected)==1?"y":"ies",
242 g_object_unref(package);
245 static void test_package_files(void)
247 PloverPackage *package;
248 struct razor_file_iterator *iter;
250 GList *expected,*lnk;
251 package=package_getref("zsh","1-1");
252 g_assert(package != NULL);
253 expected=g_list_prepend(NULL,(gpointer)g_intern_string("/etc/zsh.conf"));
254 expected=g_list_prepend(expected,(gpointer)g_intern_string("/usr/bin/zsh"));
255 iter=plover_package_file_iterator_create(package,FALSE);
256 g_assert(iter != NULL);
257 while(razor_file_iterator_next(iter,&name))
259 lnk=g_list_find(expected,g_intern_string(name));
261 g_warning("Unexpected file in zsh package: %s",name);
263 expected=g_list_delete_link(expected,lnk);
265 razor_file_iterator_destroy(iter);
267 g_warning("%d missing file%s in set, including %s",
268 g_list_length(expected),g_list_length(expected)==1?"":"s",
270 g_object_unref(package);
273 static void test_package_icon(void)
276 * icons aren't supported yet.
278 PloverPackage *package;
279 GInputStream *stream;
281 package=package_getref("zsh","1-1");
282 g_assert(package != NULL);
283 stream=plover_package_read_icon(package,&err);
286 /* Unexpected, but hardly an error */
287 g_object_unref(stream);
291 g_assert(err != NULL);
292 g_assert(err->message != NULL);
295 g_object_unref(package);
298 static void test_package_prefixes(void)
300 PloverPackage *package;
301 const char *const *prefixes;
302 package=package_getref("zsh","1-1");
303 g_assert(package != NULL);
304 prefixes=plover_package_get_prefixes(package);
305 g_assert_cmpstr(prefixes[0], ==, "/usr");
306 g_assert(prefixes[1] == NULL);
307 g_object_unref(package);
310 int main(int argc,char **argv)
313 g_test_init(&argc,&argv,NULL);
314 g_test_bug_base("mailto:ali@juiblex.co.uk");
315 g_test_add_func("/package/basic",test_basic_properties);
316 g_test_add_func("/package/icons",test_package_icon);
317 g_test_add_func("/package/properties",test_package_properties);
318 g_test_add_func("/package/files",test_package_files);
319 g_test_add_func("/package/prefixes",test_package_prefixes);
320 g_test_message("PloverPackage::changed signal unused and thus untestable");