test(files/quota): add e2e tests

This commit is contained in:
hexxa 2021-08-17 14:41:15 +08:00 committed by Hexxa
parent 41654e36d0
commit 839d7f43bc
4 changed files with 163 additions and 10 deletions

View file

@ -147,7 +147,11 @@ func (h *FileHandlers) Create(c *gin.Context) {
locker.Exec(func() { locker.Exec(func() {
err = h.deps.Users().SetUsed(userIDInt, true, req.FileSize) err = h.deps.Users().SetUsed(userIDInt, true, req.FileSize)
if err != nil { if err != nil {
if userstore.IsReachedLimitErr(err) {
c.JSON(q.ErrResp(c, 429, err))
} else {
c.JSON(q.ErrResp(c, 500, err)) c.JSON(q.ErrResp(c, 500, err))
}
return return
} }
@ -206,7 +210,11 @@ func (h *FileHandlers) Delete(c *gin.Context) {
err = h.deps.Users().SetUsed(userIDInt, false, info.Size()) err = h.deps.Users().SetUsed(userIDInt, false, info.Size())
if err != nil { if err != nil {
if userstore.IsReachedLimitErr(err) {
c.JSON(q.ErrResp(c, 429, err))
} else {
c.JSON(q.ErrResp(c, 500, err)) c.JSON(q.ErrResp(c, 500, err))
}
return return
} }
@ -702,7 +710,11 @@ func (h *FileHandlers) DelUploading(c *gin.Context) {
err = h.deps.Users().SetUsed(userIDInt, false, size) err = h.deps.Users().SetUsed(userIDInt, false, size)
if err != nil { if err != nil {
if userstore.IsReachedLimitErr(err) {
c.JSON(q.ErrResp(c, 429, err))
} else {
c.JSON(q.ErrResp(c, 500, err)) c.JSON(q.ErrResp(c, 500, err))
}
return return
} }

View file

@ -25,7 +25,7 @@ func TestFileHandlers(t *testing.T) {
"captchaEnabled": false, "captchaEnabled": false,
"uploadSpeedLimit": 409600, "uploadSpeedLimit": 409600,
"downloadSpeedLimit": 409600, "downloadSpeedLimit": 409600,
"spaceLimit": 1024, "spaceLimit": 1000,
"limiterCapacity": 1000, "limiterCapacity": 1000,
"limiterCyc": 1000 "limiterCyc": 1000
}, },

View file

@ -0,0 +1,138 @@
package server
import (
"fmt"
"os"
"testing"
"github.com/ihexxa/quickshare/src/client"
q "github.com/ihexxa/quickshare/src/handlers"
"github.com/ihexxa/quickshare/src/userstore"
)
func TestSpaceLimit(t *testing.T) {
addr := "http://127.0.0.1:8686"
root := "testData"
config := `{
"users": {
"enableAuth": true,
"minUserNameLen": 2,
"minPwdLen": 4,
"captchaEnabled": false,
"uploadSpeedLimit": 409600,
"downloadSpeedLimit": 409600,
"spaceLimit": 100,
"limiterCapacity": 1000,
"limiterCyc": 1000
},
"server": {
"debug": true
},
"fs": {
"root": "testData"
}
}`
adminName := "qs"
adminPwd := "quicksh@re"
os.Setenv("DEFAULTADMIN", adminName)
os.Setenv("DEFAULTADMINPWD", adminPwd)
os.RemoveAll(root)
err := os.MkdirAll(root, 0700)
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(root)
srv := startTestServer(config)
defer srv.Shutdown()
// fs := srv.depsFS()
if !waitForReady(addr) {
t.Fatal("fail to start server")
}
usersCl := client.NewSingleUserClient(addr)
resp, _, errs := usersCl.Login(adminName, adminPwd)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal(resp.StatusCode)
}
token := client.GetCookie(resp.Cookies(), q.TokenCookie)
userCount := 1
userPwd := "1234"
users := map[string]string{}
getUserName := func(id int) string {
return fmt.Sprintf("space_limit_user_%d", id)
}
for i := 0; i < userCount; i++ {
userName := getUserName(i)
resp, adResp, errs := usersCl.AddUser(userName, userPwd, userstore.UserRole, token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal("failed to add user")
}
users[userName] = adResp.ID
}
resp, _, errs = usersCl.Logout(token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal(resp.StatusCode)
}
t.Run("test space limitiong: Upload", func(t *testing.T) {
usersCl := client.NewSingleUserClient(addr)
resp, _, errs := usersCl.Login(getUserName(0), userPwd)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal(resp.StatusCode)
}
token := client.GetCookie(resp.Cookies(), q.TokenCookie)
fileContent := ""
for i := 0; i < 10; i++ {
fileContent += "0"
}
for i := 0; i < 10; i++ {
ok := assertUploadOK(t, fmt.Sprintf("%s/spacelimit/f_%d", getUserName(0), 0), fileContent, addr, token)
if !ok {
t.Fatalf("space limit failed at %d", 0)
}
resp, selfResp, errs := usersCl.Self(token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal("failed to add user")
} else if selfResp.UsedSpace != int64((i+1)*10) {
t.Fatal("incorrect used space")
}
}
cl := client.NewFilesClient(addr, token)
filePath := fmt.Sprintf("%s/spacelimit/f_%d", getUserName(0), 11)
res, _, errs := cl.Create(filePath, 1)
if len(errs) > 0 {
t.Fatal(errs)
} else if res.StatusCode != 429 {
t.Fatal("(space limit): this request should be rejected")
}
})
resp, _, errs = usersCl.Logout(token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal(resp.StatusCode)
}
}

View file

@ -25,6 +25,14 @@ const (
defaultDownloadSpeedLimit = 50 * 1024 * 1024 // 50MB defaultDownloadSpeedLimit = 50 * 1024 * 1024 // 50MB
) )
var (
ErrReachedLimit = errors.New("reached space limit")
)
func IsReachedLimitErr(err error) bool {
return err == ErrReachedLimit
}
type Quota struct { type Quota struct {
SpaceLimit int64 `json:"spaceLimit,space"` SpaceLimit int64 `json:"spaceLimit,space"`
UploadSpeedLimit int `json:"uploadSpeedLimit"` UploadSpeedLimit int `json:"uploadSpeedLimit"`
@ -260,12 +268,7 @@ func (us *KVUserStore) SetUsed(id uint64, incr bool, capacity int64) error {
} }
if incr && gotUser.UsedSpace+capacity > int64(gotUser.Quota.SpaceLimit) { if incr && gotUser.UsedSpace+capacity > int64(gotUser.Quota.SpaceLimit) {
return fmt.Errorf( return ErrReachedLimit
"reached space limit (%d): file size(%d), used(%d)",
gotUser.Quota.SpaceLimit,
capacity,
gotUser.UsedSpace,
)
} }
if incr { if incr {