Skip to content

Commit 9b0521a

Browse files
committed
tarfs: add unit test cases for tarfs
Add unit test cases for tarfs. Signed-off-by: Jiang Liu <[email protected]>
1 parent 4060f01 commit 9b0521a

File tree

5 files changed

+281
-0
lines changed

5 files changed

+281
-0
lines changed

.github/workflows/ci.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ jobs:
2828
key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
2929
restore-keys: |
3030
${{ runner.os }}-go
31+
- name: Setup Nydus
32+
run: |
33+
# Download nydus components
34+
NYDUS_VER=v$(curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -s "https://api.github.com/repos/dragonflyoss/nydus/releases/latest" | jq -r .tag_name | sed 's/^v//')
35+
wget https://github.com/dragonflyoss/nydus/releases/download/$NYDUS_VER/nydus-static-$NYDUS_VER-linux-amd64.tgz
36+
tar xzvf nydus-static-$NYDUS_VER-linux-amd64.tgz
37+
mkdir -p /usr/bin
38+
sudo mv nydus-static/nydus-image /usr/bin/
3139
- name: Build
3240
run: |
3341
go install github.com/golangci/golangci-lint/cmd/[email protected]
@@ -135,6 +143,14 @@ jobs:
135143
key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
136144
restore-keys: |
137145
${{ runner.os }}-go
146+
- name: Setup Nydus
147+
run: |
148+
# Download nydus components
149+
NYDUS_VER=v$(curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -s "https://api.github.com/repos/dragonflyoss/nydus/releases/latest" | jq -r .tag_name | sed 's/^v//')
150+
wget https://github.com/dragonflyoss/nydus/releases/download/$NYDUS_VER/nydus-static-$NYDUS_VER-linux-amd64.tgz
151+
tar xzvf nydus-static-$NYDUS_VER-linux-amd64.tgz
152+
mkdir -p /usr/bin
153+
sudo mv nydus-static/nydus-image /usr/bin/
138154
- name: Run unit tests.
139155
run: make cover
140156
- name: Upload coverage to Codecov

pkg/daemon/config_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright (c) 2023. Nydus Developers. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package daemon
8+
9+
import (
10+
"testing"
11+
12+
"github.com/containerd/nydus-snapshotter/config"
13+
"gotest.tools/assert"
14+
)
15+
16+
func TestConfigOptions(t *testing.T) {
17+
tmpDir := t.TempDir()
18+
opts := []NewDaemonOpt{
19+
WithSocketDir("/tmp/socket"),
20+
WithRef(5),
21+
WithLogDir(tmpDir),
22+
WithLogToStdout(true),
23+
WithLogLevel("Warning"),
24+
WithLogRotationSize(1024),
25+
WithConfigDir(tmpDir),
26+
WithMountpoint("/tmp/mnt"),
27+
WithNydusdThreadNum(4),
28+
WithFsDriver("fscache"),
29+
WithDaemonMode("dedicated"),
30+
}
31+
32+
daemon, err := NewDaemon(opts...)
33+
assert.Assert(t, err)
34+
assert.Equal(t, daemon.States.APISocket, "/tmp/socket/"+daemon.ID()+"/api.sock")
35+
assert.Equal(t, daemon.ref, int32(5))
36+
assert.Equal(t, daemon.States.LogDir, tmpDir+"/"+daemon.ID())
37+
assert.Equal(t, daemon.States.LogToStdout, true)
38+
assert.Equal(t, daemon.States.LogLevel, "Warning")
39+
assert.Equal(t, daemon.States.LogRotationSize, 1024)
40+
assert.Equal(t, daemon.States.ConfigDir, tmpDir+"/"+daemon.ID())
41+
assert.Equal(t, daemon.States.Mountpoint, "/tmp/mnt")
42+
assert.Equal(t, daemon.States.ThreadNum, 4)
43+
assert.Equal(t, daemon.States.FsDriver, "fscache")
44+
assert.Equal(t, string(daemon.States.DaemonMode), "dedicated")
45+
46+
}
47+
48+
func String(daemonMode config.DaemonMode) {
49+
panic("unimplemented")
50+
}

pkg/daemon/idgen_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (c) 2023. Nydus Developers. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package daemon
8+
9+
import (
10+
"testing"
11+
12+
"gotest.tools/assert"
13+
)
14+
15+
func TestIdGenerate(t *testing.T) {
16+
id1 := newID()
17+
id2 := newID()
18+
19+
assert.Assert(t, len(id1) > 0)
20+
assert.Assert(t, len(id2) > 0)
21+
assert.Assert(t, id1 != id2)
22+
}

pkg/rafs/rafs_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright (c) 2022. Nydus Developers. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package rafs
8+
9+
import (
10+
"testing"
11+
12+
"github.com/containerd/nydus-snapshotter/config"
13+
"github.com/containerd/nydus-snapshotter/internal/constant"
14+
"gotest.tools/assert"
15+
)
16+
17+
func TestRafsSetEmpty(t *testing.T) {
18+
cache := NewRafsCache()
19+
20+
assert.Assert(t, cache.Get("rafs1") == nil)
21+
assert.Equal(t, cache.Len(), 0)
22+
assert.Assert(t, cache.Head() == nil)
23+
instances := cache.List()
24+
assert.Equal(t, len(instances), 0)
25+
}
26+
27+
func TestRafs(t *testing.T) {
28+
tmpDir := t.TempDir()
29+
snapshotterConfig := config.SnapshotterConfig{}
30+
snapshotterConfig.Root = tmpDir
31+
snapshotterConfig.DaemonMode = constant.DaemonModeDedicated
32+
assert.Assert(t, config.ProcessConfigurations(&snapshotterConfig))
33+
34+
rafs, err := NewRafs("snapshot1", "image1", "fscache")
35+
assert.Assert(t, err)
36+
assert.Equal(t, rafs, RafsGlobalCache.Get("snapshot1"))
37+
assert.Equal(t, RafsGlobalCache.Len(), 1)
38+
assert.Equal(t, rafs, RafsGlobalCache.Head())
39+
instances := RafsGlobalCache.List()
40+
assert.Equal(t, len(instances), 1)
41+
assert.Equal(t, instances["snapshot1"].SnapshotID, "snapshot1")
42+
43+
RafsGlobalCache.Lock()
44+
instances2 := RafsGlobalCache.ListLocked()
45+
RafsGlobalCache.Unlock()
46+
assert.Equal(t, len(instances2), 1)
47+
48+
RafsGlobalCache.SetIntances(instances)
49+
assert.Equal(t, RafsGlobalCache.Len(), 1)
50+
assert.Equal(t, RafsGlobalCache.Head().SnapshotID, "snapshot1")
51+
52+
assert.Equal(t, len(rafs.Annotations), 0)
53+
rafs.AddAnnotation("key", "value")
54+
assert.Equal(t, len(rafs.Annotations), 1)
55+
assert.Equal(t, rafs.GetSnapshotDir(), tmpDir+"/snapshots/snapshot1")
56+
assert.Equal(t, rafs.RelaMountpoint(), "/snapshot1")
57+
assert.Equal(t, rafs.FscacheWorkDir(), tmpDir+"/snapshots/snapshot1/fs")
58+
assert.Equal(t, rafs.GetFsDriver(), "fscache")
59+
rafs.SetMountpoint("/tmp/mnt")
60+
assert.Equal(t, rafs.GetMountpoint(), "/tmp/mnt")
61+
_, err = rafs.BootstrapFile()
62+
assert.Assert(t, err != nil)
63+
64+
RafsGlobalCache.Remove("snapshot1")
65+
assert.Equal(t, RafsGlobalCache.Len(), 0)
66+
}

pkg/tarfs/tarfs_test.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
* Copyright (c) 2023. Nydus Developers. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package tarfs
8+
9+
import (
10+
"context"
11+
"testing"
12+
13+
"github.com/containerd/continuity/testutil"
14+
"github.com/containerd/nydus-snapshotter/pkg/label"
15+
"github.com/containerd/nydus-snapshotter/pkg/rafs"
16+
"github.com/opencontainers/go-digest"
17+
"gotest.tools/assert"
18+
)
19+
20+
const (
21+
BusyboxRef = "quay.io/quay/busybox@sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d"
22+
BusyboxManifestDigest = "sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d"
23+
BusyboxLayerDigest = "sha256:ee780d08a5b4de5192a526d422987f451d9a065e6da42aefe8c3b20023a250c7"
24+
NydusImagePath = "nydus-image"
25+
)
26+
27+
// TODO: add unit test for MergeLayers, ExportBlockData, MountErofs, RemountErofs, UmountTarErofs, DetachLayer,
28+
// RecoverSnapshoInfo, RecoverRafsInstance, getImageBlobInfo
29+
30+
func TestPrepareLayer(t *testing.T) {
31+
manager := NewManager(true, true, t.TempDir(), NydusImagePath, 4)
32+
manifestDigest, err := digest.Parse(BusyboxManifestDigest)
33+
assert.Assert(t, err)
34+
layerDigest, err := digest.Parse(BusyboxLayerDigest)
35+
assert.Assert(t, err)
36+
37+
err = manager.PrepareLayer("snapshot1", BusyboxRef, manifestDigest, layerDigest, t.TempDir())
38+
assert.Assert(t, err)
39+
40+
snapshot, err := manager.waitLayerReady("snapshot1", true)
41+
// tarfs_test.go:36: assertion failed: error is not nil: generate tarfs from image layer blob: converting OCIv1 layer blob to tarfs: exec: "nydus-image": executable file not found in $PATH
42+
assert.Assert(t, err != nil)
43+
if err == nil {
44+
assert.Equal(t, snapshot.blobID, "ee780d08a5b4de5192a526d422987f451d9a065e6da42aefe8c3b20023a250c7")
45+
}
46+
47+
err = manager.PrepareLayer("snapshot1", BusyboxRef, manifestDigest, layerDigest, t.TempDir())
48+
assert.Assert(t, err != nil)
49+
}
50+
51+
func TestBlobProcess(t *testing.T) {
52+
manager := NewManager(true, true, t.TempDir(), NydusImagePath, 4)
53+
manifestDigest, err := digest.Parse(BusyboxManifestDigest)
54+
assert.Assert(t, err)
55+
layerDigest, err := digest.Parse(BusyboxLayerDigest)
56+
assert.Assert(t, err)
57+
58+
err = manager.blobProcess(context.Background(), "snapshot2", BusyboxRef, manifestDigest, layerDigest, t.TempDir(), true)
59+
assert.Assert(t, err != nil)
60+
}
61+
62+
func TestCheckTarfsHintAnnotation(t *testing.T) {
63+
manager := NewManager(true, true, t.TempDir(), NydusImagePath, 4)
64+
ctx := context.Background()
65+
hint, err := manager.CheckTarfsHintAnnotation(ctx, BusyboxRef, BusyboxManifestDigest)
66+
assert.Assert(t, err)
67+
assert.Equal(t, hint, false)
68+
}
69+
70+
func TestGetConcurrentLimiter(t *testing.T) {
71+
manager := NewManager(false, false, t.TempDir(), NydusImagePath, 4)
72+
limiter := manager.GetConcurrentLimiter("busybox")
73+
assert.Assert(t, limiter != nil)
74+
assert.Equal(t, manager.GetConcurrentLimiter("busybox"), limiter)
75+
76+
}
77+
78+
func TestCopyTarfsAnnotations(t *testing.T) {
79+
manager := NewManager(false, false, t.TempDir(), NydusImagePath, 4)
80+
rafs := &rafs.Rafs{
81+
Annotations: make(map[string]string),
82+
}
83+
84+
annotations := map[string]string{}
85+
annotations[label.CRIImageRef] = "cri_image_ref"
86+
annotations[label.CRILayerDigest] = "cri_layer_digest"
87+
annotations[label.CRIManifestDigest] = "cri_manigest_digest"
88+
annotations[label.NydusTarfsLayer] = "nydus_tarfs_layer"
89+
annotations[label.NydusImageBlockInfo] = "nydus_image_block_info"
90+
annotations[label.NydusLayerBlockInfo] = "nydus_layer_block_info"
91+
annotations["unsupported_key"] = "error"
92+
93+
manager.copyTarfsAnnotations(annotations, rafs)
94+
assert.Equal(t, len(rafs.Annotations), 6)
95+
assert.Equal(t, rafs.Annotations[label.CRIImageRef], annotations[label.CRIImageRef])
96+
assert.Equal(t, rafs.Annotations[label.CRILayerDigest], annotations[label.CRILayerDigest])
97+
}
98+
99+
func TestTarfsFilePath(t *testing.T) {
100+
manager := NewManager(false, false, "/tmp/tarfs", NydusImagePath, 4)
101+
102+
assert.Equal(t, manager.layerTarFilePath("blob1"), "/tmp/tarfs/blob1")
103+
assert.Equal(t, manager.layerDiskFilePath("blob1"), "/tmp/tarfs/blob1.layer.disk")
104+
assert.Equal(t, manager.ImageDiskFilePath("blob1"), "/tmp/tarfs/blob1.image.disk")
105+
assert.Equal(t, manager.layerMetaFilePath("/tarfs/fs"), "/tarfs/fs/image/layer.boot")
106+
assert.Equal(t, manager.imageMetaFilePath("/tarfs/fs"), "/tarfs/fs/image/image.boot")
107+
}
108+
109+
func TestTarfsStatusString(t *testing.T) {
110+
assert.Equal(t, tarfsStatusString(TarfsStatusReady), "Ready")
111+
assert.Equal(t, tarfsStatusString(TarfsStatusPrepare), "Prepare")
112+
assert.Equal(t, tarfsStatusString(TarfsStatusFailed), "Failed")
113+
assert.Equal(t, tarfsStatusString(4), "Unknown")
114+
}
115+
116+
func TestAttachBlob(t *testing.T) {
117+
testutil.RequiresRoot(t)
118+
119+
manager := NewManager(false, false, t.TempDir(), NydusImagePath, 4)
120+
blobFile := createTempFile(t)
121+
loopdev, err := manager.attachLoopdev(blobFile)
122+
assert.Assert(t, err)
123+
err = deleteLoop(loopdev)
124+
assert.Assert(t, err)
125+
err = deleteLoop(loopdev)
126+
assert.Assert(t, err != nil)
127+
}

0 commit comments

Comments
 (0)