mirror of
https://github.com/haiwen/seafile-server.git
synced 2025-06-25 06:31:33 +00:00
281 lines
6.3 KiB
Go
281 lines
6.3 KiB
Go
package diff
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"syscall"
|
|
"testing"
|
|
|
|
"github.com/haiwen/seafile-server/fileserver/fsmgr"
|
|
)
|
|
|
|
const (
|
|
emptySHA1 = "0000000000000000000000000000000000000000"
|
|
diffTestSeafileConfPath = "/tmp/conf"
|
|
diffTestSeafileDataDir = "/tmp/conf/seafile-data"
|
|
diffTestRepoID = "0d18a711-c988-4f7b-960c-211b34705ce3"
|
|
)
|
|
|
|
var diffTestTree1 string
|
|
var diffTestTree2 string
|
|
var diffTestTree3 string
|
|
var diffTestTree4 string
|
|
var diffTestFileID string
|
|
var diffTestDirID1 string
|
|
var diffTestDirID2 string
|
|
|
|
/*
|
|
test directory structure:
|
|
|
|
tree1
|
|
|--
|
|
|
|
tree2
|
|
|--file
|
|
|
|
tree3
|
|
|--dir
|
|
|
|
tree4
|
|
|--dir
|
|
|-- file
|
|
|
|
*/
|
|
|
|
func TestDiffTrees(t *testing.T) {
|
|
fsmgr.Init(diffTestSeafileConfPath, diffTestSeafileDataDir)
|
|
|
|
err := diffTestCreateTestDir()
|
|
if err != nil {
|
|
fmt.Printf("failed to create test dir: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
t.Run("test1", testDiffTrees1)
|
|
t.Run("test2", testDiffTrees2)
|
|
t.Run("test3", testDiffTrees3)
|
|
t.Run("test4", testDiffTrees4)
|
|
t.Run("test5", testDiffTrees5)
|
|
|
|
err = diffTestDelFile()
|
|
if err != nil {
|
|
fmt.Printf("failed to remove test file : %v", err)
|
|
}
|
|
}
|
|
|
|
func diffTestCreateTestDir() error {
|
|
modeDir := uint32(syscall.S_IFDIR | 0644)
|
|
modeFile := uint32(syscall.S_IFREG | 0644)
|
|
|
|
dir1, err := diffTestCreateSeafdir(nil)
|
|
if err != nil {
|
|
err := fmt.Errorf("failed to get seafdir: %v", err)
|
|
return err
|
|
}
|
|
diffTestTree1 = dir1
|
|
file1, err := fsmgr.NewSeafile(1, 1, nil)
|
|
if err != nil {
|
|
err := fmt.Errorf("failed to new seafile: %v", err)
|
|
return err
|
|
}
|
|
diffTestFileID = file1.FileID
|
|
err = fsmgr.SaveSeafile(diffTestRepoID, file1)
|
|
if err != nil {
|
|
err := fmt.Errorf("failed to save seafile: %v", err)
|
|
return err
|
|
}
|
|
dent1 := fsmgr.SeafDirent{ID: file1.FileID, Name: "file", Mode: modeFile, Size: 1}
|
|
dir2, err := diffTestCreateSeafdir([]*fsmgr.SeafDirent{&dent1})
|
|
if err != nil {
|
|
err := fmt.Errorf("failed to get seafdir: %v", err)
|
|
return err
|
|
}
|
|
diffTestTree2 = dir2
|
|
|
|
dent2 := fsmgr.SeafDirent{ID: dir1, Name: "dir", Mode: modeDir}
|
|
diffTestDirID1 = dir1
|
|
dir3, err := diffTestCreateSeafdir([]*fsmgr.SeafDirent{&dent2})
|
|
if err != nil {
|
|
err := fmt.Errorf("failed to get seafdir: %v", err)
|
|
return err
|
|
}
|
|
diffTestTree3 = dir3
|
|
|
|
dent3 := fsmgr.SeafDirent{ID: dir2, Name: "dir", Mode: modeDir}
|
|
diffTestDirID2 = dir2
|
|
dir4, err := diffTestCreateSeafdir([]*fsmgr.SeafDirent{&dent3})
|
|
if err != nil {
|
|
err := fmt.Errorf("failed to get seafdir: %v", err)
|
|
return err
|
|
}
|
|
diffTestTree4 = dir4
|
|
|
|
return nil
|
|
}
|
|
|
|
func testDiffTrees1(t *testing.T) {
|
|
var results []interface{}
|
|
opt := &DiffOptions{
|
|
FileCB: diffTestFileCB,
|
|
DirCB: diffTestDirCB,
|
|
RepoID: diffTestRepoID}
|
|
opt.Data = &results
|
|
DiffTrees([]string{diffTestTree2, diffTestTree1}, opt)
|
|
if len(results) != 1 {
|
|
t.Errorf("data length is %d not 1", len(results))
|
|
}
|
|
var ret = make([]string, len(results))
|
|
for k, v := range results {
|
|
ret[k] = fmt.Sprintf("%s", v)
|
|
}
|
|
if ret[0] != diffTestFileID {
|
|
t.Errorf("result %s != %s", ret[0], diffTestFileID)
|
|
}
|
|
}
|
|
|
|
func testDiffTrees2(t *testing.T) {
|
|
var results []interface{}
|
|
opt := &DiffOptions{
|
|
FileCB: diffTestFileCB,
|
|
DirCB: diffTestDirCB,
|
|
RepoID: diffTestRepoID}
|
|
opt.Data = &results
|
|
DiffTrees([]string{diffTestTree3, diffTestTree1}, opt)
|
|
if len(results) != 1 {
|
|
t.Errorf("data length is %d not 1", len(results))
|
|
}
|
|
var ret = make([]string, len(results))
|
|
for k, v := range results {
|
|
ret[k] = fmt.Sprintf("%s", v)
|
|
}
|
|
if ret[0] != diffTestDirID1 {
|
|
t.Errorf("result %s != %s", ret[0], diffTestDirID1)
|
|
}
|
|
|
|
}
|
|
|
|
func testDiffTrees3(t *testing.T) {
|
|
var results []interface{}
|
|
opt := &DiffOptions{
|
|
FileCB: diffTestFileCB,
|
|
DirCB: diffTestDirCB,
|
|
RepoID: diffTestRepoID}
|
|
opt.Data = &results
|
|
DiffTrees([]string{diffTestTree4, diffTestTree1}, opt)
|
|
if len(results) != 2 {
|
|
t.Errorf("data length is %d not 1", len(results))
|
|
}
|
|
|
|
var ret = make([]string, len(results))
|
|
for k, v := range results {
|
|
ret[k] = fmt.Sprintf("%s", v)
|
|
}
|
|
if ret[0] != diffTestDirID2 {
|
|
t.Errorf("result %s != %s", ret[0], diffTestDirID2)
|
|
}
|
|
if ret[1] != diffTestFileID {
|
|
t.Errorf("result %s != %s", ret[1], diffTestFileID)
|
|
}
|
|
}
|
|
|
|
func testDiffTrees4(t *testing.T) {
|
|
var results []interface{}
|
|
opt := &DiffOptions{
|
|
FileCB: diffTestFileCB,
|
|
DirCB: diffTestDirCB,
|
|
RepoID: diffTestRepoID}
|
|
opt.Data = &results
|
|
DiffTrees([]string{diffTestTree4, diffTestTree3}, opt)
|
|
if len(results) != 2 {
|
|
t.Errorf("data length is %d not 1", len(results))
|
|
}
|
|
|
|
var ret = make([]string, len(results))
|
|
for k, v := range results {
|
|
ret[k] = fmt.Sprintf("%s", v)
|
|
}
|
|
if ret[0] != diffTestDirID2 {
|
|
t.Errorf("result %s != %s", ret[0], diffTestDirID2)
|
|
}
|
|
if ret[1] != diffTestFileID {
|
|
t.Errorf("result %s != %s", ret[1], diffTestFileID)
|
|
}
|
|
}
|
|
|
|
func testDiffTrees5(t *testing.T) {
|
|
var results []interface{}
|
|
opt := &DiffOptions{
|
|
FileCB: diffTestFileCB,
|
|
DirCB: diffTestDirCB,
|
|
RepoID: diffTestRepoID}
|
|
opt.Data = &results
|
|
DiffTrees([]string{diffTestTree3, diffTestTree2}, opt)
|
|
if len(results) != 1 {
|
|
t.Errorf("data length is %d not 1", len(results))
|
|
}
|
|
var ret = make([]string, len(results))
|
|
for k, v := range results {
|
|
ret[k] = fmt.Sprintf("%s", v)
|
|
}
|
|
if ret[0] != diffTestDirID1 {
|
|
t.Errorf("result %s != %s", ret[0], diffTestDirID1)
|
|
}
|
|
}
|
|
|
|
func diffTestCreateSeafdir(dents []*fsmgr.SeafDirent) (string, error) {
|
|
seafdir, err := fsmgr.NewSeafdir(1, dents)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
err = fsmgr.SaveSeafdir(diffTestRepoID, seafdir)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return seafdir.DirID, nil
|
|
}
|
|
|
|
func diffTestDelFile() error {
|
|
err := os.RemoveAll(diffTestSeafileConfPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func diffTestFileCB(ctx context.Context, baseDir string, files []*fsmgr.SeafDirent, data interface{}) error {
|
|
file1 := files[0]
|
|
file2 := files[1]
|
|
results, ok := data.(*[]interface{})
|
|
if !ok {
|
|
err := fmt.Errorf("failed to assert results")
|
|
return err
|
|
}
|
|
|
|
if file1 != nil &&
|
|
(file2 == nil || file1.ID != file2.ID) {
|
|
*results = append(*results, file1.ID)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func diffTestDirCB(ctx context.Context, baseDir string, dirs []*fsmgr.SeafDirent, data interface{}, recurse *bool) error {
|
|
dir1 := dirs[0]
|
|
dir2 := dirs[1]
|
|
results, ok := data.(*[]interface{})
|
|
if !ok {
|
|
err := fmt.Errorf("failed to assert results")
|
|
return err
|
|
}
|
|
|
|
if dir1 != nil &&
|
|
(dir2 == nil || dir1.ID != dir2.ID) {
|
|
*results = append(*results, dir1.ID)
|
|
}
|
|
|
|
return nil
|
|
}
|