Files
nezha_domains/integration/agentcompat/internal/evidence/dedicated_fault_fields_test.go
T
2026-07-20 14:13:41 +00:00

87 lines
5.0 KiB
Go

package evidence
import (
"testing"
"time"
)
func TestEvidence_TransferHashRejectsEverySuccessOnlyField(t *testing.T) {
tests := []struct {
name string
mutate func(*transferEvidence)
}{
{"upload bytes", func(value *transferEvidence) { value.UploadBytes = 1 }},
{"download bytes", func(value *transferEvidence) { value.DownloadBytes = 1 }},
{"upload hash", func(value *transferEvidence) { value.UploadSHA256 = "stale" }},
{"download hash", func(value *transferEvidence) { value.DownloadSHA256 = "stale" }},
{"upload chunks", func(value *transferEvidence) { value.UploadChunks = 1 }},
{"download chunks", func(value *transferEvidence) { value.DownloadChunks = 1 }},
{"upload duration", func(value *transferEvidence) { value.UploadDuration = time.Nanosecond }},
{"download duration", func(value *transferEvidence) { value.DownloadDuration = time.Nanosecond }},
{"retained heap", func(value *transferEvidence) { value.RetainedHeapBytes = 1 }},
{"mode", func(value *transferEvidence) { value.Mode = "0640" }},
{"create dirs", func(value *transferEvidence) { value.CreateDirs = true }},
{"upload replay", func(value *transferEvidence) { value.UploadReplayRejected = true }},
{"download replay", func(value *transferEvidence) { value.DownloadReplayRejected = true }},
{"oversize", func(value *transferEvidence) { value.OversizeRejected = true }},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
dir := t.TempDir()
writeDedicatedExecutableEvidence(t, dir, "transfer-100mib", "transfer-hash", false)
artifact := validTransferArtifact("transfer-hash", false)
test.mutate(&artifact.Evidence)
writeJSONEvidenceFile(t, dir, "transfer.json", artifact)
if err := ValidateDirectory(dir); err == nil {
t.Fatal("stale transfer success field accepted")
}
})
}
}
func TestEvidence_DashboardExitRejectsEveryPostFaultField(t *testing.T) {
tests := []struct {
name string
mutate func(*reconnectEvidence)
}{
{"dashboard after", func(value *reconnectEvidence) { value.Runtime.DashboardAfter.PID = 1 }},
{"agent after", func(value *reconnectEvidence) { value.Runtime.AgentAfter.PID = 1 }},
{"state before restart", func(value *reconnectEvidence) { value.Runtime.StateGenerationBeforeAgentRestart = 1 }},
{"state after restart", func(value *reconnectEvidence) { value.Runtime.StateGenerationAfterAgentRestart = 1 }},
{"identity dashboard config", func(value *reconnectEvidence) { value.Identity.DashboardConfigUnchanged = true }},
{"identity agent config", func(value *reconnectEvidence) { value.Identity.AgentConfigUnchanged = true }},
{"identity fixture", func(value *reconnectEvidence) { value.Identity.DashboardFixtureUnchanged = true }},
{"clients recreated", func(value *reconnectEvidence) { value.Identity.ClientsRecreated = true }},
{"bootstrap recreated", func(value *reconnectEvidence) { value.Identity.BootstrapRecreated = true }},
{"reconnect timestamp", func(value *reconnectEvidence) { value.Lifecycle.ReconnectAt = time.Now() }},
{"reconnect interval", func(value *reconnectEvidence) { value.Lifecycle.ReconnectInterval = time.Second }},
{"dashboard receipts", func(value *reconnectEvidence) { value.Lifecycle.DashboardReceipts = []receiptPair{{}} }},
{"agent receipts", func(value *reconnectEvidence) { value.Lifecycle.AgentReceipts = []receiptPair{{}} }},
{"stale accounting", func(value *reconnectEvidence) { value.Lifecycle.StaleGenerationReceipts = 1 }},
{"duplicate accounting", func(value *reconnectEvidence) { value.Lifecycle.DuplicateTaskIDs = 1 }},
{"lost accounting", func(value *reconnectEvidence) { value.Lifecycle.LostResultIDs = 1 }},
{"observation server", func(value *reconnectEvidence) { value.Observation.ServerID = 1 }},
{"observation uuid", func(value *reconnectEvidence) { value.Observation.UUID = "stale" }},
{"old generation", func(value *reconnectEvidence) { value.Observation.OldGeneration = 1 }},
{"new generation", func(value *reconnectEvidence) { value.Observation.NewGeneration = 1 }},
{"disconnect observation", func(value *reconnectEvidence) { value.Observation.DisconnectAt = time.Now() }},
{"reconnect observation", func(value *reconnectEvidence) { value.Observation.ReconnectAt = time.Now() }},
{"task ids", func(value *reconnectEvidence) { value.Observation.TaskIDs = []uint64{1} }},
{"result ids", func(value *reconnectEvidence) { value.Observation.ResultIDs = []uint64{1} }},
{"post reconnect", func(value *reconnectEvidence) { value.Observation.PostReconnect = true }},
{"agent restarted", func(value *reconnectEvidence) { value.Observation.AgentRestarted = true }},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
dir := t.TempDir()
writeDedicatedExecutableEvidence(t, dir, "reconnect", "dashboard-exit", false)
artifact := validReconnectArtifact(t, "dashboard-exit", false)
test.mutate(&artifact.Evidence)
writeJSONEvidenceFile(t, dir, "reconnect.json", artifact)
if err := ValidateDirectory(dir); err == nil {
t.Fatal("stale reconnect success field accepted")
}
})
}
}