462 lines
9 KiB
Go
462 lines
9 KiB
Go
package server
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/ihexxa/gocfg"
|
|
|
|
"github.com/ihexxa/quickshare/src/db"
|
|
)
|
|
|
|
func TestLoadCfg(t *testing.T) {
|
|
argsList := []*Args{
|
|
// default config
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "",
|
|
Configs: []string{},
|
|
},
|
|
// default config + db
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "testdata/test_quickshare.db",
|
|
Configs: []string{},
|
|
},
|
|
// default config + db + config_1 (dbPath is from config_1)
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "",
|
|
Configs: []string{"testdata/config_1.yml"},
|
|
},
|
|
// // default config + db + config_1 (dbPath is from args)
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "testdata/test_quickshare.db",
|
|
Configs: []string{"testdata/config_1.yml"},
|
|
},
|
|
// default config + db + config_1 + config_4
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "",
|
|
Configs: []string{"testdata/config_1.yml", "testdata/config_4.yml"},
|
|
},
|
|
// config partial overwrite
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "",
|
|
Configs: []string{
|
|
"testdata/config_1.yml",
|
|
"testdata/config_4.yml",
|
|
"testdata/config_partial_users.yml",
|
|
"testdata/config_partial_db.yml",
|
|
},
|
|
},
|
|
// default config + db + config_1 + config_4 + config_partial_users.yml + config_partial_db.yml + args(db)
|
|
&Args{
|
|
Host: "",
|
|
Port: 0,
|
|
DbPath: "testdata/test_quickshare.db",
|
|
Configs: []string{
|
|
"testdata/config_1.yml",
|
|
"testdata/config_4.yml",
|
|
"testdata/config_partial_users.yml",
|
|
"testdata/config_partial_db.yml",
|
|
},
|
|
},
|
|
}
|
|
|
|
cfgDefault := DefaultConfigStruct()
|
|
|
|
cfgDBOnly := *cfgDefault
|
|
cfgDBOnly.Site = &db.SiteConfig{
|
|
ClientCfg: &db.ClientConfig{
|
|
SiteName: "Quickshare",
|
|
SiteDesc: "quick and simple file sharing",
|
|
Bg: &db.BgConfig{
|
|
Url: "/static/img/textured_paper.png",
|
|
Repeat: "repeat",
|
|
Position: "center",
|
|
Align: "fixed",
|
|
BgColor: "#ccc",
|
|
},
|
|
},
|
|
}
|
|
|
|
cfg1 := &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: []*db.UserCfg{
|
|
&db.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: &db.SiteConfig{
|
|
ClientCfg: &db.ClientConfig{
|
|
SiteName: "Quickshare",
|
|
SiteDesc: "quick and simple file sharing",
|
|
Bg: &db.BgConfig{
|
|
Url: "/static/img/textured_paper.png",
|
|
Repeat: "repeat",
|
|
Position: "center",
|
|
Align: "fixed",
|
|
BgColor: "#ccc",
|
|
},
|
|
},
|
|
},
|
|
Db: &DbConfig{
|
|
DbPath: "testdata/test_quickshare.db",
|
|
},
|
|
}
|
|
|
|
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: []*db.UserCfg{
|
|
&db.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: &db.SiteConfig{
|
|
ClientCfg: &db.ClientConfig{
|
|
SiteName: "4",
|
|
SiteDesc: "4",
|
|
Bg: &db.BgConfig{
|
|
Url: "4",
|
|
Repeat: "4",
|
|
Position: "4",
|
|
Align: "4",
|
|
BgColor: "4",
|
|
},
|
|
},
|
|
},
|
|
Db: &DbConfig{
|
|
DbPath: "4",
|
|
},
|
|
}
|
|
|
|
cfg5 := &Config{
|
|
Fs: &FSConfig{
|
|
Root: "4",
|
|
OpensLimit: 4,
|
|
OpenTTL: 4,
|
|
},
|
|
Users: &UsersCfg{
|
|
EnableAuth: true,
|
|
DefaultAdmin: "5",
|
|
DefaultAdminPwd: "5",
|
|
CookieTTL: 4,
|
|
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: []*db.UserCfg{
|
|
&db.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: &db.SiteConfig{
|
|
ClientCfg: &db.ClientConfig{
|
|
SiteName: "4",
|
|
SiteDesc: "4",
|
|
Bg: &db.BgConfig{
|
|
Url: "4",
|
|
Repeat: "4",
|
|
Position: "4",
|
|
Align: "4",
|
|
BgColor: "4",
|
|
},
|
|
},
|
|
},
|
|
Db: &DbConfig{
|
|
DbPath: "5",
|
|
},
|
|
}
|
|
|
|
cfgWithPartialCfg := &Config{
|
|
Fs: &FSConfig{
|
|
Root: "4",
|
|
OpensLimit: 4,
|
|
OpenTTL: 4,
|
|
},
|
|
Users: &UsersCfg{
|
|
EnableAuth: true,
|
|
DefaultAdmin: "5",
|
|
DefaultAdminPwd: "5",
|
|
CookieTTL: 4,
|
|
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: []*db.UserCfg{
|
|
&db.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: &db.SiteConfig{
|
|
ClientCfg: &db.ClientConfig{
|
|
SiteName: "4",
|
|
SiteDesc: "4",
|
|
Bg: &db.BgConfig{
|
|
Url: "4",
|
|
Repeat: "4",
|
|
Position: "4",
|
|
Align: "4",
|
|
BgColor: "4",
|
|
},
|
|
},
|
|
},
|
|
Db: &DbConfig{
|
|
DbPath: "5",
|
|
},
|
|
}
|
|
|
|
expects := []*Config{
|
|
cfgDefault,
|
|
&cfgDBOnly,
|
|
cfg1,
|
|
cfg1,
|
|
cfg4,
|
|
cfg5,
|
|
cfgWithPartialCfg,
|
|
}
|
|
|
|
testLoadCfg := func(t *testing.T) {
|
|
for i, args := range argsList {
|
|
gotCfg, err := LoadCfg(args)
|
|
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 !reflect.DeepEqual(gotCfg.Template(), expectCfg.Template()) {
|
|
gotJSON, _ := gotCfg.JSON()
|
|
expectJSON, _ := expectCfg.JSON()
|
|
fmt.Printf("\ngot\n%s\n", gotJSON)
|
|
fmt.Printf("\nexpected\n%s\n", expectJSON)
|
|
t.Fatalf("%d, cfgs are not identical", i)
|
|
}
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|