mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-16 03:39:29 +02:00
- si AJEAN tourne, remplacer le binaire ne changeait RIEN a l'ecran (l'ancienne version restait en memoire) et rien ne le disait. On demande desormais s'il faut fermer et redemarrer pour appliquer la mise a jour, versions affichees. - si la version installee est PLUS RECENTE que le fichier lance : avertissement, aucun remplacement, choix entre demarrer et fermer. Avant, une version plus ancienne prenait la place sans un mot. - version installee illisible (binaire anterieur aux ressources de version) : traitee comme ancienne donc remplacable. La traiter comme egale condamnait ces installations a ne plus jamais se mettre a jour, en silence. - raccourcis verifies a chaque demarrage et recrees s'ils manquent, et ranges dans le dossier « Programmes » du menu Demarrer (ils etaient a la racine, donc introuvables par la recherche). La desinstallation nettoie les deux endroits. - les instances en cours sont reperees par CHEMIN complet, jamais par nom d'image : un taskkill /IM jean.exe emporterait le processus courant.
68 lines
2.3 KiB
Go
68 lines
2.3 KiB
Go
//go:build windows
|
|
|
|
package jean
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"testing"
|
|
)
|
|
|
|
// binaryVersion pilote la mise à jour automatique du binaire installé quand on
|
|
// lance le fichier téléchargé : si elle renvoie du vide, plus aucune mise à jour
|
|
// n'a lieu, et en silence. C'est exactement ce qui arrivait avec la première
|
|
// implémentation (exécuter `jean version`, dont la sortie est vide pour un
|
|
// binaire en sous-système GUI). D'où ces tests sur la plomberie syscall.
|
|
func TestBinaryVersionReadsResource(t *testing.T) {
|
|
// kernel32.dll porte toujours une ressource de version.
|
|
dll := filepath.Join(os.Getenv("SystemRoot"), "System32", "kernel32.dll")
|
|
if _, err := os.Stat(dll); err != nil {
|
|
t.Skip("kernel32.dll introuvable")
|
|
}
|
|
v := binaryVersion(dll)
|
|
if !regexp.MustCompile(`^\d+\.\d+\.\d+$`).MatchString(v) {
|
|
t.Fatalf("binaryVersion(kernel32.dll) = %q, attendu une version x.y.z", v)
|
|
}
|
|
}
|
|
|
|
// replaceInstalled doit écraser le binaire en place, y compris quand le fichier
|
|
// cible existe déjà, et laisser l'ancien de côté sans le confondre avec la cible.
|
|
func TestReplaceInstalled(t *testing.T) {
|
|
dir := t.TempDir()
|
|
target := filepath.Join(dir, "jean.exe")
|
|
if err := os.WriteFile(target, []byte("ancienne version"), 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := replaceInstalled(target); err != nil {
|
|
t.Fatalf("replaceInstalled : %v", err)
|
|
}
|
|
got, err := os.ReadFile(target)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// installSelf copie l'exécutable courant (ici le binaire de test).
|
|
self, err := os.ReadFile(os.Args[0])
|
|
if err != nil {
|
|
t.Skip("binaire de test illisible")
|
|
}
|
|
if len(got) != len(self) {
|
|
t.Fatalf("cible = %d octets, attendu %d (le binaire courant)", len(got), len(self))
|
|
}
|
|
if _, err := os.Stat(target + ".old"); err == nil {
|
|
t.Error(".old subsiste alors que la cible n'était pas verrouillée")
|
|
}
|
|
}
|
|
|
|
// Un fichier sans ressource de version doit renvoyer "" : runAsInstaller s'en
|
|
// sert pour s'abstenir plutôt que de remplacer un binaire au hasard.
|
|
func TestBinaryVersionWithoutResource(t *testing.T) {
|
|
p := filepath.Join(t.TempDir(), "vide.exe")
|
|
if err := os.WriteFile(p, []byte("pas un exe"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if v := binaryVersion(p); v != "" {
|
|
t.Fatalf("binaryVersion sur un fichier sans ressource = %q, attendu \"\"", v)
|
|
}
|
|
}
|