package updatepackage import ( "archive/zip" "bytes" "os" "path/filepath" "strings" "testing" ) // TestOpenAndCopyDirectNativeJAR 验证正常流程:打开直接提供的 JAR 后元数据正确, // 且 CopyArtifact 复制出的内容与源文件完全一致。 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) } } // TestOpenDirectNativeJARRejectsInvalidArchive 验证内容并非合法 ZIP 的 JAR 文件 // 会被 OpenDirectNativeJAR 拒绝。 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") } } // TestCopyDirectNativeJARRejectsChangedSource 验证源 JAR 在 OpenDirectNativeJAR // 之后被替换时,CopyArtifact 会返回包含 "changed" 的错误。 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) } } // writeDirectNativeJAR 在临时目录创建名为 fileName 的 JAR,内含一个 // BOOT-INF/classes/application.properties 条目,内容为 content,返回文件路径。 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 }