92 lines
3.4 KiB
Go
92 lines
3.4 KiB
Go
package servicehost
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestOptionsValidate(t *testing.T) {
|
|
base := Options{
|
|
Name: "Scert",
|
|
Executable: filepath.Join("C:", "scert.exe"),
|
|
ConfigPath: filepath.Join("C:", "scert", "scert.json"),
|
|
WorkDir: filepath.Join("C:", "scert"),
|
|
}
|
|
if err := base.Validate(); err != nil {
|
|
t.Fatalf("有效服务配置不应失败:%v", err)
|
|
}
|
|
for name, mutate := range map[string]func(*Options){
|
|
"名称为空": func(o *Options) { o.Name = "" },
|
|
"名称含路径": func(o *Options) { o.Name = "a/b" },
|
|
"程序路径为空": func(o *Options) { o.Executable = "" },
|
|
"配置路径为空": func(o *Options) { o.ConfigPath = "" },
|
|
"工作目录为空": func(o *Options) { o.WorkDir = "" },
|
|
} {
|
|
item := base
|
|
mutate(&item)
|
|
if err := item.Validate(); err == nil {
|
|
t.Errorf("%s时应校验失败", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOptionsNormalizedDefaultsDisplayText(t *testing.T) {
|
|
item, err := (Options{
|
|
Name: " Scert ", Executable: "scert.exe", ConfigPath: "scert.json", WorkDir: filepath.Join("C:", "scert"),
|
|
}).normalized()
|
|
if err != nil {
|
|
t.Fatalf("规范化服务配置失败:%v", err)
|
|
}
|
|
if item.DisplayName != "Scert" || item.Description != "Scert" {
|
|
t.Fatalf("服务显示信息默认值错误:%+v", item)
|
|
}
|
|
if strings.TrimSpace(item.Executable) == "" {
|
|
t.Fatal("规范化后程序路径不能为空")
|
|
}
|
|
}
|
|
|
|
func TestValidateNameRejectsPathLikeValues(t *testing.T) {
|
|
for _, name := range []string{"", " ", ".", "..", "../Scert", "a/b", `a\b`} {
|
|
if err := validateName(name); err == nil {
|
|
t.Errorf("服务名称 %q 未被拒绝", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOptionsValidateRejectsUnsafeUnitValues(t *testing.T) {
|
|
base := Options{
|
|
Name: "Scert", Executable: "scert", ConfigPath: "scert.json", WorkDir: "scert",
|
|
}
|
|
cases := []Options{
|
|
{Name: "Scert\nInjected", Executable: base.Executable, ConfigPath: base.ConfigPath, WorkDir: base.WorkDir},
|
|
{Name: base.Name, DisplayName: "Scert\nInjected", Executable: base.Executable, ConfigPath: base.ConfigPath, WorkDir: base.WorkDir},
|
|
{Name: base.Name, Description: "Scert\rInjected", Executable: base.Executable, ConfigPath: base.ConfigPath, WorkDir: base.WorkDir},
|
|
{Name: base.Name, User: "Scert", Executable: base.Executable, ConfigPath: base.ConfigPath, WorkDir: base.WorkDir},
|
|
{Name: base.Name, User: "Scert", Group: "Scert Group", Executable: base.Executable, ConfigPath: base.ConfigPath, WorkDir: base.WorkDir},
|
|
}
|
|
for index, item := range cases {
|
|
if err := item.Validate(); err == nil {
|
|
t.Errorf("不安全的服务配置 %d 未被拒绝", index)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOptionsNormalizedCopiesServiceSecuritySettings(t *testing.T) {
|
|
firstPath := filepath.Clean(filepath.Join("C:", "var", "lib", "scert"))
|
|
secondPath := filepath.Clean(filepath.Join("C:", "var", "log", "scert"))
|
|
item, err := (Options{
|
|
Name: " Scert ", Executable: "scert", ConfigPath: "scert.json", WorkDir: "scert",
|
|
User: " Scert ", Group: " Scert ", ReadWritePaths: []string{" " + firstPath + " ", " " + secondPath + " "},
|
|
}).normalized()
|
|
if err != nil {
|
|
t.Fatalf("规范化服务安全配置失败:%v", err)
|
|
}
|
|
if item.User != "Scert" || item.Group != "Scert" {
|
|
t.Fatalf("服务用户配置未规范化:%+v", item)
|
|
}
|
|
if len(item.ReadWritePaths) != 2 || item.ReadWritePaths[0] != firstPath || item.ReadWritePaths[1] != secondPath {
|
|
t.Fatalf("服务可写路径未规范化:%+v", item.ReadWritePaths)
|
|
}
|
|
}
|