89 lines
2.7 KiB
Go
89 lines
2.7 KiB
Go
|
|
package updatepackage
|
||
|
|
|
||
|
|
import (
|
||
|
|
"archive/zip"
|
||
|
|
"bytes"
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestOpenAndCopyDirectNativeJAR(t *testing.T) {
|
||
|
|
jarPath := writeDirectNativeJAR(t, "glory-soft-yms.jar", []byte("backend classes"))
|
||
|
|
jar, err := OpenDirectNativeJAR(jarPath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("open direct native backend JAR: %v", err)
|
||
|
|
}
|
||
|
|
if jar.FileName != "glory-soft-yms.jar" || jar.SHA256 == "" || jar.Identity.Size <= 0 {
|
||
|
|
t.Fatalf("unexpected direct native backend JAR metadata: %+v", jar)
|
||
|
|
}
|
||
|
|
|
||
|
|
destination := filepath.Join(t.TempDir(), "transaction", "backend.jar")
|
||
|
|
if err := jar.CopyArtifact(destination); err != nil {
|
||
|
|
t.Fatalf("copy direct native backend JAR: %v", err)
|
||
|
|
}
|
||
|
|
expected, err := os.ReadFile(jarPath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("read source JAR: %v", err)
|
||
|
|
}
|
||
|
|
actual, err := os.ReadFile(destination)
|
||
|
|
if err != nil || !bytes.Equal(actual, expected) {
|
||
|
|
t.Fatalf("unexpected copied JAR: err=%v", err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestOpenDirectNativeJARRejectsInvalidArchive(t *testing.T) {
|
||
|
|
path := filepath.Join(t.TempDir(), "glory-soft-yms.jar")
|
||
|
|
if err := os.WriteFile(path, []byte("not a JAR"), 0o600); err != nil {
|
||
|
|
t.Fatalf("write invalid JAR: %v", err)
|
||
|
|
}
|
||
|
|
if _, err := OpenDirectNativeJAR(path); err == nil {
|
||
|
|
t.Fatal("expected invalid direct JAR rejection")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCopyDirectNativeJARRejectsChangedSource(t *testing.T) {
|
||
|
|
jarPath := writeDirectNativeJAR(t, "glory-soft-yms.jar", []byte("first"))
|
||
|
|
jar, err := OpenDirectNativeJAR(jarPath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("open direct native backend JAR: %v", err)
|
||
|
|
}
|
||
|
|
replacement := writeDirectNativeJAR(t, "replacement.jar", []byte("second"))
|
||
|
|
content, err := os.ReadFile(replacement)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("read replacement JAR: %v", err)
|
||
|
|
}
|
||
|
|
if err := os.WriteFile(jarPath, content, 0o600); err != nil {
|
||
|
|
t.Fatalf("replace source JAR: %v", err)
|
||
|
|
}
|
||
|
|
err = jar.CopyArtifact(filepath.Join(t.TempDir(), "backend.jar"))
|
||
|
|
if err == nil || !strings.Contains(err.Error(), "changed") {
|
||
|
|
t.Fatalf("expected changed source rejection, got %v", err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func writeDirectNativeJAR(t *testing.T, fileName string, content []byte) string {
|
||
|
|
t.Helper()
|
||
|
|
jarPath := filepath.Join(t.TempDir(), fileName)
|
||
|
|
file, err := os.Create(jarPath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("create direct JAR: %v", err)
|
||
|
|
}
|
||
|
|
writer := zip.NewWriter(file)
|
||
|
|
entry, err := writer.Create("BOOT-INF/classes/application.properties")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("create direct JAR entry: %v", err)
|
||
|
|
}
|
||
|
|
if _, err := entry.Write(content); err != nil {
|
||
|
|
t.Fatalf("write direct JAR entry: %v", err)
|
||
|
|
}
|
||
|
|
if err := writer.Close(); err != nil {
|
||
|
|
t.Fatalf("close direct JAR writer: %v", err)
|
||
|
|
}
|
||
|
|
if err := file.Close(); err != nil {
|
||
|
|
t.Fatalf("close direct JAR: %v", err)
|
||
|
|
}
|
||
|
|
return jarPath
|
||
|
|
}
|