package systemd import ( "testing" ) // TestParseUnitPropertiesRequiresExactProperties 验证属性解析严格接受恰好三个预期属性,并拒绝缺失、多余或重复属性。 func TestParseUnitPropertiesRequiresExactProperties(t *testing.T) { t.Parallel() unit, err := parseUnitProperties("yms-green.service", []byte("LoadState=loaded\nActiveState=inactive\nSubState=dead\n")) if err != nil { t.Fatalf("parse systemd properties: %v", err) } if unit.Name != "yms-green.service" || unit.LoadState != "loaded" || unit.ActiveState != "inactive" || unit.SubState != "dead" { t.Fatalf("unexpected unit: %+v", unit) } invalid := [][]byte{ []byte("LoadState=loaded\nActiveState=inactive\n"), []byte("LoadState=loaded\nActiveState=inactive\nSubState=dead\nDescription=YMS\n"), []byte("LoadState=loaded\nLoadState=loaded\nActiveState=inactive\nSubState=dead\n"), } for _, output := range invalid { if _, err := parseUnitProperties("yms-green.service", output); err == nil { t.Fatalf("expected exact property validation failure for %q", output) } } } // TestNewSystemctlRequiresAbsoluteExecutable 验证相对路径会被拒绝,绝对路径会被接受。 func TestNewSystemctlRequiresAbsoluteExecutable(t *testing.T) { t.Parallel() if _, err := NewSystemctl("systemctl"); err == nil { t.Fatal("expected relative executable path rejection") } manager, err := NewSystemctl("/usr/bin/systemctl") if err != nil || manager.executable != "/usr/bin/systemctl" { t.Fatalf("unexpected manager: manager=%+v err=%v", manager, err) } } // TestValidateUnitNamePreservesOpaqueValue 验证合法单元名被原样保留,空串或带首尾空白被拒绝。 func TestValidateUnitNamePreservesOpaqueValue(t *testing.T) { t.Parallel() if err := validateUnitName("backend-green.service"); err != nil { t.Fatalf("validate exact unit name: %v", err) } for _, name := range []string{"", " backend-green.service", "backend-green.service "} { if err := validateUnitName(name); err == nil { t.Fatalf("expected unit name rejection: %q", name) } } }