mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-05 08:53:39 +02:00
girepository: Make gi_repository_find_by_error_domain() deterministic
As with the previous commit, finding a `GIBaseInfo` matching the given error domain was non-deterministic because it iterated through a hash table of typelibs. Hash table iteration is non-deterministic. Change the method to instead use the `ordered_typelibs` and `ordered_lazy_typelibs` arrays to give deterministic iteration order. Add a unit test, although it can’t test the interesting case of an error domain which is present in both `GioUnix`/`GioWin32` and `Gio`, because no such error domain exists. Signed-off-by: Philip Withnall <pwithnall@gnome.org> Helps: #3303
This commit is contained in:
@@ -513,12 +513,31 @@ test_repository_error_quark (RepositoryFixture *fx,
|
||||
|
||||
g_test_summary ("Test finding an error quark by error domain");
|
||||
|
||||
/* Find a simple error domain. */
|
||||
error_info = gi_repository_find_by_error_domain (fx->repository, G_RESOLVER_ERROR);
|
||||
g_assert_nonnull (error_info);
|
||||
g_assert_true (GI_IS_ENUM_INFO (error_info));
|
||||
g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (error_info)), ==, "ResolverError");
|
||||
|
||||
g_clear_pointer (&error_info, gi_base_info_unref);
|
||||
|
||||
/* Find again to check the caching. */
|
||||
error_info = gi_repository_find_by_error_domain (fx->repository, G_RESOLVER_ERROR);
|
||||
g_assert_nonnull (error_info);
|
||||
g_assert_true (GI_IS_ENUM_INFO (error_info));
|
||||
g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (error_info)), ==, "ResolverError");
|
||||
|
||||
g_clear_pointer (&error_info, gi_base_info_unref);
|
||||
|
||||
/* Try and find an unknown error domain. */
|
||||
g_assert_null (gi_repository_find_by_error_domain (fx->repository, GI_REPOSITORY_ERROR));
|
||||
|
||||
/* And check caching for unknown error domains. */
|
||||
g_assert_null (gi_repository_find_by_error_domain (fx->repository, GI_REPOSITORY_ERROR));
|
||||
|
||||
/* It would be good to try and find one which will resolve in both Gio and
|
||||
* GioUnix/GioWin32, but neither of the platform-specific GIRs actually define
|
||||
* any error domains at the moment. */
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -861,7 +880,7 @@ main (int argc,
|
||||
ADD_REPOSITORY_TEST ("/repository/constructor-return-type", test_repository_constructor_return_type, &typelib_load_spec_gobject);
|
||||
ADD_REPOSITORY_TEST ("/repository/enum-info-c-identifier", test_repository_enum_info_c_identifier, &typelib_load_spec_glib);
|
||||
ADD_REPOSITORY_TEST ("/repository/enum-info-static-methods", test_repository_enum_info_static_methods, &typelib_load_spec_glib);
|
||||
ADD_REPOSITORY_TEST ("/repository/error-quark", test_repository_error_quark, &typelib_load_spec_gio);
|
||||
ADD_REPOSITORY_TEST ("/repository/error-quark", test_repository_error_quark, &typelib_load_spec_gio_platform);
|
||||
ADD_REPOSITORY_TEST ("/repository/flags-info-c-identifier", test_repository_flags_info_c_identifier, &typelib_load_spec_gobject);
|
||||
ADD_REPOSITORY_TEST ("/repository/fundamental-ref-func", test_repository_fundamental_ref_func, &typelib_load_spec_gobject);
|
||||
ADD_REPOSITORY_TEST ("/repository/instance-method-ownership-transfer", test_repository_instance_method_ownership_transfer, &typelib_load_spec_gio);
|
||||
|
Reference in New Issue
Block a user