1 /*
2 * Copyright 2023 GNOME Foundation, Inc.
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
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
17 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 *
19 * Author: Philip Withnall <pwithnall@gnome.org>
20 */
21
22 #include "glib.h"
23 #include "girepository.h"
24
25 static void
26 test_repository_basic (void)
27 {
28 GIRepository *repository;
29 char *gobject_typelib_dir = NULL;
30 const char * const * search_paths;
31 GITypelib *typelib = NULL;
32 char **namespaces = NULL;
33 const char *expected_namespaces[] = { "GLib", NULL };
34 GError *local_error = NULL;
35 char **versions;
36 size_t n_versions;
37
38 g_test_summary ("Test basic opening of a repository and requiring a typelib");
39
40 gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "introspection", NULL);
41 g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
42 gi_repository_prepend_search_path (gobject_typelib_dir);
43
44 repository = gi_repository_new ();
45 g_assert_nonnull (repository);
46
47 versions = gi_repository_enumerate_versions (repository, "SomeInvalidNamespace", &n_versions);
48 g_assert_nonnull (versions);
49 g_assert_cmpstrv (versions, ((char *[]){NULL}));
50 g_assert_cmpuint (n_versions, ==, 0);
51 g_clear_pointer (&versions, g_strfreev);
52
53 versions = gi_repository_enumerate_versions (repository, "GLib", NULL);
54 g_assert_nonnull (versions);
55 g_assert_cmpstrv (versions, ((char *[]){"2.0", NULL}));
56 g_clear_pointer (&versions, g_strfreev);
57
58 search_paths = gi_repository_get_search_path (NULL);
59 g_assert_nonnull (search_paths);
60 g_assert_cmpuint (g_strv_length ((char **) search_paths), >, 0);
61 g_assert_cmpstr (search_paths[0], ==, gobject_typelib_dir);
62
63 typelib = gi_repository_require (repository, "GLib", "2.0", 0, &local_error);
64 g_assert_no_error (local_error);
65 g_assert_nonnull (typelib);
66
67 namespaces = gi_repository_get_loaded_namespaces (repository);
68 g_assert_cmpstrv (namespaces, expected_namespaces);
69 g_strfreev (namespaces);
70
71 g_free (gobject_typelib_dir);
72 g_clear_object (&repository);
73 }
74
75 static void
76 test_repository_info (void)
77 {
78 GIRepository *repository;
79 char *gobject_typelib_dir = NULL;
80 GITypelib *typelib = NULL;
81 GIObjectInfo *object_info = NULL;
82 GISignalInfo *signal_info = NULL;
83 GError *local_error = NULL;
84
85 g_test_summary ("Test retrieving some basic info blobs from a typelib");
86
87 gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "introspection", NULL);
88 g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
89 gi_repository_prepend_search_path (gobject_typelib_dir);
90 g_free (gobject_typelib_dir);
91
92 repository = gi_repository_new ();
93 g_assert_nonnull (repository);
94
95 typelib = gi_repository_require (repository, "GObject", "2.0", 0, &local_error);
96 g_assert_no_error (local_error);
97 g_assert_nonnull (typelib);
98
99 object_info = (GIObjectInfo *) gi_repository_find_by_name (repository, "GObject", "Object");
100 g_assert_nonnull (object_info);
101
102 g_assert_cmpint (gi_base_info_get_info_type ((GIBaseInfo *) object_info), ==, GI_INFO_TYPE_OBJECT);
103 g_assert_cmpstr (gi_base_info_get_name ((GIBaseInfo *) object_info), ==, "Object");
104 g_assert_cmpstr (gi_base_info_get_namespace ((GIBaseInfo *) object_info), ==, "GObject");
105
106 signal_info = gi_object_info_find_signal (object_info, "notify");
107 g_assert_nonnull (signal_info);
108
109 g_assert_cmpint (gi_signal_info_get_flags (signal_info), ==,
110 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION);
111
112 gi_base_info_unref ((GIBaseInfo *) signal_info);
113 gi_base_info_unref ((GIBaseInfo *) object_info);
114 g_clear_object (&repository);
115 }
116
117 static void
118 test_repository_dependencies (void)
119 {
120 GIRepository *repository;
121 GITypelib *typelib;
122 GError *error = NULL;
123 char *gobject_typelib_dir = NULL;
124 char **dependencies;
125
126 g_test_summary ("Test ensures namespace dependencies are correctly exposed");
127
128 gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "..", "gobject", NULL);
129 g_test_message ("Using GI_TYPELIB_DIR = %s", gobject_typelib_dir);
130 gi_repository_prepend_search_path (gobject_typelib_dir);
131 g_free (gobject_typelib_dir);
132
133 repository = gi_repository_new ();
134 g_assert_nonnull (repository);
135
136 typelib = gi_repository_require (repository, "GObject", "2.0", 0, &error);
137 g_assert_no_error (error);
138 g_assert_nonnull (typelib);
139
140 dependencies = gi_repository_get_dependencies (repository, "GObject");
141 g_assert_cmpuint (g_strv_length (dependencies), ==, 1);
142 g_assert_true (g_strv_contains ((const char **) dependencies, "GLib-2.0"));
143
144 g_clear_error (&error);
145 g_clear_object (&repository);
146 g_clear_pointer (&dependencies, g_strfreev);
147 }
148
149 int
150 main (int argc,
151 char *argv[])
152 {
153 /* Isolate from the system typelibs and GIRs. */
154 g_setenv ("GI_TYPELIB_PATH", "/dev/null", TRUE);
155 g_setenv ("GI_GIR_PATH", "/dev/null", TRUE);
156
157 g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
158
159 g_test_add_func ("/repository/basic", test_repository_basic);
160 g_test_add_func ("/repository/info", test_repository_info);
161 g_test_add_func ("/repository/dependencies", test_repository_dependencies);
162
163 return g_test_run ();
164 }