mirror of
https://github.com/gilbertchen/duplicacy
synced 2025-12-06 00:03:38 +00:00
131 lines
3.3 KiB
Go
131 lines
3.3 KiB
Go
// Copyright (c) Acrosync LLC. All rights reserved.
|
|
// Licensed under the Fair Source License 0.9 (https://fair.io/)
|
|
// User Limitation: 5 users
|
|
|
|
package duplicacy
|
|
|
|
import (
|
|
"os"
|
|
"time"
|
|
"path"
|
|
"testing"
|
|
"runtime/debug"
|
|
|
|
crypto_rand "crypto/rand"
|
|
"math/rand"
|
|
)
|
|
|
|
func TestUploaderAndDownloader(t *testing.T) {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
setTestingT(t)
|
|
SetLoggingLevel(INFO)
|
|
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
switch e := r.(type) {
|
|
case Exception:
|
|
t.Errorf("%s %s", e.LogID, e.Message)
|
|
debug.PrintStack()
|
|
default:
|
|
t.Errorf("%v", e)
|
|
debug.PrintStack()
|
|
}
|
|
}
|
|
} ()
|
|
|
|
testDir := path.Join(os.TempDir(), "duplicacy_test", "storage_test")
|
|
os.RemoveAll(testDir)
|
|
os.MkdirAll(testDir, 0700)
|
|
|
|
t.Logf("storage: %s", testStorageName)
|
|
|
|
storage, err := loadStorage(testDir, 1)
|
|
if err != nil {
|
|
t.Errorf("Failed to create storage: %v", err)
|
|
return
|
|
}
|
|
storage.EnableTestMode()
|
|
storage.SetRateLimits(testRateLimit, testRateLimit)
|
|
|
|
for _, dir := range []string { "chunks", "snapshots" } {
|
|
err = storage.CreateDirectory(0, dir)
|
|
if err != nil {
|
|
t.Errorf("Failed to create directory %s: %v", dir, err)
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
numberOfChunks := 100
|
|
maxChunkSize := 64 * 1024
|
|
|
|
if testQuickMode {
|
|
numberOfChunks = 10
|
|
}
|
|
|
|
var chunks []*Chunk
|
|
|
|
config := CreateConfig()
|
|
config.MinimumChunkSize = 100
|
|
config.chunkPool = make(chan *Chunk, numberOfChunks * 2)
|
|
totalFileSize := 0
|
|
|
|
for i := 0; i < numberOfChunks; i++ {
|
|
content := make([]byte, rand.Int() % maxChunkSize + 1)
|
|
_, err = crypto_rand.Read(content)
|
|
if err != nil {
|
|
t.Errorf("Error generating random content: %v", err)
|
|
return
|
|
}
|
|
|
|
chunk := CreateChunk(config, true)
|
|
chunk.Reset(true)
|
|
chunk.Write(content)
|
|
chunks = append(chunks, chunk)
|
|
|
|
t.Logf("Chunk: %s, size: %d", chunk.GetID(), chunk.GetLength())
|
|
totalFileSize += chunk.GetLength()
|
|
}
|
|
|
|
completionFunc := func(chunk *Chunk, chunkIndex int, skipped bool, chunkSize int, uploadSize int) {
|
|
t.Logf("Chunk %s size %d (%d/%d) uploaded", chunk.GetID(), chunkSize, chunkIndex, len(chunks))
|
|
}
|
|
|
|
chunkUploader := CreateChunkUploader(config, storage, nil, testThreads, nil)
|
|
chunkUploader.completionFunc = completionFunc
|
|
chunkUploader.Start()
|
|
|
|
for i, chunk := range chunks {
|
|
chunkUploader.StartChunk(chunk, i)
|
|
}
|
|
|
|
chunkUploader.Stop()
|
|
|
|
|
|
chunkDownloader := CreateChunkDownloader(config, storage, nil, true, testThreads)
|
|
chunkDownloader.totalFileSize = int64(totalFileSize)
|
|
|
|
for _, chunk := range chunks {
|
|
chunkDownloader.AddChunk(chunk.GetHash())
|
|
}
|
|
|
|
for i, chunk := range chunks {
|
|
downloaded := chunkDownloader.WaitForChunk(i)
|
|
if downloaded.GetID() != chunk.GetID() {
|
|
t.Error("Uploaded: %s, downloaded: %s", chunk.GetID(), downloaded.GetID())
|
|
}
|
|
}
|
|
|
|
chunkDownloader.Stop()
|
|
|
|
for _, file := range listChunks(storage) {
|
|
err = storage.DeleteFile(0, "chunks/" + file)
|
|
if err != nil {
|
|
t.Errorf("Failed to delete the file %s: %v", file, err)
|
|
return
|
|
}
|
|
}
|
|
|
|
}
|