integration: reproduce #9347

Signed-off-by: Wei Fu <fuweid89@gmail.com>
This commit is contained in:
Wei Fu
2023-11-15 19:47:05 +08:00
parent 2e9686c054
commit 7f410ae05a
2 changed files with 105 additions and 3 deletions

View File

@@ -21,8 +21,10 @@ import (
"path/filepath"
"sync"
"testing"
"time"
containerd "github.com/containerd/containerd/v2/client"
"github.com/containerd/containerd/v2/content"
"github.com/containerd/containerd/v2/pkg/cri/constants"
"github.com/containerd/containerd/v2/platforms"
"github.com/containerd/containerd/v2/plugins"
@@ -30,6 +32,7 @@ import (
srvconfig "github.com/containerd/containerd/v2/services/server/config"
"github.com/containerd/log/logtest"
"github.com/containerd/plugin"
"github.com/opencontainers/go-digest"
_ "github.com/containerd/containerd/v2/diff/walking/plugin"
_ "github.com/containerd/containerd/v2/events/plugin"
@@ -59,9 +62,11 @@ var (
loadedPluginsErr error
)
type tweakPluginInitFunc func(t *testing.T, p plugin.Registration) plugin.Registration
// buildLocalContainerdClient is to return containerd client with initialized
// core plugins in local.
func buildLocalContainerdClient(t *testing.T, tmpDir string) *containerd.Client {
func buildLocalContainerdClient(t *testing.T, tmpDir string, tweakInitFn tweakPluginInitFunc) *containerd.Client {
ctx := logtest.WithT(context.Background(), t)
// load plugins
@@ -104,6 +109,10 @@ func buildLocalContainerdClient(t *testing.T, tmpDir string) *containerd.Client
initContext.Config = pc
}
if tweakInitFn != nil {
p = tweakInitFn(t, p)
}
result := p.Init(initContext)
assert.NoError(t, initialized.Add(result))
@@ -124,3 +133,61 @@ func buildLocalContainerdClient(t *testing.T, tmpDir string) *containerd.Client
return client
}
func tweakContentInitFnWithDelayer(commitDelayDuration time.Duration) tweakPluginInitFunc {
return func(t *testing.T, p plugin.Registration) plugin.Registration {
if p.URI() != "io.containerd.content.v1.content" {
return p
}
oldInitFn := p.InitFn
p.InitFn = func(ic *plugin.InitContext) (interface{}, error) {
instance, err := oldInitFn(ic)
if err != nil {
return nil, err
}
return &contentStoreDelayer{
t: t,
Store: instance.(content.Store),
commitDelayDuration: commitDelayDuration,
}, nil
}
return p
}
}
type contentStoreDelayer struct {
t *testing.T
content.Store
commitDelayDuration time.Duration
}
func (cs *contentStoreDelayer) Writer(ctx context.Context, opts ...content.WriterOpt) (content.Writer, error) {
w, err := cs.Store.Writer(ctx, opts...)
if err != nil {
return nil, err
}
return &contentWriterDelayer{
t: cs.t,
Writer: w,
commitDelayDuration: cs.commitDelayDuration,
}, nil
}
type contentWriterDelayer struct {
t *testing.T
content.Writer
commitDelayDuration time.Duration
}
func (w *contentWriterDelayer) Commit(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt) error {
w.t.Logf("[testcase: %s] Commit %v blob after %v", w.t.Name(), expected, w.commitDelayDuration)
time.Sleep(w.commitDelayDuration)
return w.Writer.Commit(ctx, size, expected, opts...)
}