214 lines
4.7 KiB
Go
214 lines
4.7 KiB
Go
package server
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"math/rand"
|
|
"net/http"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ihexxa/gocfg"
|
|
"github.com/ihexxa/quickshare/src/client"
|
|
fspkg "github.com/ihexxa/quickshare/src/fs"
|
|
"github.com/ihexxa/quickshare/src/userstore"
|
|
)
|
|
|
|
func startTestServer(config string) *Server {
|
|
defaultCfg, err := DefaultConfig()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
cfg, err := gocfg.New(NewConfig()).
|
|
Load(
|
|
gocfg.JSONStr(defaultCfg),
|
|
gocfg.JSONStr(config),
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
srv, err := NewServer(cfg)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
go srv.Start()
|
|
return srv
|
|
}
|
|
|
|
func setUpEnv(t *testing.T, rootPath string, adminName, adminPwd string) {
|
|
os.Setenv("DEFAULTADMIN", adminName)
|
|
os.Setenv("DEFAULTADMINPWD", adminPwd)
|
|
os.RemoveAll(rootPath)
|
|
err := os.MkdirAll(rootPath, 0700)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func getUserName(id int) string {
|
|
return fmt.Sprintf("user_%d", id)
|
|
}
|
|
|
|
func addUsers(t *testing.T, addr, userPwd string, userCount int, adminToken *http.Cookie) map[string]string {
|
|
usersCl := client.NewSingleUserClient(addr)
|
|
users := map[string]string{}
|
|
for i := range make([]int, userCount) {
|
|
userName := getUserName(i)
|
|
|
|
resp, adResp, errs := usersCl.AddUser(userName, userPwd, userstore.UserRole, adminToken)
|
|
if len(errs) > 0 {
|
|
t.Fatal(errs)
|
|
} else if resp.StatusCode != 200 {
|
|
t.Fatal("failed to add user")
|
|
}
|
|
|
|
users[userName] = adResp.ID
|
|
}
|
|
|
|
return users
|
|
}
|
|
|
|
func isServerReady(addr string) bool {
|
|
retry := 20
|
|
setCl := client.NewSettingsClient(addr)
|
|
|
|
for retry > 0 {
|
|
_, _, errs := setCl.Health()
|
|
if len(errs) > 0 {
|
|
time.Sleep(100 * time.Millisecond)
|
|
} else {
|
|
return true
|
|
}
|
|
retry--
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func compareFileContent(fs fspkg.ISimpleFS, uid, filePath string, expectedContent string) (bool, error) {
|
|
reader, id, err := fs.GetFileReader(filePath)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer func() {
|
|
err = fs.CloseReader(fmt.Sprint(id))
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}()
|
|
|
|
gotContent, err := ioutil.ReadAll(reader)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return string(gotContent) == expectedContent, nil
|
|
}
|
|
|
|
func assertUploadOK(t *testing.T, filePath, content, addr string, token *http.Cookie) bool {
|
|
cl := client.NewFilesClient(addr, token)
|
|
|
|
fileSize := int64(len([]byte(content)))
|
|
res, _, errs := cl.Create(filePath, fileSize)
|
|
if len(errs) > 0 {
|
|
t.Fatal(errs)
|
|
return false
|
|
} else if res.StatusCode != 200 {
|
|
t.Fatal(res.StatusCode)
|
|
return false
|
|
}
|
|
|
|
base64Content := base64.StdEncoding.EncodeToString([]byte(content))
|
|
res, _, errs = cl.UploadChunk(filePath, base64Content, 0)
|
|
if len(errs) > 0 {
|
|
t.Fatal(errs)
|
|
return false
|
|
} else if res.StatusCode != 200 {
|
|
t.Fatal(res.StatusCode)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func assertDownloadOK(t *testing.T, filePath, content, addr string, token *http.Cookie) bool {
|
|
var (
|
|
res *http.Response
|
|
body string
|
|
errs []error
|
|
fileSize = int64(len([]byte(content)))
|
|
)
|
|
|
|
cl := client.NewFilesClient(addr, token)
|
|
|
|
rd := rand.Intn(3)
|
|
switch rd {
|
|
case 0:
|
|
res, body, errs = cl.Download(filePath, map[string]string{})
|
|
case 1:
|
|
res, body, errs = cl.Download(filePath, map[string]string{
|
|
"Range": fmt.Sprintf("bytes=0-%d", fileSize-1),
|
|
})
|
|
case 2:
|
|
res, body, errs = cl.Download(filePath, map[string]string{
|
|
"Range": fmt.Sprintf("bytes=0-%d, %d-%d", (fileSize-1)/2, (fileSize-1)/2+1, fileSize-1),
|
|
})
|
|
}
|
|
|
|
fileName := path.Base(filePath)
|
|
contentDispositionHeader := res.Header.Get("Content-Disposition")
|
|
if len(errs) > 0 {
|
|
t.Error(errs)
|
|
return false
|
|
}
|
|
if res.StatusCode != 200 && res.StatusCode != 206 {
|
|
t.Error(res.StatusCode)
|
|
return false
|
|
}
|
|
if contentDispositionHeader != fmt.Sprintf(`attachment; filename="%s"`, fileName) {
|
|
t.Errorf("incorrect Content-Disposition header: %s", contentDispositionHeader)
|
|
return false
|
|
}
|
|
|
|
switch rd {
|
|
case 0:
|
|
if body != content {
|
|
t.Errorf("body not equal got(%s) expect(%s)\n", body, content)
|
|
return false
|
|
}
|
|
case 1:
|
|
if body[2:] != content { // body returned by gorequest contains the first CRLF
|
|
t.Errorf("body not equal got(%s) expect(%s)\n", body[2:], content)
|
|
return false
|
|
}
|
|
default:
|
|
body = body[2:] // body returned by gorequest contains the first CRLF
|
|
realBody := ""
|
|
boundaryEnd := strings.Index(body, "\r\n")
|
|
boundary := body[0:boundaryEnd]
|
|
bodyParts := strings.Split(body, boundary)
|
|
|
|
for i, bodyPart := range bodyParts {
|
|
if i == 0 || i == len(bodyParts)-1 {
|
|
continue
|
|
}
|
|
start := strings.Index(bodyPart, "\r\n\r\n")
|
|
|
|
fmt.Printf("<%s>", bodyPart[start+4:len(bodyPart)-2]) // ignore the last CRLF
|
|
realBody += bodyPart[start+4 : len(bodyPart)-2]
|
|
}
|
|
if realBody != content {
|
|
t.Errorf("multi body not equal got(%s) expect(%s)\n", realBody, content)
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|