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 }