From 7cc1aa15560b2600e7c949284dd66e6be61ca9f3 Mon Sep 17 00:00:00 2001 From: Jiang Liu Date: Wed, 6 Dec 2023 22:27:12 +0800 Subject: [PATCH] storage: add smoking test for chunk dedup Add smoking test case for chunk dedup. Signed-off-by: Jiang Liu --- smoke/tests/chunk_dedup.go | 75 +++++++++++++++++++++++++++++++++++++ smoke/tests/tool/context.go | 1 + smoke/tests/tool/nydusd.go | 4 ++ smoke/tests/tool/verify.go | 1 + storage/src/utils.rs | 2 +- 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 smoke/tests/chunk_dedup.go diff --git a/smoke/tests/chunk_dedup.go b/smoke/tests/chunk_dedup.go new file mode 100644 index 00000000000..208621d9002 --- /dev/null +++ b/smoke/tests/chunk_dedup.go @@ -0,0 +1,75 @@ +// Copyright 2023 Nydus Developers. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + +package tests + +import ( + "path/filepath" + "testing" + + "github.com/containerd/nydus-snapshotter/pkg/converter" + "github.com/dragonflyoss/image-service/smoke/tests/texture" + "github.com/dragonflyoss/image-service/smoke/tests/tool" + "github.com/dragonflyoss/image-service/smoke/tests/tool/test" + "github.com/opencontainers/go-digest" + "github.com/stretchr/testify/require" +) + +const ( + paramIteration = "iteration" +) + +type ChunkDedupTestSuite struct { + t *testing.T +} + +func (z *ChunkDedupTestSuite) TestChunkDedup() test.Generator { + + scenarios := tool.DescartesIterator{} + scenarios.Dimension(paramIteration, []interface{}{1, 2}) + + return func() (name string, testCase test.Case) { + if !scenarios.HasNext() { + return + } + scenario := scenarios.Next() + + ctx := tool.DefaultContext(z.t) + ctx.Runtime.ChunkDedupDbFile = ctx.Env.WorkDir + "/cas.db" + + return scenario.Str(), func(t *testing.T) { + z.testMakeLayers(*ctx, t) + } + } +} + +func (z *ChunkDedupTestSuite) testMakeLayers(ctx tool.Context, t *testing.T) { + + // Prepare work directory + ctx.PrepareWorkDir(t) + defer ctx.Destroy(t) + + lowerLayer := texture.MakeLowerLayer(t, filepath.Join(ctx.Env.WorkDir, "source")) + lowerOCIBlobDigest, lowerRafsBlobDigest := lowerLayer.PackRef(t, ctx, ctx.Env.BlobDir, ctx.Build.OCIRefGzip) + mergeOption := converter.MergeOption{ + BuilderPath: ctx.Binary.Builder, + ChunkDictPath: "", + OCIRef: true, + } + actualDigests, lowerBootstrap := tool.MergeLayers(t, ctx, mergeOption, []converter.Layer{ + { + Digest: lowerRafsBlobDigest, + OriginalDigest: &lowerOCIBlobDigest, + }, + }) + require.Equal(t, []digest.Digest{lowerOCIBlobDigest}, actualDigests) + + // Verify lower layer mounted by nydusd + ctx.Env.BootstrapPath = lowerBootstrap + tool.Verify(t, ctx, lowerLayer.FileTree) +} + +func TestChunkDedup(t *testing.T) { + test.Run(t, &ChunkDedupTestSuite{t: t}) +} diff --git a/smoke/tests/tool/context.go b/smoke/tests/tool/context.go index 7d409d3b996..7673232693e 100644 --- a/smoke/tests/tool/context.go +++ b/smoke/tests/tool/context.go @@ -39,6 +39,7 @@ type RuntimeContext struct { RafsMode string EnablePrefetch bool AmplifyIO uint64 + ChunkDedupDb string } type EnvContext struct { diff --git a/smoke/tests/tool/nydusd.go b/smoke/tests/tool/nydusd.go index a56b85aeeb0..100b82f31ae 100644 --- a/smoke/tests/tool/nydusd.go +++ b/smoke/tests/tool/nydusd.go @@ -69,6 +69,7 @@ type NydusdConfig struct { AccessPattern bool PrefetchFiles []string AmplifyIO uint64 + ChunkDedupDb string } type Nydusd struct { @@ -205,6 +206,9 @@ func (nydusd *Nydusd) Mount() error { if len(nydusd.BootstrapPath) > 0 { args = append(args, "--bootstrap", nydusd.BootstrapPath) } + if len(nydusd.ChunkDedupDbFile) > 0 { + args = append(args, "--dedup", nydusd.ChunkDedupDb) + } cmd := exec.Command(nydusd.NydusdPath, args...) cmd.Stdout = os.Stdout diff --git a/smoke/tests/tool/verify.go b/smoke/tests/tool/verify.go index d2d4ad277d2..55104aa26b5 100644 --- a/smoke/tests/tool/verify.go +++ b/smoke/tests/tool/verify.go @@ -30,6 +30,7 @@ func Verify(t *testing.T, ctx Context, expectedFiles map[string]*File) { RafsMode: ctx.Runtime.RafsMode, DigestValidate: false, AmplifyIO: ctx.Runtime.AmplifyIO, + ChunkDedupDb: ctx.Runtime.ChunkDedupDb, } nydusd, err := NewNydusd(config) diff --git a/storage/src/utils.rs b/storage/src/utils.rs index c4abe2f2b99..c8f8671f531 100644 --- a/storage/src/utils.rs +++ b/storage/src/utils.rs @@ -421,7 +421,7 @@ mod tests { let mut src = TempFile::new().unwrap().into_file(); let dst = TempFile::new().unwrap(); - let buf = vec![08u8; 4096]; + let buf = vec![8u8; 4096]; src.write_all(&buf).unwrap(); copy_file_range(&src, 0, dst.as_file(), 4096, 4096).unwrap(); assert_eq!(dst.as_file().metadata().unwrap().len(), 8192);