0aebcbc32d
Layer metadata storage has not been implemented outside of the layer store and will be deprecated by containerd metadata storage. To prepare for this and freeze the current metadata storage, remove the exported interface and make it internal to the layer store. Signed-off-by: Derek McGowan <derek@mcgstyle.net>
104 lines
2.2 KiB
Go
104 lines
2.2 KiB
Go
package layer // import "github.com/docker/docker/layer"
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"math/rand"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"syscall"
|
|
"testing"
|
|
|
|
"github.com/opencontainers/go-digest"
|
|
)
|
|
|
|
func randomLayerID(seed int64) ChainID {
|
|
r := rand.New(rand.NewSource(seed))
|
|
|
|
return ChainID(digest.FromBytes([]byte(fmt.Sprintf("%d", r.Int63()))))
|
|
}
|
|
|
|
func newFileMetadataStore(t *testing.T) (*fileMetadataStore, string, func()) {
|
|
td, err := ioutil.TempDir("", "layers-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
fms, err := newFSMetadataStore(td)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
return fms, td, func() {
|
|
if err := os.RemoveAll(td); err != nil {
|
|
t.Logf("Failed to cleanup %q: %s", td, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func assertNotDirectoryError(t *testing.T, err error) {
|
|
perr, ok := err.(*os.PathError)
|
|
if !ok {
|
|
t.Fatalf("Unexpected error %#v, expected path error", err)
|
|
}
|
|
|
|
if perr.Err != syscall.ENOTDIR {
|
|
t.Fatalf("Unexpected error %s, expected %s", perr.Err, syscall.ENOTDIR)
|
|
}
|
|
}
|
|
|
|
func TestCommitFailure(t *testing.T) {
|
|
fms, td, cleanup := newFileMetadataStore(t)
|
|
defer cleanup()
|
|
|
|
if err := ioutil.WriteFile(filepath.Join(td, "sha256"), []byte("was here first!"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tx, err := fms.StartTransaction()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := tx.SetSize(0); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = tx.Commit(randomLayerID(5))
|
|
if err == nil {
|
|
t.Fatalf("Expected error committing with invalid layer parent directory")
|
|
}
|
|
assertNotDirectoryError(t, err)
|
|
}
|
|
|
|
func TestStartTransactionFailure(t *testing.T) {
|
|
fms, td, cleanup := newFileMetadataStore(t)
|
|
defer cleanup()
|
|
|
|
if err := ioutil.WriteFile(filepath.Join(td, "tmp"), []byte("was here first!"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
_, err := fms.StartTransaction()
|
|
if err == nil {
|
|
t.Fatalf("Expected error starting transaction with invalid layer parent directory")
|
|
}
|
|
assertNotDirectoryError(t, err)
|
|
|
|
if err := os.Remove(filepath.Join(td, "tmp")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tx, err := fms.StartTransaction()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if expected := filepath.Join(td, "tmp"); strings.HasPrefix(expected, tx.String()) {
|
|
t.Fatalf("Unexpected transaction string %q, expected prefix %q", tx.String(), expected)
|
|
}
|
|
|
|
if err := tx.Cancel(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|