feat(config): add config loading functions
This commit is contained in:
parent
32a003d789
commit
48a239bef2
5 changed files with 576 additions and 0 deletions
352
src/server/config_load_test.go
Normal file
352
src/server/config_load_test.go
Normal file
|
@ -0,0 +1,352 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/ihexxa/gocfg"
|
||||
|
||||
"github.com/ihexxa/quickshare/src/db/sitestore"
|
||||
"github.com/ihexxa/quickshare/src/db/userstore"
|
||||
)
|
||||
|
||||
func TestLoadCfg(t *testing.T) {
|
||||
argsList := []*Opts{
|
||||
// default config
|
||||
&Opts{
|
||||
Host: "",
|
||||
Port: 0,
|
||||
DbPath: "",
|
||||
Configs: []string{},
|
||||
},
|
||||
// default config + db
|
||||
&Opts{
|
||||
Host: "",
|
||||
Port: 0,
|
||||
DbPath: "testdata",
|
||||
Configs: []string{},
|
||||
},
|
||||
// default config + db + config_1
|
||||
&Opts{
|
||||
Host: "",
|
||||
Port: 0,
|
||||
DbPath: "testdata",
|
||||
Configs: []string{"testdata/config_1.yml"},
|
||||
},
|
||||
// default config + db + config_1 + config_2
|
||||
&Opts{
|
||||
Host: "",
|
||||
Port: 0,
|
||||
DbPath: "testdata",
|
||||
Configs: []string{"testdata/config_1.yml", "testdata/config_4.yml"},
|
||||
},
|
||||
// config partial overwrite
|
||||
&Opts{
|
||||
Host: "",
|
||||
Port: 0,
|
||||
DbPath: "testdata",
|
||||
Configs: []string{
|
||||
"testdata/config_1.yml",
|
||||
"testdata/config_4.yml",
|
||||
"testdata/config_partial_users.yml",
|
||||
},
|
||||
},
|
||||
// arg overwrite
|
||||
}
|
||||
|
||||
cfg1 := DefaultConfigStruct()
|
||||
|
||||
cfg2 := DefaultConfigStruct()
|
||||
cfg2.Site.ClientCfg.SiteName = "Quickshare"
|
||||
cfg2.Site.ClientCfg.SiteDesc = "Quickshare"
|
||||
cfg2.Site.ClientCfg.Bg.Url = "test.png"
|
||||
cfg2.Site.ClientCfg.Bg.Repeat = "no-repeat"
|
||||
cfg2.Site.ClientCfg.Bg.Position = "top"
|
||||
cfg2.Site.ClientCfg.Bg.Align = "scroll"
|
||||
|
||||
cfg3 := &Config{
|
||||
Fs: &FSConfig{
|
||||
Root: "1",
|
||||
OpensLimit: 1,
|
||||
OpenTTL: 1,
|
||||
},
|
||||
Users: &UsersCfg{
|
||||
EnableAuth: true,
|
||||
DefaultAdmin: "1",
|
||||
DefaultAdminPwd: "1",
|
||||
CookieTTL: 1,
|
||||
CookieSecure: true,
|
||||
CookieHttpOnly: true,
|
||||
MinUserNameLen: 1,
|
||||
MinPwdLen: 1,
|
||||
CaptchaWidth: 1,
|
||||
CaptchaHeight: 1,
|
||||
CaptchaEnabled: true,
|
||||
UploadSpeedLimit: 1,
|
||||
DownloadSpeedLimit: 1,
|
||||
SpaceLimit: 1,
|
||||
LimiterCapacity: 1,
|
||||
LimiterCyc: 1,
|
||||
PredefinedUsers: []*userstore.UserCfg{
|
||||
&userstore.UserCfg{
|
||||
Name: "1",
|
||||
Pwd: "1",
|
||||
Role: "1",
|
||||
},
|
||||
},
|
||||
},
|
||||
Secrets: &Secrets{
|
||||
TokenSecret: "1",
|
||||
},
|
||||
Server: &ServerCfg{
|
||||
Debug: true,
|
||||
Host: "1",
|
||||
Port: 1,
|
||||
ReadTimeout: 1,
|
||||
WriteTimeout: 1,
|
||||
MaxHeaderBytes: 1,
|
||||
PublicPath: "1",
|
||||
},
|
||||
Workers: &WorkerPoolCfg{
|
||||
QueueSize: 1,
|
||||
SleepCyc: 1,
|
||||
WorkerCount: 1,
|
||||
},
|
||||
Site: &sitestore.SiteConfig{
|
||||
ClientCfg: &sitestore.ClientConfig{
|
||||
SiteName: "1",
|
||||
SiteDesc: "1",
|
||||
Bg: &sitestore.BgConfig{
|
||||
Url: "1",
|
||||
Repeat: "1",
|
||||
Position: "1",
|
||||
Align: "1",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
cfg4 := &Config{
|
||||
Fs: &FSConfig{
|
||||
Root: "4",
|
||||
OpensLimit: 4,
|
||||
OpenTTL: 4,
|
||||
},
|
||||
Users: &UsersCfg{
|
||||
EnableAuth: false,
|
||||
DefaultAdmin: "4",
|
||||
DefaultAdminPwd: "4",
|
||||
CookieTTL: 4,
|
||||
CookieSecure: false,
|
||||
CookieHttpOnly: false,
|
||||
MinUserNameLen: 4,
|
||||
MinPwdLen: 4,
|
||||
CaptchaWidth: 4,
|
||||
CaptchaHeight: 4,
|
||||
CaptchaEnabled: false,
|
||||
UploadSpeedLimit: 4,
|
||||
DownloadSpeedLimit: 4,
|
||||
SpaceLimit: 4,
|
||||
LimiterCapacity: 4,
|
||||
LimiterCyc: 4,
|
||||
PredefinedUsers: []*userstore.UserCfg{
|
||||
&userstore.UserCfg{
|
||||
Name: "4",
|
||||
Pwd: "4",
|
||||
Role: "4",
|
||||
},
|
||||
},
|
||||
},
|
||||
Secrets: &Secrets{
|
||||
TokenSecret: "4",
|
||||
},
|
||||
Server: &ServerCfg{
|
||||
Debug: false,
|
||||
Host: "4",
|
||||
Port: 4,
|
||||
ReadTimeout: 4,
|
||||
WriteTimeout: 4,
|
||||
MaxHeaderBytes: 4,
|
||||
PublicPath: "4",
|
||||
},
|
||||
Workers: &WorkerPoolCfg{
|
||||
QueueSize: 4,
|
||||
SleepCyc: 4,
|
||||
WorkerCount: 4,
|
||||
},
|
||||
Site: &sitestore.SiteConfig{
|
||||
ClientCfg: &sitestore.ClientConfig{
|
||||
SiteName: "4",
|
||||
SiteDesc: "4",
|
||||
Bg: &sitestore.BgConfig{
|
||||
Url: "4",
|
||||
Repeat: "4",
|
||||
Position: "4",
|
||||
Align: "4",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
cfg5 := &Config{
|
||||
Fs: &FSConfig{
|
||||
Root: "4",
|
||||
OpensLimit: 4,
|
||||
OpenTTL: 4,
|
||||
},
|
||||
Users: &UsersCfg{
|
||||
EnableAuth: true,
|
||||
DefaultAdmin: "5",
|
||||
DefaultAdminPwd: "5",
|
||||
CookieTTL: 5,
|
||||
CookieSecure: true,
|
||||
CookieHttpOnly: true,
|
||||
MinUserNameLen: 5,
|
||||
MinPwdLen: 5,
|
||||
CaptchaWidth: 5,
|
||||
CaptchaHeight: 5,
|
||||
CaptchaEnabled: true,
|
||||
UploadSpeedLimit: 5,
|
||||
DownloadSpeedLimit: 5,
|
||||
SpaceLimit: 5,
|
||||
LimiterCapacity: 5,
|
||||
LimiterCyc: 5,
|
||||
PredefinedUsers: []*userstore.UserCfg{
|
||||
&userstore.UserCfg{
|
||||
Name: "5",
|
||||
Pwd: "5",
|
||||
Role: "5",
|
||||
},
|
||||
},
|
||||
},
|
||||
Secrets: &Secrets{
|
||||
TokenSecret: "4",
|
||||
},
|
||||
Server: &ServerCfg{
|
||||
Debug: false,
|
||||
Host: "4",
|
||||
Port: 4,
|
||||
ReadTimeout: 4,
|
||||
WriteTimeout: 4,
|
||||
MaxHeaderBytes: 4,
|
||||
PublicPath: "4",
|
||||
},
|
||||
Workers: &WorkerPoolCfg{
|
||||
QueueSize: 4,
|
||||
SleepCyc: 4,
|
||||
WorkerCount: 4,
|
||||
},
|
||||
Site: &sitestore.SiteConfig{
|
||||
ClientCfg: &sitestore.ClientConfig{
|
||||
SiteName: "4",
|
||||
SiteDesc: "4",
|
||||
Bg: &sitestore.BgConfig{
|
||||
Url: "4",
|
||||
Repeat: "4",
|
||||
Position: "4",
|
||||
Align: "4",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
expects := []*Config{
|
||||
cfg1,
|
||||
cfg2,
|
||||
cfg3,
|
||||
cfg4,
|
||||
cfg5,
|
||||
}
|
||||
|
||||
testLoadCfg := func(t *testing.T) {
|
||||
for i, opts := range argsList {
|
||||
gotCfg, err := LoadCfg(opts)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expectCfgStruct := expects[i]
|
||||
expectCfgBytes, err := json.Marshal(expectCfgStruct)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expectCfg, err := gocfg.New(NewConfig()).Load(gocfg.JSONStr(string(expectCfgBytes)))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if !Equal(gotCfg, expectCfg) {
|
||||
t.Fatal("cfgs are not identical")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
t.Run("test LoadCfg", testLoadCfg)
|
||||
}
|
||||
|
||||
// TODO: use better comparing method
|
||||
func Equal(cfg1, cfg2 *gocfg.Cfg) bool {
|
||||
// check cfg1
|
||||
for k1, v1 := range cfg1.Bools() {
|
||||
v2, ok := cfg2.Bool(k1)
|
||||
if !ok || v2 != v1 {
|
||||
fmt.Println(k1, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
for k1, v1 := range cfg1.Ints() {
|
||||
v2, ok := cfg2.Int(k1)
|
||||
if !ok || v2 != v1 {
|
||||
fmt.Println(k1, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
for k1, v1 := range cfg1.Floats() {
|
||||
v2, ok := cfg2.Float(k1)
|
||||
if !ok || v2 != v1 {
|
||||
fmt.Println(k1, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
for k1, v1 := range cfg1.Strings() {
|
||||
v2, ok := cfg2.String(k1)
|
||||
if !ok || v2 != v1 {
|
||||
fmt.Println(k1, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// check cfg2
|
||||
for k2, v2 := range cfg2.Bools() {
|
||||
v1, ok := cfg1.Bool(k2)
|
||||
if !ok || v1 != v2 {
|
||||
fmt.Println(k2, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
for k2, v2 := range cfg2.Ints() {
|
||||
v1, ok := cfg1.Int(k2)
|
||||
if !ok || v1 != v2 {
|
||||
fmt.Println(k2, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
for k2, v2 := range cfg2.Floats() {
|
||||
v1, ok := cfg1.Float(k2)
|
||||
if !ok || v1 != v2 {
|
||||
fmt.Println(k2, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
for k2, v2 := range cfg2.Strings() {
|
||||
v1, ok := cfg1.String(k2)
|
||||
if !ok || v1 != v2 {
|
||||
fmt.Println(k2, v1, v2)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue