pkg: use a blob buffer in pkg_t to store variable fields
[oweals/opkg-lede.git] / tests / libopkg_test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <libgen.h>
5
6 #include <opkg.h>
7
8 int opkg_state_changed;
9 pkg_t *find_pkg = NULL;
10
11 #define TEST_PACKAGE "aspell"
12
13 void progress_callback(const opkg_progress_data_t * progress, void *data)
14 {
15         printf("\r%s %3d%%\n", (char *)data, progress->percentage);
16         fflush(stdout);
17 }
18
19 static void list_pkg(pkg_t * pkg)
20 {
21         char *v = pkg_version_str_alloc(pkg);
22         printf("%s - %s\n", pkg->name, v);
23         free(v);
24 }
25
26 void package_list_installed_callback(pkg_t * pkg, void *data)
27 {
28         if (pkg->state_status == SS_INSTALLED)
29                 list_pkg(pkg);
30 }
31
32 void package_list_callback(pkg_t * pkg, void *data)
33 {
34         static int install_count = 0;
35         static int total_count = 0;
36
37         if (pkg->state_status == SS_INSTALLED)
38                 install_count++;
39
40         total_count++;
41
42         printf("\rPackage count: %d Installed, %d Total Available",
43                install_count, total_count);
44         fflush(stdout);
45
46         if (!find_pkg) {
47                 /* store the first package to print out later */
48                 find_pkg = pkg;
49         }
50 }
51
52 void package_list_upgradable_callback(pkg_t * pkg, void *data)
53 {
54         list_pkg(pkg);
55 }
56
57 void print_package(pkg_t * pkg)
58 {
59         char *v = pkg_version_str_alloc(pkg);
60         const char *tags = pkg_get_string(pkg, PKG_TAGS);
61
62         printf("Name:         %s\n"
63                "Version:      %s\n"
64                "Repository:   %s\n"
65                "Architecture: %s\n"
66                "Description:  %s\n"
67                "Tags:         %s\n"
68                "Size:         %ld\n"
69                "Status:       %d\n",
70                pkg->name,
71                v,
72                pkg->src->name,
73                pkg_get_string(pkg, PKG_ARCHITECTURE),
74                pkg_get_string(pkg, PKG_DESCRIPTION),
75                tags ? tags : "", pkg->size, pkg->state_status);
76         free(v);
77 }
78
79 void opkg_test(void)
80 {
81         int err;
82         pkg_t *pkg;
83
84         err = opkg_update_package_lists(progress_callback, "Updating...");
85         printf("\nopkg_update_package_lists returned %d\n", err);
86
87         opkg_list_packages(package_list_callback, NULL);
88         printf("\n");
89
90         if (find_pkg) {
91                 printf("Finding package \"%s\"\n", find_pkg->name);
92                 pkg =
93                     opkg_find_package(find_pkg->name,
94                                       pkg_get_string(find_pkg, PKG_VERSION),
95                                       pkg_get_string(find_pkg, PKG_ARCHITECTURE),
96                                       find_pkg->src->name);
97                 if (pkg) {
98                         print_package(pkg);
99                 } else
100                         printf("Package \"%s\" not found!\n", find_pkg->name);
101         } else
102                 printf("No package available to test find_package.\n");
103
104         err =
105             opkg_install_package(TEST_PACKAGE, progress_callback,
106                                  "Installing...");
107         printf("\nopkg_install_package returned %d\n", err);
108
109         err =
110             opkg_upgrade_package(TEST_PACKAGE, progress_callback,
111                                  "Upgrading...");
112         printf("\nopkg_upgrade_package returned %d\n", err);
113
114         err =
115             opkg_remove_package(TEST_PACKAGE, progress_callback, "Removing...");
116         printf("\nopkg_remove_package returned %d\n", err);
117
118         printf("Listing upgradable packages...\n");
119         opkg_list_upgradable_packages(package_list_upgradable_callback, NULL);
120
121         err = opkg_upgrade_all(progress_callback, "Upgrading all...");
122         printf("\nopkg_upgrade_all returned %d\n", err);
123
124 }
125
126 int main(int argc, char **argv)
127 {
128         pkg_t *pkg;
129         int err;
130
131         if (argc < 2) {
132                 printf("Usage: %s command\n"
133                        "\nCommands:\n"
134                        "\tupdate - Update package lists\n"
135                        "\tfind [package] - Print details of the specified package\n"
136                        "\tinstall [package] - Install the specified package\n"
137                        "\tupgrade [package] - Upgrade the specified package\n"
138                        "\tlist upgrades - List the available upgrades\n"
139                        "\tlist all - List all available packages\n"
140                        "\tlist installed - List all the installed packages\n"
141                        "\tremove [package] - Remove the specified package\n"
142                        "\trping - Reposiroties ping, check the accessibility of repositories\n"
143                        "\ttest - Run test script\n", basename(argv[0]));
144                 exit(0);
145         }
146
147         setenv("OFFLINE_ROOT", "/tmp", 0);
148
149         if (opkg_new()) {
150                 printf("opkg_new() failed. This sucks.\n");
151                 print_error_list();
152                 return 1;
153         }
154
155         switch (argv[1][0]) {
156         case 'f':
157                 pkg = opkg_find_package(argv[2], NULL, NULL, NULL);
158                 if (pkg) {
159                         print_package(pkg);
160                 } else
161                         printf("Package \"%s\" not found!\n", find_pkg->name);
162                 break;
163         case 'i':
164                 err =
165                     opkg_install_package(argv[2], progress_callback,
166                                          "Installing...");
167                 printf("\nopkg_install_package returned %d\n", err);
168                 break;
169
170         case 'u':
171                 if (argv[1][2] == 'd') {
172                         err =
173                             opkg_update_package_lists(progress_callback,
174                                                       "Updating...");
175                         printf("\nopkg_update_package_lists returned %d\n",
176                                err);
177                         break;
178                 } else {
179                         if (argc < 3) {
180                                 err =
181                                     opkg_upgrade_all(progress_callback,
182                                                      "Upgrading all...");
183                                 printf("\nopkg_upgrade_all returned %d\n", err);
184                         } else {
185                                 err =
186                                     opkg_upgrade_package(argv[2],
187                                                          progress_callback,
188                                                          "Upgrading...");
189                                 printf("\nopkg_upgrade_package returned %d\n",
190                                        err);
191                         }
192                 }
193                 break;
194
195         case 'l':
196                 if (argc < 3) {
197                         printf
198                             ("Please specify one either all, installed or upgrades\n");
199                 } else {
200                         switch (argv[2][0]) {
201                         case 'u':
202                                 printf("Listing upgradable packages...\n");
203                                 opkg_list_upgradable_packages
204                                     (package_list_upgradable_callback, NULL);
205                                 break;
206                         case 'a':
207                                 printf("Listing all packages...\n");
208                                 opkg_list_packages(package_list_callback, NULL);
209                                 printf("\n");
210                                 break;
211                         case 'i':
212                                 printf("Listing installed packages...\n");
213                                 opkg_list_packages
214                                     (package_list_installed_callback, NULL);
215                                 break;
216                         default:
217                                 printf("Unknown list option \"%s\"\n", argv[2]);
218                         }
219                 }
220                 break;
221
222         case 'r':
223                 if (argv[1][1] == 'e') {
224                         err =
225                             opkg_remove_package(argv[2], progress_callback,
226                                                 "Removing...");
227                         printf("\nopkg_remove_package returned %d\n", err);
228                         break;
229                 } else if (argv[1][1] == 'p') {
230                         err = opkg_repository_accessibility_check();
231                         printf
232                             ("\nopkg_repository_accessibility_check returned (%d)\n",
233                              err);
234                         break;
235                 }
236
237         default:
238                 printf("Unknown command \"%s\"\n", argv[1]);
239         }
240
241         opkg_free();
242
243         return 0;
244 }