feat: backend native executor implement

This commit is contained in:
2026-08-16 01:27:30 +08:00
parent fbce91d797
commit 390e0565d3
44 changed files with 6430 additions and 31 deletions
+111
View File
@@ -0,0 +1,111 @@
package main
import (
"bytes"
"context"
"os"
"path/filepath"
"testing"
"yms-daemon/internal/daemonapi"
)
func TestParseUpdateArgsAcceptsBackendAndResolvesFile(t *testing.T) {
file := filepath.Join(t.TempDir(), "package.zip")
if err := os.WriteFile(file, []byte("zip"), 0o600); err != nil {
t.Fatalf("write update package: %v", err)
}
request, err := parseUpdateArgs([]string{"--service", "backend", "-f", file}, &bytes.Buffer{})
if err != nil {
t.Fatalf("parse backend update arguments: %v", err)
}
if request.service != "backend" || request.inputType != daemonapi.InputTypeRepackZIP || request.file != file {
t.Fatalf("unexpected backend update arguments: %+v", request)
}
}
func TestParseUpdateArgsAcceptsDirectNativeJAR(t *testing.T) {
file := filepath.Join(t.TempDir(), "glory-soft-yms.jar")
if err := os.WriteFile(file, []byte("jar"), 0o600); err != nil {
t.Fatalf("write native backend JAR: %v", err)
}
request, err := parseUpdateArgs([]string{"--service", "backend", "--native-jar", file}, &bytes.Buffer{})
if err != nil {
t.Fatalf("parse direct native backend update arguments: %v", err)
}
if request.service != "backend" || request.inputType != daemonapi.InputTypeNativeJAR || request.file != file {
t.Fatalf("unexpected direct native backend update arguments: %+v", request)
}
}
func TestParseUpdateArgsAcceptsQuite(t *testing.T) {
file := filepath.Join(t.TempDir(), "glory-soft-yms.jar")
if err := os.WriteFile(file, []byte("jar"), 0o600); err != nil {
t.Fatalf("write native backend JAR: %v", err)
}
request, err := parseUpdateArgs([]string{"--service", "backend", "--native-jar", file, "--quite"}, &bytes.Buffer{})
if err != nil {
t.Fatalf("parse quiet direct update arguments: %v", err)
}
if !request.quite {
t.Fatal("--quite was not retained")
}
}
func TestWriteUpdateProgress(t *testing.T) {
var output bytes.Buffer
writeUpdateProgress(&output, daemonapi.Response{State: "STARTING", Message: "Starting backend"})
if output.String() != "STARTING Starting backend\n" {
t.Fatalf("unexpected update progress: %q", output.String())
}
}
func TestParseRestartArgs(t *testing.T) {
request, err := parseRestartArgs([]string{"--service", "backend", "--quite"}, &bytes.Buffer{})
if err != nil {
t.Fatalf("parse backend restart arguments: %v", err)
}
if request.service != serviceBackend || !request.quite {
t.Fatalf("unexpected backend restart arguments: %+v", request)
}
}
func TestParseRestartArgsRejectsUnsupportedInput(t *testing.T) {
for name, arguments := range map[string][]string{
"missing service": nil,
"other service": {"--service", "frontend"},
"positional": {"--service", "backend", "extra"},
} {
t.Run(name, func(t *testing.T) {
if _, err := parseRestartArgs(arguments, &bytes.Buffer{}); err == nil {
t.Fatal("expected restart argument rejection")
}
})
}
}
func TestParseUpdateArgsRejectsIncompleteOrUnsupportedInput(t *testing.T) {
for name, arguments := range map[string][]string{
"missing service": {"-f", "/tmp/package.zip"},
"missing file": {"--service", "backend"},
"other service": {"--service", "frontend", "-f", "/tmp/package.zip"},
"positional": {"--service", "backend", "-f", "/tmp/package.zip", "extra"},
"both inputs": {"--service", "backend", "-f", "/tmp/package.zip", "--native-jar", "/tmp/backend.jar"},
} {
t.Run(name, func(t *testing.T) {
if _, err := parseUpdateArgs(arguments, &bytes.Buffer{}); err == nil {
t.Fatal("expected update argument rejection")
}
})
}
}
func TestRunPrintsUsageWithoutCommand(t *testing.T) {
var stderr bytes.Buffer
if exitCode := run(context.Background(), nil, &bytes.Buffer{}, &stderr); exitCode != 2 {
t.Fatalf("unexpected exit code: %d", exitCode)
}
if stderr.Len() == 0 {
t.Fatal("missing usage output")
}
}