Branch data Line data Source code
1 : : /*
2 : : * Copyright 2024 GNOME Foundation
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 : :
20 : : #include "config.h"
21 : :
22 : : #include <glib.h>
23 : : #include <glib/gstdio.h>
24 : :
25 : : #include "girepository.h"
26 : : #include "test-common.h"
27 : :
28 : : /* Dummy GTypes which can be introspected by the dumper. */
29 : :
30 : : /* Dummy object type with no properties or signals. */
31 : : struct _TestObject
32 : : {
33 : : GObject parent_instance;
34 : : };
35 : :
36 : : #define TEST_TYPE_OBJECT test_object_get_type ()
37 : : G_MODULE_EXPORT G_DECLARE_FINAL_TYPE (TestObject, test_object, TEST, OBJECT, GObject)
38 : 3 : G_DEFINE_FINAL_TYPE (TestObject, test_object, G_TYPE_OBJECT)
39 : :
40 : : static void
41 : 1 : test_object_class_init (TestObjectClass *klass)
42 : : {
43 : 1 : }
44 : :
45 : : static void
46 : 0 : test_object_init (TestObject *self)
47 : : {
48 : 0 : }
49 : :
50 : : /* Dummy interface type with no properties or signals. */
51 : : struct _TestInterfaceInterface
52 : : {
53 : : GTypeInterface g_iface;
54 : : };
55 : :
56 : : #define TEST_TYPE_INTERFACE test_interface_get_type ()
57 : : G_MODULE_EXPORT G_DECLARE_INTERFACE (TestInterface, test_interface, TEST, INTERFACE, GObject)
58 : 1 : G_DEFINE_INTERFACE (TestInterface, test_interface, G_TYPE_OBJECT)
59 : :
60 : : static void
61 : 1 : test_interface_default_init (TestInterfaceInterface *iface)
62 : : {
63 : 1 : }
64 : :
65 : : /* Test functions */
66 : : static void
67 : 2 : assert_dump (const char *input,
68 : : const char *expected_output)
69 : : {
70 : 2 : int fd = -1;
71 : 2 : char *in_file_path = NULL;
72 : 2 : char *out_file_path = NULL;
73 : 2 : char *output = NULL;
74 : : gboolean retval;
75 : 2 : GError *local_error = NULL;
76 : :
77 : 2 : fd = g_file_open_tmp ("dump_XXXXXX", &in_file_path, NULL);
78 : 2 : g_assert_cmpint (fd, >=, 0);
79 : 2 : g_assert_true (g_close (fd, NULL));
80 : :
81 : 2 : out_file_path = g_strconcat (in_file_path, ".out", NULL);
82 : :
83 : 2 : g_file_set_contents (in_file_path, input, -1, &local_error);
84 : 2 : g_assert_no_error (local_error);
85 : :
86 : 2 : retval = gi_repository_dump (in_file_path, out_file_path, &local_error);
87 : 2 : g_assert_no_error (local_error);
88 : 2 : g_assert_true (retval);
89 : :
90 : 2 : g_file_get_contents (out_file_path, &output, NULL, &local_error);
91 : 2 : g_assert_no_error (local_error);
92 : :
93 : 2 : g_assert_cmpstr (output, ==, expected_output);
94 : :
95 : 2 : g_unlink (out_file_path);
96 : 2 : g_unlink (in_file_path);
97 : 2 : g_free (output);
98 : 2 : g_free (out_file_path);
99 : 2 : g_free (in_file_path);
100 : 2 : }
101 : :
102 : : static void
103 : 2 : assert_dump_error (const char *input,
104 : : GQuark expected_error_domain,
105 : : int expected_error_code)
106 : : {
107 : 2 : int fd = -1;
108 : 2 : char *in_file_path = NULL;
109 : 2 : char *out_file_path = NULL;
110 : : gboolean retval;
111 : 2 : GError *local_error = NULL;
112 : :
113 : 2 : fd = g_file_open_tmp ("dump_XXXXXX", &in_file_path, NULL);
114 : 2 : g_assert_cmpint (fd, >=, 0);
115 : 2 : g_assert_true (g_close (fd, NULL));
116 : :
117 : 2 : out_file_path = g_strconcat (in_file_path, ".out", NULL);
118 : :
119 : 2 : g_file_set_contents (in_file_path, input, -1, &local_error);
120 : 2 : g_assert_no_error (local_error);
121 : :
122 : 2 : retval = gi_repository_dump (in_file_path, out_file_path, &local_error);
123 : 2 : g_assert_error (local_error, expected_error_domain, expected_error_code);
124 : 2 : g_assert_false (retval);
125 : 2 : g_clear_error (&local_error);
126 : :
127 : 2 : g_unlink (out_file_path);
128 : 2 : g_unlink (in_file_path);
129 : 2 : g_free (out_file_path);
130 : 2 : g_free (in_file_path);
131 : 2 : }
132 : :
133 : : static void
134 : 1 : test_empty_file (void)
135 : : {
136 : 1 : assert_dump ("",
137 : : "<?xml version=\"1.0\"?>\n"
138 : : "<dump>\n"
139 : : "</dump>\n");
140 : 1 : }
141 : :
142 : : static void
143 : 1 : test_missing_get_type (void)
144 : : {
145 : 1 : assert_dump_error ("get-type:does_not_exist_get_type",
146 : : G_FILE_ERROR, G_FILE_ERROR_FAILED);
147 : 1 : }
148 : :
149 : : static void
150 : 1 : test_missing_quark (void)
151 : : {
152 : 1 : assert_dump_error ("error-quark:does_not_exist_error",
153 : : G_FILE_ERROR, G_FILE_ERROR_FAILED);
154 : 1 : }
155 : :
156 : : static void
157 : 1 : test_basic (void)
158 : : {
159 : 1 : assert_dump ("get-type:test_object_get_type\n"
160 : : "get-type:test_interface_get_type\n",
161 : : "<?xml version=\"1.0\"?>\n"
162 : : "<dump>\n"
163 : : " <class name=\"TestObject\" get-type=\"test_object_get_type\" parents=\"GObject\" final=\"1\">\n"
164 : : " </class>\n"
165 : : " <interface name=\"TestInterface\" get-type=\"test_interface_get_type\">\n"
166 : : " </interface>\n"
167 : : "</dump>\n");
168 : 1 : }
169 : :
170 : : int
171 : 1 : main (int argc,
172 : : char *argv[])
173 : : {
174 : 1 : repository_init (&argc, &argv);
175 : :
176 : 1 : g_test_add_func ("/dump/empty-file", test_empty_file);
177 : 1 : g_test_add_func ("/dump/missing-get-type", test_missing_get_type);
178 : 1 : g_test_add_func ("/dump/missing-quark", test_missing_quark);
179 : 1 : g_test_add_func ("/dump/basic", test_basic);
180 : :
181 : 1 : return g_test_run ();
182 : : }
|