2022-05-06 19:24:27 +00:00
|
|
|
package chunksize
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/rclone/rclone/fs"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestComputeChunkSize(t *testing.T) {
|
2022-08-09 09:44:54 +00:00
|
|
|
for _, test := range []struct {
|
|
|
|
name string
|
|
|
|
size fs.SizeSuffix
|
2022-05-06 19:24:27 +00:00
|
|
|
maxParts int
|
|
|
|
defaultChunkSize fs.SizeSuffix
|
2022-08-09 09:44:54 +00:00
|
|
|
want fs.SizeSuffix
|
2022-05-06 19:24:27 +00:00
|
|
|
}{
|
2022-08-09 09:44:54 +00:00
|
|
|
{
|
|
|
|
name: "streaming file",
|
|
|
|
size: -1,
|
|
|
|
maxParts: 10000,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(10),
|
|
|
|
want: toSizeSuffixMiB(10),
|
|
|
|
}, {
|
|
|
|
name: "default size returned when file size is small enough",
|
|
|
|
size: 1000,
|
|
|
|
maxParts: 10000,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(10),
|
|
|
|
want: toSizeSuffixMiB(10),
|
|
|
|
}, {
|
|
|
|
name: "default size returned when file size is just 1 byte small enough",
|
|
|
|
size: toSizeSuffixMiB(100000) - 1,
|
|
|
|
maxParts: 10000,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(10),
|
|
|
|
want: toSizeSuffixMiB(10),
|
|
|
|
}, {
|
|
|
|
name: "no rounding up when everything divides evenly",
|
|
|
|
size: toSizeSuffixMiB(1000000),
|
|
|
|
maxParts: 10000,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(100),
|
|
|
|
want: toSizeSuffixMiB(100),
|
|
|
|
}, {
|
|
|
|
name: "rounding up to nearest MiB when not quite enough parts",
|
|
|
|
size: toSizeSuffixMiB(1000000),
|
|
|
|
maxParts: 9999,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(100),
|
|
|
|
want: toSizeSuffixMiB(101),
|
|
|
|
}, {
|
|
|
|
name: "rounding up to nearest MiB when one extra byte",
|
|
|
|
size: toSizeSuffixMiB(1000000) + 1,
|
|
|
|
maxParts: 10000,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(100),
|
|
|
|
want: toSizeSuffixMiB(101),
|
|
|
|
}, {
|
|
|
|
name: "expected MiB value when rounding sets to absolute minimum",
|
|
|
|
size: toSizeSuffixMiB(1) - 1,
|
|
|
|
maxParts: 1,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(1),
|
|
|
|
want: toSizeSuffixMiB(1),
|
|
|
|
}, {
|
|
|
|
name: "expected MiB value when rounding to absolute min with extra",
|
|
|
|
size: toSizeSuffixMiB(1) + 1,
|
|
|
|
maxParts: 1,
|
|
|
|
defaultChunkSize: toSizeSuffixMiB(1),
|
|
|
|
want: toSizeSuffixMiB(2),
|
|
|
|
}, {
|
|
|
|
name: "issue from forum #1",
|
|
|
|
size: 120864818840,
|
|
|
|
maxParts: 10000,
|
|
|
|
defaultChunkSize: 5 * 1024 * 1024,
|
|
|
|
want: toSizeSuffixMiB(12),
|
|
|
|
},
|
|
|
|
} {
|
|
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
got := Calculator(test.name, int64(test.size), test.maxParts, test.defaultChunkSize)
|
|
|
|
if got != test.want {
|
|
|
|
t.Fatalf("expected: %v, got: %v", test.want, got)
|
|
|
|
}
|
|
|
|
if test.size < 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
parts := func(result fs.SizeSuffix) int {
|
|
|
|
n := test.size / result
|
|
|
|
r := test.size % result
|
|
|
|
if r != 0 {
|
|
|
|
n++
|
|
|
|
}
|
|
|
|
return int(n)
|
|
|
|
}
|
|
|
|
// Check this gives the parts in range
|
|
|
|
if parts(got) > test.maxParts {
|
|
|
|
t.Fatalf("too many parts %d", parts(got))
|
|
|
|
}
|
|
|
|
// Check that setting chunk size smaller gave too many parts
|
|
|
|
if got > test.defaultChunkSize {
|
|
|
|
if parts(got-toSizeSuffixMiB(1)) <= test.maxParts {
|
|
|
|
t.Fatalf("chunk size %v too big as %v only gives %d parts", got, got-toSizeSuffixMiB(1), parts(got-toSizeSuffixMiB(1)))
|
|
|
|
}
|
2022-05-06 19:24:27 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func toSizeSuffixMiB(size int64) fs.SizeSuffix {
|
|
|
|
return fs.SizeSuffix(size * int64(fs.Mebi))
|
|
|
|
}
|