move rootfstest to tartest

it's not "rootfs" or "docker" any more.
This commit is contained in:
2021-05-24 00:11:58 +03:00
parent 81db130c94
commit ccd34cf34b
6 changed files with 32 additions and 37 deletions

View File

@@ -20,7 +20,7 @@ go_test(
],
embed = [":go_default_library"],
deps = [
"//src/undocker/rootfs/rootfstest:go_default_library",
"//src/undocker/internal/tartest:go_default_library",
"@com_github_stretchr_testify//assert:go_default_library",
"@com_github_stretchr_testify//require:go_default_library",
],

View File

@@ -1,25 +1,22 @@
package rootfs
import (
"archive/tar"
"bytes"
"encoding/json"
"testing"
"github.com/motiejus/code/undocker/rootfs/rootfstest"
"github.com/motiejus/code/undocker/internal/tartest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type (
file = rootfstest.File
dir = rootfstest.Dir
hardlink = rootfstest.Hardlink
manifest = rootfstest.Manifest
extractable = rootfstest.Extractable
tarball = rootfstest.Tarball
)
var (
extract = rootfstest.Extract
file = tartest.File
dir = tartest.Dir
hardlink = tartest.Hardlink
extractable = tartest.Extractable
tarball = tartest.Tarball
)
func TestRootFS(t *testing.T) {
@@ -183,8 +180,24 @@ func TestRootFS(t *testing.T) {
return
}
require.NoError(t, err)
got := extract(t, &out)
got := tartest.Extract(t, &out)
assert.Equal(t, tt.want, got)
})
}
}
// Helpers
type (
manifest []string
)
func (m manifest) Tar(tw *tar.Writer) error {
b, err := json.Marshal(dockerManifestJSON{{Layers: m}})
if err != nil {
return err
}
return file{
Name: "manifest.json",
Contents: bytes.NewBuffer(b),
}.Tar(tw)
}

View File

@@ -1,16 +0,0 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = ["rootfstest.go"],
importpath = "github.com/motiejus/code/undocker/rootfs/rootfstest",
visibility = ["//visibility:public"],
deps = ["@com_github_stretchr_testify//require:go_default_library"],
)
go_test(
name = "go_default_test",
srcs = ["rootfstest_test.go"],
embed = [":go_default_library"],
deps = ["@com_github_stretchr_testify//assert:go_default_library"],
)

View File

@@ -1,137 +0,0 @@
package rootfstest
import (
"archive/tar"
"bytes"
"encoding/json"
"io"
"testing"
"github.com/stretchr/testify/require"
)
type (
Tarrer interface {
Tar(*tar.Writer) error
}
Tarball []Tarrer
// Extractable is an empty interface for comparing extracted outputs in tests.
// Using that just to avoid the ugly `interface{}`.
Extractable interface{}
Dir struct {
Name string
Uid int
}
File struct {
Name string
Uid int
Contents *bytes.Buffer
}
Manifest []string
Hardlink struct {
Name string
Uid int
}
dockerManifestJSON []struct {
Layers []string `json:"Layers"`
}
)
func (tb Tarball) Buffer() *bytes.Buffer {
var buf bytes.Buffer
tw := tar.NewWriter(&buf)
for _, member := range tb {
member.Tar(tw)
}
tw.Close()
return &buf
}
func (d Dir) Tar(tw *tar.Writer) error {
hdr := &tar.Header{
Typeflag: tar.TypeDir,
Name: d.Name,
Mode: 0644,
Uid: d.Uid,
}
return tw.WriteHeader(hdr)
}
func (f File) Tar(tw *tar.Writer) error {
var contents []byte
if f.Contents != nil {
contents = f.Contents.Bytes()
}
hdr := &tar.Header{
Typeflag: tar.TypeReg,
Name: f.Name,
Mode: 0644,
Uid: f.Uid,
Size: int64(len(contents)),
}
if err := tw.WriteHeader(hdr); err != nil {
return err
}
if _, err := tw.Write(contents); err != nil {
return err
}
return nil
}
func (m Manifest) Tar(tw *tar.Writer) error {
b, err := json.Marshal(dockerManifestJSON{{Layers: m}})
if err != nil {
return err
}
return File{
Name: "manifest.json",
Contents: bytes.NewBuffer(b),
}.Tar(tw)
}
func (h Hardlink) Tar(tw *tar.Writer) error {
return tw.WriteHeader(&tar.Header{
Typeflag: tar.TypeLink,
Name: h.Name,
Mode: 0644,
Uid: h.Uid,
})
}
func Extract(t *testing.T, r io.Reader) []Extractable {
t.Helper()
ret := []Extractable{}
tr := tar.NewReader(r)
for {
hdr, err := tr.Next()
if err == io.EOF {
break
}
require.NoError(t, err)
var elem Extractable
switch hdr.Typeflag {
case tar.TypeDir:
elem = Dir{Name: hdr.Name, Uid: hdr.Uid}
case tar.TypeLink:
elem = Hardlink{Name: hdr.Name}
case tar.TypeReg:
f := File{Name: hdr.Name, Uid: hdr.Uid}
if hdr.Size > 0 {
var buf bytes.Buffer
io.Copy(&buf, tr)
f.Contents = &buf
}
elem = f
}
ret = append(ret, elem)
}
return ret
}

View File

@@ -1,28 +0,0 @@
package rootfstest
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
)
func TestTarball(t *testing.T) {
bk := Tarball{File{Name: "entrypoint.sh", Contents: bytes.NewBufferString("hello")}}
img := Tarball{
File{Name: "backup.tar", Contents: bk.Buffer()},
File{Name: "entrypoint.sh", Contents: bytes.NewBufferString("bye")},
Dir{Name: "bin"},
Hardlink{Name: "entrypoint2"},
}
got := Extract(t, img.Buffer())
want := []Extractable{
File{Name: "backup.tar", Contents: bk.Buffer()},
File{Name: "entrypoint.sh", Contents: bytes.NewBufferString("bye")},
Dir{Name: "bin"},
Hardlink{Name: "entrypoint2"},
}
assert.Equal(t, want, got)
}

View File

@@ -15,7 +15,7 @@ type tree struct {
end bool
}
// New creates a new tree from a given path.
// newTree creates a new tree from a given path.
func newTree(paths ...string) *tree {
t := &tree{name: ".", children: []*tree{}}
for _, path := range paths {