CI / go-test (push) Canceled after 0s
CI / postgres-durable-first (push) Canceled after 0s
CI / codegen (push) Canceled after 0s
CI / govulncheck (push) Canceled after 0s
CI / race (push) Canceled after 0s
CI / fuzz-smoke (push) Canceled after 0s
CI / golangci (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CodeQL Advanced / Analyze (go) (push) Canceled after 0s
CodeQL Advanced / Analyze (actions) (push) Canceled after 0s
CodeQL Advanced / Analyze (javascript-typescript) (push) Canceled after 0s
Docs CI / build (push) Canceled after 0s
Docs Deploy (GitHub Pages) / build (push) Canceled after 0s
Release 3X-UI / build (386) (push) Canceled after 0s
Release 3X-UI / build (amd64) (push) Canceled after 0s
Release 3X-UI / build (arm64) (push) Canceled after 0s
Release 3X-UI / build (armv5) (push) Canceled after 0s
Release 3X-UI / build (armv6) (push) Canceled after 0s
Release 3X-UI / build (armv7) (push) Canceled after 0s
Release 3X-UI / build (s390x) (push) Canceled after 0s
Release 3X-UI / Build for Windows (amd64) (push) Canceled after 0s
Deploy Smoke Tests / noninteractive-install (ubuntu-24.04-arm) (push) Canceled after 0s
Deploy Smoke Tests / noninteractive-install (ubuntu-latest) (push) Canceled after 0s
Deploy Smoke Tests / release-tag-install (ubuntu-24.04-arm) (push) Canceled after 0s
Deploy Smoke Tests / release-tag-install (ubuntu-latest) (push) Canceled after 0s
Docs Deploy (GitHub Pages) / deploy (push) Canceled after 0s
Release 3X-UI / Publish rolling dev release (push) Canceled after 0s
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package service
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/mhsanaei/3x-ui/v3/internal/xray"
|
|
)
|
|
|
|
func TestXrayLifecycleSnapshotDoesNotOverwriteNewerResult(t *testing.T) {
|
|
state := xrayLifecycle{}
|
|
first := xray.NewProcess(&xray.Config{})
|
|
second := xray.NewProcess(&xray.Config{})
|
|
|
|
state.replace(first)
|
|
state.storeResult(first, "first result")
|
|
process, result := state.snapshot()
|
|
if process != first || result != "first result" {
|
|
t.Fatalf("snapshot = (%p, %q), want (%p, %q)", process, result, first, "first result")
|
|
}
|
|
state.replace(second)
|
|
state.storeResult(first, "old result")
|
|
|
|
process, result = state.snapshot()
|
|
if process != second {
|
|
t.Fatal("snapshot returned the replaced process")
|
|
}
|
|
if result != "" {
|
|
t.Fatalf("snapshot result = %q, want empty", result)
|
|
}
|
|
}
|
|
|
|
func TestXrayLifecycleConcurrentStatusResultAndTrafficReads(t *testing.T) {
|
|
previousProcess, previousResult := xrayState.snapshot()
|
|
t.Cleanup(func() {
|
|
xrayState.mu.Lock()
|
|
xrayState.process = previousProcess
|
|
xrayState.result = previousResult
|
|
xrayState.mu.Unlock()
|
|
})
|
|
|
|
first := xray.NewProcess(&xray.Config{})
|
|
second := xray.NewProcess(&xray.Config{})
|
|
service := XrayService{}
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Go(func() {
|
|
for range 200 {
|
|
xrayState.replace(first)
|
|
xrayState.replace(second)
|
|
}
|
|
})
|
|
|
|
for range 4 {
|
|
wg.Go(func() {
|
|
for range 200 {
|
|
_ = service.IsXrayRunning()
|
|
_ = service.GetXrayResult()
|
|
_, _, err := service.GetXrayTraffic()
|
|
if err == nil || err.Error() != "xray is not running" {
|
|
t.Errorf("GetXrayTraffic error = %v, want xray is not running", err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
wg.Wait()
|
|
}
|