mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-08 00:26:37 +08:00
[优化] 添加服务器升级日志功能,记录升级状态和日志信息;更新相关类型定义以支持日志展示
This commit is contained in:
@@ -4,17 +4,28 @@ import (
|
||||
"atsflare/common"
|
||||
"bytes"
|
||||
"context"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type roundTripFunc func(req *http.Request) (*http.Response, error)
|
||||
|
||||
func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
return f(req)
|
||||
}
|
||||
|
||||
func resetServerUpgradeTestState(t *testing.T) {
|
||||
t.Helper()
|
||||
serverUpgradeState.Lock()
|
||||
serverUpgradeState.inProgress = false
|
||||
serverUpgradeState.status = ""
|
||||
serverUpgradeState.logs = nil
|
||||
serverUpgradeState.Unlock()
|
||||
manualServerBinaryState.Lock()
|
||||
cleanupManualServerBinaryCandidateLocked()
|
||||
@@ -282,3 +293,113 @@ func TestConfirmManualServerUpgrade(t *testing.T) {
|
||||
t.Fatal("expected manual upgrade executor to be called")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildLatestServerReleaseViewIncludesUpgradeLogs(t *testing.T) {
|
||||
originalVersion := common.Version
|
||||
common.Version = "v0.4.0"
|
||||
t.Cleanup(func() {
|
||||
common.Version = originalVersion
|
||||
resetServerUpgradeTestState(t)
|
||||
})
|
||||
|
||||
serverUpgradeState.Lock()
|
||||
serverUpgradeState.inProgress = true
|
||||
serverUpgradeState.status = "running"
|
||||
serverUpgradeState.logs = []ServerUpgradeLogRecord{
|
||||
{
|
||||
Level: "info",
|
||||
Message: "download started",
|
||||
CreatedAt: time.Now(),
|
||||
},
|
||||
}
|
||||
serverUpgradeState.Unlock()
|
||||
|
||||
view := buildLatestServerReleaseView(&githubReleaseResponse{
|
||||
TagName: "v0.5.0",
|
||||
}, ReleaseChannelStable)
|
||||
|
||||
if view.UpgradeStatus != "running" {
|
||||
t.Fatalf("expected upgrade status to be running, got %s", view.UpgradeStatus)
|
||||
}
|
||||
if len(view.UpgradeLogs) != 1 {
|
||||
t.Fatalf("expected one upgrade log, got %d", len(view.UpgradeLogs))
|
||||
}
|
||||
if view.UpgradeLogs[0].Message != "download started" {
|
||||
t.Fatalf("unexpected upgrade log message: %s", view.UpgradeLogs[0].Message)
|
||||
}
|
||||
}
|
||||
|
||||
func TestScheduleServerUpgradeUsesDownloadedBinaryValidation(t *testing.T) {
|
||||
originalVersion := common.Version
|
||||
originalClient := UpdateHTTPClientForTest()
|
||||
originalExecutor := ServerBinaryUpgradeExecutorForTest()
|
||||
originalDelay := ServerUpgradeDispatchDelayForTest()
|
||||
common.Version = "v0.4.0"
|
||||
called := make(chan string, 1)
|
||||
|
||||
SetUpdateHTTPClientForTest(&http.Client{
|
||||
Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) {
|
||||
switch req.URL.String() {
|
||||
case "https://api.github.com/repos/Rain-kl/ATSFlare/releases/latest":
|
||||
return &http.Response{
|
||||
StatusCode: http.StatusOK,
|
||||
Header: make(http.Header),
|
||||
Body: io.NopCloser(strings.NewReader(`{
|
||||
"tag_name":"v0.5.0",
|
||||
"body":"release notes",
|
||||
"html_url":"https://github.com/Rain-kl/ATSFlare/releases/tag/v0.5.0",
|
||||
"published_at":"2026-03-11T00:00:00Z",
|
||||
"assets":[{"name":"atsflare-server-` + runtime.GOOS + `-` + runtime.GOARCH + `","browser_download_url":"https://downloads.example.com/atsflare-server"}]
|
||||
}`)),
|
||||
}, nil
|
||||
case "https://downloads.example.com/atsflare-server":
|
||||
_, content := fakeServerBinaryFixture("v0.5.0")
|
||||
return &http.Response{
|
||||
StatusCode: http.StatusOK,
|
||||
Header: make(http.Header),
|
||||
Body: io.NopCloser(bytes.NewReader(content)),
|
||||
}, nil
|
||||
default:
|
||||
t.Fatalf("unexpected request url: %s", req.URL.String())
|
||||
return nil, nil
|
||||
}
|
||||
}),
|
||||
})
|
||||
SetServerBinaryUpgradeExecutorForTest(func(execPath string, tempPath string) error {
|
||||
called <- tempPath
|
||||
return nil
|
||||
})
|
||||
SetServerUpgradeDispatchDelayForTest(0)
|
||||
t.Cleanup(func() {
|
||||
common.Version = originalVersion
|
||||
SetUpdateHTTPClientForTest(originalClient)
|
||||
SetServerBinaryUpgradeExecutorForTest(originalExecutor)
|
||||
SetServerUpgradeDispatchDelayForTest(originalDelay)
|
||||
resetServerUpgradeTestState(t)
|
||||
})
|
||||
|
||||
release, err := ScheduleServerUpgrade("stable")
|
||||
if err != nil {
|
||||
t.Fatalf("expected schedule to succeed: %v", err)
|
||||
}
|
||||
if !release.InProgress {
|
||||
t.Fatal("expected release to report in-progress upgrade")
|
||||
}
|
||||
|
||||
select {
|
||||
case tempPath := <-called:
|
||||
if tempPath == "" {
|
||||
t.Fatal("expected upgrade executor to receive temp path")
|
||||
}
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("expected automatic upgrade executor to be called")
|
||||
}
|
||||
|
||||
_, status, logs := snapshotServerUpgradeState()
|
||||
if status != "succeeded" {
|
||||
t.Fatalf("expected succeeded status after executor call, got %s", status)
|
||||
}
|
||||
if len(logs) == 0 {
|
||||
t.Fatal("expected upgrade logs to be recorded")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user