From 349ff157ba11cf0b5240f0abc96dcfab7fb8d471 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Sat, 18 Jul 2026 15:42:48 +0200 Subject: [PATCH] feat: notify application after tool initialization --- include/core/tool_initializer.h | 48 ++ labfy-investigation | Bin 329288 -> 331296 bytes src/core/application.c | 132 +++ src/core/tool_initializer.c | 278 ++++++- tests/test_tool_initializer | Bin 85656 -> 99456 bytes tests/test_tool_initializer.c | 1337 +++++++++++++++++++++++++++++++ 6 files changed, 1779 insertions(+), 16 deletions(-) diff --git a/include/core/tool_initializer.h b/include/core/tool_initializer.h index 411d7a2..48a1454 100644 --- a/include/core/tool_initializer.h +++ b/include/core/tool_initializer.h @@ -31,6 +31,25 @@ typedef struct gsize version_failed_count; } ToolInitializationSummary; +/** + * @brief Fonction appelée après la fin d’une initialisation. + * + * Le callback est exécuté sur le contexte principal GLib. + * + * summary est non NULL uniquement après une réussite. + * error est non NULL uniquement lorsqu’une erreur est disponible. + * + * Les pointeurs summary et error sont empruntés et restent valides + * uniquement pendant l’appel du callback. + */ +typedef void (*ToolInitializerCompletedCallback)( + ToolInitializer *tool_initializer, + BackgroundTaskState final_state, + const ToolInitializationSummary *summary, + const GError *error, + gpointer user_data +); + /** * @brief Codes d’erreur de ToolInitializer. */ @@ -150,6 +169,35 @@ ToolRegistry *tool_initializer_get_registry( ToolInitializer *tool_initializer ); +/** + * @brief Enregistre le callback appelé après chaque initialisation. + * + * Le même callback est conservé pour les lancements suivants. + * + * En passant callback == NULL, l’enregistrement actuel est supprimé. + * + * Lorsque destroy_notify est non NULL, ToolInitializer devient + * responsable de user_data. La fonction de destruction sera appelée + * exactement une fois lorsque : + * + * - le callback est remplacé ; + * - le callback est supprimé ; + * - l’initialiseur est détruit. + * + * Le callback est exécuté sur le contexte principal GLib. + * + * @param tool_initializer Initialiseur concerné. + * @param callback Fonction appelée après la fin, ou NULL. + * @param user_data Données transmises au callback. + * @param destroy_notify Fonction libérant user_data, ou NULL. + */ +void tool_initializer_set_completed_callback( + ToolInitializer *tool_initializer, + ToolInitializerCompletedCallback callback, + gpointer user_data, + GDestroyNotify destroy_notify +); + /** * @brief Démarre l’initialisation en arrière-plan. * diff --git a/labfy-investigation b/labfy-investigation index f314d53057e447ed989d1ca543bee7c1e78911d6..a47839f4c95162b50312adec247cae6093bc3457 100755 GIT binary patch delta 76470 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 G@c#g;>Q?Rm diff --git a/src/core/application.c b/src/core/application.c index cdd741e..40884a0 100644 --- a/src/core/application.c +++ b/src/core/application.c @@ -77,6 +77,107 @@ static void application_present_error( const char *message ); +/** + * @brief Traite la fin de l’initialisation des outils externes. + * + * Ce callback est exécuté sur le contexte principal GLib. + * + * @param tool_initializer Initialiseur ayant terminé. + * @param final_state État final de la tâche. + * @param summary Résumé emprunté en cas de réussite. + * @param error Erreur empruntée en cas d’échec. + * @param user_data Pointeur emprunté vers Application. + */ +static void application_on_tool_initialization_completed( + ToolInitializer *tool_initializer, + BackgroundTaskState final_state, + const ToolInitializationSummary *summary, + const GError *error, + gpointer user_data +) +{ + Application *application = user_data; + + if (application == NULL || + tool_initializer == NULL) + { + return; + } + + if (tool_initializer != + application->tool_initializer) + { + g_warning( + "Notification reçue depuis un initialiseur inconnu." + ); + + return; + } + + switch (final_state) + { + case BACKGROUND_TASK_STATE_COMPLETED: + if (summary == NULL) + { + g_warning( + "L’initialisation des outils est terminée " + "sans résumé valide." + ); + + return; + } + + g_message( + "Outils externes initialisés : " + "%" G_GSIZE_FORMAT " disponibles, " + "%" G_GSIZE_FORMAT " absents, " + "%" G_GSIZE_FORMAT " versions détectées, " + "%" G_GSIZE_FORMAT " versions non détectées.", + summary->available_count, + summary->missing_count, + summary->version_detected_count, + summary->version_failed_count + ); + + break; + + case BACKGROUND_TASK_STATE_CANCELLED: + g_message( + "L’initialisation des outils externes a été annulée." + ); + + break; + + case BACKGROUND_TASK_STATE_FAILED: + g_warning( + "L’initialisation des outils externes a échoué : %s", + error != NULL + ? error->message + : "erreur inconnue" + ); + + application_present_error( + application, + "Initialisation des outils impossible", + error != NULL + ? error->message + : "Les outils externes n’ont pas pu être initialisés." + ); + + break; + + case BACKGROUND_TASK_STATE_PENDING: + case BACKGROUND_TASK_STATE_RUNNING: + default: + g_warning( + "Notification de fin reçue avec un état invalide : %d.", + (int) final_state + ); + + break; + } +} + /** * @brief Démarre la détection asynchrone des outils externes. * @@ -154,6 +255,20 @@ static void application_present_error( ); } +static void application_on_tool_initialization_completed( + ToolInitializer *tool_initializer, + BackgroundTaskState final_state, + const ToolInitializationSummary *summary, + const GError *error, + gpointer user_data +); + +static void application_present_error( + Application *application, + const char *title, + const char *message +); + /** * @brief Installe une nouvelle session et son arbre dans l'application. * @@ -1145,6 +1260,13 @@ Application *application_new(void) return NULL; } + tool_initializer_set_completed_callback( + application->tool_initializer, + application_on_tool_initialization_completed, + application, + NULL + ); + application->gtk_application = gtk_application_new( APPLICATION_ID, G_APPLICATION_DEFAULT_FLAGS @@ -1219,6 +1341,16 @@ void application_free( return; } + if (application->tool_initializer != NULL) + { + tool_initializer_set_completed_callback( + application->tool_initializer, + NULL, + NULL, + NULL + ); + } + task_manager_cancel_all( application->task_manager ); diff --git a/src/core/tool_initializer.c b/src/core/tool_initializer.c index 0c91b60..eebb633 100644 --- a/src/core/tool_initializer.c +++ b/src/core/tool_initializer.c @@ -9,6 +9,15 @@ #include #include +typedef struct +{ + gatomicrefcount reference_count; + + ToolInitializerCompletedCallback callback; + gpointer user_data; + GDestroyNotify destroy_notify; +} ToolInitializerCallbackRegistration; + /** * @struct ToolInitializer * @brief État interne de l’initialiseur d’outils. @@ -24,11 +33,89 @@ struct ToolInitializer BackgroundTask *task; ToolInitializationSummary last_summary; - + ToolInitializerCallbackRegistration *callback_registration; gboolean has_last_summary; gboolean is_running; }; +/** + * @brief Enregistrement immuable d’un callback de fin. + */ +static ToolInitializerCallbackRegistration * +tool_initializer_callback_registration_new( + ToolInitializerCompletedCallback callback, + gpointer user_data, + GDestroyNotify destroy_notify +) +{ + ToolInitializerCallbackRegistration *registration = NULL; + + if (callback == NULL) + { + return NULL; + } + + registration = g_new0( + ToolInitializerCallbackRegistration, + 1 + ); + + g_atomic_ref_count_init( + ®istration->reference_count + ); + + registration->callback = callback; + registration->user_data = user_data; + registration->destroy_notify = destroy_notify; + + return registration; +} + +static ToolInitializerCallbackRegistration * +tool_initializer_callback_registration_ref( + ToolInitializerCallbackRegistration *registration +) +{ + if (registration == NULL) + { + return NULL; + } + + g_atomic_ref_count_inc( + ®istration->reference_count + ); + + return registration; +} + +static void tool_initializer_callback_registration_unref( + ToolInitializerCallbackRegistration *registration +) +{ + if (registration == NULL) + { + return; + } + + if (!g_atomic_ref_count_dec( + ®istration->reference_count + )) + { + return; + } + + if (registration->destroy_notify != NULL) + { + registration->destroy_notify( + registration->user_data + ); + } + + g_free( + registration + ); +} + static gboolean tool_initializer_ensure_catalog_registered( ToolInitializer *tool_initializer, GError **error @@ -69,6 +156,8 @@ static void tool_initializer_unref_internal( BackgroundTask *task = NULL; ToolRegistry *tool_registry = NULL; + ToolInitializerCallbackRegistration *callback_registration = NULL; + if (tool_initializer == NULL) { return; @@ -85,11 +174,18 @@ static void tool_initializer_unref_internal( &tool_initializer->mutex ); - task = tool_initializer->task; - tool_registry = tool_initializer->tool_registry; + task = + tool_initializer->task; + + tool_registry = + tool_initializer->tool_registry; + + callback_registration = + tool_initializer->callback_registration; tool_initializer->task = NULL; tool_initializer->tool_registry = NULL; + tool_initializer->callback_registration = NULL; tool_initializer->task_manager = NULL; tool_initializer->is_running = FALSE; @@ -101,6 +197,10 @@ static void tool_initializer_unref_internal( task ); + tool_initializer_callback_registration_unref( + callback_registration + ); + tool_registry_free( tool_registry ); @@ -771,8 +871,16 @@ static void tool_initializer_bootstrap_completed( ToolInitializer *tool_initializer = user_data; - const ToolInitializationSummary *summary = - NULL; + ToolInitializerCallbackRegistration *callback_registration = NULL; + + BackgroundTaskState final_state; + + const ToolInitializationSummary *task_summary = NULL; + const ToolInitializationSummary *callback_summary = NULL; + + ToolInitializationSummary summary_copy = {0}; + + GError *callback_error = NULL; if (task == NULL || tool_initializer == NULL) @@ -780,33 +888,89 @@ static void tool_initializer_bootstrap_completed( return; } - if (background_task_get_state( - task - ) == BACKGROUND_TASK_STATE_COMPLETED) - { - summary = background_task_get_result( + final_state = + background_task_get_state( task ); + + if (final_state == BACKGROUND_TASK_STATE_COMPLETED) + { + task_summary = + background_task_get_result( + task + ); + + if (task_summary != NULL) + { + summary_copy = + *task_summary; + + callback_summary = + &summary_copy; + } + } + else if (final_state == BACKGROUND_TASK_STATE_FAILED) + { + callback_error = + background_task_dup_error( + task + ); } g_mutex_lock( &tool_initializer->mutex ); - if (summary != NULL) + if (callback_summary != NULL) { tool_initializer->last_summary = - *summary; + summary_copy; tool_initializer->has_last_summary = TRUE; } + else + { + tool_initializer->last_summary = + (ToolInitializationSummary) {0}; + + tool_initializer->has_last_summary = + FALSE; + } tool_initializer->is_running = FALSE; + callback_registration = + tool_initializer_callback_registration_ref( + tool_initializer->callback_registration + ); + g_mutex_unlock( &tool_initializer->mutex ); + + /* + * Le callback utilisateur est toujours appelé hors du mutex. + * Il peut donc consulter l’initialiseur ou remplacer son callback. + */ + if (callback_registration != NULL) + { + callback_registration->callback( + tool_initializer, + final_state, + callback_summary, + callback_error, + callback_registration->user_data + ); + } + + tool_initializer_callback_registration_unref( + callback_registration + ); + + g_clear_error( + &callback_error + ); } GQuark tool_initializer_error_quark(void) @@ -877,6 +1041,17 @@ void tool_initializer_free( return; } + /* + * Le propriétaire public abandonne l’initialiseur. + * Aucun callback ne doit désormais utiliser son user_data. + */ + tool_initializer_set_completed_callback( + tool_initializer, + NULL, + NULL, + NULL + ); + task = tool_initializer_get_task( tool_initializer ); @@ -1031,16 +1206,16 @@ gboolean tool_initializer_start( tool_initializer->is_running = FALSE; - g_mutex_unlock( - &tool_initializer->mutex - ); - tool_initializer->last_summary = previous_summary; tool_initializer->has_last_summary = previous_has_last_summary; + g_mutex_unlock( + &tool_initializer->mutex + ); + tool_initializer_set_wrapped_error( error, TOOL_INITIALIZER_ERROR_TASK_REGISTRATION, @@ -1175,6 +1350,77 @@ gboolean tool_initializer_start( return TRUE; } +void tool_initializer_set_completed_callback( + ToolInitializer *tool_initializer, + ToolInitializerCompletedCallback callback, + gpointer user_data, + GDestroyNotify destroy_notify +) +{ + ToolInitializerCallbackRegistration *new_registration = NULL; + ToolInitializerCallbackRegistration *previous_registration = NULL; + + if (callback != NULL) + { + new_registration = + tool_initializer_callback_registration_new( + callback, + user_data, + destroy_notify + ); + } + + if (tool_initializer == NULL) + { + tool_initializer_callback_registration_unref( + new_registration + ); + + /* + * Aucun enregistrement n’a pu prendre possession des données. + */ + if (new_registration == NULL && + destroy_notify != NULL) + { + destroy_notify( + user_data + ); + } + + return; + } + + g_mutex_lock( + &tool_initializer->mutex + ); + + previous_registration = + tool_initializer->callback_registration; + + tool_initializer->callback_registration = + new_registration; + + g_mutex_unlock( + &tool_initializer->mutex + ); + + tool_initializer_callback_registration_unref( + previous_registration + ); + + /* + * callback == NULL signifie suppression. + * Les éventuelles nouvelles données ne sont pas conservées. + */ + if (callback == NULL && + destroy_notify != NULL) + { + destroy_notify( + user_data + ); + } +} + gboolean tool_initializer_cancel( ToolInitializer *tool_initializer, GError **error diff --git a/tests/test_tool_initializer b/tests/test_tool_initializer index 8ac05fd779be91c684a4a114a1d41c880cf45b4f..b9ce4494a703306ac8bbdfe8d12973b3c856140c 100755 GIT binary patch literal 99456 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 diff --git a/tests/test_tool_initializer.c b/tests/test_tool_initializer.c index b8fd0ea..fc26583 100644 --- a/tests/test_tool_initializer.c +++ b/tests/test_tool_initializer.c @@ -14,6 +14,163 @@ static char *test_tool_initializer_directory = NULL; +typedef struct +{ + guint callback_count; + guint *observed_callback_count; + guint *destroy_count; + + BackgroundTaskState final_state; + + gboolean received_summary; + gboolean received_error; + gboolean initializer_was_running; + + ToolInitializationSummary summary; + + gsize registry_count; + + char *curl_version; + GError *error; + + GThread *callback_thread; +} TestToolInitializerCallbackData; + +static void test_tool_initializer_callback_data_free( + gpointer user_data +) +{ + TestToolInitializerCallbackData *callback_data = + user_data; + + if (callback_data == NULL) + { + return; + } + + if (callback_data->destroy_count != NULL) + { + (*callback_data->destroy_count)++; + } + + g_clear_pointer( + &callback_data->curl_version, + g_free + ); + + g_clear_error( + &callback_data->error + ); + + g_free( + callback_data + ); +} + +static void test_tool_initializer_completed_callback( + ToolInitializer *tool_initializer, + BackgroundTaskState final_state, + const ToolInitializationSummary *summary, + const GError *error, + gpointer user_data +) +{ + TestToolInitializerCallbackData *callback_data = + user_data; + + ToolRegistry *tool_registry = NULL; + const ToolInfo *curl_info = NULL; + + g_assert_nonnull( + tool_initializer + ); + + g_assert_nonnull( + callback_data + ); + + callback_data->callback_count++; + + if (callback_data->observed_callback_count != NULL) + { + (*callback_data->observed_callback_count)++; + } + + callback_data->final_state = + final_state; + + callback_data->initializer_was_running = + tool_initializer_is_running( + tool_initializer + ); + + callback_data->callback_thread = + g_thread_self(); + + callback_data->received_summary = + summary != NULL; + + if (summary != NULL) + { + callback_data->summary = + *summary; + } + else + { + callback_data->summary = + (ToolInitializationSummary) {0}; + } + + callback_data->received_error = + error != NULL; + + g_clear_error( + &callback_data->error + ); + + if (error != NULL) + { + callback_data->error = + g_error_copy( + error + ); + } + + tool_registry = + tool_initializer_get_registry( + tool_initializer + ); + + if (tool_registry != NULL) + { + callback_data->registry_count = + tool_registry_get_count( + tool_registry + ); + + curl_info = + tool_registry_find( + tool_registry, + "http.curl" + ); + } + + g_clear_pointer( + &callback_data->curl_version, + g_free + ); + + if (curl_info != NULL) + { + callback_data->curl_version = + g_strdup( + tool_info_get_detected_version( + curl_info + ) + ); + } +} + static gboolean test_tool_initializer_wait_for_progress( ToolInitializer *tool_initializer, double minimum_progress @@ -253,6 +410,69 @@ static gboolean test_tool_initializer_wait_until_stopped( ); } +static gboolean test_tool_initializer_wait_for_task_terminal( + BackgroundTask *task +) +{ + gboolean timed_out = FALSE; + gboolean is_terminal = FALSE; + guint timeout_source_id = 0; + + g_assert_nonnull( + task + ); + + timeout_source_id = + g_timeout_add_seconds( + TEST_TOOL_INITIALIZER_TIMEOUT_SECONDS, + test_tool_initializer_timeout, + &timed_out + ); + + g_assert_cmpuint( + timeout_source_id, + !=, + 0 + ); + + while (!timed_out) + { + BackgroundTaskState task_state; + + task_state = + background_task_get_state( + task + ); + + is_terminal = + task_state == BACKGROUND_TASK_STATE_COMPLETED || + task_state == BACKGROUND_TASK_STATE_FAILED || + task_state == BACKGROUND_TASK_STATE_CANCELLED; + + if (is_terminal) + { + break; + } + + g_main_context_iteration( + NULL, + TRUE + ); + } + + if (!timed_out) + { + g_assert_true( + g_source_remove( + timeout_source_id + ) + ); + } + + return !timed_out && + is_terminal; +} + static void test_tool_initializer_new_invalid_arguments(void) { ToolInitializer *tool_initializer = NULL; @@ -1528,6 +1748,1079 @@ static void test_tool_initializer_restart_after_cancellation(void) ); } +static void test_tool_initializer_callback_success(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + tool_initializer + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 1 + ); + + g_assert_cmpint( + callback_data->final_state, + ==, + BACKGROUND_TASK_STATE_COMPLETED + ); + + g_assert_false( + callback_data->initializer_was_running + ); + + g_assert_true( + callback_data->received_summary + ); + + g_assert_false( + callback_data->received_error + ); + + g_assert_null( + callback_data->error + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_summary_and_registry(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + test_tool_initializer_write_fake_tool( + "curl", + "#!/bin/sh\n" + "printf 'Fake curl 5.4.3\\n'\n" + ); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 1 + ); + + g_assert_true( + callback_data->received_summary + ); + + g_assert_cmpuint( + callback_data->summary.total_count, + ==, + tool_catalog_get_count() + ); + + g_assert_cmpuint( + callback_data->summary.available_count, + ==, + 1 + ); + + g_assert_cmpuint( + callback_data->summary.missing_count, + ==, + tool_catalog_get_count() - 1 + ); + + g_assert_cmpuint( + callback_data->summary.version_detected_count, + ==, + 1 + ); + + g_assert_cmpuint( + callback_data->summary.version_failed_count, + ==, + 0 + ); + + /* + * Le catalogue et les versions doivent déjà être enregistrés + * lorsque le callback est exécuté. + */ + g_assert_cmpuint( + callback_data->registry_count, + ==, + tool_catalog_get_count() + ); + + g_assert_cmpstr( + callback_data->curl_version, + ==, + "Fake curl 5.4.3" + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_replacement(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *first_callback_data = NULL; + TestToolInitializerCallbackData *second_callback_data = NULL; + + guint first_callback_count = 0; + guint second_callback_count = 0; + + guint first_destroy_count = 0; + guint second_destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + first_callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + first_callback_data->observed_callback_count = + &first_callback_count; + + first_callback_data->destroy_count = + &first_destroy_count; + + second_callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + second_callback_data->observed_callback_count = + &second_callback_count; + + second_callback_data->destroy_count = + &second_destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + first_callback_data, + test_tool_initializer_callback_data_free + ); + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + second_callback_data, + test_tool_initializer_callback_data_free + ); + + /* + * Le premier enregistrement a été remplacé et doit déjà être + * détruit. + */ + g_assert_cmpuint( + first_destroy_count, + ==, + 1 + ); + + g_assert_cmpuint( + second_destroy_count, + ==, + 0 + ); + + g_assert_cmpuint( + first_callback_count, + ==, + 0 + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + first_callback_count, + ==, + 0 + ); + + g_assert_cmpuint( + second_callback_count, + ==, + 1 + ); + + g_assert_cmpuint( + second_callback_data->callback_count, + ==, + 1 + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + first_destroy_count, + ==, + 1 + ); + + g_assert_cmpuint( + second_destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_destroy_notify(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_cmpuint( + destroy_count, + ==, + 0 + ); + + tool_initializer_set_completed_callback( + tool_initializer, + NULL, + NULL, + NULL + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + /* + * La destruction de l’initialiseur ne doit pas appeler une seconde + * fois le destroy notify de l’ancien enregistrement. + */ + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_cancellation(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + test_tool_initializer_write_fake_tool( + "dig", + "#!/bin/sh\n" + "exec /bin/sleep 30\n" + ); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_for_progress( + tool_initializer, + 0.15 + ) + ); + + g_assert_true( + tool_initializer_cancel( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 1 + ); + + g_assert_cmpint( + callback_data->final_state, + ==, + BACKGROUND_TASK_STATE_CANCELLED + ); + + g_assert_false( + callback_data->received_summary + ); + + g_assert_false( + callback_data->received_error + ); + + g_assert_false( + callback_data->initializer_was_running + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_failure(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + ToolRegistry *tool_registry = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + tool_registry = + tool_initializer_get_registry( + tool_initializer + ); + + g_assert_nonnull( + tool_registry + ); + + /* + * Le registre ne correspondra plus exactement au catalogue. + * Le worker doit donc échouer pendant sa vérification initiale. + */ + g_assert_true( + tool_registry_register( + tool_registry, + "test.extra", + "Outil supplémentaire", + "extra", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 1 + ); + + g_assert_cmpint( + callback_data->final_state, + ==, + BACKGROUND_TASK_STATE_FAILED + ); + + g_assert_false( + callback_data->received_summary + ); + + g_assert_true( + callback_data->received_error + ); + + g_assert_nonnull( + callback_data->error + ); + + g_assert_error( + callback_data->error, + TOOL_INITIALIZER_ERROR, + TOOL_INITIALIZER_ERROR_CATALOG_REGISTRATION + ); + + g_assert_false( + callback_data->initializer_was_running + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_main_context(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + GThread *main_thread = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + main_thread = + g_thread_self(); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 1 + ); + + g_assert_true( + callback_data->callback_thread == + main_thread + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_callback_restart(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 1 + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_until_stopped( + tool_initializer + ) + ); + + g_assert_cmpuint( + callback_data->callback_count, + ==, + 2 + ); + + g_assert_cmpint( + callback_data->final_state, + ==, + BACKGROUND_TASK_STATE_COMPLETED + ); + + g_assert_cmpuint( + task_manager_get_count( + task_manager + ), + ==, + 2 + ); + + tool_initializer_free( + tool_initializer + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + task_manager_free( + task_manager + ); +} + +static void test_tool_initializer_free_while_running(void) +{ + TaskManager *task_manager = NULL; + ToolInitializer *tool_initializer = NULL; + BackgroundTask *task = NULL; + + TestToolInitializerCallbackData *callback_data = NULL; + + guint callback_count = 0; + guint destroy_count = 0; + + GError *error = NULL; + + test_tool_initializer_reset_fake_tools(); + + test_tool_initializer_write_fake_tool( + "dig", + "#!/bin/sh\n" + "exec /bin/sleep 30\n" + ); + + task_manager = + task_manager_new(); + + tool_initializer = + tool_initializer_new( + task_manager, + &error + ); + + g_assert_no_error( + error + ); + + callback_data = + g_new0( + TestToolInitializerCallbackData, + 1 + ); + + callback_data->observed_callback_count = + &callback_count; + + callback_data->destroy_count = + &destroy_count; + + tool_initializer_set_completed_callback( + tool_initializer, + test_tool_initializer_completed_callback, + callback_data, + test_tool_initializer_callback_data_free + ); + + g_assert_true( + tool_initializer_start( + tool_initializer, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + test_tool_initializer_wait_for_progress( + tool_initializer, + 0.15 + ) + ); + + task = + tool_initializer_get_task( + tool_initializer + ); + + g_assert_nonnull( + task + ); + + /* + * La libération publique supprime le callback et demande + * l’annulation, sans attendre la fin du worker. + */ + tool_initializer_free( + tool_initializer + ); + + tool_initializer = NULL; + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + g_assert_cmpuint( + callback_count, + ==, + 0 + ); + + g_assert_true( + test_tool_initializer_wait_for_task_terminal( + task + ) + ); + + g_assert_cmpint( + background_task_get_state( + task + ), + ==, + BACKGROUND_TASK_STATE_CANCELLED + ); + + /* + * Aucun callback utilisateur ne doit être déclenché après free(). + */ + g_assert_cmpuint( + callback_count, + ==, + 0 + ); + + g_assert_cmpuint( + destroy_count, + ==, + 1 + ); + + background_task_unref( + task + ); + + task_manager_free( + task_manager + ); +} + int main( int argc, char **argv @@ -1625,6 +2918,50 @@ int main( test_tool_initializer_restart_after_cancellation ); + g_test_add_func( + "/tool_initializer/callback_success", + test_tool_initializer_callback_success + ); + + g_test_add_func( + "/tool_initializer/callback_summary_and_registry", + test_tool_initializer_callback_summary_and_registry + ); + + g_test_add_func( + "/tool_initializer/callback_replacement", + test_tool_initializer_callback_replacement + ); + + g_test_add_func( + "/tool_initializer/callback_destroy_notify", + test_tool_initializer_callback_destroy_notify + ); + + g_test_add_func( + "/tool_initializer/callback_cancellation", + test_tool_initializer_callback_cancellation + ); + + g_test_add_func( + "/tool_initializer/callback_failure", + test_tool_initializer_callback_failure + ); + + g_test_add_func( + "/tool_initializer/callback_main_context", + test_tool_initializer_callback_main_context + ); + + g_test_add_func( + "/tool_initializer/callback_restart", + test_tool_initializer_callback_restart + ); + + g_test_add_func( + "/tool_initializer/free_while_running", + test_tool_initializer_free_while_running + ); { int test_result = 0;