mirror of https://github.com/XTLS/Xray-core
				
				
				
			
		
			
				
	
	
		
			180 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
package router
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
/*
 | 
						|
Split into multiple package, need to be tested separately
 | 
						|
 | 
						|
	func TestSelectLeastLoad(t *testing.T) {
 | 
						|
		settings := &StrategyLeastLoadConfig{
 | 
						|
			HealthCheck: &HealthPingConfig{
 | 
						|
				SamplingCount: 10,
 | 
						|
			},
 | 
						|
			Expected: 1,
 | 
						|
			MaxRTT:   int64(time.Millisecond * time.Duration(800)),
 | 
						|
		}
 | 
						|
		strategy := NewLeastLoadStrategy(settings)
 | 
						|
		// std 40
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(60))
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(140))
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(60))
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(140))
 | 
						|
		// std 60
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(40))
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(160))
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(40))
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(160))
 | 
						|
		// std 0, but >MaxRTT
 | 
						|
		strategy.PutResult("c", time.Millisecond*time.Duration(1000))
 | 
						|
		strategy.PutResult("c", time.Millisecond*time.Duration(1000))
 | 
						|
		strategy.PutResult("c", time.Millisecond*time.Duration(1000))
 | 
						|
		strategy.PutResult("c", time.Millisecond*time.Duration(1000))
 | 
						|
		expected := "a"
 | 
						|
		actual := strategy.SelectAndPick([]string{"a", "b", "c", "untested"})
 | 
						|
		if actual != expected {
 | 
						|
			t.Errorf("expected: %v, actual: %v", expected, actual)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	func TestSelectLeastLoadWithCost(t *testing.T) {
 | 
						|
		settings := &StrategyLeastLoadConfig{
 | 
						|
			HealthCheck: &HealthPingConfig{
 | 
						|
				SamplingCount: 10,
 | 
						|
			},
 | 
						|
			Costs: []*StrategyWeight{
 | 
						|
				{Match: "a", Value: 9},
 | 
						|
			},
 | 
						|
			Expected: 1,
 | 
						|
		}
 | 
						|
		strategy := NewLeastLoadStrategy(settings, nil)
 | 
						|
		// std 40, std+c 120
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(60))
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(140))
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(60))
 | 
						|
		strategy.PutResult("a", time.Millisecond*time.Duration(140))
 | 
						|
		// std 60
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(40))
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(160))
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(40))
 | 
						|
		strategy.PutResult("b", time.Millisecond*time.Duration(160))
 | 
						|
		expected := "b"
 | 
						|
		actual := strategy.SelectAndPick([]string{"a", "b", "untested"})
 | 
						|
		if actual != expected {
 | 
						|
			t.Errorf("expected: %v, actual: %v", expected, actual)
 | 
						|
		}
 | 
						|
	}
 | 
						|
*/
 | 
						|
func TestSelectLeastExpected(t *testing.T) {
 | 
						|
	strategy := &LeastLoadStrategy{
 | 
						|
		settings: &StrategyLeastLoadConfig{
 | 
						|
			Baselines: nil,
 | 
						|
			Expected:  3,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodes := []*node{
 | 
						|
		{Tag: "a", RTTDeviationCost: 100},
 | 
						|
		{Tag: "b", RTTDeviationCost: 200},
 | 
						|
		{Tag: "c", RTTDeviationCost: 300},
 | 
						|
		{Tag: "d", RTTDeviationCost: 350},
 | 
						|
	}
 | 
						|
	expected := 3
 | 
						|
	ns := strategy.selectLeastLoad(nodes)
 | 
						|
	if len(ns) != expected {
 | 
						|
		t.Errorf("expected: %v, actual: %v", expected, len(ns))
 | 
						|
	}
 | 
						|
}
 | 
						|
func TestSelectLeastExpected2(t *testing.T) {
 | 
						|
	strategy := &LeastLoadStrategy{
 | 
						|
		settings: &StrategyLeastLoadConfig{
 | 
						|
			Baselines: nil,
 | 
						|
			Expected:  3,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodes := []*node{
 | 
						|
		{Tag: "a", RTTDeviationCost: 100},
 | 
						|
		{Tag: "b", RTTDeviationCost: 200},
 | 
						|
	}
 | 
						|
	expected := 2
 | 
						|
	ns := strategy.selectLeastLoad(nodes)
 | 
						|
	if len(ns) != expected {
 | 
						|
		t.Errorf("expected: %v, actual: %v", expected, len(ns))
 | 
						|
	}
 | 
						|
}
 | 
						|
func TestSelectLeastExpectedAndBaselines(t *testing.T) {
 | 
						|
	strategy := &LeastLoadStrategy{
 | 
						|
		settings: &StrategyLeastLoadConfig{
 | 
						|
			Baselines: []int64{200, 300, 400},
 | 
						|
			Expected:  3,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodes := []*node{
 | 
						|
		{Tag: "a", RTTDeviationCost: 100},
 | 
						|
		{Tag: "b", RTTDeviationCost: 200},
 | 
						|
		{Tag: "c", RTTDeviationCost: 250},
 | 
						|
		{Tag: "d", RTTDeviationCost: 300},
 | 
						|
		{Tag: "e", RTTDeviationCost: 310},
 | 
						|
	}
 | 
						|
	expected := 3
 | 
						|
	ns := strategy.selectLeastLoad(nodes)
 | 
						|
	if len(ns) != expected {
 | 
						|
		t.Errorf("expected: %v, actual: %v", expected, len(ns))
 | 
						|
	}
 | 
						|
}
 | 
						|
func TestSelectLeastExpectedAndBaselines2(t *testing.T) {
 | 
						|
	strategy := &LeastLoadStrategy{
 | 
						|
		settings: &StrategyLeastLoadConfig{
 | 
						|
			Baselines: []int64{200, 300, 400},
 | 
						|
			Expected:  3,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodes := []*node{
 | 
						|
		{Tag: "a", RTTDeviationCost: 500},
 | 
						|
		{Tag: "b", RTTDeviationCost: 600},
 | 
						|
		{Tag: "c", RTTDeviationCost: 700},
 | 
						|
		{Tag: "d", RTTDeviationCost: 800},
 | 
						|
		{Tag: "e", RTTDeviationCost: 900},
 | 
						|
	}
 | 
						|
	expected := 3
 | 
						|
	ns := strategy.selectLeastLoad(nodes)
 | 
						|
	if len(ns) != expected {
 | 
						|
		t.Errorf("expected: %v, actual: %v", expected, len(ns))
 | 
						|
	}
 | 
						|
}
 | 
						|
func TestSelectLeastLoadBaselines(t *testing.T) {
 | 
						|
	strategy := &LeastLoadStrategy{
 | 
						|
		settings: &StrategyLeastLoadConfig{
 | 
						|
			Baselines: []int64{200, 400, 600},
 | 
						|
			Expected:  0,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodes := []*node{
 | 
						|
		{Tag: "a", RTTDeviationCost: 100},
 | 
						|
		{Tag: "b", RTTDeviationCost: 200},
 | 
						|
		{Tag: "c", RTTDeviationCost: 300},
 | 
						|
	}
 | 
						|
	expected := 1
 | 
						|
	ns := strategy.selectLeastLoad(nodes)
 | 
						|
	if len(ns) != expected {
 | 
						|
		t.Errorf("expected: %v, actual: %v", expected, len(ns))
 | 
						|
	}
 | 
						|
}
 | 
						|
func TestSelectLeastLoadBaselinesNoQualified(t *testing.T) {
 | 
						|
	strategy := &LeastLoadStrategy{
 | 
						|
		settings: &StrategyLeastLoadConfig{
 | 
						|
			Baselines: []int64{200, 400, 600},
 | 
						|
			Expected:  0,
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodes := []*node{
 | 
						|
		{Tag: "a", RTTDeviationCost: 800},
 | 
						|
		{Tag: "b", RTTDeviationCost: 1000},
 | 
						|
	}
 | 
						|
	expected := 0
 | 
						|
	ns := strategy.selectLeastLoad(nodes)
 | 
						|
	if len(ns) != expected {
 | 
						|
		t.Errorf("expected: %v, actual: %v", expected, len(ns))
 | 
						|
	}
 | 
						|
}
 |