Introduction

Documentation technique EasySave v3.0 — ProSoft

Contexte du Projet

Mission ProSoft

Notre équipe a intégré l'éditeur de logiciels ProSoft, une entreprise spécialisée dans le développement de solutions professionnelles. Sous la responsabilité du DSI, nous avons été mandatés pour concevoir et développer EasySave, un logiciel de sauvegarde destiné à s'intégrer dans la Suite ProSoft.

Politique Tarifaire

Prix unitaire : 200 €HT
Maintenance annuelle (5/7, 8h-17h) : 12% du prix d'achat

Projet Fil Rouge

Développement en 3 versions majeures avec livrables progressifs et documentations associées (UML, manuel utilisateur, release notes)

Stack Technique

C# / .NET 10.0 / Avalonia UI
Visual Studio 2022, GitHub, PlantUML

Internationalisation

Code et commentaires en anglais pour les filiales anglophones. Interface utilisateur FR/EN.

Contraintes Imposées par la Direction

Catégorie Exigence
Versioning Gestion de projet via GitHub avec historique complet des modifications et travail en équipe
Qualité du code Absence de redondance (pas de copier-coller), fonctions de taille raisonnable, conventions de nommage respectées
Architecture Code maintenable et évolutif pour faciliter les futures versions et la réactivité aux dysfonctionnements
Documentation Manuel utilisateur, documentation support, release notes obligatoires
Livrables UML Diagrammes à livrer 24h avant chaque version (Use Case, Séquence, Activité, Classes)

Qu'est-ce qu'EasySave ?

EasySave est un logiciel de sauvegarde professionnel permettant aux utilisateurs de créer et gérer un nombre illimité de travaux de sauvegarde. L'application supporte les sauvegardes complètes (copie intégrale) et différentielles (fichiers modifiés uniquement), avec une traçabilité complète via des logs JSON journaliers.

Fonctionnalités Principales (v3.0)

Exécution Parallèle

Nouveau v3.0 — Les travaux de sauvegarde s'exécutent simultanément via Task.WhenAll, exploitant pleinement les processeurs multi-cœurs.

Pause / Reprise / Stop

Nouveau v3.0 — Contrôles en temps réel par travail : pause, reprise et arrêt via JobController (ManualResetEventSlim + CancellationToken).

Fichiers Prioritaires

Nouveau v3.0 — Les fichiers dont l'extension est marquée prioritaire sont transférés en premier par tous les travaux (barrière globale).

Fichiers Volumineux

Nouveau v3.0 — Un seul fichier dépassant la taille maximale configurée (Ko) est transféré à la fois (SemaphoreSlim).

CryptoSoft Mono-Instance

Nouveau v3.0 — Un Mutex nommé garantit qu'une seule instance de CryptoSoft s'exécute à la fois, même en parallèle.

Auto-Pause Logiciel Métier

Nouveau v3.0 — Si le logiciel métier est détecté, tous les travaux sont automatiquement mis en pause ; reprise automatique à la fermeture.

Interface Graphique

Interface moderne Avalonia UI (XAML) avec panneau de progression en temps réel par travail et boutons Pause/Reprise/Stop.

Logs Détaillés

Traçabilité complète : horodatage, temps de transfert, temps de chiffrement. Mode de log configurable (local, serveur, les deux).

Modes d'Utilisation

Deux modes disponibles
  • Interface Graphique (GUI) : Gestion complète et intuitive via une fenêtre moderne.
  • Mode ligne de commande : Pour l'automatisation (syntaxe identique aux v1.0 et v1.1).

Roadmap des Versions

1.0

Version Console

Application console, 5 travaux max, logs JSON, multilingue.

1.1

Console améliorée

Choix du format de log (JSON/XML), interface console améliorée.

2.0

Interface Graphique

GUI Avalonia, travaux illimités, CryptoSoft, logiciel métier, logs avec temps de cryptage.

3.0

Version Avancée (Actuelle)

Exécution parallèle, Pause/Reprise/Stop par travail, fichiers prioritaires, fichiers volumineux, CryptoSoft mono-instance, auto-pause logiciel métier.

Démarche Technique

Du cahier des charges à l'implémentation

Méthodologie de Conception

EasySave a été conçu avec UML (Unified Modeling Language) et le pattern MVVM (Model-View-ViewModel), pour garder une architecture claire et évolutive.

Étapes de Conception

1

Analyse du Cahier des Charges

Identification des exigences fonctionnelles (travaux illimités en v2.0/v3.0, 2 types de sauvegarde, multilingue, interface graphique) et des exigences techniques (logs JSON/XML, état temps réel, DLL EasyLog, CryptoSoft, logiciel métier).

2

Diagramme de Cas d'Utilisation

Modélisation des interactions entre l'utilisateur et le système. Identification de 6 cas d'utilisation principaux : Créer, Modifier, Supprimer, Exécuter, Lister les travaux, et Changer les paramètres.

3

Diagramme de Classes

Définition de l'architecture technique finale avec toutes les classes, leurs attributs, méthodes et relations. Ce diagramme a servi de référence pour l'implémentation du code.

4

Diagramme d'Activité

Représentation du flux global de l'application : démarrage → choix du mode (CLI ou interactif) → boucle de menu → exécution des actions. Ce diagramme a clarifié la logique de navigation.

5

Diagrammes de Séquence

Pour chaque cas d'utilisation, création d'un diagramme de séquence détaillant les interactions entre les objets : View → ViewModel → Service → Model. Ces diagrammes ont guidé l'implémentation des méthodes.

6

Implémentation MVVM

Développement du code C# en respectant le pattern MVVM (v2.0/v3.0) avec réutilisation de la logique métier :
Models : BackupJob, JobState, ProgressInfo
ViewModels : MainViewModel, JobEditViewModel, SettingsViewModel
Views : Interface Avalonia (MainWindow, JobEditWindow, SettingsWindow), LanguageManager
Services : BackupService (Façade), JobManager, BackupExecutor, StateManager, intégration CryptoSoft

Stratégie Git

Le projet utilise GitFlow pour la gestion des branches :

  • main : Version stable de production
  • develop : Branche d'intégration des fonctionnalités
  • feature/* : Développement de nouvelles fonctionnalités
  • docs/* : Modifications de la documentation

La librairie EasyLog.dll est dans le même dépôt mais compilée en DLL à part pour pouvoir être réutilisée (y compris dans d'autres projets) et faire évoluer le logging sans toucher à l’application.

Patterns de Conception Utilisés

Façade

BackupService expose une interface simplifiée vers les sous-systèmes (JobManager, BackupExecutor, ConfigurationManager).

Singleton

LanguageManager assure une seule instance pour les traductions dans toute l'application.

Observer

Les événements OnProgressUpdate permettent à la View de réagir aux changements d'état des sauvegardes en temps réel.

MVVM

Séparation entre données (Models), affichage (Views) et logique de présentation (ViewModels) avec data binding bidirectionnel.

Installation

Prérequis et compilation du projet

Prérequis

.NET 10.0 SDK

Téléchargez et installez le SDK depuis le site officiel Microsoft

Télécharger .NET 10.0

Compilation

Pour générer un exécutable autonome (self-contained), utilisez la commande correspondant à votre plateforme :

PowerShell / CMD
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r win-x64 --self-contained true -o ./publish/windows
Terminal (Apple Silicon M1/M2/M3)
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r osx-arm64 --self-contained true -o ./publish/macos
Terminal (Intel)
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r osx-x64 --self-contained true -o ./publish/macos_intel
Terminal
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r linux-x64 --self-contained true -o ./publish/linux

Lancement rapide (développement)

Mode développement
dotnet run --project EasySave.Avalonia

Guide Utilisateur

Utilisation de l'interface graphique EasySave v3.0

Fenêtre Principale

Au lancement sans arguments, EasySave ouvre une interface graphique (Avalonia UI) composée d'une fenêtre principale affichant la liste des travaux de sauvegarde.

Fonctions disponibles
  • Liste des travaux : tableau avec ID, nom, source, destination, type (Complète / Différentielle)
  • Créer un travail : bouton ouvrant une fenêtre de création (nom, source, destination, type)
  • Modifier un travail : sélection d'un travail puis édition des champs
  • Supprimer un travail : suppression après confirmation
  • Exécuter un ou plusieurs travaux : lancement avec progression en temps réel
  • Paramètres : langue (FR/EN), format de log (JSON/XML), extensions à chiffrer, logiciel métier

Créer un Travail

1

Nom du travail

Nom descriptif unique (ex: "Sauvegarde Documents"). Le nom ne doit pas déjà exister.

2

Répertoire source

Chemin du dossier à sauvegarder. Supports : disques locaux, externes, chemins réseau (UNC).

3

Répertoire destination

Chemin de destination. Le dossier est créé automatiquement s'il n'existe pas.

4

Type de sauvegarde

Complète : copie tous les fichiers. Différentielle : uniquement les fichiers modifiés depuis la destination.

Nombre de travaux (v3.0)

En version 3.0, le nombre de travaux de sauvegarde est illimité.

Exécuter des Travaux

Vous pouvez lancer un travail unique, une sélection, ou tous les travaux. En v3.0, les travaux s'exécutent en parallèle. La progression s'affiche en temps réel par travail avec des contrôles Pause / Reprise / Stop individuels. En ligne de commande, la syntaxe reste identique aux v1.0 et v1.1 (EasySave.Avalonia.exe 1-3, 1;3;5).

Logiciel métier (v3.0 : auto-pause)

Si un logiciel métier est détecté (configuré dans Paramètres), tous les travaux en cours sont automatiquement mis en pause. À la fermeture du logiciel métier, les travaux reprennent automatiquement. L'événement est consigné dans le fichier log.

Paramètres (Paramètres généraux)

Paramètre Description
Langue Français (fr-FR) ou Anglais (en-US)
Format des logs JSON ou XML pour les fichiers journaliers dans Data/Logs/
Extensions à chiffrer Liste d'extensions (ex: .docx, .pdf). Seuls ces fichiers sont cryptés via CryptoSoft avant copie.
Logiciel métier Nom du processus du logiciel métier (ex: calculatrice). S'il est détecté, auto-pause de tous les travaux ; reprise automatique à la fermeture.
Extensions prioritaires (v3.0) Extensions transférées en premier par tous les travaux (barrière globale).
Taille max fichier volumineux (v3.0) Seuil en Ko au-dessus duquel un seul fichier est transféré à la fois.
Mode de log (v3.0) Local, Centralized (serveur Docker), ou Both.
URL serveur de log (v3.0) URL du service LogCentralization (ex: http://localhost:5050).

Notes Importantes

Sauvegarde automatique

Les travaux et paramètres sont sauvegardés automatiquement

Validation des chemins

Les chemins source et destination sont validés à la création

Logs et chiffrement

Chaque transfert est loggé ; le temps de cryptage (si applicable) est enregistré

Différentiel

Les sauvegardes différentielles sans fichiers modifiés sont ignorées

Ligne de Commande

Exécution directe via arguments

Syntaxe

Format général
EasySave.Avalonia.exe <sélecteur_travaux>

Formats de sélection

Format Description Exemple
N Exécute un seul travail par son ID EasySave.Avalonia.exe 1
N-M Exécute une plage de travaux (de N à M) EasySave.Avalonia.exe 1-3
N;M;O Exécute une liste de travaux spécifiques EasySave.Avalonia.exe 1;3;5

Exemples d'utilisation

Exécuter le travail n°2
./EasySave.Avalonia.exe 2
Exécuter les travaux 1, 2 et 3
./EasySave.Avalonia.exe 1-3
Exécuter les travaux 1, 3 et 5
./EasySave.Avalonia.exe 1;3;5

Manuel utilisateur (1 page)

Résumé condensé EasySave v3.0

EasySave v3.0 est une application de sauvegarde avec interface graphique (GUI). Elle permet de créer un nombre illimité de travaux de sauvegarde, de les exécuter en parallèle avec contrôles Pause/Reprise/Stop par travail, de chiffrer des fichiers sensibles et de centraliser les logs via Docker.

Comparaison des versions

Fonction Version 1.0 Version 1.1 Version 2.0 Version 3.0
Interface Console Console Graphique Graphique
Multi-langues Anglais et Français Anglais et Français Anglais et Français Anglais et Français
Travaux de sauvegarde Limité à 5 Limité à 5 Illimité Illimité
Fichier Log journalier Oui en JSON uniquement Oui (JSON, XML) Oui (JSON, XML) + temps de cryptage Oui (JSON, XML)
L'utilisateur peut mettre en pause une ou plusieurs tâches Non Non Non Oui
Fichier État Oui Oui Oui Oui
Type de fonctionnement Sauvegarde Mono ou séquentielle Mono ou séquentielle Mono ou Séquentielle Parallèle
Arrêt si détection du logiciel métier Non Non Oui (impossible de lancer un travail) Oui (arrêt de tous les transferts en cours)
Utilisation du logiciel de cryptage externe « CryptoSoft » Non Non Oui Oui (logiciel Mono-Instance)
Gestion de fichiers Prioritaires Non Non Non OUI, avec attente des autres tâches
Interdiction de sauvegardes simultanées pour les fichiers volumineux Non Non Non OUI
Centralisation des fichiers log Journalier Non Non Non Oui
Ligne de commande Oui identique version 1.0 identique version 1.0 identique version 1.0

Interface principale

Au démarrage, le tableau de bord affiche tous les travaux de sauvegarde. Créer (Ajouter), Exécuter (sélectionner puis Lancer), Supprimer, Paramètres (langue, chiffrement, logs).

Paramètres

  • Général : Langue (FR/EN), Format des logs (JSON ou XML).
  • Logiciel métier : Nom du processus (ex. Calculatrice). S'il est en cours, EasySave bloque les nouvelles sauvegardes et arrête les en cours.
  • Chiffrement (CryptoSoft) : Extensions à chiffrer (ex. .pdf, .docx). Seuls les fichiers avec ces extensions sont chiffrés. Le module CryptoSoft est intégré directement dans l'application.

Créer un travail

Cliquer sur Ajouter un travail, renseigner le nom, la source, la destination, le type (Complète ou Différentielle), puis Enregistrer. Aucune limite de nombre de travaux.

Exécuter des sauvegardes

Sélectionner un ou plusieurs travaux, cliquer sur Lancer. La fenêtre de progression affiche l'état. Si un logiciel métier est détecté, la sauvegarde s'arrête automatiquement.

Logs

Stockés dans Data/Logs/ : format YYYY-MM-DD.json ou YYYY-MM-DD.xml. Contenu : horodatage, source, destination, taille, temps de transfert, temps de chiffrement.

Conception (UML)

Diagrammes de modélisation du système

Cas d'Utilisation

Diagramme de Cas d'Utilisation (v3.0)

Diagramme de Classes

Diagramme de Classes (v3.0)

Diagramme d'Activité

Diagramme d'Activité (v3.0)

Diagrammes de Séquence

Créer un travail

Séquence Créer un travail (v3.0)

Modifier un travail

Séquence Modifier un travail (v3.0)

Supprimer un travail

Séquence Supprimer un travail (v3.0)

Exécuter un travail

Séquence Exécuter un travail (v3.0)

Lister les travaux

Séquence Lister les travaux (v3.0)

Changer les paramètres

Séquence Changer les paramètres (v3.0)

Chiffrer un fichier (CryptoSoft)

Séquence Chiffrer un fichier (v3.0)

Play / Stop / Pause un travail

Séquence Play/Stop/Pause (v3.0)

Détecter le logiciel métier

Séquence Détecter le logiciel métier (v3.0)

Gérer la persistance

Séquence Gérer la persistance (v3.0)

Architecture

Structure du projet et pattern MVVM (v3.0)

Qu'est-ce que le Pattern MVVM ?

EasySave s'appuie sur le pattern Model-View-ViewModel (MVVM), adapté aux interfaces graphiques. En v3.0, la couche Services intègre l'exécution parallèle asynchrone, les contrôles Pause/Reprise/Stop par travail, et la gestion des fichiers prioritaires.

Model (Modèle)

Représente les données. Indépendant de l'interface.

Dans EasySave : BackupJob, JobState, BackupType, JobStatus (v3.0), JobController (v3.0), AppSettings

View (Vue)

Interface graphique Avalonia (XAML) : fenêtres et contrôles. Pas de logique métier.

Dans EasySave : MainWindow (liste + progression par travail), JobEditWindow, SettingsWindow (v3.0 : prioritaires, taille max, log mode)

ViewModel

Expose les données et commandes à la Vue. Fait le lien avec les Services.

Dans EasySave : MainViewModel, JobEditViewModel, SettingsViewModel, JobProgressViewModel (v3.0)

Pourquoi ce choix architectural ?

Avantage Bénéfice pour EasySave
Séparation des responsabilités Chaque développeur peut travailler sur une couche sans impacter les autres. Le code est plus lisible et maintenable.
Testabilité Les services et ViewModels peuvent être testés indépendamment de l'interface. On peut mocker les services dans les tests unitaires.
Évolutivité La migration de la console (v1.x) vers l'interface Avalonia (v2.0) a conservé Models et Services ; seules les Vues et le flux de contrôle ont changé (MVVM).
Réutilisabilité Les models BackupJob et JobState et les services sont réutilisables (CLI possible en parallèle de la GUI).
Maintenabilité Un bug d'affichage ? → Modifier les vues Avalonia ou ViewModels. Un bug dans la sauvegarde ? → Modifier BackupExecutor ou services.

Flux de Données dans EasySave (v3.0)

Lors d'une action utilisateur dans l'interface graphique :

1

L'utilisateur interagit avec la View

La fenêtre Avalonia (ex: MainWindow) déclenche une Commande (ex: Exécuter un travail).

2

Le ViewModel exécute l'action

MainViewModel (ou JobEditViewModel) appelle le BackupService pour créer, modifier, supprimer ou exécuter des travaux.

3

Les Services exécutent la logique métier

BackupService délègue à BackupExecutor (copie, chiffrement CryptoSoft si extension concernée), StateManager, Logger.

4

Models et fichiers mis à jour

state.json, logs journaliers (JSON/XML), jobs.json et settings.json sont persistés.

5

La View est notifiée (binding)

Les propriétés du ViewModel (progression, état) sont liées à la Vue ; l'interface se met à jour automatiquement (Observer / INotifyPropertyChanged).

Diagramme MVVM Simplifié

EasySave v3.0 : couche Services avec exécution parallèle, contrôles temps réel, ViewModels pour la GUI.

Views (Avalonia)

MainWindow, JobEditWindow, SettingsWindow

Interface graphique XAML — Panneau de progression v3.0

ViewModels

MainViewModel, JobEditViewModel, SettingsViewModel, JobProgressViewModel

Commandes, données, contrôles Pause/Reprise/Stop

Models

BackupJob, JobState, BackupType, JobStatus, JobController, AppSettings

Données métier + contrôles v3.0

Services

BackupService, BackupExecutor (parallèle), StateManager (thread-safe), CryptoSoftService (mono-instance)

Logique métier — Exécution async, SemaphoreSlim, lock
Couche Services

La logique métier reste dans une couche Services indépendante de l'UI, ce qui permet la réutilisation (CLI en ligne de commande, tests unitaires) et le respect du principe de responsabilité unique (SRP).

Structure des fichiers (v3.0)

EasySave/
Models/
BackupJob.cs — Définition d'un travail
JobState.cs — État temps réel
BackupType.cs — Enum (Complete/Differential)
ViewModels/
MainViewModel.cs — Fenêtre principale
JobEditViewModel.cs — Création / édition travail
SettingsViewModel.cs — Paramètres (langue, log, CryptoSoft, métier)
Services/
BackupService.cs — Logique de sauvegarde
ConfigurationManager.cs — Gestion config JSON
StateManager.cs — Gestion état temps réel
LanguageManager.cs — Gestion multilingue
EasySave.Avalonia/ — Interface graphique
MainWindow.axaml(.cs) — Fenêtre principale
JobEditWindow.axaml — Création / édition
SettingsWindow.axaml — Paramètres
EasyLog/ — DLL de logging

Modèles de Données

Classes POCO et structures de données du projet

Rôle des Modèles dans l'Architecture

Les modèles (ou Models) représentent les entités métier de l'application. Dans EasySave, ils sont implémentés sous forme de POCO (Plain Old CLR Objects) : des classes simples sans logique complexe, uniquement des propriétés.

POCO (Plain Old CLR Object)

Classes simples sans dépendances framework. Elles ne contiennent que des propriétés get/set et sont facilement sérialisables.

Sérialisation JSON

Grâce aux attributs [JsonPropertyName], les modèles sont automatiquement convertis en JSON pour la persistance (jobs.json, state.json).

Immutabilité partielle

Les propriétés ont des valeurs par défaut (string.Empty) pour limiter les NullReferenceException et garder un état cohérent.

BackupJob

Représente un travail de sauvegarde configuré par l'utilisateur. Cette classe est persistée dans jobs.json et chargée au démarrage de l'application.

BackupJob
Propriété Type Description
Id int Identifiant unique (v2.0 : nombre de travaux illimité)
Name string Nom du travail
SourceDirectory string Chemin du répertoire source
TargetDirectory string Chemin du répertoire destination
Type BackupType Complete ou Differential

JobState

Représente l'état temps réel d'une sauvegarde en cours d'exécution. Cette classe est mise à jour à chaque fichier copié et persistée dans state.json pour permettre un suivi externe (ex: application de monitoring).

JobState
Propriété Type Description
JobName string Nom du travail en cours
State string Active, Inactive, Finished, Error
TotalFiles int Nombre total de fichiers
TotalSize long Taille totale en octets
FilesRemaining int Fichiers restants à copier
Progression double Pourcentage (0-100)
Méthode CalculateProgression()

La classe JobState contient une méthode CalculateProgression() qui calcule automatiquement le pourcentage d'avancement à partir du nombre de fichiers restants :

Progression = ((TotalFiles - FilesRemaining) / TotalFiles) × 100

BackupType (Enum)

Définit le type de sauvegarde à effectuer. Le choix du type impacte directement le comportement de BackupExecutor lors de la copie des fichiers.

Complete Copie intégrale de tous les fichiers du répertoire source vers la destination, qu'ils existent déjà ou non.
Differential Copie uniquement les fichiers dont la date de modification est plus récente que celle du fichier destination. Optimise le temps de sauvegarde.
Différentiel vs Incrémentiel

Une sauvegarde différentielle compare la source à la destination actuelle. Une sauvegarde incrémentielle (non implémentée dans v1.0) comparerait à la dernière sauvegarde effectuée. La différentielle est plus simple à implémenter et permet une restauration plus rapide.

Configuration

Fichiers de configuration et persistance des données

Emplacement des fichiers

Tous les fichiers de configuration sont stockés dans un dossier Data/ situé à côté de l'exécutable :

Structure du dossier Data/
EasySave.Avalonia.exe
Data/
├── jobs.json        # Liste des travaux de sauvegarde
├── settings.json    # Paramètres (langue, format log, extensions chiffrement, logiciel métier)
├── state.json       # État temps réel des sauvegardes
└── Logs/
    ├── 2026-02-03.json   # Logs journaliers (JSON ou XML selon paramètre)
    └── 2026-02-03.xml

Fichier jobs.json

Contient la liste des travaux de sauvegarde configurés. Ce fichier est créé automatiquement au premier lancement.

Exemple de jobs.json
[
  {
    "id": 1,
    "name": "Sauvegarde Documents",
    "sourceDirectory": "C:\\Users\\Documents",
    "targetDirectory": "D:\\Backup\\Documents",
    "type": 0
  },
  {
    "id": 2,
    "name": "Sauvegarde Photos",
    "sourceDirectory": "C:\\Users\\Pictures",
    "targetDirectory": "D:\\Backup\\Pictures",
    "type": 1
  }
]
Types de sauvegarde

Dans le fichier JSON, le type est représenté par un entier :

  • 0 = Sauvegarde complète (Complete)
  • 1 = Sauvegarde différentielle (Differential)

Fichier settings.json

Contient les paramètres globaux : langue, format des logs, extensions à chiffrer (CryptoSoft), logiciel métier, extensions prioritaires, taille max fichier volumineux, mode de log et URL du serveur de log (v3.0).

Exemple de settings.json (v3.0)
{
  "language": "fr-FR",
  "logFormat": "JSON",
  "businessSoftwareProcessName": "Calculator",
  "encryptedExtensions": [ ".docx", ".pdf", ".xlsx" ],
  "priorityExtensions": [ ".docx", ".pdf" ],
  "maxLargeFileTransferSizeKB": 10240,
  "logMode": "Local",
  "logServerUrl": "http://localhost:5000"
}
Propriété Valeurs possibles Description
language fr-FR, en-US Langue de l'interface utilisateur
logFormat JSON, XML Format des fichiers de log journaliers
businessSoftwareProcessName Nom de processus (ex. Calculator) Logiciel métier : v3.0 — auto-pause/reprise de tous les travaux si détecté
encryptedExtensions Liste d'extensions (ex. [".pdf", ".docx"]) Fichiers à chiffrer via CryptoSoft avant copie
priorityExtensions Liste d'extensions (ex. [".docx"]) v3.0 — Extensions prioritaires transférées en premier (barrière globale)
maxLargeFileTransferSizeKB Entier (Ko), ex. 10240 = 10 Mo v3.0 — Fichiers au-dessus de cette taille sont transférés un à la fois
logMode Local, Server, Both v3.0 — Mode de logs : fichier local, serveur distant, ou les deux
logServerUrl URL (ex. http://localhost:5000) v3.0 — URL du serveur de logs centralisé (utilisé si logMode = Server ou Both)

EasyLog.dll

Librairie de logging réutilisable

Pourquoi une DLL séparée ?

Le cahier des charges impose une librairie de logging distincte. EasyLog est donc compilé en DLL séparée : réutilisable dans d'autres projets, compatible avec les évolutions d'EasySave, et isolée du reste du code.

Structure du Projet

Organisation Git
EasySave/
├── EasySave/                # Bibliothèque métier (Models, Services, ViewModels)
│   └── EasySave.csproj      # Référence EasyLog + CryptoSoft
│
├── EasySave.Avalonia/       # Interface graphique (Views Avalonia)
│   └── EasySave.Avalonia.csproj  # Point d'entrée (WinExe), référence EasySave
│
├── EasyLog/                 # Projet DLL de logging
│   ├── EasyLog.csproj       # Compile en DLL
│   └── Logger.cs            # Classe principale
│
├── CryptoSoft/              # Module de chiffrement (DLL)
│   └── CryptoSoft.csproj
│
├── EasySave.Tests/          # Tests unitaires et d'intégration (xUnit)
│   └── EasySave.Tests.csproj
│
└── EasySave.sln             # Solution regroupant les 5 projets

API de la Classe Logger

Logger
Méthode Description
Logger(string storageDirectory) Constructeur - initialise le répertoire de stockage des logs
Log(name, source, dest, size, transferTime) Enregistre un transfert de fichier réussi
LogError(name, source, dest, size, errorCode) Enregistre une erreur (temps négatif)
LogDirectoryCreated(name, directoryPath) Enregistre la création d'un répertoire
LogJobAction(action, jobName) Enregistre une action sur un travail (CREATED, MODIFIED, DELETED)

Structure d'une Entrée de Log

LogEntry
Propriété Type Description
Name string Nom du travail de sauvegarde
Timestamp DateTime Horodatage de l'action
SourcePath string Chemin source au format UNC
DestinationPath string Chemin destination au format UNC
FileSize long Taille du fichier en octets
TransferTimeMs long Temps de transfert en ms (négatif si erreur)
EncryptionTimeMs long v2.0 : Temps de cryptage en ms (0 = pas de cryptage, >0 = temps, <0 = code erreur)

Formats de log (JSON / XML)

Depuis la v1.1, l'utilisateur peut choisir le format des fichiers log journaliers : YYYY-MM-DD.json ou YYYY-MM-DD.xml. Le paramètre est stocké dans settings.json (logFormat).

Conversion UNC

Tous les chemins sont automatiquement convertis au format UNC (Universal Naming Convention) pour compatibilité avec les serveurs et lecteurs réseaux :

Exemple de conversion
Chemin local    : C:\Users\Documents\file.txt
Chemin UNC      : \\?\C:\Users\Documents\file.txt

Chemin réseau   : \\server\share\file.txt
Chemin UNC      : \\server\share\file.txt (inchangé)

Fichier Log Journalier

Les logs sont enregistrés dans des fichiers journaliers au format YYYY-MM-DD.json :

Exemple : 2026-02-05.json
[
  {
    "Name": "Sauvegarde Documents",
    "Timestamp": "2026-02-05T14:30:45",
    "SourcePath": "\\\\?\\C:\\Users\\Documents\\rapport.docx",
    "DestinationPath": "\\\\?\\D:\\Backup\\Documents\\rapport.docx",
    "FileSize": 245760,
    "TransferTimeMs": 45
  },
  {
    "Name": "Sauvegarde Documents",
    "Timestamp": "2026-02-05T14:30:46",
    "SourcePath": "\\\\?\\C:\\Users\\Documents\\image.png",
    "DestinationPath": "\\\\?\\D:\\Backup\\Documents\\image.png",
    "FileSize": 1048576,
    "TransferTimeMs": 120
  },
  {
    "Name": "[CREATED] Sauvegarde Photos",
    "Timestamp": "2026-02-05T15:00:00",
    "SourcePath": "",
    "DestinationPath": "",
    "FileSize": 0,
    "TransferTimeMs": 0
  }
]
Convention des Codes d'Erreur

Lorsqu'une erreur survient, TransferTimeMs contient une valeur négative :

  • -1 : Limite de travaux atteinte
  • -2 : Chemins invalides
  • -3 : Répertoire source inexistant
  • -4 : Nom de travail en doublon

Logs & États

Fichiers de suivi et traçabilité

Fichiers de log journaliers

Chaque transfert est enregistré dans un fichier par jour (YYYY-MM-DD.json ou YYYY-MM-DD.xml selon les paramètres), dans Data/Logs/. En v3.0, chaque entrée peut inclure le temps de cryptage (EncryptionTimeMs) : 0 = pas de cryptage, >0 = temps en ms, <0 = code erreur.

Exemple d'entrée de log
{
  "timestamp": "2026-02-03T15:30:45",
  "jobName": "Sauvegarde Documents",
  "sourceFile": "C:\\Users\\Documents\\rapport.docx",
  "targetFile": "D:\\Backup\\Documents\\rapport.docx",
  "fileSize": 245760,
  "transferTimeMs": 45
}
Emplacement des logs

Les logs sont stockés dans le sous-dossier Logs/ du répertoire de configuration de l'application.

Fichier d'État (state.json)

L'état temps réel des sauvegardes est maintenu dans un fichier JSON actualisé en continu.

Exemple d'état en cours d'exécution
{
  "jobName": "Sauvegarde Documents",
  "timestamp": "2026-02-03T15:30:50",
  "state": "Active",
  "totalFiles": 150,
  "totalSize": 52428800,
  "filesRemaining": 75,
  "sizeRemaining": 26214400,
  "currentSourceFile": "C:\\Users\\Documents\\images\\photo.jpg",
  "currentTargetFile": "D:\\Backup\\Documents\\images\\photo.jpg",
  "progression": 50.0
}

États possibles

Active

Sauvegarde en cours d'exécution

Inactive

Aucune sauvegarde en cours

Finished

Sauvegarde terminée avec succès

Error

Une erreur s'est produite

Bibliothèque EasyLog

Le module EasyLog est une DLL séparée qui gère l'écriture des logs. Elle offre les fonctionnalités suivantes :

Logs journaliers

Un fichier par jour : YYYY-MM-DD.json ou YYYY-MM-DD.xml

Temps de cryptage (v2.0)

Champ EncryptionTimeMs : 0 = pas de cryptage, >0 = temps en ms, <0 = erreur

Format UNC

Les chemins sont convertis au format UNC pour compatibilité réseau

Thread-safe

Écriture sécurisée pour accès concurrent

Convention des erreurs

TransferTimeMs ou EncryptionTimeMs négatif = code d'erreur. L'arrêt dû au logiciel métier est consigné dans le log.

CryptoSoft (v3.0 — Mono-Instance)

Chiffrement des fichiers avant sauvegarde

Rôle de CryptoSoft

Le cahier des charges impose l'utilisation du logiciel de cryptage CryptoSoft. Seuls les fichiers dont l'extension figure dans la liste définie par l'utilisateur (paramètres généraux) sont cryptés avant d'être copiés vers la destination.

Nouveau v3.0 : CryptoSoft est désormais mono-instance. Un Mutex nommé (Global\CryptoSoftMutex) empêche le lancement simultané de plusieurs processus CryptoSoft. Côté EasySave, un SemaphoreSlim(1,1) dans CryptoSoftService sérialise les appels internes au module de chiffrement.

Fonctionnement

  • L'utilisateur configure dans Paramètres la liste des extensions à chiffrer (ex: .docx, .pdf, .xlsx).
  • Lors d'une sauvegarde, pour chaque fichier dont l'extension est dans cette liste, EasySave appelle CryptoSoft pour chiffrer le fichier (XOR ou algorithme implémenté) avant la copie.
  • Le temps de cryptage (en ms) est enregistré dans le fichier log journalier (EncryptionTimeMs). Valeur 0 = pas de cryptage, >0 = temps, <0 = code erreur.

Paramètres

La liste des extensions est stockée dans settings.json sous la clé encryptedExtensions (tableau de chaînes). Elle est modifiable via la fenêtre Paramètres de l'interface.

Docker — LogCentralization (v3.0)

Service de centralisation des logs EasySave en temps réel

Pourquoi centraliser les logs ?

En v3.0, EasySave peut envoyer ses logs vers un serveur centralisé déployé sous Docker. Cela permet de regrouper les logs de toutes les machines et utilisateurs dans un fichier journalier unique par jour, facilitant l'audit et le suivi des sauvegardes à l'échelle de l'entreprise.

Architecture

API ASP.NET Core

Service web léger exposant un endpoint POST /api/logs pour recevoir les entrées de log au format JSON.

Fichier journalier centralisé

Un fichier par jour (YYYY-MM-DD.json) agrège les entrées de toutes les machines. Chaque entrée contient machineId et userName.

Docker Compose

Déploiement en une commande : docker compose up -d. Volume persistant pour les données de log.

Port 5050

Le service écoute sur le port 5050 (configurable dans docker-compose.yml).

Déploiement avec Docker Compose

Depuis la racine du dépôt :

Lancer le service
docker compose up -d

Le service écoute sur http://localhost:5050. Les logs centralisés sont stockés dans le volume Docker logcentralization_data (répertoire /app/Data/Logs dans le conteneur).

Build manuel de l'image

Build et exécution
docker build -f LogCentralization/Dockerfile -t easysave-logcentralization .
docker run -d -p 5050:5050 -v logcentralization_data:/app/Data --name easysave-logcentralization easysave-logcentralization

Exécution locale (sans Docker)

Mode développement
cd LogCentralization
dotnet run

Configuration du client EasySave

Dans les paramètres généraux (ou dans settings.json) :

Paramètre Valeurs possibles Description
logMode Local, Centralized, Both Mode de logs : fichier local seul, serveur centralisé seul, ou les deux
logServerUrl URL (ex. http://localhost:5050) URL du serveur LogCentralization (utilisé si logMode = Centralized ou Both)

Endpoint API

POST /api/logs — Corps JSON
{
  "machineId": "PC-BUREAU-01",
  "userName": "jean.dupont",
  "name": "Sauvegarde Documents",
  "timestamp": "2026-02-24T14:30:45",
  "sourcePath": "C:\\Users\\Documents\\rapport.docx",
  "destinationPath": "D:\\Backup\\Documents\\rapport.docx",
  "fileSize": 245760,
  "transferTimeMs": 45,
  "encryptionTimeMs": 12
}

docker-compose.yml

Configuration Docker Compose
services:
  logcentralization:
    build:
      context: .
      dockerfile: LogCentralization/Dockerfile
    container_name: easysave-logcentralization
    ports:
      - "5050:5050"
    volumes:
      - logcentralization_data:/app/Data
    environment:
      - LogStorage__Directory=/app/Data/Logs
    restart: unless-stopped

volumes:
  logcentralization_data:
Structure du projet LogCentralization

Le service est un projet ASP.NET Core séparé dans le dossier LogCentralization/ avec son propre Dockerfile, Controllers/, Models/ et Services/.

Support Multilingue

Gestion des langues et traductions

Langues supportées

EasySave supporte actuellement deux langues :

Code Langue Fichier de ressources
fr-FR Français (par défaut) Resources/lang_fr.json
en-US Anglais Resources/lang_en.json

Changement de langue

En v3.0, la langue se change via Paramètres (fenêtre Paramètres). Le choix est sauvegardé dans settings.json et persiste entre les sessions.

Fichiers de traduction

Les traductions sont stockées dans des fichiers JSON situés dans le dossier Resources/ :

Extrait de lang_fr.json
{
  "MenuOption1": "1. Lister les travaux",
  "MenuOption2": "2. Créer un travail",
  "MenuOption3": "3. Modifier un travail",
  "JobCreated": "Travail créé avec succès !",
  "JobDeleted": "Travail supprimé avec succès !",
  "MaxJobsReached": "Erreur : Limite de 5 travaux atteinte."
}

Architecture du LanguageManager

Le gestionnaire de langues utilise le pattern Singleton pour garantir une instance unique dans toute l'application.

LanguageManager
Méthode Description
Instance Propriété statique retournant l'instance unique
LoadLanguage(string) Charge un fichier de langue (fr-FR ou en-US)
GetString(string) Retourne la traduction pour une clé donnée
CurrentLanguage Retourne le code de la langue actuelle
Traductions par défaut

Si les fichiers de traduction sont manquants ou corrompus, le LanguageManager utilise des traductions intégrées dans le code source.

Support technique

Prérequis, installation, emplacements des fichiers, dépannage

Configuration minimale

Exigence Spécification
Système d'exploitation Windows 10+, macOS 11+, Linux
Runtime .NET 10.0 / 8.0 (compatible)
Espace disque ~150 Mo (application + CryptoSoft)
RAM 512 Mo minimum

Installation

Exécutable autonome : Aucune installation requise. Le module CryptoSoft est intégré directement dans l'application (DLL incluse).

Compilation depuis les sources :

Publication
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r <RID> --self-contained true -o ./publish

RID (Runtime Identifier) : Windows win-x64, macOS ARM osx-arm64, Linux linux-x64.

Emplacements des fichiers

Tous les fichiers de configuration et de log sont dans le dossier Data/, à côté de l'exécutable :

Structure
EasySave/
├── EasySave.Avalonia.exe   (application principale)
├── CryptoSoft.dll          (module de chiffrement, intégré)
└── Data/
    ├── jobs.json           # Définition des travaux
    ├── settings.json       # Paramètres (langue, format log, extensions, logiciel métier)
    ├── state.json          # État d'exécution en temps réel
    └── Logs/
        └── YYYY-MM-DD.json  # Logs journaliers des transferts

Formats des fichiers de configuration

settings.json (v3.0) — Champs : language, logFormat, businessSoftwareProcessName, encryptedExtensions, priorityExtensions, maxLargeFileTransferSizeKB, logMode, logServerUrl.

state.json — Champs : JobId, JobName, SourceFilePath, TargetFilePath, State, TotalFiles, FilesToCopy, TotalSize, BytesToCopy, Progression.

Log journalier (YYYY-MM-DD.json) — Chaque entrée : Name, SourceFilePath, TargetFilePath, FileSize, TransferTime, EncryptionTime, Time. EncryptionTime en ms (0 si non chiffré). TransferTime < 0 = erreur.

Dépannage

Problème Solution
« Erreur de chiffrement » Vérifier que les extensions configurées sont correctes dans les Paramètres et que les fichiers source sont accessibles.
« Logiciel métier détecté » Fermer le logiciel détecté ; v3.0 : les travaux reprennent automatiquement à la fermeture du processus.
Travaux en pause Vérifier la fenêtre de progression : cliquer sur « Reprendre » ou vérifier si le logiciel métier est actif (v3.0 : auto-pause).
Fichiers volumineux lents V3.0 : un seul fichier volumineux est transféré à la fois (SemaphoreSlim). Augmenter maxLargeFileTransferSizeKB dans les Paramètres pour changer le seuil.
La langue de l'interface ne change pas Redémarrer l'application ou vérifier le dossier Resources/.
Les logs ne sont pas créés S'assurer que le répertoire Data/Logs/ est accessible en écriture.

Contact

Pour le support, contacter l'équipe technique ProSoft.

Tests

Architecture, exécution et détail des tests EasySave

Cette section décrit l'architecture du projet de tests, les technologies utilisées, comment lancer les tests et le détail de chaque suite de tests.

1. Architecture du projet de tests

Le projet de tests se trouve dans le dossier EasySave.Tests/ et suit la structure suivante :

Structure EasySave.Tests/
EasySave.Tests/
├── EasySave.Tests.csproj          # Fichier projet (dépendances, références)
├── Mocks/
│   ├── TestData.cs                # Données de test réutilisables (jobs, settings, fichiers temporaires)
│   └── MockDialogService.cs       # Mock du service de dialogues pour les ViewModels
├── Services/
│   ├── BackupServiceTests.cs      # Tests de la façade BackupService (CRUD, exécution, settings)
│   ├── BackupExecutorV3Tests.cs   # v3.0 : parallélisme, priorités, fichiers volumineux, logiciel métier
│   ├── JobControllerTests.cs      # v3.0 : pause/resume/stop, WaitIfPaused
│   ├── CryptoSoftEngineTests.cs   # Tests du moteur de chiffrement XOR
│   └── CryptoSoftServiceTests.cs  # Tests du wrapper de chiffrement avec timing
├── ViewModels/
│   ├── JobEditViewModelTests.cs   # Tests du ViewModel d'édition de job
│   ├── JobProgressViewModelTests.cs # v3.0 : progression par travail, commandes
│   ├── MainViewModelTests.cs      # Tests du ViewModel principal
│   ├── RelayCommandTests.cs       # Tests de l'implémentation ICommand
│   └── SettingsViewModelTests.cs  # Tests du ViewModel de paramètres
└── RegressionTests.cs             # Tests de régression (compatibilité v1.0/v1.1 → v2.0/v3.0)

L'organisation miroir la structure du projet principal (Services/, ViewModels/) pour faciliter la navigation.

2. Technologies et dépendances

Package Version Rôle
xunit 2.9.3 Framework de tests unitaires
xunit.runner.visualstudio 3.1.4 Runner pour l'intégration IDE (Visual Studio, Rider)
Microsoft.NET.Test.Sdk 17.14.1 SDK de la plateforme de test .NET
coverlet.collector 6.0.4 Collecteur de couverture de code

Framework cible : .NET 10.0

Références de projet : EasySave.csproj (projet principal), CryptoSoft.csproj (module de chiffrement).

3. Types de tests utilisés

3.1 Tests unitaires (Unit Tests)

La majorité des tests sont des tests unitaires. Ils testent des unités de code isolées, sans dépendances externes réelles.

Fichiers concernés : RelayCommandTests.cs, JobEditViewModelTests.cs, SettingsViewModelTests.cs, CryptoSoftEngineTests.cs, CryptoSoftServiceTests.cs.

  • Utilisation de mocks (MockDialogService) pour isoler les ViewModels de l'UI
  • Données de test centralisées (TestData)
  • Chaque test vérifie un seul comportement (Arrange-Act-Assert)

3.2 Tests d'intégration (Integration Tests)

Ils vérifient l'interaction entre plusieurs composants réels.

Fichiers concernés : BackupServiceTests.cs, MainViewModelTests.cs.

  • Création de vrais fichiers et dossiers temporaires ; nettoyage via IDisposable
  • Collection xUnit [Collection("BackupService")] pour éviter les conflits de parallélisme

3.3 Tests de régression (Regression Tests)

Ils garantissent que les fonctionnalités v1.0/v1.1 continuent de fonctionner dans la v2.0/v3.0.

Fichier : RegressionTests.cs. Catégories : sauvegarde complète et différentielle, StateManager, journalisation JSON/XML, CRUD jobs, parsing arguments CLI.

4. Comment lancer les tests

Commande Description
dotnet test Lancer tous les tests
dotnet test EasySave.Tests/ Lancer uniquement le projet de tests
dotnet test --filter "FullyQualifiedName~BackupServiceTests" Lancer un fichier de tests spécifique
dotnet test --filter "FullyQualifiedName~BackupServiceTests.CreateJob_Valid_ReturnsTrue" Lancer un test unique
dotnet test --collect:"XPlat Code Coverage" Lancer les tests avec couverture de code (rapport dans TestResults/)

5. Verbosité des tests

Option --verbosity (ou -v) : quiet, minimal, normal (défaut), detailed, diagnostic.

Génération d'un rapport TRX (CI) :

Logger TRX
dotnet test --logger "trx;LogFileName=results.trx"

6. CI/CD

Les tests sont exécutés automatiquement via GitHub Actions à chaque push ou pull request sur les branches v1.0, v1.1, v2.0, v3.0, develop et main.

Points clés : build et tests multi-plateforme (Windows, Ubuntu, macOS) ; sur les branches version (v*), publish self-contained et création/mise à jour d’une Release GitHub avec les archives par OS.

7. Infrastructure de test — Mocks

TestData : données réutilisables (jobs valides/invalides, paramètres, structures de fichiers temporaires, nettoyage).

MockDialogService : implémentation mock de IDialogService pour tester les ViewModels sans UI (résultats prédéfinis pour dialogues et confirmations, compteurs d'appels, Reset()).

8. Détail de chaque suite de tests

RegressionTests — Tests de régression

But : Vérifier que les fonctionnalités v1.0/v1.1 fonctionnent toujours en v2.0/v3.0.

Catégories : Backup (complète, différentielle), StateManager, Logger (JSON, XML, EncryptionTimeMs), Job CRUD, parsing CLI (plage, liste, entrée unique, entrée invalide, HasJobArguments).

BackupServiceTests — Façade BackupService

But : Tester l'API publique (CRUD jobs, exécution, paramètres).

Catégories : création (valide, chemins invalides, doublon, pas de limite en v2.0), récupération (liste vide, index valide/invalide), JobNameExists, suppression, modification, exécution (valide, copie réelle, ExecuteAllJobs, source vide), paramètres (GetSettings, UpdateSettings, ChangeLanguage), événement Progress.

CryptoSoftEngineTests — Moteur de chiffrement XOR

But : Tester le chiffrement/déchiffrement symétrique.

Tests : contenu changé après chiffrement, double chiffrement restaure l'original, FileNotFoundException si source absente, fichier vide, création du répertoire de destination, fichier volumineux (1 Mo), contenu binaire (taille préservée).

CryptoSoftServiceTests — Wrapper avec timing

But : Tester RunWithTiming() (chiffrement + mesure du temps).

Tests : succès (true, temps ≥ 0), source introuvable (false, temps -1), fichier chiffré valide.

JobEditViewModelTests — ViewModel d'édition

But : Validation, constructeurs, conversion ToBackupJob().

Catégories : constructeur (nouveau job champs vides, job existant pré-rempli), IsValid (champs remplis, nom vide/espaces, source/dest vides, caractères spéciaux, nom long), ToBackupJob (valeurs, préservation ID, ID 0 pour nouveau), PropertyChanged (Name, IsValid, SourceDirectory), AvailableTypes (Complete et Differential).

MainViewModelTests — ViewModel principal

But : Commandes, état, interactions avec MockDialogService.

Catégories : état initial (JobsList, SelectedJob, IsExecuting, ProgressValue), CanExecute des commandes, sélection (HasSelection, PropertyChanged), CreateJob (annulation, ajout), DeleteJob (confirmation/refus), IsExecuting/StatusMessage/ProgressValue (PropertyChanged), OpenSettings (annulation, sauvegarde).

RelayCommandTests — ICommand

But : Tester l'implémentation du pattern ICommand (Execute, CanExecute, RaiseCanExecuteChanged, constructeurs, ArgumentNullException si execute null).

SettingsViewModelTests — ViewModel paramètres

But : Propriétés, extensions chiffrées, conversion ToAppSettings().

Catégories : constructeur (paramètres par défaut, v2.0 complets, anglais+XML), gestion des extensions (Add avec/sans point, pas de doublons, Remove, nombreuses extensions), ToAppSettings (valeurs correctes, copie indépendante), AvailableLanguages (fr-FR, en-US), AvailableLogFormats (JSON, XML), PropertyChanged (Language, LogFormat).

BackupExecutorV3Tests — Exécuteur v3.0 (23 tests)

But : Tester l'exécution parallèle, les fichiers prioritaires, les fichiers volumineux, le logiciel métier, et les contrôles Pause/Resume/Stop.

Catégories : exécution parallèle (3 travaux, 5 travaux concurrents, sélection spécifique, travail unique async), Pause/Resume/Stop (pause, stop avec fichiers partiels, resume après pause), contrôles globaux (PauseAll, StopAll), fichiers prioritaires (traités en premier, barrière inter-travaux, fonctionnement normal sans priorité), fichiers volumineux (sémaphore actif, petits fichiers libres), logiciel métier (processus absent, nom vide, parsing .exe), événements de progression (émis par travail, informations correctes), cas limites (liste vide, sources vides, nettoyage des contrôleurs).

JobControllerTests — Contrôleur de travail v3.0 (17 tests)

But : Tester le cycle de vie du contrôleur : état initial, transitions Pause/Resume/Stop, WaitIfPaused, CancellationToken.

Catégories : état initial (Pending, IsStopped false), Start (→ Running), Pause (depuis Running, Pending, Finished), Resume (depuis Paused, Running), Stop (→ Stopped, IsStopped true, annule le token, depuis Paused), Finish (→ Finished), WaitIfPaused (pas de blocage si Running, bloque jusqu'au Resume, débloque et annule si Stopped), cycles complets (Pending→Finished, avec pause/resume, 5 cycles consécutifs).

JobProgressViewModelTests — Progression par travail v3.0 (20 tests)

But : Tester le ViewModel de progression temps réel par travail : constructeur, mise à jour depuis JobState, commandes Pause/Resume/Stop, PropertyChanged.

Catégories : constructeur (nom, status Pending, progression 0, IsRunning), UpdateFromState (progression, compteur fichiers, Finished, Stopped), commandes (Pause, Resume, Stop existent, Resume désactivé si pas en pause, Stop activé/désactivé selon état), PropertyChanged (Progression, Status, IsPaused + IsRunning, FilesProgress).

9. Résumé des tests (176 au total)

Catégorie Fichier Tests Description
Services BackupServiceTests.cs 17 CRUD des travaux, exécution, paramètres
Services BackupExecutorV3Tests.cs 23 v3.0 : parallélisme, priorités, fichiers volumineux, logiciel métier
Services JobControllerTests.cs 17 v3.0 : pause/resume/stop, WaitIfPaused
Services CryptoSoftEngineTests.cs 7 Chiffrement XOR, symétrie, fichiers vides/larges
Services CryptoSoftServiceTests.cs 3 Wrapper de timing du chiffrement
ViewModels MainViewModelTests.cs 17 Commandes, état, interactions de dialogue
ViewModels JobEditViewModelTests.cs 14 Validation, conversion, PropertyChanged
ViewModels SettingsViewModelTests.cs 13 Extensions, conversion, langues, formats
ViewModels JobProgressViewModelTests.cs 20 v3.0 : progression par travail, commandes
ViewModels RelayCommandTests.cs 8 Execute, CanExecute, événements
Régression RegressionTests.cs 18 Compatibilité v1.0/v1.1, sauvegarde, log, CLI
Total 176

CI/CD (GitHub Actions)

Intégration continue et déploiement automatisé

Pipeline

Le projet utilise GitHub Actions pour automatiser la compilation, les tests et la génération des exécutables. Le workflow ci.yml s'exécute à chaque push et pull request sur les branches principales.

Étapes du workflow

1

Build & Test

Compilation (dotnet build -c Release) et exécution des tests unitaires (dotnet test -c Release --no-build) sur 3 OS : Windows, macOS et Linux (matrix).

2

Publish (branches version uniquement)

Sur les branches dont le nom commence par v (ex. v1.0, v3.0), génération d'exécutables autonomes (self-contained) par plateforme via dotnet publish, puis archivage (ZIP sous Windows, tar.gz sous Linux/macOS) et upload des artifacts (asset-windows, asset-linux, asset-macos).

3

Release GitHub (push sur branche version)

Lors d’un push sur une branche version, le job create-release télécharge les artifacts, crée ou met à jour la Release GitHub associée au tag (ex. v3.0) et y attache les archives (EasySave_v3.0_windows.zip, EasySave_v3.0_linux.tar.gz, EasySave_v3.0_macos.tar.gz).

Artifacts / Release

Fichier (ex. pour v3.0) OS Runtime Exécutable
EasySave_<version>_windows.zip Windows win-x64 EasySave.Avalonia.exe
EasySave_<version>_macos.tar.gz macOS osx-x64 EasySave.Avalonia
EasySave_<version>_linux.tar.gz Linux linux-x64 EasySave.Avalonia

Télécharger les exécutables

Récupérer une version release
  • Ouvrir la page Releases du dépôt GitHub
  • Choisir la release (ex. v3.0)
  • Télécharger l’archive correspondant à votre OS (EasySave_<version>_windows.zip, _linux.tar.gz ou _macos.tar.gz)
  • Extraire l’archive et lancer l’exécutable
Branches déclenchant le workflow
  • main, develop, v1.0, v1.1, v2.0, v3.0 (push et pull request)
  • Le publish et la Release GitHub ne s’exécutent que sur les branches dont le nom commence par v (et uniquement en push pour la release).
Fichier workflow
.github/workflows/ci.yml

Conformité au Cahier des Charges

Synthèse du respect des exigences CDC v3.0

Synthèse

Les tableaux ci-dessous rattachent les exigences du CDC v3.0 (et v1.0/v1.1/v2.0) à leur implémentation.

Exigences Fonctionnelles (v3.0)

Exigence CDC Statut Implémentation
Interface graphique (abandon console) Application Avalonia UI, fenêtres XAML
Nombre de travaux illimité Plus de limite à 5 ; jobs.json et gestion dynamique des ID
Définition travail (nom, source, cible, type) Classe BackupJob ; création/édition via JobEditWindow
Sauvegarde complète / différentielle BackupType.Complete / Differential, BackupExecutor
Support multilingue (FR/EN) LanguageManager + Paramètres
Exécution mono ou séquentielle BackupExecutor, sélection dans l'interface ou en CLI
v3.0 : Exécution parallèle Task.WhenAll dans BackupExecutor.ExecuteJobsInParallelAsync
v3.0 : Pause / Reprise / Stop par travail JobController (ManualResetEventSlim + CancellationToken)
v3.0 : Fichiers prioritaires transférés en premier Extensions configurées dans priorityExtensions ; barrière globale Interlocked
v3.0 : Fichiers volumineux (1 à la fois) SemaphoreSlim(1,1) pour fichiers > maxLargeFileTransferSizeKB
v3.0 : CryptoSoft mono-instance Mutex nommé dans CryptoSoft + SemaphoreSlim dans CryptoSoftService
v3.0 : Auto-pause logiciel métier Timer 1s dans BackupExecutor ; auto-pause/reprise via JobController
Ligne de commande identique aux v1.0 et v1.1 EasySave.Avalonia.exe 1-3, 1;3;5 (plage / liste)
Format log JSON ou XML settings.logFormat, EasyLog.dll
Cryptage via CryptoSoft Extensions configurables ; appel CryptoSoft avant copie ; log EncryptionTimeMs
Logiciel métier : interdiction lancement + arrêt consigné en log businessSoftwareProcessName ; détection processus ; fin du fichier en cours puis arrêt ; entrée dans le log

Exigences Techniques - Stockage

Exigence CDC Statut Implémentation
Support disques locaux Chemins standards (C:\, D:\...)
Support disques externes Tout chemin valide accessible par le système
Support lecteurs réseaux (UNC) Méthode ConvertToUncPath() dans Logger.cs
Sauvegarde fichiers + sous-répertoires Récursion dans ProcessDirectory() de BackupExecutor

Exigences Techniques - Logging & État

Exigence CDC Statut Implémentation
Fichier log journalier Format YYYY-MM-DD.json via GetDailyLogFileName()
Contenu log : horodatage, nom, source, dest, taille, temps Classe LogEntry avec tous les champs requis
Temps de transfert négatif si erreur Méthode LogError() avec code négatif
DLL séparée nommée EasyLog.dll Projet distinct EasyLog/ compilé en DLL
Fichier état temps réel unique state.json géré par StateManager
État : nom travail, horodatage, statut Classe JobState avec JobName, Timestamp, State
État actif : total fichiers, taille, progression TotalFiles, TotalSize, Progression, FilesRemaining
État actif : fichiers source/dest en cours CurrentSourceFile, CurrentTargetFile
Emplacement flexible (pas c:\temp) Dossier Data/ relatif à l'exécutable
Format JSON avec retours à la ligne WriteIndented = true dans JsonSerializerOptions
Thread-safety v3.0

Toutes les classes partagées entre threads parallèles sont sécurisées : StateManager avec lock, CryptoSoftService avec SemaphoreSlim(1,1), ConcurrentDictionary pour les JobControllers.

Notes de Version

Historique des versions d'EasySave

v3.0 Livrable 3

Nouveautés

  • Exécution parallèle : les travaux s'exécutent simultanément via Task.WhenAll dans BackupExecutor
  • Pause / Reprise / Stop : contrôles en temps réel par travail via JobController (ManualResetEventSlim + CancellationToken)
  • Fichiers prioritaires : extensions configurables transférées en premier par tous les travaux (barrière globale Interlocked)
  • Fichiers volumineux : un seul fichier dépassant maxLargeFileTransferSizeKB transféré à la fois (SemaphoreSlim(1,1))
  • CryptoSoft mono-instance : Mutex nommé empêchant les exécutions simultanées
  • Auto-pause logiciel métier : détection par timer (1s) ; pause automatique de tous les travaux si le processus métier est actif ; reprise automatique à la fermeture
  • Paramètres v3.0 : extensions prioritaires, taille max fichier volumineux (Ko), mode de log (Local/Server/Both), URL serveur de log
  • Thème Dark / Light : bouton de bascule dans l'en-tête de l'application ; le choix persiste dans settings.json entre les redémarrages
  • Logo & Icône : logo bouclier + flèche (SVG vectoriel) affiché dans l'en-tête et comme icône de fenêtre / barre des tâches
  • Design moderne : boutons colorés sémantiques (teal = action, vert = exécution, ambre = pause, rouge = danger), cartes arrondies, styles globaux Fluent

Technique

  • Nouveaux modèles : JobStatus (enum), JobController (ManualResetEventSlim + CancellationTokenSource)
  • Nouveau ViewModel : JobProgressViewModel (progression temps réel par travail)
  • StateManager thread-safe (lock sur toutes les E/S fichier)
  • ConcurrentDictionary pour les JobControllers
  • Interface : panneau de progression par travail avec boutons Pause/Reprise/Stop
  • Thème persistant : champ theme dans AppSettings ; App.ToggleTheme() sauvegarde via ConfigurationManager
  • Icône app : rendu vectoriel RenderTargetBitmap (64×64) à partir de StreamGeometry, mis en cache dans WindowIcon
  • Styles AXAML globaux : classes .accent, .danger, .warning, .success, .ghost, .icon-btn, .card dans App.axaml
  • CI/CD : workflow GitHub Actions sur v1.0, v1.1, v2.0, v3.0, main, develop ; build et tests sur Windows, Linux et macOS ; sur les branches version (v*), publish self-contained puis création/mise à jour automatique d’une Release GitHub avec les archives EasySave_<version>_windows.zip, _linux.tar.gz, _macos.tar.gz (téléchargement depuis la page Releases)
  • Build : 0 erreurs, 0 warnings ; 176 tests unitaires et d'intégration
v2.0 Livrable 2

Nouveautés

  • Interface graphique : abandon du mode console, application Avalonia UI (XAML)
  • Travaux illimités : plus de limite à 5 travaux
  • CryptoSoft : chiffrement des fichiers selon extensions définies dans les paramètres ; temps de cryptage dans le log
  • Logiciel métier : détection du processus configuré ; interdiction de lancer un travail si actif ; arrêt après le fichier en cours et consignation dans le log
  • Paramètres : langue, format log (JSON/XML), extensions à chiffrer, chemin logiciel métier

Technique

  • Architecture MVVM ; ViewModels (Main, JobEdit, Settings) ; vues Avalonia
  • Ligne de commande identique aux v1.0 et v1.1
v1.1 11 Février 2026

Nouveautés

  • Logs XML : choix du format de fichier log (JSON ou XML)
  • Interface console améliorée ; recyclage des ID après suppression

Correctifs

  • Barre de progression (0% sur différentiel vide) ; limite de 5 jobs strictement appliquée
v1.0 04 Février 2026

Fonctionnalités principales

  • Application Console (.NET)
  • Gestion de 5 travaux de sauvegarde maximum
  • Sauvegardes complètes et différentielles
  • Support multilingue (FR/EN)
  • Exécution séquentielle ou spécifique (CLI)

Technique

  • Architecture MVC
  • Logs journaliers JSON (EasyLog.dll), état temps réel (state.json)
  • Support UNC et lecteurs réseaux

v1.0 — Détail complémentaire

Gestion des sauvegardes : Jusqu'à 5 travaux ; sauvegarde complète (tous les fichiers) et différentielle (fichiers modifiés) ; récursive (sous-répertoires) ; disques locaux, externes et réseau.

Modes d'exécution : Mode interactif (menu) ; ligne de commande EasySave 1-3 ou EasySave 1;3 ; exécution séquentielle.

Multilingue : Français (par défaut), Anglais.

Journalisation : Fichiers log journaliers (YYYY-MM-DD.json), état temps réel (state.json), chemins au format UNC.

Composant Version
.NET 10.0
Architecture MVC (Console)
Format des données JSON
Plateformes Windows, macOS, Linux

Limitations connues (v1.0)

  • Maximum 5 travaux de sauvegarde
  • Exécution séquentielle uniquement (parallèle prévu en v3.0)
  • Format de log JSON uniquement (XML ajouté en v1.1)

Évolutions livrées en v2.0 (par rapport à la v1.1)

  • Interface graphique (Avalonia)
  • Travaux de sauvegarde illimités
  • Chiffrement des fichiers (CryptoSoft)
  • Détection du logiciel métier

Ces évolutions sont livrées dans la version 2.0.