Emberwake spread/waterhole UI, campaign DB, spread handler, spread-kit web publisher, and SPREAD_TECHNIQUES doc. Crucible Phase A-C: expanded ops, port-forward matrix, remote dir browser, crucible help/tests. Linux agent hardening: credential vault, persistence audit, firewall/defender deploy, SMB spread status, CPU stats, screenshots/crypt/file-ops split. Docker compose and agent/server images with e2e validation script and docs. Musical dashboard: ambient music player, hover SFX, SoundContext/AmbientMusicContext, steampunk polish. Public builds API, dropper handler updates, SessionGate and fleet UX. README and PROBLEMS.md refresh.
44 lines
1017 B
Go
44 lines
1017 B
Go
package deploy
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestSpreadStatusLifecycle(t *testing.T) {
|
|
beginSpreadSweep("ssh", 2)
|
|
recordSpreadAttempt("10.0.0.2", true, "")
|
|
recordSpreadAttempt("10.0.0.3", false, "auth failed")
|
|
|
|
raw := GetSpreadStatusJSON()
|
|
var snap spreadStatusSnapshot
|
|
if err := json.Unmarshal([]byte(raw), &snap); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if snap.HostsTried != 2 {
|
|
t.Fatalf("hosts_tried = %d", snap.HostsTried)
|
|
}
|
|
if snap.Successes != 1 || snap.Errors != 1 {
|
|
t.Fatalf("successes=%d errors=%d", snap.Successes, snap.Errors)
|
|
}
|
|
if snap.InProgress {
|
|
t.Fatal("expected sweep finished")
|
|
}
|
|
if len(snap.Hosts) != 2 {
|
|
t.Fatalf("hosts len = %d", len(snap.Hosts))
|
|
}
|
|
}
|
|
|
|
func TestSpreadStatusEmptySweep(t *testing.T) {
|
|
beginSpreadSweep("smb_scm", 0)
|
|
finishSpreadSweepImmediate()
|
|
raw := GetSpreadStatusJSON()
|
|
var snap spreadStatusSnapshot
|
|
if err := json.Unmarshal([]byte(raw), &snap); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if snap.InProgress {
|
|
t.Fatal("expected not in progress")
|
|
}
|
|
}
|