Skip to content

Commit

Permalink
tarfs: add unit test cases for tarfs
Browse files Browse the repository at this point in the history
Add unit test cases for tarfs.

Signed-off-by: Jiang Liu <gerry@linux.alibaba.com>
  • Loading branch information
jiangliu committed Nov 20, 2023
1 parent 4060f01 commit bfc11e7
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 3 deletions.
13 changes: 10 additions & 3 deletions pkg/tarfs/tarfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ func (t *Manager) fetchImageConfig(ctx context.Context, remote *remote.Remote, r
return config, nil
}

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
func (t *Manager) getBlobDiffID(ctx context.Context, remote *remote.Remote, ref string, manifestDigest, layerDigest digest.Digest) (digest.Digest, error) {
if diffid, ok := t.diffIDCache.Get(layerDigest); ok {
return diffid.(digest.Digest), nil
Expand Down Expand Up @@ -444,6 +445,8 @@ func (t *Manager) retryPrepareLayer(snapshotID, upperDirPath string, labels map[
return nil
}

// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

func (t *Manager) PrepareLayer(snapshotID, ref string, manifestDigest, layerDigest digest.Digest, upperDirPath string) error {
t.mutex.Lock()
if _, ok := t.snapshotMap[snapshotID]; ok {
Expand All @@ -465,6 +468,7 @@ func (t *Manager) PrepareLayer(snapshotID, ref string, manifestDigest, layerDige
return t.blobProcess(ctx, snapshotID, ref, manifestDigest, layerDigest, upperDirPath, false)
}

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
func (t *Manager) MergeLayers(ctx context.Context, s storage.Snapshot, storageLocater func(string) string,
infoGetter func(ctx context.Context, id string) (string, snapshots.Info, error)) error {
mergedBootstrap := t.imageMetaFilePath(storageLocater(s.ParentIDs[0]))
Expand Down Expand Up @@ -939,6 +943,8 @@ func (t *Manager) RecoverRafsInstance(r *rafs.Rafs) error {
return nil
}

// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

func (t *Manager) getSnapshotStatusWithLock(snapshotID string) (*snapshotStatus, error) {
t.mutex.Lock()
defer t.mutex.Unlock()
Expand Down Expand Up @@ -999,15 +1005,15 @@ func (t *Manager) CheckTarfsHintAnnotation(ctx context.Context, ref string, mani
if err != nil {
return false, err
}
remote := remote.New(keyChain, t.insecure)
remoteFactory := remote.New(keyChain, t.insecure)

handle := func() (bool, error) {
if tarfsHint, ok := t.tarfsHintCache.Get(ref); ok {
return tarfsHint.(bool), nil
}

if _, err, _ := t.sg.Do(ref, func() (interface{}, error) {
err := t.fetchImageInfo(ctx, remote, ref, manifestDigest)
err := t.fetchImageInfo(ctx, remoteFactory, ref, manifestDigest)
return nil, err
}); err != nil {
return false, err
Expand All @@ -1021,7 +1027,8 @@ func (t *Manager) CheckTarfsHintAnnotation(ctx context.Context, ref string, mani
}

tarfsHint, err := handle()
if err != nil && remote.RetryWithPlainHTTP(ref, err) {
if err != nil && remoteFactory.RetryWithPlainHTTP(ref, err) {
remoteFactory = remote.New(keyChain, t.insecure)
tarfsHint, err = handle()
}
return tarfsHint, err
Expand Down
109 changes: 109 additions & 0 deletions pkg/tarfs/tarfs_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* Copyright (c) 2023. Nydus Developers. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/

package tarfs

import (
"context"
"testing"

"github.com/containerd/continuity/testutil"
"github.com/containerd/nydus-snapshotter/pkg/label"
"github.com/containerd/nydus-snapshotter/pkg/rafs"
"github.com/opencontainers/go-digest"
"gotest.tools/assert"
)

const (
BusyboxRef = "quay.io/quay/busybox@sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d"
BusyboxManifestDigest = "sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d"
BusyboxLayerDigest = "sha256:ee780d08a5b4de5192a526d422987f451d9a065e6da42aefe8c3b20023a250c7"
)

func TestPrepareLayer(t *testing.T) {
manager := NewManager(true, true, "/tmp/tarfs", "/usr/bin/nydus-image", 4)
manifestDigest, err := digest.Parse(BusyboxManifestDigest)
assert.Assert(t, err)
layerDigest, err := digest.Parse(BusyboxLayerDigest)
assert.Assert(t, err)

err = manager.PrepareLayer("snapshot1", BusyboxRef, manifestDigest, layerDigest, t.TempDir())
assert.Assert(t, err)

// snapshot, err := manager.waitLayerReady("snapshot1", true)
// assert.Assert(t, err)
// assert.Equal(t, snapshot.blobID, "ee780d08a5b4de5192a526d422987f451d9a065e6da42aefe8c3b20023a250c7")

err = manager.PrepareLayer("snapshot1", BusyboxRef, manifestDigest, layerDigest, t.TempDir())
assert.Assert(t, err != nil)
}

func TestCheckTarfsHintAnnotation(t *testing.T) {
manager := NewManager(true, true, "/tmp/tarfs", "/usr/bin/nydus-image", 4)
ctx := context.Background()
hint, err := manager.CheckTarfsHintAnnotation(ctx, BusyboxRef, BusyboxManifestDigest)
assert.Assert(t, err)
assert.Equal(t, hint, false)
}

func TestGetConcurrentLimiter(t *testing.T) {
manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4)
limiter := manager.GetConcurrentLimiter("busybox")
assert.Assert(t, limiter != nil)
assert.Equal(t, manager.GetConcurrentLimiter("busybox"), limiter)

}

func TestCopyTarfsAnnotations(t *testing.T) {
manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4)
rafs := &rafs.Rafs{
Annotations: make(map[string]string),
}

annotations := map[string]string{}
annotations[label.CRIImageRef] = "cri_image_ref"
annotations[label.CRILayerDigest] = "cri_layer_digest"
annotations[label.CRIManifestDigest] = "cri_manigest_digest"
annotations[label.NydusTarfsLayer] = "nydus_tarfs_layer"
annotations[label.NydusImageBlockInfo] = "nydus_image_block_info"
annotations[label.NydusLayerBlockInfo] = "nydus_layer_block_info"
annotations["unsupported_key"] = "error"

manager.copyTarfsAnnotations(annotations, rafs)
assert.Equal(t, len(rafs.Annotations), 6)
assert.Equal(t, rafs.Annotations[label.CRIImageRef], annotations[label.CRIImageRef])
assert.Equal(t, rafs.Annotations[label.CRILayerDigest], annotations[label.CRILayerDigest])
}

func TestTarfsFilePath(t *testing.T) {
manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4)

assert.Equal(t, manager.layerTarFilePath("blob1"), "/tmp/tarfs/blob1")
assert.Equal(t, manager.layerDiskFilePath("blob1"), "/tmp/tarfs/blob1.layer.disk")
assert.Equal(t, manager.ImageDiskFilePath("blob1"), "/tmp/tarfs/blob1.image.disk")
assert.Equal(t, manager.layerMetaFilePath("/tarfs/fs"), "/tarfs/fs/image/layer.boot")
assert.Equal(t, manager.imageMetaFilePath("/tarfs/fs"), "/tarfs/fs/image/image.boot")
}

func TestTarfsStatusString(t *testing.T) {
assert.Equal(t, tarfsStatusString(TarfsStatusReady), "Ready")
assert.Equal(t, tarfsStatusString(TarfsStatusPrepare), "Prepare")
assert.Equal(t, tarfsStatusString(TarfsStatusFailed), "Failed")
assert.Equal(t, tarfsStatusString(4), "Unknown")
}

func TestAttachBlob(t *testing.T) {
testutil.RequiresRoot(t)

manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4)
blobFile := createTempFile(t)
loopdev, err := manager.attachLoopdev(blobFile)
assert.Assert(t, err)
err = deleteLoop(loopdev)
assert.Assert(t, err)
err = deleteLoop(loopdev)
assert.Assert(t, err != nil)
}

0 comments on commit bfc11e7

Please sign in to comment.