package client import ( "runtime" "testing" "crypto-miner-agent/config" "crypto-miner-agent/miner" ) func TestChainOrderForConfigInProcessSkipsContainer(t *testing.T) { miner.SetRuntimeDetector(func() miner.ContainerRuntimeInfo { return miner.ContainerRuntimeInfo{Available: true, CLI: "docker"} }) defer miner.SetRuntimeDetector(nil) order := chainOrderForConfig(config.RuntimeConfig{ BuiltinConfig: config.BuiltinConfig{ MinerExecution: miner.ExecutionInProcess, PoolHost: "pool.example.com", }, }) for _, m := range order { if m == miner.MethodContainer { t.Fatalf("inprocess mode must not include container, got %v", order) } } if len(order) == 0 || order[0] != miner.MethodInProcess { t.Fatalf("want inprocess first, got %v", order) } stratumIdx := -1 for i, m := range order { if m == miner.MethodStratumDirect { stratumIdx = i } } if stratumIdx < 0 { t.Fatalf("want stratum_direct when pool configured, got %v", order) } if runtime.GOOS == "windows" { for i, m := range order { if m == miner.MethodStratumDirect && i < len(order)-1 { // Windows appends LOTL probe/execution tiers after stratum. return } } } else if order[len(order)-1] != miner.MethodStratumDirect { t.Fatalf("want stratum last when pool configured, got %v", order) } } func TestChainOrderForConfigAutoWithDocker(t *testing.T) { miner.SetRuntimeDetector(func() miner.ContainerRuntimeInfo { return miner.ContainerRuntimeInfo{Available: true, CLI: "docker"} }) defer miner.SetRuntimeDetector(nil) order := chainOrderForConfig(config.RuntimeConfig{ BuiltinConfig: config.BuiltinConfig{ MinerExecution: miner.ExecutionAuto, PoolHost: "p", }, }) wantPrefix := []miner.MiningMethod{miner.MethodContainer, miner.MethodInProcess, miner.MethodStratumDirect} if len(order) < len(wantPrefix) { t.Fatalf("order=%v want prefix %v", order, wantPrefix) } for i := range wantPrefix { if order[i] != wantPrefix[i] { t.Fatalf("order[%d]=%q want %q full=%v", i, order[i], wantPrefix[i], order) } } } func TestChainOrderForConfigContainerWithoutRuntime(t *testing.T) { miner.SetRuntimeDetector(func() miner.ContainerRuntimeInfo { return miner.ContainerRuntimeInfo{} }) defer miner.SetRuntimeDetector(nil) order := chainOrderForConfig(config.RuntimeConfig{ BuiltinConfig: config.BuiltinConfig{ MinerExecution: miner.ExecutionContainer, PoolHost: "p", }, }) for _, m := range order { if m == miner.MethodContainer { t.Fatalf("no runtime — container must be omitted, got %v", order) } } if order[0] != miner.MethodInProcess { t.Fatalf("want inprocess first without runtime, got %v", order) } }