backupy-agent/apps/agent/internal/pipeline/compress_test.go
TronoSfera 8b0c978337 feat(initial): Backupy agent + backupy-decrypt CLI
Source ports from the TronoSfera/backupy-cloud monorepo:
- apps/agent/        — Go agent (WSS client, persistent queue, Docker
                       discovery, 5 DB drivers: PG/MySQL/Mongo/Redis/SQLite,
                       pre/post hooks, Prometheus metrics)
- apps/backupy-decrypt/ — standalone CLI for client-side decryption
- packages/proto/    — protobuf wire format (generated .pb.go committed
                       so the repo builds without protoc)
- docs/              — agent spec + wire-protocol contract

Apache-2.0 license. Image published to ghcr.io/tronosfera/backupy-agent
on every v* tag via .github/workflows/release.yml (multi-arch amd64+arm64).
2026-05-17 20:22:35 +03:00

57 lines
1.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package pipeline
import (
"bytes"
"crypto/rand"
"io"
"testing"
"github.com/klauspost/compress/zstd"
"github.com/stretchr/testify/require"
)
func TestCompressZstd_RoundTrip(t *testing.T) {
plaintext := make([]byte, 1<<20)
_, err := rand.Read(plaintext)
require.NoError(t, err)
var compressed bytes.Buffer
orig, ccount, err := CompressZstd(bytes.NewReader(plaintext), &compressed)
require.NoError(t, err)
require.Equal(t, int64(len(plaintext)), orig)
require.Equal(t, int64(compressed.Len()), ccount)
dec, err := zstd.NewReader(&compressed)
require.NoError(t, err)
defer dec.Close()
round, err := io.ReadAll(dec)
require.NoError(t, err)
require.Equal(t, plaintext, round, "decompressed bytes must match the original")
}
func TestCompressZstd_Empty(t *testing.T) {
var compressed bytes.Buffer
orig, ccount, err := CompressZstd(bytes.NewReader(nil), &compressed)
require.NoError(t, err)
require.Equal(t, int64(0), orig)
// klauspost/compress >=1.17 emits zero bytes for an empty input
// (no frame header is written when nothing was buffered). We just
// require ccount to match the bytes actually written to `compressed`
// and the round-trip to decompress cleanly to an empty payload.
require.Equal(t, int64(compressed.Len()), ccount)
dec, err := zstd.NewReader(&compressed)
require.NoError(t, err)
defer dec.Close()
round, err := io.ReadAll(dec)
require.NoError(t, err)
require.Empty(t, round, "empty input must round-trip to empty output")
}
func TestCompressZstd_CompressibleInputShrinks(t *testing.T) {
plaintext := bytes.Repeat([]byte("ABCDEFGH"), 4096) // 32 KiB of repetition
var compressed bytes.Buffer
_, _, err := CompressZstd(bytes.NewReader(plaintext), &compressed)
require.NoError(t, err)
require.Less(t, compressed.Len(), len(plaintext)/4, "repetitive input must compress >4×")
}