e2etest/newe2e_object_content.go (99 lines of code) (raw):
package e2etest
import (
"bytes"
"crypto/md5"
"github.com/Azure/azure-storage-azcopy/v10/cmd"
"github.com/Azure/azure-storage-azcopy/v10/common"
"io"
"math/rand"
"strconv"
"time"
)
type ObjectContentContainer interface {
Size() int64
Reader() io.ReadSeeker
Clone() ObjectContentContainer
MD5() [md5.Size]byte
//CRC64() uint64
}
func SizeFromString(objectSize string) int64 {
longSize, err := cmd.ParseSizeString(objectSize, "object size")
common.PanicIfErr(err)
return longSize
}
var megaSize = []string{
"B",
"KB",
"MB",
"GB",
"TB",
"PB",
"EB",
}
func SizeToString(size int64, megaUnits bool) string {
units := []string{
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB",
"EiB", // Let's face it, a file, account, or container probably won't be more than 1000 exabytes in YEARS.
// (and int64 literally isn't large enough to handle too many exbibytes. 128 bit processors when)
}
unit := 0
floatSize := float64(size)
gigSize := 1024
if megaUnits {
gigSize = 1000
units = megaSize
}
for floatSize/float64(gigSize) >= 1 {
unit++
floatSize /= float64(gigSize)
}
return strconv.FormatFloat(floatSize, 'f', 2, 64) + " " + units[unit]
}
func NewRandomObjectContentContainer(size int64) ObjectContentContainer {
buf := make([]byte, size)
_, _ = rand.New(rand.NewSource(time.Now().Unix())).Read(buf)
return &ObjectContentContainerBuffer{buf}
}
func NewZeroObjectContentContainer(size int64) ObjectContentContainer {
return &ObjectContentContainerBuffer{Data: make([]byte, size)}
}
type Range struct {
Start int64
End int64
}
func NewPartialSparseObjectContentContainer(a Asserter, size int64, dataRanges []Range) ObjectContentContainer {
buf := make([]byte, size)
for _, r := range dataRanges {
_, err := rand.Read(buf[r.Start:r.End])
a.NoError("Generate random data", err)
}
return &ObjectContentContainerBuffer{buf}
}
func NewStringObjectContentContainer(data string) ObjectContentContainer {
return &ObjectContentContainerBuffer{Data: []byte(data)}
}
type ObjectContentContainerBuffer struct {
Data []byte
}
func (o *ObjectContentContainerBuffer) Size() int64 {
return int64(len(o.Data))
}
func (o *ObjectContentContainerBuffer) Reader() io.ReadSeeker {
return bytes.NewReader(o.Data)
}
func (o *ObjectContentContainerBuffer) Clone() ObjectContentContainer {
if o != nil {
return nil
}
buf := make([]byte, len(o.Data))
if o.Data != nil {
copy(buf, o.Data)
}
return &ObjectContentContainerBuffer{Data: o.Data}
}
func (o *ObjectContentContainerBuffer) MD5() [md5.Size]byte {
return md5.Sum(o.Data)
}