Skip to content

Commit d7a0e70

Browse files
committed
Add resume content test cases
Signed-off-by: Derek McGowan <[email protected]>
1 parent 3e89d82 commit d7a0e70

1 file changed

Lines changed: 115 additions & 0 deletions

File tree

content/testsuite/testsuite.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package testsuite
33
import (
44
"bytes"
55
"context"
6+
"fmt"
67
"io"
78
"io/ioutil"
89
"math/rand"
@@ -24,6 +25,11 @@ func ContentSuite(t *testing.T, name string, storeFn func(ctx context.Context, r
2425
t.Run("Writer", makeTest(t, name, storeFn, checkContentStoreWriter))
2526
t.Run("UploadStatus", makeTest(t, name, storeFn, checkUploadStatus))
2627
t.Run("Resume", makeTest(t, name, storeFn, checkResumeWriter))
28+
t.Run("ResumeTruncate", makeTest(t, name, storeFn, checkResume(resumeTruncate)))
29+
t.Run("ResumeDiscard", makeTest(t, name, storeFn, checkResume(resumeDiscard)))
30+
t.Run("ResumeCopy", makeTest(t, name, storeFn, checkResume(resumeCopy)))
31+
t.Run("ResumeCopySeeker", makeTest(t, name, storeFn, checkResume(resumeCopySeeker)))
32+
t.Run("ResumeCopyReaderAt", makeTest(t, name, storeFn, checkResume(resumeCopyReaderAt)))
2733
t.Run("Labels", makeTest(t, name, storeFn, checkLabels))
2834
}
2935

@@ -352,6 +358,115 @@ func checkLabels(ctx context.Context, t *testing.T, cs content.Store) {
352358

353359
}
354360

361+
func checkResume(rf func(context.Context, content.Writer, []byte, int64, int64, digest.Digest) error) func(ctx context.Context, t *testing.T, cs content.Store) {
362+
return func(ctx context.Context, t *testing.T, cs content.Store) {
363+
sizes := []int64{500, 5000, 50000}
364+
truncations := []float64{0.0, 0.1, 0.5, 0.9, 1.0}
365+
366+
for i, size := range sizes {
367+
for j, tp := range truncations {
368+
b, d := createContent(size, int64(i*len(truncations)+j))
369+
limit := int64(float64(size) * tp)
370+
ref := fmt.Sprintf("ref-%d-%d", i, j)
371+
372+
w, err := cs.Writer(ctx, ref, size, d)
373+
if err != nil {
374+
t.Fatal(err)
375+
}
376+
377+
if _, err := w.Write(b[:limit]); err != nil {
378+
w.Close()
379+
t.Fatal(err)
380+
}
381+
382+
if err := w.Close(); err != nil {
383+
t.Fatal(err)
384+
}
385+
386+
w, err = cs.Writer(ctx, ref, size, d)
387+
if err != nil {
388+
t.Fatal(err)
389+
}
390+
391+
st, err := w.Status()
392+
if err != nil {
393+
w.Close()
394+
t.Fatal(err)
395+
}
396+
397+
if st.Offset != limit {
398+
w.Close()
399+
t.Fatalf("Unexpected offset %d, expected %d", st.Offset, limit)
400+
}
401+
402+
preCommit := time.Now()
403+
if err := rf(ctx, w, b, limit, size, d); err != nil {
404+
t.Fatalf("Resume failed: %+v", err)
405+
}
406+
407+
postCommit := time.Now()
408+
409+
if err := w.Close(); err != nil {
410+
t.Fatal(err)
411+
}
412+
413+
info := content.Info{
414+
Digest: d,
415+
Size: size,
416+
}
417+
418+
if err := checkInfo(ctx, cs, d, info, preCommit, postCommit, preCommit, postCommit); err != nil {
419+
t.Fatalf("Check info failed: %+v", err)
420+
}
421+
}
422+
}
423+
}
424+
}
425+
426+
func resumeTruncate(ctx context.Context, w content.Writer, b []byte, written, size int64, dgst digest.Digest) error {
427+
if err := w.Truncate(0); err != nil {
428+
return errors.Wrap(err, "truncate failed")
429+
}
430+
431+
if _, err := io.CopyBuffer(w, bytes.NewReader(b), make([]byte, 1024)); err != nil {
432+
return errors.Wrap(err, "write failed")
433+
}
434+
435+
return errors.Wrap(w.Commit(ctx, size, dgst), "commit failed")
436+
}
437+
438+
func resumeDiscard(ctx context.Context, w content.Writer, b []byte, written, size int64, dgst digest.Digest) error {
439+
if _, err := io.CopyBuffer(w, bytes.NewReader(b[written:]), make([]byte, 1024)); err != nil {
440+
return errors.Wrap(err, "write failed")
441+
}
442+
return errors.Wrap(w.Commit(ctx, size, dgst), "commit failed")
443+
}
444+
445+
func resumeCopy(ctx context.Context, w content.Writer, b []byte, _, size int64, dgst digest.Digest) error {
446+
r := struct {
447+
io.Reader
448+
}{bytes.NewReader(b)}
449+
return errors.Wrap(content.Copy(ctx, w, r, size, dgst), "copy failed")
450+
}
451+
452+
func resumeCopySeeker(ctx context.Context, w content.Writer, b []byte, _, size int64, dgst digest.Digest) error {
453+
r := struct {
454+
io.ReadSeeker
455+
}{bytes.NewReader(b)}
456+
return errors.Wrap(content.Copy(ctx, w, r, size, dgst), "copy failed")
457+
}
458+
459+
func resumeCopyReaderAt(ctx context.Context, w content.Writer, b []byte, _, size int64, dgst digest.Digest) error {
460+
type readerAt interface {
461+
io.Reader
462+
io.ReaderAt
463+
}
464+
r := struct {
465+
readerAt
466+
}{bytes.NewReader(b)}
467+
return errors.Wrap(content.Copy(ctx, w, r, size, dgst), "copy failed")
468+
}
469+
355470
func checkStatus(t *testing.T, w content.Writer, expected content.Status, d digest.Digest, preStart, postStart, preUpdate, postUpdate time.Time) {
356471
t.Helper()
357472
st, err := w.Status()

0 commit comments

Comments
 (0)