mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-09-18 22:29:20 +03:00
fa5d7a255b
* v5: Health Check & LeastLoad Strategy (rebased from 2c5a71490368500a982018a74a6d519c7e121816) Some changes will be necessary to integrate it into V2Ray * Update proto * parse duration conf with time.Parse() * moving health ping to observatory as a standalone component * moving health ping to observatory as a standalone component: auto generated file * add initialization for health ping * incorporate changes in router implementation * support principle target output * add v4 json support for BurstObservatory & fix balancer reference * update API command * remove cancelled API * return zero length value when observer is not found * remove duplicated targeted dispatch * adjust test with updated structure * bug fix for observer * fix strategy selector * fix strategy least load * Fix ticker usage ticker.Close does not close ticker.C * feat: Replace default Health Ping URL to HTTPS (#1991) * fix selectLeastLoad() returns wrong number of nodes (#2083) * Test: fix leastload strategy unit test * fix(router): panic caused by concurrent map read and write (#2678) * Clean up code --------- Co-authored-by: Jebbs <qjebbs@gmail.com> Co-authored-by: Shelikhoo <xiaokangwang@outlook.com> Co-authored-by: 世界 <i@sekai.icu> Co-authored-by: Bernd Eichelberger <46166740+4-FLOSS-Free-Libre-Open-Source-Software@users.noreply.github.com> Co-authored-by: 秋のかえで <autmaple@protonmail.com> Co-authored-by: Rinka <kujourinka@gmail.com>
107 lines
2.4 KiB
Go
107 lines
2.4 KiB
Go
package burst_test
|
|
|
|
import (
|
|
"math"
|
|
reflect "reflect"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/xtls/xray-core/app/observatory/burst"
|
|
)
|
|
|
|
func TestHealthPingResults(t *testing.T) {
|
|
rtts := []int64{60, 140, 60, 140, 60, 60, 140, 60, 140}
|
|
hr := burst.NewHealthPingResult(4, time.Hour)
|
|
for _, rtt := range rtts {
|
|
hr.Put(time.Duration(rtt))
|
|
}
|
|
rttFailed := time.Duration(math.MaxInt64)
|
|
expected := &burst.HealthPingStats{
|
|
All: 4,
|
|
Fail: 0,
|
|
Deviation: 40,
|
|
Average: 100,
|
|
Max: 140,
|
|
Min: 60,
|
|
}
|
|
actual := hr.Get()
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
t.Errorf("expected: %v, actual: %v", expected, actual)
|
|
}
|
|
hr.Put(rttFailed)
|
|
hr.Put(rttFailed)
|
|
expected.Fail = 2
|
|
actual = hr.Get()
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
t.Errorf("failed half-failures test, expected: %v, actual: %v", expected, actual)
|
|
}
|
|
hr.Put(rttFailed)
|
|
hr.Put(rttFailed)
|
|
expected = &burst.HealthPingStats{
|
|
All: 4,
|
|
Fail: 4,
|
|
Deviation: 0,
|
|
Average: 0,
|
|
Max: 0,
|
|
Min: 0,
|
|
}
|
|
actual = hr.Get()
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
t.Errorf("failed all-failures test, expected: %v, actual: %v", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestHealthPingResultsIgnoreOutdated(t *testing.T) {
|
|
rtts := []int64{60, 140, 60, 140}
|
|
hr := burst.NewHealthPingResult(4, time.Duration(10)*time.Millisecond)
|
|
for i, rtt := range rtts {
|
|
if i == 2 {
|
|
// wait for previous 2 outdated
|
|
time.Sleep(time.Duration(10) * time.Millisecond)
|
|
}
|
|
hr.Put(time.Duration(rtt))
|
|
}
|
|
hr.Get()
|
|
expected := &burst.HealthPingStats{
|
|
All: 2,
|
|
Fail: 0,
|
|
Deviation: 40,
|
|
Average: 100,
|
|
Max: 140,
|
|
Min: 60,
|
|
}
|
|
actual := hr.Get()
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
t.Errorf("failed 'half-outdated' test, expected: %v, actual: %v", expected, actual)
|
|
}
|
|
// wait for all outdated
|
|
time.Sleep(time.Duration(10) * time.Millisecond)
|
|
expected = &burst.HealthPingStats{
|
|
All: 0,
|
|
Fail: 0,
|
|
Deviation: 0,
|
|
Average: 0,
|
|
Max: 0,
|
|
Min: 0,
|
|
}
|
|
actual = hr.Get()
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
t.Errorf("failed 'outdated / not-tested' test, expected: %v, actual: %v", expected, actual)
|
|
}
|
|
|
|
hr.Put(time.Duration(60))
|
|
expected = &burst.HealthPingStats{
|
|
All: 1,
|
|
Fail: 0,
|
|
// 1 sample, std=0.5rtt
|
|
Deviation: 30,
|
|
Average: 60,
|
|
Max: 60,
|
|
Min: 60,
|
|
}
|
|
actual = hr.Get()
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
t.Errorf("expected: %v, actual: %v", expected, actual)
|
|
}
|
|
}
|