Files
RocketDev 0104fa8405 feat: display geosite date if gfwlist absent
Currently, if system /usr/share/v2raya/geosite.dat is used, v2raya will
not post error, but will display "none" for local GFWList date.
Since v2rayA reads this compatible file, we should display a date for
it, so that user is not confused.

Assisted-by: GPT-5.6-terra
2026-09-21 03:29:57 +08:00

93 lines
2.8 KiB
Go

package controller
import (
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/v2rayA/v2rayA/common"
)
func TestGetSettingReportsGFWListAndGeoSiteVersionsSeparately(t *testing.T) {
assetDir := t.TempDir()
t.Setenv("XRAY_LOCATION_ASSET", assetDir)
date := time.Date(2026, time.September, 15, 12, 0, 0, 0, time.Local)
for _, name := range []string{"LoyalsoldierSite.dat", "geosite.dat"} {
path := filepath.Join(assetDir, name)
if err := os.WriteFile(path, []byte("dat"), 0644); err != nil {
t.Fatal(err)
}
if err := os.Chtimes(path, date, date); err != nil {
t.Fatal(err)
}
}
recorder := httptest.NewRecorder()
ctx, _ := gin.CreateTestContext(recorder)
ctx.Request = httptest.NewRequest(http.MethodGet, "/setting", nil)
GetSetting(ctx)
var response struct {
Data struct {
LocalGFWListVersion string `json:"localGFWListVersion"`
LocalGeositeVersion string `json:"localGeositeVersion"`
} `json:"data"`
}
if err := json.Unmarshal(recorder.Body.Bytes(), &response); err != nil {
t.Fatal(err)
}
if response.Data.LocalGFWListVersion != "2026-09-15" {
t.Errorf("localGFWListVersion = %q, want 2026-09-15", response.Data.LocalGFWListVersion)
}
if response.Data.LocalGeositeVersion != "2026-09-15" {
t.Errorf("localGeositeVersion = %q, want 2026-09-15", response.Data.LocalGeositeVersion)
}
}
func TestGetVersionIncludesDockerFlag(t *testing.T) {
recorder := httptest.NewRecorder()
ctx, _ := gin.CreateTestContext(recorder)
ctx.Request = httptest.NewRequest(http.MethodGet, "/version", nil)
GetVersion(ctx)
var response struct {
Data struct {
Docker *bool `json:"docker"`
} `json:"data"`
}
if err := json.Unmarshal(recorder.Body.Bytes(), &response); err != nil {
t.Fatal(err)
}
if response.Data.Docker == nil || *response.Data.Docker != common.IsDocker() {
t.Fatalf("docker = %v, want %v", response.Data.Docker, common.IsDocker())
}
}
type versionTransport func(*http.Request) (*http.Response, error)
func (f versionTransport) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) }
func TestRemoteVersionRequestHasDeadline(t *testing.T) {
old := http.DefaultTransport
defer func() { http.DefaultTransport = old }()
called := false
http.DefaultTransport = versionTransport(func(r *http.Request) (*http.Response, error) {
called = true
if _, ok := r.Context().Deadline(); !ok {
t.Error("remote version request has no deadline")
}
return &http.Response{StatusCode: 200, Status: "200 OK", Body: io.NopCloser(strings.NewReader(`[]`)), Header: make(http.Header)}, nil
})
ctx, _ := gin.CreateTestContext(httptest.NewRecorder())
ctx.Request = httptest.NewRequest(http.MethodGet, "/", nil)
GetRemoteGFWListVersion(ctx)
if !called {
t.Fatal("remote version was not queried")
}
}