mirror of
https://github.com/gilbertchen/duplicacy
synced 2025-12-06 00:03:38 +00:00
133 lines
3.9 KiB
Go
133 lines
3.9 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 (
|
|
"testing"
|
|
"bytes"
|
|
crypto_rand "crypto/rand"
|
|
"math/rand"
|
|
"io"
|
|
"sort"
|
|
)
|
|
|
|
func splitIntoChunks(content []byte, n, averageChunkSize, maxChunkSize, minChunkSize,
|
|
bufferCapacity int) ([]string, int) {
|
|
|
|
config := CreateConfig()
|
|
|
|
config.CompressionLevel = DEFAULT_COMPRESSION_LEVEL
|
|
config.AverageChunkSize = averageChunkSize
|
|
config.MaximumChunkSize = maxChunkSize
|
|
config.MinimumChunkSize = minChunkSize
|
|
config.ChunkSeed = []byte("duplicacy")
|
|
|
|
config.HashKey = DEFAULT_KEY
|
|
config.IDKey = DEFAULT_KEY
|
|
|
|
maker := CreateChunkMaker(config, false)
|
|
|
|
var chunks [] string
|
|
totalChunkSize := 0
|
|
totalFileSize := int64(0)
|
|
|
|
//LOG_INFO("CHUNK_SPLIT", "bufferCapacity: %d", bufferCapacity)
|
|
|
|
buffers := make([] *bytes.Buffer, n)
|
|
sizes := make([] int, n)
|
|
sizes[0] = 0
|
|
for i := 1; i < n; i++ {
|
|
same := true
|
|
for same {
|
|
same = false
|
|
sizes[i] = rand.Int() % n
|
|
for j := 0; j < i; j++ {
|
|
if sizes[i] == sizes[j] {
|
|
same = true
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sort.Sort(sort.IntSlice(sizes))
|
|
|
|
for i := 0; i < n - 1; i++ {
|
|
buffers[i] = bytes.NewBuffer(content[sizes[i] : sizes[i + 1]])
|
|
}
|
|
buffers[n - 1] = bytes.NewBuffer(content[sizes[n - 1]:])
|
|
|
|
i := 0
|
|
|
|
maker.ForEachChunk(buffers[0],
|
|
func (chunk *Chunk, final bool) {
|
|
//LOG_INFO("CHUNK_SPLIT", "i: %d, chunk: %s, size: %d", i, chunk.GetHash(), size)
|
|
chunks = append(chunks, chunk.GetHash())
|
|
totalChunkSize += chunk.GetLength()
|
|
},
|
|
func (size int64, hash string) (io.Reader, bool) {
|
|
totalFileSize += size
|
|
i++
|
|
if i >= len(buffers) {
|
|
return nil, false
|
|
}
|
|
return buffers[i], true
|
|
})
|
|
|
|
if (totalFileSize != int64(totalChunkSize)) {
|
|
LOG_ERROR("CHUNK_SPLIT", "total chunk size: %d, total file size: %d", totalChunkSize, totalFileSize)
|
|
}
|
|
return chunks, totalChunkSize
|
|
}
|
|
|
|
func TestChunkMaker(t *testing.T) {
|
|
|
|
|
|
//sizes := [...] int { 64 }
|
|
sizes := [...] int { 64, 256, 1024, 1024 * 10 }
|
|
|
|
for _, size := range sizes {
|
|
|
|
content := make([]byte, size)
|
|
_, err := crypto_rand.Read(content)
|
|
if err != nil {
|
|
t.Errorf("Error generating random content: %v", err)
|
|
continue
|
|
}
|
|
|
|
chunkArray1, totalSize1 := splitIntoChunks(content, 10, 32, 64, 16, 32)
|
|
|
|
capacities := [...]int { 32, 33, 34, 61, 62, 63, 64, 65, 66, 126, 127, 128, 129, 130,
|
|
255, 256, 257, 511, 512, 513, 1023, 1024, 1025,
|
|
32, 48, 64, 128, 256, 512, 1024, 2048, }
|
|
|
|
//capacities := [...]int { 32 }
|
|
|
|
for _, capacity := range capacities {
|
|
|
|
for _, n := range [...]int { 6, 7, 8, 9, 10 } {
|
|
chunkArray2, totalSize2 := splitIntoChunks(content, n, 32, 64, 16, capacity)
|
|
|
|
if totalSize1 != totalSize2 {
|
|
t.Errorf("[size %d, capacity %d] total size is %d instead of %d",
|
|
size, capacity, totalSize2, totalSize1)
|
|
}
|
|
|
|
if len(chunkArray1) != len(chunkArray2) {
|
|
t.Errorf("[size %d, capacity %d] number of chunks is %d instead of %d",
|
|
size, capacity, len(chunkArray2), len(chunkArray1))
|
|
} else {
|
|
for i := 0; i < len(chunkArray1); i++ {
|
|
if chunkArray1[i] != chunkArray2[i] {
|
|
t.Errorf("[size %d, capacity %d, chunk %d] chunk is different", size, capacity, i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|