116 lines
3.5 KiB
Go
116 lines
3.5 KiB
Go
package main
|
|
|
|
import "testing"
|
|
|
|
func TestUPSParsing(t *testing.T) {
|
|
values := parseColonValues("battery.charge: 98.5\nups.status: OL\nbattery.runtime: 1200\n")
|
|
metrics := upsFromValues("NUT", "ups", values)
|
|
if metrics.ChargePercent == nil || *metrics.ChargePercent != 98.5 {
|
|
t.Fatalf("неожиданный заряд: %v", metrics.ChargePercent)
|
|
}
|
|
if metrics.StatusLabel != "Питание от сети" {
|
|
t.Fatalf("неожиданный статус: %s", metrics.StatusLabel)
|
|
}
|
|
}
|
|
|
|
const cyberPowerSample = `device.mfr: CPS
|
|
device.model: VP700ELCD
|
|
battery.charge: 100
|
|
battery.charge.low: 10
|
|
battery.charge.warning: 20
|
|
battery.mfr.date: CPS
|
|
battery.runtime: 450
|
|
battery.runtime.low: 300
|
|
battery.type: PbAcid
|
|
battery.voltage: 13.4
|
|
battery.voltage.nominal: 12
|
|
input.frequency: 498.0
|
|
input.transfer.high: 295
|
|
input.transfer.low: 167
|
|
input.voltage: 224.0
|
|
input.voltage.nominal: 230
|
|
output.voltage: 225.0
|
|
ups.beeper.status: disabled
|
|
ups.delay.shutdown: 20
|
|
ups.delay.start: 30
|
|
ups.load: 46
|
|
ups.realpower.nominal: 390
|
|
ups.status: OL
|
|
ups.test.result: No test initiated
|
|
driver.name: usbhid-ups
|
|
driver.version: 2.8.1
|
|
`
|
|
|
|
func TestCyberPowerFrequencyPowerAndRaw(t *testing.T) {
|
|
raw := parseColonValues(cyberPowerSample)
|
|
m := upsFromValues("NUT", "cyberpower", raw)
|
|
if !m.FrequencyCorrected || *m.InputFrequency != 49.8 || *m.InputFrequencyRaw != 498 || m.Raw["input.frequency"] != "498.0" {
|
|
t.Fatalf("frequency %+v", m)
|
|
}
|
|
if m.Power == nil || *m.Power != 179.4 || !m.PowerEstimated {
|
|
t.Fatalf("power %+v", m)
|
|
}
|
|
if m.BatteryDate != "" || m.BatteryAgeDays != 0 || m.Raw["battery.mfr.date"] != "CPS" {
|
|
t.Fatal("invalid date not preserved as raw only")
|
|
}
|
|
raw["input.frequency"] = "49.8"
|
|
raw["ups.realpower"] = "165"
|
|
m = upsFromValues("NUT", "ups", raw)
|
|
if m.FrequencyCorrected || *m.InputFrequency != 49.8 || m.PowerEstimated || *m.Power != 165 {
|
|
t.Fatal("double correction or ignored measured power")
|
|
}
|
|
raw["device.mfr"] = "Other"
|
|
raw["input.frequency"] = "498"
|
|
if m = upsFromValues("NUT", "ups", raw); m.FrequencyCorrected || *m.InputFrequency != 498 {
|
|
t.Fatal("other vendor corrected")
|
|
}
|
|
for _, v := range []string{"NaN", "Inf", "-Inf", ""} {
|
|
if numberPointer(v) != nil {
|
|
t.Fatal("nonfinite accepted")
|
|
}
|
|
}
|
|
if m = upsFromValues("NUT", "ups", map[string]string{"ups.load": "46"}); m.Power != nil {
|
|
t.Fatal("invented power without nominal")
|
|
}
|
|
}
|
|
func TestUPSHistoryRecordsCorrectedValuesAndGaps(t *testing.T) {
|
|
s, a := trafficFixture(t)
|
|
_ = a
|
|
u := upsFromValues("NUT", "cyberpower", parseColonValues(cyberPowerSample))
|
|
s.AddEntityMetrics(dashboardMetrics{UPS: u})
|
|
for _, tc := range []struct {
|
|
kind, name string
|
|
want float64
|
|
}{{"ups-frequency", "Частота", 49.8}, {"ups-power", "Расчётная ≈", 179.4}, {"ups-runtime", "Автономность", 450}} {
|
|
rows, err := s.EntityHistory(tc.kind, 1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
found := false
|
|
for _, r := range rows {
|
|
if r.Name == tc.name {
|
|
found = true
|
|
if r.Points[0].Value1 == nil || *r.Points[0].Value1 != tc.want {
|
|
t.Fatalf("bad %s: %+v", tc.kind, r)
|
|
}
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("missing history")
|
|
}
|
|
}
|
|
u.Available = false
|
|
u.CommunicationOK = false
|
|
s.AddEntityMetrics(dashboardMetrics{UPS: u})
|
|
rows, _ := s.EntityHistory("ups-frequency", 1)
|
|
for _, r := range rows {
|
|
if r.Points[len(r.Points)-1].Value1 != nil {
|
|
t.Fatal("stale reading stored as live")
|
|
}
|
|
}
|
|
p := historyPointFromMetrics(dashboardMetrics{UPS: u})
|
|
if p.UPSCharge != nil || p.UPSLoad != nil {
|
|
t.Fatal("stale charge stored")
|
|
}
|
|
}
|