mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-18 04:36:44 +02:00
- Windows : quand AJEAN est deja installe, lancer le fichier telecharge remplace le binaire installe (s'il est plus recent) puis demarre l'application, sans message. La 0.6.10 annoncait « vous lancez une copie » puis demarrait quand meme : une information inactionnable suivie d'un comportement non annonce. Le refus d'installation est desormais memorise (.install_declined). - la version du binaire installe est lue dans les ressources du fichier (VS_VERSIONINFO). L'implementation evidente (executer `jean version` et lire la sortie) renvoie du VIDE : le binaire est en sous-systeme GUI et n'ecrit pas dans un tuyau, donc la mise a jour ne se serait jamais faite, en silence. Piege documente dans le code + deux tests. - UI : les emplacements passent sous le journal du moteur (clic sur la pastille d'etat) au lieu d'un bouton isole dans les actions.
40 lines
1.4 KiB
Go
40 lines
1.4 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)
|
|
}
|
|
}
|
|
|
|
// Un fichier sans ressource de version doit renvoyer "" : upgradeInstalled 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)
|
|
}
|
|
}
|