Files
Loki/internal/jean/sys_firstrun_windows_test.go
T
nathaninline 1d58a7b1b9 v0.6.12 : le .exe telecharge gere le cas « AJEAN deja lance » et les retours en arriere
- 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.
2026-08-04 12:01:13 +02:00

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)
}
}